@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,954 +0,0 @@
1
- // ─────────────────────────────────────────────────────────────────────────────
2
- // seal-image-digests — write the PUBLISHED ARTIFACT's digest into the lock.
3
- //
4
- // WHY THIS EXISTS
5
- // ---------------
6
- // An `images.lock.json` subject records `contentHash`, `sourceCommit` and
7
- // `sourceManifestHash`. Every one of those is a BUILD INPUT. None of them names
8
- // the artifact that was actually produced, so the lock said what was INTENDED
9
- // and never what SHIPPED.
10
- //
11
- // The kernel has carried the field for this the whole time —
12
- // `RuntimeImageSubjectSchema.imageDigest`, optional, documented down to "this is
13
- // the INDEX digest, not a per-platform child" and "it belongs to the DELIVERY
14
- // step". Measured 2026-09-14: `imageDigest` occurs in NONE of the nine committed
15
- // locks and in NO .mjs in this repository. The contract was declared and the
16
- // producer was never built. This is the producer.
17
- //
18
- // WHAT IT COST TO BE MISSING. `chartlib.imageRef` refuses a 64-hex tag, and a
19
- // contentHash IS 64-hex — so with no digest to install from, NO Distribution
20
- // lock could render through the canonical chart library at all. Every fresh
21
- // customer install, every appliance and every air-gap bundle was blocked on a
22
- // field nothing wrote.
23
- //
24
- // IT RESOLVES NOTHING ITSELF, and that is deliberate
25
- // --------------------------------------------------
26
- // `verifyDistributionPlatforms` already fetches the index, hash-checks the bytes
27
- // against `Docker-Content-Digest` rather than trusting the header, walks every
28
- // child manifest BY DIGEST, reads each image CONFIG for its real platform, and
29
- // fails closed when a required platform is absent. It already returns
30
- // `manifestDigest` per subject and then throws it away. Re-implementing any of
31
- // that here would be a second resolver that can disagree with the verifier about
32
- // what was published — so this script performs the verification and records its
33
- // answer, and there is no path through it that writes a digest the verifier did
34
- // not prove.
35
- //
36
- // FOUR REFUSALS, none of which may be softened:
37
- //
38
- // * A subject the verifier cannot resolve aborts the WHOLE run before
39
- // anything is written. A partially sealed lock is worse than an unsealed
40
- // one: it installs some services by digest and silently leaves the rest
41
- // un-pinned.
42
- // * A subject whose lock ALREADY carries a different `imageDigest` is a hard
43
- // error, never an update. The tag is immutable by convention in this fleet;
44
- // if the same contentHash now resolves to different bytes, either the tag
45
- // moved or the registry is lying, and both are supply-chain incidents rather
46
- // than drift to reconcile.
47
- // * Nothing is invented. There is no fallback that derives a digest from the
48
- // contentHash — they are different hashes of different things, and the whole
49
- // defect this closes came from treating one as the other.
50
- // * A run over zero subjects fails. An empty seal that reports success is the
51
- // "reports green while executing nothing" shape.
52
- //
53
- // It is IDEMPOTENT: re-running against an already-sealed lock re-verifies every
54
- // subject, finds the same digests, and writes nothing.
55
- //
56
- // node repos-infra/xema-distributions/seal-image-digests.mjs <distributionId>
57
- // node repos-infra/xema-distributions/seal-image-digests.mjs <distributionId> --check
58
- // node repos-infra/xema-distributions/seal-image-digests.mjs <distributionId> --if-published
59
- // node repos-infra/xema-distributions/seal-image-digests.mjs <distributionId> --publication-verdict
60
- //
61
- // `--check` verifies and reports without writing — the CI shape, so a lock that
62
- // has drifted from the registry fails a pull request instead of a deploy.
63
- //
64
- // FOUR MODES, BECAUSE THEY ASK QUESTIONS AT DIFFERENT MOMENTS
65
- // -----------------------------------------------------------
66
- // The two added below exist because a lock is WRITTEN before the images it
67
- // names are built. `resolve-images.mjs` computes `contentHash` from git build
68
- // inputs, so it runs — correctly — against a registry that does not yet serve
69
- // the coordinate it just predicted. Sealing therefore cannot happen at lock
70
- // production, and a single mode cannot serve both the pass that re-pins and the
71
- // pass that publishes.
72
- //
73
- // `--if-published` RECONCILE. Seal every subject, or, if the coordinate is
74
- // not published YET, skip THE WHOLE EDITION and exit 0.
75
- //
76
- // This does NOT soften the partial-seal refusal above, and
77
- // the distinction is the reason it is safe: that refusal is
78
- // about writing SOME subjects of one lock. Skipping leaves
79
- // the lock ENTIRELY unsealed, which is the state the
80
- // publication gate then refuses. An edition is still all or
81
- // nothing; what changed is that "nothing" became reachable
82
- // without failing a scheduled job that re-pins every 20
83
- // minutes. Without it, every pin move reddens reconcile
84
- // fleet-wide for the interval between the pin landing and
85
- // its producers building — which is the normal case, not an
86
- // exceptional one.
87
- //
88
- // ONLY a 404 skips. The discriminator is `error.status`,
89
- // set by `manifestHttpError` and measured to survive
90
- // `verifyDistributionPlatforms` intact — never a match on
91
- // message text, which would silently widen the day a
92
- // registry reworded its error body. A 401, a 403, a
93
- // malformed index or an absent required platform all still
94
- // abort.
95
- //
96
- // `--publication-verdict` PUBLICATION. Classify the lock PUBLISHABLE
97
- // (fully sealed) or WITHHELD (wholly unsealed — the resting
98
- // state a pin advance leaves, owner ruling 2026-09-29), as
99
- // ONE line on stdout, exit 0. A malformed, empty or
100
- // PARTIALLY sealed lock exits 1: a broken artifact.
101
- // OFFLINE and structural: it reads the locks and nothing
102
- // else (the distribution lock through the built kernel,
103
- // `--kernel`, only when the images lock is PUBLISHABLE). That is deliberate rather than a shortcut — a
104
- // publication gate that needs a registry credential can
105
- // fail for reasons that have nothing to do with the artifact
106
- // being published, and a gate people learn to re-run is a
107
- // gate that stops being read. `--check` answers the STRONGER
108
- // question (does the lock still AGREE with the registry) and
109
- // needs the network to do it; this one answers the question
110
- // publication actually turns on.
111
- // ─────────────────────────────────────────────────────────────────────────────
112
-
113
- import { readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
114
- import { join } from 'node:path';
115
-
116
- import { adapterHostRow, assertAdapterBundlesMatchHost, fetchRegistryManifest, lockMountsAdapters } from './adapter-bundled-versions.mjs';
117
- import { sealLock, verifyBiomeContentHashes } from './biome-content.mjs';
118
- import { fetchCatalogue } from './catalogue-fetch.mjs';
119
- import { readCataloguePin } from './catalogue-pin.mjs';
120
- import { parseCustomerDefinition } from './customer-definition.mjs';
121
- import { CATALOGUE_TOKEN_ENV_FLAG, CATALOGUE_USERNAME_FLAG, DEFINITION_FLAG } from './customer-flags.mjs';
122
- import { EditionChannel } from './edition-constants.mjs';
123
- import { editionPinnedInputs } from './edition-pinned-inputs.mjs';
124
- import { WorkspaceRoot, biomeIndexPath, configureEditionWorkspaceFromProcess, dataRoot, editionsRoot, isEntryModule, runtimeImageSourceIndexPath } from './edition-workspace.mjs';
125
- import {
126
- assertCoordinatesFinal,
127
- collectFleetPlatformRequirements,
128
- isNotFinalYet,
129
- readFleetImageLocks,
130
- } from './fleet-coordinate-finality.mjs';
131
- import { imageSubjectIdentity } from './image-subject-identity.mjs';
132
- import { adoptCatalogueKernel } from './kernel-package.mjs';
133
- import { loadKernelDistributionSchemas, serializeJson } from './lib.mjs';
134
- import { assertPlatformCanParseLock } from './platform-lock-readability.mjs';
135
- import { assertReleaseEditionTree } from './release-channel-guard.mjs';
136
- import { commandForSelf } from './remedy-command.mjs';
137
- import { externalSourceTrees, sourceTreeLocator } from './resolve-images.mjs';
138
- import { readSealedDistributionLock } from './sealed-distribution-lock.mjs';
139
- import { committedRepositoryPins, createPinnedSourceAuthority } from './source-authority.mjs';
140
- import { readStrictJsonFile } from './strict-json.mjs';
141
- import { pinnedManifestDigests, thirdPartyImagePins } from './third-party-image-pins.mjs';
142
- import { loadTrustedThirdPartySourcePins } from './third-party-pins-trusted.mjs';
143
- import {
144
- loadImageLockForVerification,
145
- verifyDistributionPlatforms,
146
- } from './verify-image-platforms.mjs';
147
-
148
- if (isEntryModule(import.meta.url)) {
149
- // The customer form (it names --definition) reads exactly these roots - the data root (the vendor's
150
- // runtime-image-source-index.json), the editions root, the sources root (the readability check of the
151
- // vendor repositories) and the cache (external source trees, and the catalogue's kernel from npm) - and
152
- // refuses any other, the kernel root included. A vendor seal takes the kernel root too.
153
- let namesDefinition;
154
- try {
155
- namesDefinition = parseSealArgs(process.argv.slice(2)).catalogueFlags.has(DEFINITION_FLAG);
156
- } catch (error) {
157
- process.stderr.write(`${error.message}\n`);
158
- process.exit(1);
159
- }
160
- configureEditionWorkspaceFromProcess(
161
- namesDefinition
162
- ? [WorkspaceRoot.Data, WorkspaceRoot.Editions, WorkspaceRoot.Sources, WorkspaceRoot.Cache]
163
- : [WorkspaceRoot.Data, WorkspaceRoot.Editions, WorkspaceRoot.Sources, WorkspaceRoot.Kernel, WorkspaceRoot.Cache],
164
- { refuseOthers: namesDefinition },
165
- );
166
- }
167
-
168
- const SHA256_DIGEST = /^sha256:[a-f0-9]{64}$/u;
169
-
170
- // This file's own directory is the distributions root in BOTH layouts the fleet
171
- // runs — the aggregator's `repos-infra/xema-distributions/` and a FLAT checkout
172
- // of this repository alone. It is the FALLBACK only: `--editions-root` and
173
- // `XEMA_DISTRIBUTIONS_ROOT` still win, through the plane's own resolver, so an
174
- // external editions root is honoured here exactly as it is everywhere else.
175
- //
176
- // The module-level `editionsRoot()` in `lib.mjs` is deliberately NOT used: it
177
- // applies the resolver with a fallback that assumes the aggregator layout, and
178
- // measured from a flat checkout it answers a path that does not exist.
179
-
180
- /**
181
- * The remedy, as a command the reader can actually run FROM WHERE THEY ARE.
182
- *
183
- * Built from this file's real path rather than printed as `pnpm dist:seal-digests`,
184
- * because that script is declared in the AGGREGATOR's `package.json` and this
185
- * repository has no `scripts` block at all — so the pnpm spelling is unrunnable
186
- * in a flat checkout, which is exactly where the publication gate fails. A
187
- * remedy that cannot be run where it is printed is a dead end.
188
- *
189
- * This was the only site in the repository that got it right, and the reasoning
190
- * above is why. It now DELEGATES to `remedy-command.mjs`, which generalises it
191
- * to the other ten diagnostics rather than leaving each to re-derive it.
192
- */
193
- export function sealCommandFor(distributionId) {
194
- return commandForSelf(import.meta.url, distributionId);
195
- }
196
-
197
- /**
198
- * The lock as the RESOLVER sees it: every subject with its sealed `imageDigest`
199
- * removed, everything else byte-for-byte as committed.
200
- *
201
- * `resolve-images.mjs` computes a lock from git build inputs and can never know
202
- * the digest — the digest is what this module writes AFTER the registry has
203
- * served the coordinate. So a comparison of a committed lock against a fresh
204
- * resolve has to subtract exactly what the seal added, or a sealed lock reads
205
- * as drifted from a resolver that is in fact in full agreement with it.
206
- *
207
- * Measured 2026-09-16: `dist-check.mjs` stripped `contentHash` and
208
- * `sourceManifestPath` from its structural view and NOT `imageDigest`, so every
209
- * lock this module had sealed (a customer edition, 63/63) was reported
210
- * "structurally out of date" and the printed remedy — re-resolve — would have
211
- * produced an UNSEALED lock that the publication gate then refuses. Sealing
212
- * must never make the drift check red: the digest is a fact about what
213
- * SHIPPED, layered over a lock whose structure and hashes it does not touch.
214
- *
215
- * Pure, and owned HERE rather than in the checker because this is the module
216
- * that decides what a seal writes; a second list of "fields the seal adds" in
217
- * `dist-check.mjs` is the pair that can only agree by hand.
218
- */
219
- export function withoutSealedDigests(lock) {
220
- return {
221
- ...lock,
222
- subjects: (lock.subjects ?? []).map(
223
- ({ imageDigest: _imageDigest, ...subject }) => subject,
224
- ),
225
- };
226
- }
227
-
228
- /**
229
- * Pure: decide what each subject's `imageDigest` should become.
230
- *
231
- * Separated from the I/O so the decision table is testable without a registry,
232
- * and so the refusals are assertable rather than reachable only through a
233
- * network round trip.
234
- */
235
- export function planDigestSeal({ subjects, verified }) {
236
- if (!Array.isArray(subjects) || subjects.length === 0) {
237
- throw new Error(
238
- 'seal-image-digests: the lock declares no subjects; sealing nothing and ' +
239
- 'reporting success would be a verification that executed nothing',
240
- );
241
- }
242
- const byId = new Map(
243
- verified.map((entry) => [imageSubjectIdentity({ kind: entry.subjectKind, id: entry.subjectId, imageRef: entry.subjectImageRef, contentHash: entry.subjectContentHash }), entry]),
244
- );
245
- const writes = [];
246
- const unchanged = [];
247
- for (const subject of subjects) {
248
- const key = imageSubjectIdentity(subject);
249
- const entry = byId.get(key);
250
- if (!entry) {
251
- throw new Error(
252
- `seal-image-digests: ${key} has no verification result; refusing to seal a ` +
253
- 'lock the verifier did not fully cover',
254
- );
255
- }
256
- const digest = entry.manifestDigest;
257
- if (typeof digest !== 'string' || !SHA256_DIGEST.test(digest)) {
258
- throw new Error(
259
- `seal-image-digests: ${key} resolved to "${digest}", which is not a canonical ` +
260
- 'sha256 digest',
261
- );
262
- }
263
- if (subject.imageDigest === digest) {
264
- unchanged.push({ key, digest });
265
- continue;
266
- }
267
- if (typeof subject.imageDigest === 'string' && subject.imageDigest.length > 0) {
268
- throw new Error(
269
- `seal-image-digests: ${key} is already sealed at ${subject.imageDigest} but ` +
270
- `${entry.coordinate} now resolves to ${digest}. The tag MOVED, or the registry ` +
271
- 'is serving different bytes for the same coordinate. This is not drift to ' +
272
- 'reconcile — nothing is rewritten, and the cause must be established first.',
273
- );
274
- }
275
- writes.push({ key, digest, coordinate: entry.coordinate });
276
- }
277
- return { writes, unchanged };
278
- }
279
-
280
- /** The two RESTING STATES a lock may be published from — or withheld in. */
281
- export const PublicationVerdict = Object.freeze({
282
- Publishable: 'PUBLISHABLE',
283
- Withheld: 'WITHHELD',
284
- });
285
-
286
- /**
287
- * Pure: is this lock PUBLISHABLE, WITHHELD, or BROKEN?
288
- *
289
- * The publication gate. OFFLINE — it reads the parsed lock and nothing else — so
290
- * it cannot fail for a reason unrelated to the artifact being published, and
291
- * cannot be re-run into passing.
292
- *
293
- * THREE ANSWERS, NOT TWO. Owner ruling 2026-09-29: an unsealed lock blocks
294
- * PUBLICATION and nothing else. A pin advance is committed UNSEALED — the
295
- * resolver strips every `imageDigest` when it re-pins — and only the edition
296
- * that must publish is sealed. So a wholly unsealed lock is a RESTING STATE of
297
- * `main`, not a defect, and it gets the npm release lane's shape: the edition is
298
- * WITHHELD, said out loud, and nothing is uploaded for it. It is never
299
- * published, because an unsealed lock addresses its images by a MUTABLE tag and
300
- * `chartlib.imageRef` refuses a bare 64-hex contentHash in the tag slot, so it
301
- * could not be installed by the canonical chart library at all.
302
- *
303
- * What still THROWS is a lock no resting state produces — a BROKEN artifact:
304
- *
305
- * * NO SUBJECTS — a gate passing over an empty roster has verified nothing;
306
- * * a NON-CANONICAL digest — a bare 64-hex contentHash laundered into the
307
- * digest slot, an uppercased or truncated one;
308
- * * a PARTIAL seal — some subjects carry a digest and others do not. The
309
- * sealer refuses to write one (it seals all or nothing) and the resolver
310
- * strips all or nothing, so no correct path produces it. It would install
311
- * some services by digest and silently leave the rest un-pinned.
312
- *
313
- * IT CHECKS SHAPE AS WELL AS PRESENCE. This gate reads the lock with
314
- * `JSON.parse`, so the kernel's digest regex is not upstream of it and this
315
- * file's own `SHA256_DIGEST` is the only rule on the images lock. (The sealed
316
- * grammar of the distribution lock is the kernel's, asked of it separately once
317
- * the images lock reads PUBLISHABLE.)
318
- */
319
- export function classifyPublicationState({
320
- distributionId,
321
- subjects,
322
- remedy = sealCommandFor(distributionId),
323
- }) {
324
- if (!Array.isArray(subjects) || subjects.length === 0) {
325
- throw new Error(
326
- `seal-image-digests: "${distributionId}" declares no subjects; a publication gate ` +
327
- 'that passes over an empty roster has verified nothing',
328
- );
329
- }
330
- // MALFORMED is reported before anything else: one verdict, not a cascade.
331
- const malformed = subjects
332
- .filter(
333
- (subject) =>
334
- typeof subject.imageDigest === 'string' &&
335
- subject.imageDigest.length > 0 &&
336
- !SHA256_DIGEST.test(subject.imageDigest),
337
- )
338
- .map((subject) => `${subject.kind}:${subject.id}=${subject.imageDigest}`);
339
- if (malformed.length > 0) {
340
- throw new Error(
341
- `seal-image-digests: "${distributionId}" carries ${malformed.length} NON-CANONICAL ` +
342
- `imageDigest value(s): ${malformed.slice(0, 4).join(', ')}. A digest is ` +
343
- '`sha256:` followed by 64 lowercase hex characters. A BARE 64-hex value is a ' +
344
- "contentHash — a hash of BUILD INPUTS, not of the artifact — and `chartlib.imageRef` " +
345
- 'refuses it in the tag slot for exactly this reason. Refusing to publish.',
346
- );
347
- }
348
- const unsealed = subjects
349
- .filter((subject) => typeof subject.imageDigest !== 'string' || subject.imageDigest.length === 0)
350
- .map((subject) => imageSubjectIdentity(subject));
351
- if (unsealed.length === 0) {
352
- return {
353
- verdict: PublicationVerdict.Publishable,
354
- distributionId,
355
- subjectCount: subjects.length,
356
- unsealedCount: 0,
357
- };
358
- }
359
- if (unsealed.length < subjects.length) {
360
- throw new Error(
361
- `seal-image-digests: "${distributionId}" is PARTIALLY sealed — ${unsealed.length} of ` +
362
- `${subjects.length} subject(s) carry no imageDigest: ${unsealed.slice(0, 8).join(', ')}` +
363
- `${unsealed.length > 8 ? `, and ${unsealed.length - 8} more` : ''}. ` +
364
- 'No correct path produces this: the sealer writes all or nothing and the resolver ' +
365
- 'strips all or nothing. It would install some services by digest and silently ' +
366
- 'leave the rest un-pinned. This is a broken artifact, not a resting state; ' +
367
- `refusing to publish. Re-seal the whole edition:\n ${remedy}`,
368
- );
369
- }
370
- return {
371
- verdict: PublicationVerdict.Withheld,
372
- distributionId,
373
- subjectCount: subjects.length,
374
- unsealedCount: unsealed.length,
375
- remedy,
376
- };
377
- }
378
-
379
- /**
380
- * Is this failure "the coordinate is not published YET"?
381
- *
382
- * `manifestHttpError` stamps `error.status` from the HTTP response, and that
383
- * property was measured surviving `verifyDistributionPlatforms` intact against
384
- * the live registry (a fabricated tag on a real repository returns
385
- * `status === 404`, body `MANIFEST_UNKNOWN`). Matching the MESSAGE instead would
386
- * widen silently the day ghcr rewords its error body — and widening this
387
- * predicate turns a hard failure into a skip, which is the one direction that
388
- * must never happen by accident.
389
- */
390
- export function isNotPublishedYet(error) {
391
- return Boolean(error) && error.status === 404;
392
- }
393
-
394
- /**
395
- * Pure: split argv into the mode flags and the ONE positional distribution id.
396
- *
397
- * WHY THIS EXISTS AS A FUNCTION
398
- * -----------------------------
399
- * The previous form was `args.filter((a) => !FLAGS.has(a))` over a set holding
400
- * only the three MODE flags, and everything surviving that filter was treated as
401
- * positional. `--editions-root <path>` therefore contributed TWO unexpected
402
- * positionals and the usage error fired — so the editions-root flag was
403
- * REJECTED by the very script that threads argv into the resolver
404
- * (`editionsRoot()` below passes `args` to `resolveEditionsRootWithSource`,
405
- * which reads exactly this flag).
406
- *
407
- * That is the "written and never wired" shape pointed at a CLI: the capability
408
- * was reachable in code and unreachable from the command line, while
409
- * `XEMA_DISTRIBUTIONS_ROOT` — the env half of the same precedence chain — worked.
410
- * A customer edition resolved from a root this repository does not own is the
411
- * case the flag exists for, and it is exactly the case that could not be spelled.
412
- *
413
- * The flag NAME is imported from `lib.mjs` rather than restated here, so this
414
- * parser cannot drift from the resolver that consumes it.
415
- *
416
- * VALUE HANDLING IS DELIBERATELY NOT DUPLICATED. The space form's value is
417
- * skipped without being validated, because `resolveEditionsRootWithSource`
418
- * already refuses a missing value, an empty one, and one that swallows the next
419
- * flag. Re-checking here would be a second implementation of a rule that owns
420
- * itself — and the two could disagree about which is authoritative.
421
- */
422
- export function parseSealArgs(args) {
423
- const MODES = new Set(['--check', '--if-published', '--publication-verdict']);
424
- const CATALOGUE_VALUE_FLAGS = new Set([DEFINITION_FLAG, CATALOGUE_USERNAME_FLAG, CATALOGUE_TOKEN_ENV_FLAG]);
425
- const positional = [];
426
- const catalogueFlags = new Map();
427
- for (let i = 0; i < args.length; i += 1) {
428
- const arg = args[i];
429
- if (MODES.has(arg)) {continue;}
430
- const eq = arg.indexOf('=');
431
- if (eq > 0 && CATALOGUE_VALUE_FLAGS.has(arg.slice(0, eq))) {
432
- const value = arg.slice(eq + 1);
433
- if (value === '' || value.startsWith('--')) {throw new Error(`${arg.slice(0, eq)} takes a value`);}
434
- catalogueFlags.set(arg.slice(0, eq), value);
435
- continue;
436
- }
437
- if (CATALOGUE_VALUE_FLAGS.has(arg)) {
438
- if (args[i + 1] === undefined || args[i + 1].startsWith('--')) {throw new Error(`${arg} takes a value`);}
439
- catalogueFlags.set(arg, args[i + 1]);
440
- i += 1;
441
- continue;
442
- }
443
- positional.push(arg);
444
- }
445
- const [distributionId, ...rest] = positional;
446
- return {
447
- catalogueFlags,
448
- distributionId,
449
- rest,
450
- check: args.includes('--check'),
451
- ifPublished: args.includes('--if-published'),
452
- publicationVerdict: args.includes('--publication-verdict'),
453
- };
454
- }
455
-
456
- /** Where a lock is staged before it replaces `path`: beside it, so the rename never crosses a filesystem. */
457
- export const sealStagingPath = (path) => `${path}.sealing`;
458
-
459
- /**
460
- * Replace the locks of one seal together. Every document is first written to its
461
- * staging file; only when all of them are on disk is each renamed over its lock,
462
- * in the order given. A failure while staging removes what was staged and leaves
463
- * every committed lock byte-identical.
464
- */
465
- function replaceLocksTogether(documents) {
466
- const staged = [];
467
- try {
468
- for (const { path, text } of documents) {
469
- writeFileSync(sealStagingPath(path), text);
470
- staged.push(path);
471
- }
472
- } catch (error) {
473
- for (const path of staged) {rmSync(sealStagingPath(path), { force: true });}
474
- throw error;
475
- }
476
- for (const { path } of documents) {renameSync(sealStagingPath(path), path);}
477
- }
478
-
479
- /**
480
- * The lock the images of an edition will actually READ, built IN MEMORY: the committed lock sealed against the image lock
481
- * carrying `digests`. Nothing is written. The readability grader asks its question of THIS, never of the committed
482
- * unsealed form, which every contracts reader refuses for want of a `schemaVersion` whatever the repositories do.
483
- */
484
- export async function buildSealedEditionLock(options) {
485
- const { prepared } = await prepareEditionSeal({ ...options, checkAdapters: false, check: false });
486
- return prepared.result.lock;
487
- }
488
-
489
- /**
490
- * Write each planned digest into the raw images lock's subject of the same identity (a composed artifact is its
491
- * `imageRef:contentHash`, so two live generations take their own digests), and count them. A plan the file does not
492
- * match, in either direction, is refused: nothing is written.
493
- */
494
- export function applyDigestsToSubjects(rawImages, digests) {
495
- let applied = 0;
496
- for (const subject of rawImages.subjects) {
497
- const digest = digests.get(imageSubjectIdentity(subject));
498
- if (digest) {
499
- subject.imageDigest = digest;
500
- applied += 1;
501
- }
502
- }
503
- if (applied !== digests.size) {
504
- throw new Error(
505
- `seal-image-digests: planned ${digests.size} writes but matched ${applied} subjects ` +
506
- 'in the file on disk; nothing written',
507
- );
508
- }
509
- return applied;
510
- }
511
-
512
- /** The shared in-memory half of the seal: reads both locks, applies `digests`, seals or verifies. Writes nothing. */
513
- async function prepareEditionSeal({ distributionId, root, digests = new Map(), check = false, vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, fetchManifest = fetchRegistryManifest, checkAdapters = true }) {
514
- const schemas = await loadKernelDistributionSchemas();
515
- const lockPath = join(root, distributionId, 'distribution.lock.json');
516
- const imagesPath = join(root, distributionId, 'images.lock.json');
517
- // The file is re-read rather than the PARSED lock re-serialised: the parse is a
518
- // validation, not a round-trip, and writing back a schema-normalised document
519
- // would silently reformat or drop anything the parser does not model.
520
- const rawImages = JSON.parse(readFileSync(imagesPath, 'utf8'));
521
- const applied = applyDigestsToSubjects(rawImages, digests);
522
- const raw = JSON.parse(readFileSync(lockPath, 'utf8'));
523
- const imageLock = schemas.parseImageLock(rawImages);
524
- // A release seal reads the EDITION's indexes and pins (a held repository is sealed at the held commit); a
525
- // customer seal (catalogue) and a develop seal (injected `vendoredCommit`) are not vendor release editions.
526
- const editionInputs = catalogue === undefined && vendoredCommit === undefined ? await editionPinnedInputs(distributionId, { schemas }) : undefined;
527
- const pinned = vendoredCommit ?? ((repo) => createPinnedSourceAuthority({ pins: editionInputs?.repositoryPins ?? committedRepositoryPins() }).vendoredSourceCommitForRepository(repo));
528
- const lockDocument = raw !== null && typeof raw === 'object' && 'unsealedSchema' in raw ? schemas.parseUnsealedDistributionLock(raw) : schemas.parseDistributionLock(raw);
529
- if (checkAdapters && lockMountsAdapters(lockDocument)) {
530
- // The adapter host's row: the verified catalogue's for a customer, the data root's biome index for the vendor.
531
- const rows = catalogue !== undefined ? catalogue.biomes : (editionInputs?.biomeIndex ?? JSON.parse(readFileSync(biomeIndexPath(), 'utf8')));
532
- await assertAdapterBundlesMatchHost({ lock: lockDocument, hostRow: adapterHostRow(rows), fetchManifest });
533
- }
534
- const result = await sealOrVerifyLock({
535
- schemas,
536
- lock: lockDocument,
537
- imageLock,
538
- locate: sourceTreeLocator(externalSourceTrees(lockDocument)),
539
- vendoredCommit: pinned,
540
- catalogue,
541
- catalogueDigest,
542
- storePublisherAnchorKeys,
543
- check,
544
- lockPath,
545
- });
546
- return { prepared: { result, rawImages, applied, lockPath, imagesPath } };
547
- }
548
-
549
- /**
550
- * The seal of one edition's two locks, as ONE write.
551
- *
552
- * `digests` (`kind:id` -> registry digest) are the image digests this run seals
553
- * into the images lock. Each biome's `biomeContentHash` is then RECOMPUTED from
554
- * its sources over that sealed images lock, and the unsealed distribution lock
555
- * the resolver wrote is turned into the v5 lock by the kernel's
556
- * `sealDistributionLock`. A distribution lock that is already sealed is VERIFIED
557
- * instead: every hash is recomputed and a mismatch is refused, naming the biome.
558
- *
559
- * Nothing is written until both documents exist in memory, and the distribution
560
- * lock is renamed LAST: a seal that fails for any reason before that leaves the
561
- * committed pair as it was, and the one state a crash between the two renames
562
- * can leave (images sealed, distribution unsealed) is refused by every reader of
563
- * a sealed edition.
564
- */
565
- export async function sealEditionLocks({ distributionId, root, digests = new Map(), check = false, label = 'dist:seal-digests', vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, fetchManifest = fetchRegistryManifest }) {
566
- const { prepared } = await prepareEditionSeal({ distributionId, root, digests, check, vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, fetchManifest });
567
- const { result, rawImages, applied, lockPath, imagesPath } = prepared;
568
- replaceLocksTogether([
569
- ...(applied > 0 ? [{ path: imagesPath, text: `${JSON.stringify(rawImages, null, 2)}\n` }] : []),
570
- ...(result.sealed ? [{ path: lockPath, text: serializeJson(result.lock) }] : []),
571
- ]);
572
- if (applied > 0) {console.log(`[${label}] sealed ${applied} subject(s) into ${imagesPath}.`);}
573
- if (result.sealed) {
574
- console.log(`[${label}] sealed ${result.lock.biomes.length} biomeContentHash(es) into ${lockPath}.`);
575
- } else {
576
- console.log(`[${label}] ${result.lock.biomes.length} biomeContentHash(es) recomputed from their inputs and agree with ${lockPath}.`);
577
- }
578
- return result.lock;
579
- }
580
-
581
- /**
582
- * The decision, with no files: an UNSEALED lock is sealed (refused under `check`); a SEALED lock is VERIFIED -
583
- * every hash recomputed, a mismatch refused naming the biome.
584
- */
585
- export async function sealOrVerifyLock({ schemas, lock, imageLock, locate, vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, bundleSigners, check = false, lockPath = 'distribution.lock.json' }) {
586
- if ('unsealedSchema' in lock) {
587
- if (check) {
588
- throw new Error(`${lockPath} is unsealed (no biomeContentHash); run \`xema edition resolve-digests ${lock.distributionId}\``);
589
- }
590
- return { sealed: true, lock: await sealLock({ schemas, unsealed: lock, imageLock, locate, vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, bundleSigners }) };
591
- }
592
- await verifyBiomeContentHashes({ schemas, lock, imageLock, locate, vendoredCommit, catalogue, catalogueDigest, storePublisherAnchorKeys, bundleSigners });
593
- return { sealed: false, lock };
594
- }
595
-
596
- async function main() {
597
- const args = process.argv.slice(2);
598
- const { distributionId, rest, check, ifPublished, publicationVerdict, catalogueFlags } =
599
- parseSealArgs(args);
600
- if (!distributionId || rest.length > 0) {
601
- throw new Error(
602
- 'usage: xema edition resolve-digests <distributionId> ' +
603
- `[--check | --if-published | --publication-verdict] ` +
604
- `[--definition <file> [--catalogue-username <name> --catalogue-token-env <VAR>]]`,
605
- );
606
- }
607
- // The modes answer different questions and combining them would make the
608
- // verdict depend on precedence nobody declared.
609
- const selected = [check, ifPublished, publicationVerdict].filter(Boolean).length;
610
- if (selected > 1) {
611
- throw new Error(
612
- 'seal-image-digests: --check, --if-published and --publication-verdict are mutually exclusive',
613
- );
614
- }
615
-
616
- // PUBLICATION GATE — offline (no network, no credential) and structural. The images lock is
617
- // classified with no kernel at all. A PUBLISHABLE verdict then also reads the distribution lock
618
- // through the BUILT kernel (`readSealedDistributionLock`, the predicate `xema edition artifact`
619
- // uses), so the publication workflow provisions the built kernel before it asks (`--kernel`).
620
- // It returns BEFORE `loadImageLockForVerification`, which needs sibling repositories and the registry.
621
- //
622
- // EVERY mode, the offline publication verdict included: a release edition
623
- // never carries develop content, whatever the sealer is asked to do with it.
624
- assertReleaseEditionTree(join(editionsRoot(), distributionId));
625
-
626
- if (publicationVerdict) {
627
- const lockPath = join(editionsRoot(), distributionId, 'images.lock.json');
628
- const raw = JSON.parse(readFileSync(lockPath, 'utf8'));
629
- const state = classifyPublicationState({
630
- distributionId,
631
- subjects: raw.subjects,
632
- });
633
- // STDOUT CARRIES EXACTLY ONE MACHINE LINE, and nothing else. The publish
634
- // loop branches on it, and accepts only these two shapes: anything else —
635
- // including an empty stdout from a crash — is a failure there, never a
636
- // withhold. The human explanation goes to stderr.
637
- if (state.verdict === PublicationVerdict.Publishable) {
638
- // The artifact verb reads the distribution lock through this same predicate; a verdict that
639
- // passed an unsealed one would be the first thing `xema edition artifact` contradicts.
640
- readSealedDistributionLock({
641
- schemas: await loadKernelDistributionSchemas(),
642
- lockPath: join(editionsRoot(), distributionId, 'distribution.lock.json'),
643
- distributionId,
644
- });
645
- console.error(
646
- `[dist:seal-digests --publication-verdict] "${distributionId}": all ` +
647
- `${state.subjectCount} subject(s) carry a canonical imageDigest; publishable. ` +
648
- `(${lockPath})`,
649
- );
650
- console.log(`${state.verdict} ${distributionId} ${state.subjectCount}`);
651
- return;
652
- }
653
- console.error(
654
- `[dist:seal-digests --publication-verdict] "${distributionId}": WITHHELD — all ` +
655
- `${state.unsealedCount} subject(s) are unsealed. This is a resting state (owner ` +
656
- 'ruling 2026-09-29: an unsealed lock blocks PUBLICATION and nothing else), so ' +
657
- 'nothing is uploaded for it. To publish it, seal it once its producers have ' +
658
- `built:\n ${state.remedy}`,
659
- );
660
- console.log(
661
- `${state.verdict} ${distributionId} ${state.unsealedCount} ${state.subjectCount}`,
662
- );
663
- return;
664
- }
665
-
666
- // THE ROOT MUST REACH THE READ, NOT ONLY THE WRITE.
667
- //
668
- // `loadImageLockForVerification` takes `(distributionId, distributionsRoot =
669
- // dataRoot())`. Called with one argument it silently read the DEFAULT
670
- // root while the write below used `editionsRoot()` — so with an external
671
- // root configured, this script verified ONE lock and would have sealed the
672
- // digests it proved into a DIFFERENT one. It failed safe only when the id was
673
- // absent from the default root (ENOENT); an edition present in BOTH roots
674
- // would have been sealed from the wrong verification, silently.
675
- //
676
- // That fix reached the LOCK read and NOT the sibling seven lines below it,
677
- // and the sentence that used to stand here — "one root, resolved once, used
678
- // by every path in this function" — was the reason: a reader confirms it
679
- // against the call it is standing next to and stops. `verifyDistributionPlatforms`
680
- // defaults `distributionsRoot` to `dataRoot()`, so the REGISTRY
681
- // CREDENTIALS were still read out of this repository while the lock came from
682
- // the configured root.
683
- //
684
- // The two halves fail with OPPOSITE loudness, which is why only the quiet one
685
- // survived: a lock read against the wrong root is an ENOENT, and a credential
686
- // read against the wrong root simply authenticates against a different
687
- // declaration file and proceeds. A customer root declaring its own registry
688
- // authority would have been verified with the vendor's declarations.
689
- //
690
- // Both reads now take `root`. Asserted BEHAVIOURALLY in
691
- // `seal-image-digests.test.mjs` — the external root declares a sentinel
692
- // `authTokenEnv` and the test reads which variable the refusal names, because
693
- // no structural check can tell a threaded argument from an omitted one.
694
- const root = editionsRoot();
695
- // CUSTOMER MODE (`--definition`): the digest-pinned RELEASE catalogue of catalogue.pin.json beside the
696
- // definition, the one the edition was resolved against.
697
- // Its vendor biomes' tree ids are inputs on ITS authority (biome-content.mjs).
698
- const fetched =
699
- catalogueFlags.has(DEFINITION_FLAG)
700
- ? await fetchCatalogue({
701
- ref: readCataloguePin({ definitionFile: catalogueFlags.get(DEFINITION_FLAG), channel: EditionChannel.Release }),
702
- channel: EditionChannel.Release,
703
- username: catalogueFlags.get(CATALOGUE_USERNAME_FLAG),
704
- tokenEnv: catalogueFlags.get(CATALOGUE_TOKEN_ENV_FLAG),
705
- })
706
- : undefined;
707
- const catalogue = fetched?.catalogue;
708
- const catalogueDigest = fetched?.digest;
709
- // A customer seal reads the kernel of its catalogue (from npm), proved its contract authority, before any kernel schema is loaded.
710
- // Its definition's Store publisher selection is what the lock's `storePublisherTrust` is checked against (biome-content.mjs).
711
- const storePublisherAnchorKeys =
712
- catalogue === undefined
713
- ? undefined
714
- : parseCustomerDefinition(await adoptCatalogueKernel(catalogue), readStrictJsonFile(catalogueFlags.get(DEFINITION_FLAG))).definition.storePublisherAnchorKeys;
715
- const imageLock = await loadImageLockForVerification(distributionId, root);
716
- // A pinned third-party subject (its repository is in the data root's third-party source pins) is verified and sealed
717
- // BY the pin's manifest digest: its contentHash is publisher-attested and is not a tag.
718
- const thirdPartyPins = loadTrustedThirdPartySourcePins(dataRoot());
719
- const pinnedImages = thirdPartyImagePins({ pins: thirdPartyPins, subjects: imageLock.subjects });
720
-
721
- // Throws on ANY unresolvable subject or missing required platform, before a
722
- // single byte of the lock is touched.
723
- let report;
724
- try {
725
- report = await verifyDistributionPlatforms({ imageLock, distributionsRoot: root, pinnedDigests: pinnedManifestDigests(pinnedImages) });
726
- } catch (error) {
727
- // RECONCILE: a coordinate this pass just re-pinned has not been built yet.
728
- // Skip the EDITION — never some of its subjects — and leave the lock
729
- // entirely unsealed for the publication gate to refuse.
730
- if (ifPublished && isNotPublishedYet(error)) {
731
- console.log(
732
- `[dist:seal-digests --if-published] "${distributionId}": not published yet — ` +
733
- `${error.message.split('\n')[0]}`,
734
- );
735
- console.log(
736
- `[dist:seal-digests --if-published] skipping this edition ENTIRELY and writing ` +
737
- 'nothing. It stays unsealed, and publication refuses an unsealed lock, so ' +
738
- 'nothing installable is produced from it until its producers have built.',
739
- );
740
- return;
741
- }
742
- throw error;
743
- }
744
-
745
- // ── BEFORE ANY DIGEST IS WRITTEN ───────────────────────────────────────────
746
- //
747
- // Can the images of this edition READ the lock it is about to be sealed
748
- // against? The plane resolves with the contracts build in
749
- // `repos/xema-kernel-contracts`, which runs ahead of what ships, and
750
- // `DistributionLockSchema` is `.strict()` — so a key the plane knows and a
751
- // pinned repository does not makes the whole artifact unreadable AT BOOT.
752
- // That is not hypothetical: on 2026-09-17 `imageNamePrefix` did exactly this
753
- // to three a customer environment services at once, and the edition had sealed,
754
- // published and installed perfectly first.
755
- //
756
- // It is asked of every pinned repository that SHIPS AN IMAGE INTO THIS
757
- // EDITION and PARSES A LOCK — never of `repos/xema-base` alone, which
758
- // declares the NEWEST range in the fleet and is therefore the weakest
759
- // possible subject, and never of every pin, which grades repositories the
760
- // edition's lock cannot reach. Both narrowings are DERIVED (from this
761
- // edition's `images.lock.json` and from the pinned commit's own source);
762
- // see `platform-lock-readability.mjs` for the measurement behind each.
763
- //
764
- // WHY HERE AND NOT BEFORE `verifyDistributionPlatforms`, which is where the
765
- // original of this call sat. Three placements were available and only this
766
- // one is correct today:
767
- //
768
- // • before the lock read — `--publication-verdict` returns above it, and that
769
- // gate must stay offline and structural. It would also need a sibling
770
- // repository and the registry to answer a question about publication.
771
- // • before the verify — an edition whose coordinates are NOT PUBLISHED YET
772
- // is the ORDINARY daily outcome, and `--if-published` skips it in the
773
- // catch below. Asking first would make an edition nothing is about to
774
- // seal fail HARD on a readability question, and would pay the npm cost
775
- // for every skipped edition.
776
- // • HERE — after the skip, before `planDigestSeal` and therefore before any
777
- // write, so it runs exactly for the editions a digest is about to be
778
- // written into, and for `--check`, which is a verification mode and
779
- // should answer it.
780
- //
781
- // `runtimeImageSourceIndexPath()` is THIS repository's file rather than the
782
- // editions root's, and deliberately: the pins are a fact about the vendor
783
- // plane that BUILT the images, not about whose editions are being sealed.
784
- // Every other consumer of the index (`dist-check.mjs`, `resolve-images.mjs`)
785
- // reads it the same way.
786
- //
787
- // `imageLock` is THE EDITION'S OWN, already loaded above from `root`, and it
788
- // is what narrows the question from the fleet to this edition: the pin index
789
- // is fleet-wide, so grading every pin refuses a seal over a repository that
790
- // ships nothing here. Measured 2026-09-27, that is not hypothetical — it
791
- // blocked a customer-edition seal on `repos/xema-operator`, which has
792
- // ZERO subjects in that edition.
793
- // ── THE TWO LOCKS READ HERE ARE DIFFERENT CLASSES ────────────────────────
794
- //
795
- // `distribution.lock.json` is REBUILDABLE — a fresh resolve reproduces it,
796
- // and zero of the 9 committed ones carries a digest. `imageLock` is SEALED:
797
- // 523 of 523 subjects across those 9 editions carry an `imageDigest` that
798
- // THIS script wrote, and `resolve-images.mjs` emits none, so re-resolving it
799
- // DISCARDS them rather than recomputing them. They appear as two arguments
800
- // to one call, which is exactly the shape that invites treating them alike;
801
- // `dist-check.mjs`'s `compareCommittedLock` carries the full statement of
802
- // the split, at its own read.
803
- //
804
- // The practical rule for anything added below: the distribution lock may be
805
- // regenerated to answer a question; the image lock may not.
806
- const { writes, unchanged } = planDigestSeal({
807
- subjects: imageLock.subjects,
808
- verified: report.subjects,
809
- });
810
-
811
- const planned = new Map();
812
- for (const w of writes) {planned.set(w.key, w.digest);}
813
- await assertPlatformCanParseLock({
814
- // The lock the images will READ: sealed in memory with this run's digests, never the committed unsealed form.
815
- lock: await buildSealedEditionLock({
816
- distributionId,
817
- root,
818
- digests: planned,
819
- catalogue,
820
- catalogueDigest,
821
- }),
822
- imageLock,
823
- distributionId,
824
- // A vendor edition grades the pins it RESOLVES at (a held repository is graded at the held commit);
825
- // a customer seal grades the data root's committed index.
826
- runtimeSourceIndex:
827
- catalogue === undefined
828
- ? (await editionPinnedInputs(distributionId, { schemas: await loadKernelDistributionSchemas() })).runtimeImageSourceIndex
829
- : JSON.parse(readFileSync(runtimeImageSourceIndexPath(), 'utf8')),
830
- });
831
-
832
- const label = check ? 'dist:seal-digests --check' : 'dist:seal-digests';
833
- console.log(
834
- `[${label}] "${distributionId}": ${report.subjectCount} subjects verified against ` +
835
- `${report.registries.join(', ')}; ${unchanged.length} already sealed, ${writes.length} to seal.`,
836
- );
837
- for (const w of writes) {console.log(` seal ${w.key} ${w.coordinate} -> ${w.digest}`);}
838
-
839
- if (writes.length === 0) {
840
- console.log(`[${label}] lock is fully sealed and agrees with the registry.`);
841
- await sealEditionLocks({ distributionId, root, check, label, catalogue, catalogueDigest, storePublisherAnchorKeys });
842
- return;
843
- }
844
-
845
- // ── FLEET-SCOPED FINALITY ──────────────────────────────────────────────────
846
- //
847
- // Everything above this point is PER-EDITION and passed. That is exactly the
848
- // state `xema-internal` was in at 09:25 on 2026-09-18, when it was sealed
849
- // against 40 coordinates that were still amd64-only and whose arm64
850
- // supplement then moved 63 of its 66 digests.
851
- //
852
- // A seal pins what a MUTABLE tag resolves to, so it is stable only once the
853
- // coordinate is FINAL — and finality is a property of the FLEET, because the
854
- // edition that can still supplement the coordinate is a DIFFERENT one. Asked
855
- // here, over `writes`, because this is the moment the regression is
856
- // introduced and the repository holding every edition's lock is where the
857
- // question is answerable at all.
858
- const { editions, withoutLock } = readFleetImageLocks(root);
859
- const fleetRequirements = collectFleetPlatformRequirements({ editions, isThirdPartySubject: (subject) => thirdPartyPins.byRepository(subject.repo) !== undefined });
860
- try {
861
- const finality = assertCoordinatesFinal({
862
- distributionId,
863
- writes,
864
- verified: report.subjects,
865
- fleetRequirements,
866
- thirdPartyKeys: new Set(pinnedImages.keys()),
867
- });
868
- // Third-party subjects are NOT graded by the first-party fleet verdict, and are named here rather than skipped silently.
869
- for (const key of finality.thirdParty) {
870
- console.log(`[${label}] finality: ${key} third-party (pinned by digest), not a first-party fleet coordinate.`);
871
- }
872
- // The CORPUS, not a confirmation: how many coordinates were graded against
873
- // how many editions, and which editions made no claim. Without the
874
- // denominators a pass cannot be told from a pass over nothing, and the
875
- // editions root is printed because it BOUNDS the fleet this answer is about.
876
- console.log(
877
- `[${label}] finality: ${finality.coordinateCount} coordinate(s) graded against ` +
878
- `${editions.length} edition(s) under ${root}` +
879
- (withoutLock.length > 0
880
- ? ` (${withoutLock.length} declared no image lock: ${withoutLock.join(', ')})`
881
- : '') +
882
- `; ${finality.coordinateCount - finality.pendingElsewhere.length} final for every ` +
883
- `edition, ${finality.pendingElsewhere.length} final for this edition's own platforms only.`,
884
- );
885
- // THE ACCEPTED RESIDUAL, recorded one line per coordinate (owner ruling
886
- // 2026-09-29): another edition still awaits a platform THIS edition does not
887
- // declare, so a later supplement may move the tag. This seal keeps pinning
888
- // the manifest it verified, which serves every platform this edition needs.
889
- for (const pending of finality.pendingElsewhere) {
890
- console.log(
891
- `[${label}] RECORDED: ${pending.key} ${pending.coordinate} — ` +
892
- pending.unmet
893
- .map((u) => `${u.platform} pending for ${u.requiredBy.join(', ')}`)
894
- .join('; ') +
895
- `; not required by "${distributionId}" (serves: ${pending.served.join(', ') || 'nothing'}).`,
896
- );
897
- }
898
- } catch (error) {
899
- // RECONCILE: another edition is still awaiting a platform here. That is the
900
- // ORDINARY transient state while a supplement builds — the same shape as
901
- // "not published yet", and treated the same way for the same reason: a
902
- // daily job that reddens for a state nobody can act on today is one people
903
- // learn to bypass. The edition is skipped WHOLE and stays unsealed, so the
904
- // publication gate still refuses to ship it.
905
- if (ifPublished && isNotFinalYet(error)) {
906
- console.log(`[dist:seal-digests --if-published] ${error.message}`);
907
- console.log(
908
- `[dist:seal-digests --if-published] skipping this edition ENTIRELY and writing ` +
909
- 'nothing. It stays unsealed, and publication refuses an unsealed lock.',
910
- );
911
- return;
912
- }
913
- throw error;
914
- }
915
-
916
- if (check) {
917
- throw new Error(
918
- `${writes.length} subject(s) carry no imageDigest. Run without --check to seal them. ` +
919
- 'An unsealed lock cannot be installed by digest, and a tag-based install is ' +
920
- 'mutable lookup in the production path.',
921
- );
922
- }
923
-
924
- await sealEditionLocks({
925
- distributionId,
926
- root,
927
- digests: new Map(writes.map((w) => [w.key, w.digest])),
928
- check,
929
- label,
930
- catalogue,
931
- catalogueDigest,
932
- storePublisherAnchorKeys,
933
- });
934
- }
935
-
936
- if (isEntryModule(import.meta.url)) {
937
- main().catch((error) => {
938
- console.error(`[dist:seal-digests] ${error.message}`);
939
- // The footer is MODE-AWARE. Pointing a reader at a registry credential when
940
- // the gate that just failed never opens a socket is a remedy for the wrong
941
- // problem, and a wrong remedy costs more than no remedy.
942
- const offline = process.argv.includes('--publication-verdict');
943
- console.error(
944
- offline
945
- ? '[dist:seal-digests] fail-closed: this gate is OFFLINE — it read the lock and ' +
946
- 'nothing else, so no credential, network or registry state is involved in ' +
947
- 'the verdict above.'
948
- : '[dist:seal-digests] fail-closed: no digest above was assumed, and a partial ' +
949
- 'seal is never written. Registry credentials are declared in ' +
950
- 'image-registry-credentials.json.',
951
- );
952
- process.exit(1);
953
- });
954
- }