@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,1137 +0,0 @@
1
- #!/usr/bin/env node
2
- // dist-check — CI guard for the distribution packaging plane. Verifies:
3
- // 1. committed biome-index.json identities/order are valid offline
4
- // (`--check-sources` additionally scans a trusted clean aggregator);
5
- // 2. packaging contract tests are green (closure, immutability, parity);
6
- // 3. every distribution under distributions/*/xema-distribution.json resolves
7
- // cleanly AND its committed distribution.lock.json matches a fresh resolve;
8
- // 4. every distribution's committed images.lock.json is STRUCTURALLY in sync
9
- // with the committed distribution lock — the same actual runtime subjects,
10
- // complete platform bindings, and bundled web-biome set;
11
- // 5. the evidence trust policy the data root declares (if any): its
12
- // trusted-root digest and the data-root pin of the policy and of this
13
- // CLI's verifier agree, and its authority configuration is either
14
- // explicitly unarmed or fully armed (never partially configured); a data
15
- // root declaring none says so, and is refused if it holds an undeclared
16
- // policy.
17
- //
18
- // The distribution lock is compared in FULL (timestamp normalized out): its
19
- // `inputHash` is deterministic over (biomes + platformServices + manifest), so
20
- // any real packaging drift is caught. The image lock is compared
21
- // STRUCTURALLY ONLY — `contentHash` is deliberately excluded by the default
22
- // offline check. A content hash is source-derived from an exact Git commit and
23
- // changes whenever that committed source path/type/mode/content changes.
24
- // Uncommitted and ignored working-tree files are never inputs. Trusted
25
- // regeneration verifies exact commits with `--check-sources`.
26
- // It is never treated as an OCI digest or sufficient reuse evidence. Nonzero
27
- // exit on any structural drift or resolver error.
28
-
29
- import { execFileSync } from 'node:child_process';
30
- import { existsSync, readdirSync, readFileSync } from 'node:fs';
31
- import { dirname, join } from 'node:path';
32
- import { fileURLToPath } from 'node:url';
33
-
34
- import {
35
- AuthorizationLockCheck,
36
- checkEditionAuthorizationLock,
37
- loadKernelAuthorizationComposer,
38
- } from './authorization-base.mjs';
39
- import { verifyBiomeContentHashes } from './biome-content.mjs';
40
- import {
41
- EDITION_CHART_SET_FILE,
42
- EditionChartSetCheck,
43
- fleetChartSetLockPath,
44
- assertRosteredChartSetLock,
45
- checkEditionChartSet,
46
- } from './edition-chart-set.mjs';
47
- import { editionWorkspaceConfig } from './edition-config.mjs';
48
- import { editionPinnedInputs } from './edition-pinned-inputs.mjs';
49
- import { assertKernelEditionProtocol } from './edition-protocol.mjs';
50
- import { describeEditionHolds } from './edition-source-pins.mjs';
51
- import { WorkspaceRoot, biomeIndexPath, configureEditionWorkspaceFromProcess, dataRoot, editionsRoot, isEntryModule, kernelPackageDir, platformServiceIndexPath, runtimeImageSourceIndexPath, workspaceArgv } from './edition-workspace.mjs';
52
- import { checkEvidenceTrustPolicy } from './evidence-trust-policy.mjs';
53
- import { imageSubjectIdentity } from './image-subject-identity.mjs';
54
- import {
55
- compareIndexEntries,
56
- comparableDistributionLock,
57
- distributionBiomeSourceRepositories,
58
- isUnsealedDistributionLock,
59
- loadKernelDistributionSchemas,
60
- parseResolvedDistributionLock,
61
- serializeJson,
62
- sha256Hex,
63
- validateImmutableBiomeIndex,
64
- validateImmutableDistributionLock,
65
- validateImmutableImageLock,
66
- validateServiceDependencyOwnerParity,
67
- } from './lib.mjs';
68
- import { commandFor } from './remedy-command.mjs';
69
- import { assertReleaseGitSourcesDeclareNoBundle, resolveDistributionWithIndex } from './resolve-distribution.mjs';
70
- import {
71
- resolveDistributionDeclaredSources,
72
- resolveDistributionRequiredPlatforms,
73
- externalSourceTrees,
74
- carryComposedForwardStructurally,
75
- readCommittedPreviousLock,
76
- resolveImages,
77
- resolveComposedProcessStructure,
78
- resolveImageStructure,
79
- structureSubjects,
80
- sourceTreeLocator,
81
- supplementalSourcesFor,
82
- } from './resolve-images.mjs';
83
- import { withoutSealedDigests } from './seal-image-digests.mjs';
84
- import { createPinnedSourceAuthority } from './source-authority.mjs';
85
- import { readStorePublisherTrust } from './store-publisher-trust.mjs';
86
- import { CHECK_THIRD_PARTY_FLAG, COSIGN_BIN_ENV, COSIGN_FLAG } from './third-party-source-flags.mjs';
87
- import { loadThirdPartySourcePins } from './third-party-source-pins.mjs';
88
-
89
- if (isEntryModule(import.meta.url)) {
90
- configureEditionWorkspaceFromProcess([WorkspaceRoot.Data, WorkspaceRoot.Editions, WorkspaceRoot.Sources, WorkspaceRoot.Kernel, WorkspaceRoot.Deploy, WorkspaceRoot.Cache]);
91
- }
92
-
93
- const HERE = dirname(fileURLToPath(import.meta.url));
94
-
95
- /** Strip the volatile timestamp so committed-vs-fresh locks compare cleanly. */
96
- function normalize(lock) {
97
- const { resolvedAt: _resolvedAt, ...rest } = lock;
98
- return serializeJson(rest);
99
- }
100
-
101
- /** Outcome of a single committed-vs-fresh lock comparison. */
102
- const LockCheck = Object.freeze({
103
- GREEN: 'green',
104
- MISSING: 'missing',
105
- STALE: 'stale',
106
- });
107
-
108
- /**
109
- * Compare a freshly-resolved lock against its committed file (timestamp
110
- * normalized out). Pure — returns a {@link LockCheck} verdict; the caller owns
111
- * messaging and exit handling.
112
- *
113
- * ── THIS IS THE REBUILDABLE LOCK, AND THAT IS WHY A PLAIN DIFF IS VALID ─────
114
- *
115
- * `distribution.lock.json` and `images.lock.json` live side by side in every
116
- * edition directory and are DIFFERENT CLASSES. Only one of them may be checked
117
- * this way, and the reader is who gets it wrong, so it is said at the read
118
- * rather than at a definition:
119
- *
120
- * distribution.lock.json REBUILDABLE. A fresh resolve REPRODUCES it, byte
121
- * for byte once `resolvedAt` is normalised out. It
122
- * records a SELECTION derived from the manifests and
123
- * the pins, so regenerating it recomputes the same
124
- * answer from the same inputs. Measured 2026-09-28:
125
- * ZERO of the 9 committed distribution locks carries
126
- * an `imageDigest`, or any `sha256:` at all.
127
- *
128
- * images.lock.json SEALED. A fresh resolve does NOT reproduce it —
129
- * `resolve-images.mjs` emits no `imageDigest` at all
130
- * and says so in its own header, and the digests are
131
- * written afterwards by `seal-image-digests.mjs`.
132
- * Measured 2026-09-28 across the 9 committed locks:
133
- * 523 subjects, 523 of them sealed. So regenerating
134
- * that file does not recompute an answer — it
135
- * DISCARDS 523 approved digest bindings, and a plain
136
- * regenerate-and-diff reports every one of them as
137
- * drift.
138
- *
139
- * `checkImagesLock` below therefore subtracts the seal before comparing
140
- * (`withoutSealedDigests`, plus a purely structural pass). Do not "simplify"
141
- * the two reads into one shared helper: they agree on shape and disagree on
142
- * the only thing that matters.
143
- */
144
- async function compareCommittedLock(lockPath, fresh) {
145
- if (!existsSync(lockPath)) {return LockCheck.MISSING;}
146
- const schemas = await loadKernelDistributionSchemas();
147
- const raw = JSON.parse(readFileSync(lockPath, 'utf8'));
148
- validateImmutableDistributionLock(raw);
149
- return comparableDistributionLock(schemas, raw) === comparableDistributionLock(schemas, fresh)
150
- ? LockCheck.GREEN
151
- : LockCheck.STALE;
152
- }
153
-
154
- /**
155
- * Check one distribution's committed distribution.lock.json against a fresh
156
- * resolve. Returns true on green. The image lock is only meaningful when the
157
- * distribution lock is green (resolve-images reads it), so this gates that step.
158
- *
159
- * Returns the INDEX the fresh lock was resolved from (platform entries plus the
160
- * edition's source-walked ones) on green, `null` otherwise — the authorization
161
- * check below looks the lock's biomes up in that same index.
162
- */
163
- export async function checkDistributionLock(id) {
164
- const lockPath = join(editionsRoot(), id, 'distribution.lock.json');
165
- try {
166
- const { lock: fresh, index } = await resolveDistributionWithIndex(id);
167
- assertReleaseGitSourcesDeclareNoBundle(fresh, index);
168
- const verdict = await compareCommittedLock(lockPath, fresh);
169
- if (verdict === LockCheck.MISSING) {
170
- console.error(
171
- `[dist:check] ${id}: distribution.lock.json is missing. Run \`${commandFor('resolve-distribution.mjs', id)}\`.`,
172
- );
173
- return null;
174
- }
175
- if (verdict === LockCheck.STALE) {
176
- console.error(
177
- `[dist:check] ${id}: distribution.lock.json is out of date. Run \`${commandFor('resolve-distribution.mjs', id)}\`.`,
178
- );
179
- return null;
180
- }
181
- console.log(
182
- `[dist:check] ${id}: lock up to date (${fresh.biomes.length} biomes).`,
183
- );
184
- return index;
185
- } catch (err) {
186
- console.error(`[dist:check] ${id}: resolver error — ${err.message}`);
187
- return null;
188
- }
189
- }
190
-
191
- /**
192
- * Check one edition's committed `authorization.lock.json` against a fresh
193
- * composition by the PINNED kernel composer, over the edition's committed
194
- * distribution lock. Only meaningful once that lock is green, so the caller
195
- * gates on it. Returns true on green.
196
- *
197
- * Like `distribution.lock.json` this is a REBUILDABLE artifact — composition
198
- * is deterministic over the pinned kernel and the pinned module bytes — so the
199
- * whole lock is compared. The `.fga.yaml` tests are not re-run: an identical
200
- * `modelHash` is the model the sealer tested.
201
- */
202
- async function checkAuthorizationLock(id, kernel, index) {
203
- const editionDir = join(editionsRoot(), id);
204
- const remedy = `Run \`${commandFor('resolve-distribution.mjs', id)}\` with XEMA_FGA_CLI set.`;
205
- try {
206
- const lock = JSON.parse(readFileSync(join(editionDir, 'distribution.lock.json'), 'utf8'));
207
- const verdict = checkEditionAuthorizationLock({
208
- distributionId: id,
209
- editionDir,
210
- lockBiomes: lock.biomes,
211
- biomeOrigins: (await loadKernelDistributionSchemas()).biomeOriginsOfLock(lock),
212
- index,
213
- kernel,
214
- serialize: serializeJson,
215
- });
216
- if (verdict === AuthorizationLockCheck.GREEN) {
217
- console.log(
218
- kernel === null
219
- ? `[dist:check] ${id}: no authorization base (the pinned kernel ships no composer).`
220
- : `[dist:check] ${id}: authorization.lock.json up to date (generation ${kernel.currentPlatformGeneration}).`,
221
- );
222
- return true;
223
- }
224
- const why = {
225
- [AuthorizationLockCheck.MISSING]: 'authorization.lock.json is missing — the pinned kernel composes an authorization base for every edition.',
226
- [AuthorizationLockCheck.STALE]: 'authorization.lock.json is out of date.',
227
- [AuthorizationLockCheck.NOT_SEALABLE]: 'authorization.lock.json is committed, but the pinned kernel ships no composer that could reproduce it.',
228
- }[verdict];
229
- console.error(`[dist:check] ${id}: ${why} ${remedy}`);
230
- return false;
231
- } catch (err) {
232
- console.error(`[dist:check] ${id}: authorization base error — ${err.message}`);
233
- return false;
234
- }
235
- }
236
-
237
- /**
238
- * Structural view of an image lock: actual runtime subjects, platform bindings,
239
- * and web-biome bundle inputs with the build-time `contentHash` removed. Exact
240
- * repository commits remain part of the offline authority. Two locks
241
- * with the same structure ship the same images and bundle the same web biomes,
242
- * regardless of current source content (which the build re-hashes anyway).
243
- */
244
- /**
245
- * The committed lock with a stand-in `imageDigest` on every UNSEALED composed artifact, so the kernel can carry it forward.
246
- * The kernel's v5 parse refuses two composed artifacts sharing one imageDigest, so each stand-in is unique to its subject:
247
- * the sha256 of its identity (`imageSubjectIdentity`: `composed-process:<imageRef>:<contentHash>`, unique per lock).
248
- * It equals a real manifest digest only by a sha256 preimage, and it never reaches a verdict: both sides of every
249
- * comparison drop `imageDigest` (`withoutSealedDigests`).
250
- */
251
- export function withStandInDigests(lock, schemas) {
252
- return {
253
- ...lock,
254
- subjects: lock.subjects.map((subject) =>
255
- subject.kind === schemas.RuntimeImageSubjectKind.ComposedProcess && subject.imageDigest === undefined
256
- ? { ...subject, imageDigest: `sha256:${sha256Hex(imageSubjectIdentity(subject))}` }
257
- : subject,
258
- ),
259
- };
260
- }
261
-
262
- function imageStructure(lock) {
263
- return serializeJson({
264
- distributionId: lock.distributionId,
265
- contractAuthority: lock.contractAuthority,
266
- // The sealed `imageDigest` is removed FIRST, through the seal module's own
267
- // view: a resolver never produces one, so a committed lock that has been
268
- // sealed differs from a fresh resolve by exactly that field — and read raw
269
- // it was reported "structurally out of date" with a remedy (re-resolve)
270
- // that would have UNSEALED it. See `withoutSealedDigests`.
271
- subjects: withoutSealedDigests(lock).subjects.map(
272
- ({ contentHash: _contentHash, sourceManifestPath: _sourceManifestPath, ...rest }) => rest,
273
- ),
274
- webBiomes: lock.webBiomes ?? [],
275
- platformServiceBindings: lock.platformServiceBindings ?? [],
276
- });
277
- }
278
-
279
- /**
280
- * Check one distribution's committed images.lock.json against the canonical
281
- * image roster derived from its committed distribution lock. The default is
282
- * structural; `checkSourceEvidence` additionally re-hashes trusted source
283
- * trees. Returns true on green.
284
- *
285
- * ── THIS IS THE SEALED LOCK. IT IS NEVER COMPARED WHOLE ─────────────────────
286
- *
287
- * See `compareCommittedLock` above for the two classes. The consequence here
288
- * is mechanical: neither comparison below reads the committed file whole.
289
- * `imageStructure(...)` compares only the SHAPE (which subjects, which web
290
- * biomes, which bindings), and the source-evidence pass compares
291
- * `withoutSealedDigests(committed)` against a fresh resolve — the subtraction
292
- * that makes the two sides describe the same thing. A `normalize(committed)
293
- * === normalize(fresh)` here, which is exactly what the sibling check does and
294
- * exactly what it looks like this should do, would report all 523 sealed
295
- * subjects as stale on a clean tree and send the reader to re-resolve, which
296
- * is the operation that destroys the seal.
297
- */
298
- export async function checkImagesLock(id, checkSourceEvidence) {
299
- const imageLockPath = join(editionsRoot(), id, 'images.lock.json');
300
- try {
301
- const schemas = await loadKernelDistributionSchemas();
302
- // A pure READ of the committed lock: the shape-dispatching reader (unsealed
303
- // on develop, sealed v5 otherwise), never the writer.
304
- const distributionLock = validateImmutableDistributionLock(
305
- parseResolvedDistributionLock(
306
- schemas,
307
- JSON.parse(
308
- readFileSync(
309
- join(editionsRoot(), id, 'distribution.lock.json'),
310
- 'utf8',
311
- ),
312
- ),
313
- ),
314
- );
315
- // The EDITION's indexes: the committed ones, or rebuilt at the repositories it holds.
316
- const pinned = await editionPinnedInputs(id, { schemas });
317
- const runtimeSourceIndex = pinned.runtimeImageSourceIndex;
318
- const requiredPlatforms = resolveDistributionRequiredPlatforms(schemas, id);
319
- // The composed-process subjects are read from each producing repository's
320
- // DECLARATION at the pinned commit — the one structural input not in the
321
- // committed lock — through the same function the source resolve uses, so
322
- // the two cannot disagree on which composed subjects exist.
323
- const structure = resolveComposedProcessStructure(
324
- distributionLock,
325
- resolveImageStructure(
326
- distributionLock,
327
- runtimeSourceIndex,
328
- schemas,
329
- requiredPlatforms,
330
- resolveDistributionDeclaredSources(schemas, id),
331
- {
332
- biomeIndex: pinned.biomeIndex,
333
- supplementalSources: supplementalSourcesFor(runtimeSourceIndex),
334
- thirdPartyPins: loadThirdPartySourcePins(dataRoot()),
335
- },
336
- ),
337
- schemas,
338
- requiredPlatforms,
339
- );
340
- if (!existsSync(imageLockPath)) {
341
- console.error(
342
- `[dist:check] ${id}: images.lock.json is missing. Run \`${commandFor('resolve-images.mjs', id)}\`.`,
343
- );
344
- return false;
345
- }
346
- const committed = validateImmutableImageLock(
347
- (await readCommittedPreviousLock(id, imageLockPath)),
348
- schemas,
349
- );
350
- // The committed lock is the previous lock of the fresh resolve, so the fresh view carries the composed artifacts forward
351
- // exactly as a reseal does (generation, member keys, one artifact per live generation). Its digests are compared away
352
- // below, so a committed lock that predates sealing is given one stand-in digest per subject to be carried.
353
- const previousLock = withStandInDigests(committed, schemas);
354
- let freshSubjects;
355
- try {
356
- freshSubjects = carryComposedForwardStructurally({ subjects: structureSubjects(structure), previousLock, schemas });
357
- } catch (error) {
358
- console.error(
359
- `[dist:check] ${id}: images.lock.json is structurally out of date (its composed artifacts do not cover the declared composed processes: ${error.message}). ` +
360
- `Run \`${commandFor('resolve-images.mjs', id)}\`.`,
361
- );
362
- return false;
363
- }
364
- const fresh = {
365
- distributionId: id,
366
- contractAuthority: runtimeSourceIndex.contractAuthority,
367
- ...structure,
368
- subjects: freshSubjects,
369
- };
370
- if (
371
- serializeJson(committed.contractAuthority) !==
372
- serializeJson(runtimeSourceIndex.contractAuthority)
373
- ) {
374
- console.error(
375
- `[dist:check] ${id}: images.lock.json kernel contract authority does not exactly match runtime-image-source-index.json.`,
376
- );
377
- return false;
378
- }
379
- const inSync = imageStructure(committed) === imageStructure(fresh);
380
- if (!inSync) {
381
- console.error(
382
- `[dist:check] ${id}: images.lock.json is structurally out of date ` +
383
- `(server-image set or web-biome set differs from the distribution). ` +
384
- `Run \`${commandFor('resolve-images.mjs', id)}\`.`,
385
- );
386
- return false;
387
- }
388
- if (checkSourceEvidence) {
389
- const { imageLock: sourceResolved } = await resolveImages(id, { previousLock });
390
- // The same subtraction as the structural view above: the source resolve
391
- // carries no digest, and the committed lock may.
392
- if (
393
- normalize(withoutSealedDigests(committed)) !==
394
- normalize(withoutSealedDigests(sourceResolved))
395
- ) {
396
- console.error(
397
- `[dist:check] ${id}: images.lock.json source content hashes are out of date. ` +
398
- `Run \`${commandFor('resolve-images.mjs', id)}\` only from trusted exact Git commits. ` +
399
- `These hashes are source-derived tags, not OCI manifest digests.`,
400
- );
401
- return false;
402
- }
403
- }
404
- console.log(
405
- `[dist:check] ${id}: images lock up to date (${fresh.subjects.length} actual runtime subjects, ${fresh.webBiomes.length} web biomes` +
406
- `, ${fresh.platformServiceBindings.length} platform bindings` +
407
- `, ${committed.sourceHashAlgorithm}` +
408
- (checkSourceEvidence ? ', source hashes verified' : '') +
409
- ').',
410
- );
411
- return true;
412
- } catch (err) {
413
- console.error(`[dist:check] ${id}: image resolver error — ${err.message}`);
414
- return false;
415
- }
416
- }
417
-
418
- export async function checkCommittedRuntimeImageSourceIndex(checkSources) {
419
- try {
420
- const schemas = await loadKernelDistributionSchemas();
421
- schemas.parseRuntimeImageSourceIndex(
422
- JSON.parse(readFileSync(runtimeImageSourceIndexPath(), 'utf8')),
423
- );
424
- execFileSync(
425
- process.execPath,
426
- [
427
- join(HERE, 'build-runtime-image-source-index.mjs'),
428
- checkSources ? '--check-sources' : '--check',
429
- ...workspaceArgv(),
430
- ],
431
- { stdio: 'inherit' },
432
- );
433
- // Every pinned third-party source, from its committed evidence (a data root with none passes trivially).
434
- const cosign = process.env[COSIGN_BIN_ENV];
435
- execFileSync(
436
- process.execPath,
437
- [
438
- join(HERE, 'build-runtime-image-source-index.mjs'),
439
- CHECK_THIRD_PARTY_FLAG,
440
- ...(cosign === undefined || cosign === '' ? [] : [COSIGN_FLAG, cosign]),
441
- ...workspaceArgv(),
442
- ],
443
- { stdio: 'inherit' },
444
- );
445
- return true;
446
- } catch (error) {
447
- console.error(
448
- `[dist:check] committed runtime-image source index FAILED: ${error.message}`,
449
- );
450
- return false;
451
- }
452
- }
453
-
454
- export function checkCommittedIndex() {
455
- try {
456
- const index = validateImmutableBiomeIndex(
457
- JSON.parse(readFileSync(biomeIndexPath(), 'utf8')),
458
- );
459
- const sorted = [...index].sort(compareIndexEntries);
460
- if (serializeJson(index) !== serializeJson(sorted)) {
461
- throw new Error(
462
- 'entries are not in deterministic tier/id/target/repo order',
463
- );
464
- }
465
- const keys = new Set();
466
- for (const entry of index) {
467
- if (!Array.isArray(entry.serviceDependencies)) {
468
- throw new Error(
469
- `biome "${entry.id}" has no serviceDependencies projection`,
470
- );
471
- }
472
- const key = `${entry.id}\0${entry.target}\0${entry.repo}`;
473
- if (keys.has(key)) {
474
- throw new Error(
475
- `duplicate immutable source identity for biome "${entry.id}" (${entry.target}, ${entry.repo})`,
476
- );
477
- }
478
- keys.add(key);
479
- }
480
- console.log(
481
- `[dist:check] committed biome index: green — ${index.length} immutable, deterministically ordered entries.`,
482
- );
483
- return true;
484
- } catch (error) {
485
- console.error(
486
- `[dist:check] committed biome index FAILED: ${error.message}`,
487
- );
488
- return false;
489
- }
490
- }
491
-
492
- /**
493
- * The committed data-root files a VENDOR resolve reads that no other check
494
- * touches, read through the very functions the resolve calls (never a copy), so
495
- * a file moved or deleted in the data root fails here, naming the file, instead
496
- * of at the next resolve. The chart-set pin is read in `main` below. Offline.
497
- * `dist-check` is a vendor verb (its workspace states the vendor roots; a
498
- * customer `--definition` form never reaches it), so a customer data root is
499
- * never asked for these.
500
- */
501
- export function checkCommittedDataRootReaders() {
502
- let green = true;
503
- try {
504
- const repositories = distributionBiomeSourceRepositories();
505
- console.log(`[dist:check] Store source repositories: green — ${repositories.length} declared.`);
506
- } catch (error) {
507
- console.error(`[dist:check] Store source repositories FAILED: ${error.message}`);
508
- green = false;
509
- }
510
- try {
511
- const trust = readStorePublisherTrust();
512
- console.log(
513
- trust === undefined
514
- ? '[dist:check] Store publisher trust: none declared (valid).'
515
- : `[dist:check] Store publisher trust: green — ${trust.length} publisher(s).`,
516
- );
517
- } catch (error) {
518
- console.error(`[dist:check] Store publisher trust FAILED: ${error.message}`);
519
- green = false;
520
- }
521
- return green;
522
- }
523
-
524
- export async function checkCommittedPlatformServiceIndex() {
525
- try {
526
- const schemas = await loadKernelDistributionSchemas();
527
- const index = schemas.parsePlatformServiceSourceIndex(
528
- JSON.parse(readFileSync(platformServiceIndexPath(), 'utf8')),
529
- );
530
- validateServiceDependencyOwnerParity(
531
- validateImmutableBiomeIndex(
532
- JSON.parse(readFileSync(biomeIndexPath(), 'utf8')),
533
- ),
534
- index,
535
- );
536
- execFileSync(
537
- process.execPath,
538
- [join(HERE, 'build-platform-service-index.mjs'), '--check', ...workspaceArgv()],
539
- { stdio: 'inherit' },
540
- );
541
- console.log(
542
- `[dist:check] committed platform-service index: green — ${index.services.length} exact source identities.`,
543
- );
544
- return true;
545
- } catch (error) {
546
- console.error(
547
- `[dist:check] committed platform-service index FAILED: ${error.message}`,
548
- );
549
- return false;
550
- }
551
- }
552
-
553
- export function discoverDistributionIds() {
554
- if (!existsSync(editionsRoot())) {
555
- console.error(`[dist:check] ${editionsRoot()} does not exist.`);
556
- process.exit(1);
557
- }
558
- const ids = readdirSync(editionsRoot(), { withFileTypes: true })
559
- .filter(
560
- (d) =>
561
- d.isDirectory() &&
562
- existsSync(join(editionsRoot(), d.name, 'xema-distribution.json')),
563
- )
564
- .map((d) => d.name)
565
- .sort();
566
- if (ids.length === 0) {
567
- console.error('[dist:check] no distributions found to check.');
568
- process.exit(1);
569
- }
570
- return ids;
571
- }
572
-
573
- /**
574
- * The lock-free half of the ownership guard: the kernel's reader, exercised
575
- * against synthetic tables. (a) two biomes claiming one domain is refused,
576
- * naming it; (b) a listed domain resolves to its owner and an unlisted one is
577
- * not first-party; (c) an invalid domain is refused. Reads no lock, so the
578
- * authored check runs it too.
579
- *
580
- * @param {(lock: object) => Map<string, string>} resolveFirstPartyCapabilityDomains the kernel's reader
581
- * @returns {string[]} the failures, empty when green
582
- */
583
- export function ownershipSelfTestFailures(resolveFirstPartyCapabilityDomains) {
584
- const lockOf = (capabilityDomainOwners) => ({
585
- schemaVersion: 1,
586
- distributionId: 'dist-check-selftest',
587
- biomes: [],
588
- platformServices: [],
589
- capabilityDomainOwners,
590
- });
591
-
592
- const failures = [];
593
-
594
- // (a) collision → throws.
595
- try {
596
- resolveFirstPartyCapabilityDomains(
597
- lockOf([
598
- { domain: 'acme', biomeId: 'alpha' },
599
- { domain: 'acme', biomeId: 'beta' },
600
- ]),
601
- );
602
- failures.push(
603
- 'two biomes claiming the same domain "acme" did NOT throw — an ambiguous ownership claim must fail the resolve',
604
- );
605
- } catch (err) {
606
- if (!err.message.includes('acme')) {
607
- failures.push(
608
- `collision threw, but the message does not name the domain: ${err.message}`,
609
- );
610
- }
611
- }
612
-
613
- // (b) a listed domain is first-party; an unlisted one is not.
614
- const owners = resolveFirstPartyCapabilityDomains(
615
- lockOf([{ domain: 'acme', biomeId: 'alpha' }]),
616
- );
617
- if (owners.get('acme') !== 'alpha') {
618
- failures.push(
619
- `a listed domain did not resolve to its owner (got ${String(owners.get('acme'))}, want "alpha")`,
620
- );
621
- }
622
- if (resolveFirstPartyCapabilityDomains(lockOf([])).has('acme')) {
623
- failures.push(
624
- 'a domain listed in NO table entry resolved as first-party — a claim outside the lock must carry no weight',
625
- );
626
- }
627
-
628
- // (c) an invalid domain is refused rather than silently carried.
629
- try {
630
- resolveFirstPartyCapabilityDomains(
631
- lockOf([{ domain: 'Acme!', biomeId: 'alpha' }]),
632
- );
633
- failures.push('an invalid capability domain "Acme!" was accepted');
634
- } catch {
635
- /* expected */
636
- }
637
-
638
- return failures;
639
- }
640
-
641
- /**
642
- * Guard for the capability-domain OWNERSHIP (reservation) table.
643
- *
644
- * This repo has no test runner (no package.json, no CI workflow of its own) —
645
- * `dist:check` IS its gate — so the invariant is asserted here, where it
646
- * actually runs, rather than in a spec file nothing would execute.
647
- *
648
- * THE INVARIANT THAT MATTERS: **every edition carries the IDENTICAL table.**
649
- *
650
- * Ownership is a property of the platform, not of what an edition preloads.
651
- * An earlier design put the claim on each `LockedBiome`, which made a trimmed
652
- * edition (`appliance-lean`) leave `kb`/`agent`/… unowned — so an
653
- * org admin could install the owning biome from the store and THEN bind
654
- * `kb:page.read@1` to a URL they control, silently shadowing the platform
655
- * data plane. The table is now built from the FULL biome index and reserves
656
- * the domain even when its owning biome is absent from that edition — which
657
- * is exactly the case the reservation exists to cover.
658
- *
659
- * Also re-asserts the two structural rules, through the KERNEL's own reader:
660
- * (a) two biomes claiming the SAME domain is refused (ambiguous ownership has
661
- * no safe resolution — fail the build, never pick a winner);
662
- * (b) a domain in NO table entry is not first-party (so a claim that never
663
- * made it into a resolved, committed, drift-checked lock carries no
664
- * weight), and an invalid domain is refused rather than silently carried.
665
- *
666
- * @param {string[]} ids every distribution id discovered in this repo.
667
- * @returns {Promise<boolean>} true when green.
668
- */
669
- async function checkOwnershipInvariant(ids) {
670
- const { resolveFirstPartyCapabilityDomains } =
671
- await loadKernelDistributionSchemas();
672
-
673
- const failures = ownershipSelfTestFailures(resolveFirstPartyCapabilityDomains);
674
-
675
- // (d) THE headline invariant — every committed edition carries the same,
676
- // non-empty table. An edition-specific table is the fail-open bug.
677
- let reference;
678
- for (const id of ids) {
679
- const lockPath = join(editionsRoot(), id, 'distribution.lock.json');
680
- if (!existsSync(lockPath)) {continue;}
681
- const table = validateImmutableDistributionLock(
682
- JSON.parse(readFileSync(lockPath, 'utf8')),
683
- ).capabilityDomainOwners;
684
- if (!Array.isArray(table) || table.length === 0) {
685
- failures.push(
686
- `distribution "${id}": capabilityDomainOwners is missing or empty — an empty reservation table means NOTHING is first-party (fail-open)`,
687
- );
688
- continue;
689
- }
690
- const serialized = serializeJson(table);
691
- if (reference === undefined) {
692
- reference = { id, serialized, size: table.length };
693
- } else if (serialized !== reference.serialized) {
694
- failures.push(
695
- `distribution "${id}" carries a DIFFERENT capabilityDomainOwners table than "${reference.id}" — ` +
696
- `ownership must not vary by edition, or a trimmed edition silently leaves domains org-bindable`,
697
- );
698
- }
699
- }
700
-
701
- if (failures.length > 0) {
702
- for (const f of failures) {
703
- console.error(`[dist:check] ownership-invariant FAILED: ${f}`);
704
- }
705
- return false;
706
- }
707
- console.log(
708
- `[dist:check] capability-domain reservation table: green — ${reference?.size ?? 0} domains, identical across all ${ids.length} editions.`,
709
- );
710
- return true;
711
- }
712
-
713
- // ═══════════════════════════════════════════════════════════════════════════
714
- // BIOME CONFINEMENT — which editions may ship a biome whose CONTENTS must not
715
- // reach a customer installation.
716
- //
717
- // Two different facts, one mechanism, because the question is identical:
718
- // "which resolved locks may carry this biome, and what breaks if another one
719
- // does?" The ANSWER differs per declaration and is carried as data.
720
- //
721
- // `licensing` holds two private keys: the Ed25519 key that signs long-lived
722
- // customer licences, and the RSA key that signs registry tokens. The licence
723
- // is verified OFFLINE by @xemahq/license-verifier against a CLOSED,
724
- // compiled-in trust store — including on an air-gapped appliance that never
725
- // reaches this service. So whoever holds the issuing key can mint any tier,
726
- // unlimited seats, accepted fleet-wide, and revocation is unreachable
727
- // offline.
728
- //
729
- // `fleet-management` holds the Xema-VENDOR directory of customers and their
730
- // installations — `Client`, `CustomerRepo`, `CustomerDistribution`,
731
- // `CustomerImageEntitlement`, `CustomerDeployment`, `Appliance`,
732
- // `ProvisioningProfile`. That is commercial operations, not the generic
733
- // product model: inside a customer's own installation people are
734
- // `Organization` / `Subject` / `ExternalSubject` / `Space`, and a
735
- // customer-managed or offline Xema must not need our commercial inventory to
736
- // function. An edition that shipped it would put every OTHER customer's name,
737
- // slug, deployment targets, appliance serials and delivery grants into one
738
- // customer's installation.
739
- //
740
- // WHAT ACTUALLY HOLDS THEM OUT TODAY, AND HOW THIN THAT IS
741
- // `core` selects { tier: "base" }. BOTH biomes ARE tier "base", first-party,
742
- // deliverable — they match core's selector on every axis but ONE:
743
- // `e.audience !== 'operator'` in resolve-distribution.mjs. A single enum
744
- // comparison, in a file nobody edits when they are editing an edition.
745
- //
746
- // And an explicit { "biome": "<id>" } include is the SUPPORTED way to bypass
747
- // that comparison: naming an operator biome is how you force it in. That is a
748
- // one-line edit to an edition manifest which reads in review as a packaging
749
- // diff and IS a key-custody — or a commercial-inventory — decision. The same
750
- // shape .claude/rules/menu-audience-tiers.md forbids from the other direction
751
- // — a permission derived from a packaging label — arriving here as an
752
- // exposure derived from a selector.
753
- //
754
- // WHY THIS ASSERTS ON THE RESOLVED LOCK, NOT ON THE SELECTOR
755
- // Because there are three ways in and only the OUTPUT sees all of them: an
756
- // explicit `{ biome }` include, a widened `{ tier }`/`{ origin }` branch in
757
- // the resolver, and an `audience` change in biome-index.json. A gate that
758
- // read the selector would be blind to the other two.
759
- //
760
- // A comment explaining why licensing is absent from core is worth nothing
761
- // beside an assertion that fails when someone puts it there.
762
- // ═══════════════════════════════════════════════════════════════════════════
763
-
764
- /**
765
- * Biomes whose contents must not reach an unadmitted installation, and the
766
- * editions each is ADMITTED to. They are the data root's
767
- * (`confinedBiomes` in edition-workspace.json): the library owns the rule and
768
- * the schema, never which biome is confined or which edition may carry it.
769
- * A data root that confines nothing declares no section and has no admissions
770
- * to check. Adding an id to `admittedEditions` is the decision — make it
771
- * deliberately, in its own commit, and say who agreed.
772
- *
773
- * `consequence` is not decoration: it is what the failure message tells the
774
- * next reader is at stake, and it differs per declaration. A generic "this
775
- * biome is confined" message would leave them weighing a packaging diff.
776
- */
777
- const confinedBiomes = () => editionWorkspaceConfig().confinedBiomes ?? [];
778
-
779
- /**
780
- * The decision, as a pure function so it can be exercised against synthetic
781
- * input below rather than only against a tree that happens to be clean today.
782
- *
783
- * @param {{biomeId: string, holds: string, consequence: string, admittedEditions: readonly string[]}[]} declarations
784
- * @param {Set<string>} knownBiomeIds every id biome-index.json carries
785
- * @param {Map<string, string[]>} shippingByBiome biomeId -> edition ids shipping it
786
- * @returns {string[]}
787
- */
788
- function confinementFailures(declarations, knownBiomeIds, shippingByBiome, gradedEditions) {
789
- const failures = [];
790
- for (const decl of declarations) {
791
- // POSITIVE CONTROL, and the reason this is not decoration: if the biome id
792
- // ever stops resolving — a rename, a carve, a typo — every lock scan below
793
- // looks for a name nothing can carry, finds nothing, and the gate passes
794
- // while guarding nothing. That is the green-while-executing-nothing shape,
795
- // so an unresolvable declaration is a FAILURE, never a skip.
796
- if (!knownBiomeIds.has(decl.biomeId)) {
797
- failures.push(
798
- `confinement declaration names biome "${decl.biomeId}", which biome-index.json does not carry. ` +
799
- 'Either the biome was renamed — repoint this declaration — or it is genuinely gone and the ' +
800
- 'declaration should be deleted. It must not be left pointing at nothing: this gate would ' +
801
- 'then scan every lock for a name none of them can hold and pass without checking anything.',
802
- );
803
- continue;
804
- }
805
- const shipping = shippingByBiome.get(decl.biomeId) ?? [];
806
- for (const edition of shipping) {
807
- if (decl.admittedEditions.includes(edition)) {continue;}
808
- failures.push(
809
- `edition "${edition}" ships biome "${decl.biomeId}", which holds ${decl.holds}. ` +
810
- `That is a CONFINEMENT decision, not a packaging one: ${decl.consequence}. ` +
811
- 'If this is intended, add the edition to admittedEditions in the ' +
812
- '"confinedBiomes" section of edition-workspace.json in its own commit, naming who agreed.',
813
- );
814
- }
815
- for (const edition of decl.admittedEditions) {
816
- if (shipping.includes(edition)) {continue;}
817
- // AN UNGRADED EDITION IS UNJUDGED, NOT STALE.
818
- //
819
- // `shipping` is built only from the locks this run actually READ, so
820
- // "not shipping" and "not in the corpus" are the same absence here — and
821
- // they have opposite meanings. Judged over a partial corpus, every
822
- // admission naming an edition outside it reports as dead permission and
823
- // the remedy printed is "Delete it", which would delete a live admission
824
- // on the evidence of a lock the run never opened.
825
- //
826
- // It is not a customer-root accommodation: the same false finding fires
827
- // in the vendor's own repository for any edition that is declared and not
828
- // yet resolved. The corpus was always the right fence; nothing stated it
829
- // while the corpus was always the full set.
830
- if (!gradedEditions.has(edition)) {continue;}
831
- failures.push(
832
- `confinement admission "${decl.biomeId}" -> "${edition}" suppresses NOTHING: that edition does ` +
833
- 'not ship the biome. A standing admission for an edition that does not use it is a permission ' +
834
- 'nobody reviewed still sitting open. Delete it.',
835
- );
836
- }
837
- }
838
- return failures;
839
- }
840
-
841
- /**
842
- * @param {string[]} ids every discovered distribution id
843
- * @returns {boolean} true when the plane is within its declared confinement
844
- */
845
- function checkConfinementScope(ids) {
846
- const index = JSON.parse(readFileSync(biomeIndexPath(), 'utf8'));
847
- const entries = Array.isArray(index) ? index : (index.biomes ?? []);
848
- const knownBiomeIds = new Set(entries.map((entry) => entry?.id).filter(Boolean));
849
-
850
- const shippingByBiome = new Map();
851
- // THE LOCKS COME FROM THE EDITION CONTENT ROOT, never from `HERE`.
852
- //
853
- // `ids` is discovered under editionsRoot() and the locks were read from HERE,
854
- // so the two agreed only while tooling and content were one directory. Point
855
- // the root at a customer's `distribution/` and every `existsSync` below
856
- // answered false, every id was skipped, `shippingByBiome` stayed empty — and
857
- // `confinementFailures` over an empty map reports nothing. The confinement
858
- // check PASSED while grading not one edition, which is worse than failing:
859
- // it is the one shape that reads as protection in review.
860
- let locksRead = 0;
861
- /** The ids whose lock this run actually OPENED — the corpus, not the roster. */
862
- const gradedEditions = new Set();
863
- for (const id of ids) {
864
- const lockPath = join(editionsRoot(), id, 'distribution.lock.json');
865
- // A single unresolved edition is legitimate — it has a manifest and no lock
866
- // yet, and the lock-currency check above is what speaks to that. ALL of them
867
- // being unreadable is not, and is refused below rather than skipped.
868
- if (!existsSync(lockPath)) {continue;}
869
- locksRead += 1;
870
- gradedEditions.add(id);
871
- const lock = JSON.parse(readFileSync(lockPath, 'utf8'));
872
- for (const biome of lock.biomes ?? []) {
873
- const biomeId = biome?.id ?? biome?.biomeId;
874
- if (!biomeId) {continue;}
875
- if (!shippingByBiome.has(biomeId)) {shippingByBiome.set(biomeId, []);}
876
- shippingByBiome.get(biomeId).push(id);
877
- }
878
- }
879
-
880
- // The predicate, exercised against synthetic input. Without this the gate is
881
- // only ever run against a tree that is already clean, which proves nothing
882
- // about what it does when the tree is not.
883
- const probe = [
884
- { biomeId: 'probe', holds: 'a probe key', consequence: 'a probe consequence', admittedEditions: ['allowed'] },
885
- ];
886
- const known = new Set(['probe']);
887
- const graded = new Set(['allowed', 'sneaked']);
888
- const cases = [
889
- [new Map([['probe', ['allowed']]]), graded, 0, 'an admitted edition is silent'],
890
- [new Map([['probe', ['allowed', 'sneaked']]]), graded, 1, 'an unadmitted edition must fail'],
891
- [new Map(), graded, 1, 'an admission that suppresses nothing must fail as stale'],
892
- // THE CORPUS FENCE, both ways. The pair is the point: the SAME empty
893
- // `shipping` is a stale admission when the edition was graded and silence
894
- // when it was not. Without the second case a corpus regression is invisible,
895
- // because the first one passes either way.
896
- [new Map(), new Set(), 0, 'an admission for an edition OUTSIDE the corpus is unjudged, not stale'],
897
- [
898
- new Map([['probe', ['sneaked']]]),
899
- new Set(),
900
- 1,
901
- 'confinement itself still fires on an ungraded corpus — only the STALE arm is scoped',
902
- ],
903
- ];
904
- const selfTest = [];
905
- for (const [shipping, corpus, want, why] of cases) {
906
- const got = confinementFailures(probe, known, shipping, corpus).length;
907
- if (got !== want) {selfTest.push(`confinement self-test: expected ${want} failure(s), got ${got} — ${why}`);}
908
- }
909
- if (
910
- confinementFailures(
911
- [{ biomeId: 'gone', holds: 'x', consequence: 'y', admittedEditions: [] }],
912
- known,
913
- new Map(),
914
- graded,
915
- ).length !== 1
916
- ) {
917
- selfTest.push('confinement self-test: a declaration naming an unknown biome must fail, not pass vacuously');
918
- }
919
- // Each declaration must name what is at stake. A blank `consequence` would
920
- // still fail the right editions and would tell whoever hit it nothing, which
921
- // is how an assertion becomes a speed bump.
922
- for (const decl of confinedBiomes()) {
923
- if (typeof decl.consequence !== 'string' || decl.consequence.trim().length < 40) {
924
- selfTest.push(
925
- `confinement declaration "${decl.biomeId}" carries no substantive \`consequence\`; the failure ` +
926
- 'message would name a rule without naming what it protects.',
927
- );
928
- }
929
- }
930
-
931
- // A ZERO-LOCK SCAN IS A FAILURE, not a pass. Without this the only signal that
932
- // the check graded nothing is a corpus line nobody reads, and the exit code of
933
- // a vacuous run is identical to the exit code of a clean one.
934
- const emptyCorpus =
935
- ids.length > 0 && locksRead === 0
936
- ? [
937
- `confinement read 0 of ${String(ids.length)} edition lock(s) under ${editionsRoot()}. ` +
938
- 'Nothing was graded, so this is not evidence that the plane is confined. Either the ' +
939
- 'editions root is wrong, or no edition in it has been resolved yet.',
940
- ]
941
- : [];
942
-
943
- const failures = [
944
- ...selfTest,
945
- ...emptyCorpus,
946
- ...confinementFailures(confinedBiomes(), knownBiomeIds, shippingByBiome, gradedEditions),
947
- ];
948
- if (failures.length > 0) {
949
- console.error('✘ [dist-check] biome confinement:');
950
- for (const failure of failures) {console.error(` - ${failure}`);}
951
- return false;
952
- }
953
- console.log(
954
- `[dist-check] biome confinement: ${confinedBiomes().length} confined biome(s) checked against ` +
955
- `${String(locksRead)} of ${String(ids.length)} edition lock(s) under ${editionsRoot()}; ` +
956
- `${confinedBiomes().reduce((n, d) => n + d.admittedEditions.length, 0)} admission(s).`,
957
- );
958
- return true;
959
- }
960
-
961
- /**
962
- * The verify half of the seal: every biome's `biomeContentHash` is RECOMPUTED
963
- * from the manifest, the git tree at the pinned commit and the sealed image
964
- * digests, and a mismatch is refused naming the biome. The kernel cannot do
965
- * this ("sealed" is only a field). Returns true on green.
966
- */
967
- export async function checkBiomeContentHashes(id) {
968
- try {
969
- const schemas = await loadKernelDistributionSchemas();
970
- const rawLock = JSON.parse(readFileSync(join(editionsRoot(), id, 'distribution.lock.json'), 'utf8'));
971
- if (isUnsealedDistributionLock(rawLock)) {
972
- console.log(`[dist:check] ${id}: unsealed lock, no biome content hashes to verify until sealed.`);
973
- return true;
974
- }
975
- const lock = schemas.parseDistributionLock(rawLock);
976
- const imageLock = schemas.parseImageLock(
977
- JSON.parse(readFileSync(join(editionsRoot(), id, 'images.lock.json'), 'utf8')),
978
- );
979
- const authority = createPinnedSourceAuthority({ pins: (await editionPinnedInputs(id, { schemas })).repositoryPins });
980
- await verifyBiomeContentHashes({
981
- schemas,
982
- lock,
983
- imageLock,
984
- locate: sourceTreeLocator(externalSourceTrees(lock)),
985
- vendoredCommit: (repo) => authority.vendoredSourceCommitForRepository(repo),
986
- });
987
- console.log(`[dist:check] ${id}: ${lock.biomes.length} biomeContentHash(es) recomputed from their sources.`);
988
- return true;
989
- } catch (err) {
990
- console.error(`[dist:check] ${id}: ${err.message}`);
991
- return false;
992
- }
993
- }
994
-
995
- /**
996
- * The data-root plane both checks grade before any edition: the kernel speaks
997
- * a supported edition protocol (a refusal throws), the committed biome,
998
- * platform-service and runtime-image-source indexes validate offline, the
999
- * evidence trust policy and the data-root readers are sound. `checkSources`
1000
- * adds the trusted live-source audit of the indexes (release path only).
1001
- * Returns true when green.
1002
- */
1003
- export async function checkDataRootPlane({ checkSources }) {
1004
- let green = true;
1005
- // 0. The pinned kernel speaks an edition protocol this CLI supports. This is
1006
- // the ONE comparison between the CLI and the kernel; a refusal throws
1007
- // EditionProtocolMismatchError and stops the check before anything is read.
1008
- const protocol = assertKernelEditionProtocol(kernelPackageDir());
1009
- console.log(
1010
- `[dist:check] the kernel speaks edition protocol v${protocol.version} (${protocol.contentDigest}), which this CLI supports.`,
1011
- );
1012
-
1013
- // 1. Offline committed-index validation is the default authority boundary.
1014
- // A live sibling-source scan is an explicit trusted regeneration audit only;
1015
- // CI/shared working trees must not make unrelated uncommitted sources into
1016
- // packaging inputs.
1017
- if (!checkCommittedIndex()) {green = false;}
1018
- if (!(await checkCommittedPlatformServiceIndex())) {green = false;}
1019
- if (!(await checkCommittedRuntimeImageSourceIndex(checkSources))) {
1020
- green = false;
1021
- }
1022
- if (!(await checkEvidenceTrustPolicy())) {green = false;}
1023
- if (!checkCommittedDataRootReaders()) {green = false;}
1024
- if (checkSources) {
1025
- try {
1026
- execFileSync(
1027
- process.execPath,
1028
- [join(HERE, 'build-biome-index.mjs'), '--check', ...workspaceArgv()],
1029
- { stdio: 'inherit' },
1030
- );
1031
- execFileSync(
1032
- process.execPath,
1033
- [join(HERE, 'build-platform-service-index.mjs'), '--check-sources', ...workspaceArgv()],
1034
- { stdio: 'inherit' },
1035
- );
1036
- } catch {
1037
- green = false;
1038
- }
1039
- }
1040
- return green;
1041
- }
1042
-
1043
- /**
1044
- * The pinned kernel's authorization composer (`kernel` null when the pin
1045
- * predates it). `green` is false when the composer could not be loaded.
1046
- */
1047
- export async function loadPlaneAuthorizationKernel() {
1048
- try {
1049
- return { green: true, kernel: await loadKernelAuthorizationComposer({ kernelPackageDir: kernelPackageDir() }) };
1050
- } catch (err) {
1051
- console.error(`[dist:check] ${err.message}`);
1052
- return { green: false, kernel: undefined };
1053
- }
1054
- }
1055
-
1056
- /**
1057
- * The fleet chart-set pin every edition must carry (edition-chart-set.mjs), as
1058
- * committed text, or null when it is absent or not a rostered chart-set lock.
1059
- */
1060
- export function readFleetChartSetPin() {
1061
- try {
1062
- const text = readFileSync(fleetChartSetLockPath(), 'utf8');
1063
- assertRosteredChartSetLock(JSON.parse(text), EDITION_CHART_SET_FILE);
1064
- return text;
1065
- } catch (err) {
1066
- console.error(`[dist:check] chart-set pin: ${err.message}. Run \`${commandFor('resolve-chart-set.mjs')}\`.`);
1067
- return null;
1068
- }
1069
- }
1070
-
1071
- async function main() {
1072
- let failed = false;
1073
- // The tests spawned below resolve the editions root from THEIR OWN argv and
1074
- // env; a root stated here by --editions-root must reach them, or they
1075
- // would grade the vendor's editions under a customer's dist-check.
1076
- const checkSources = process.argv.includes('--check-sources');
1077
-
1078
- if (!(await checkDataRootPlane({ checkSources }))) {failed = true;}
1079
-
1080
- const distributionIds = discoverDistributionIds();
1081
-
1082
- for (const line of describeEditionHolds(distributionIds)) {console.log(line);}
1083
-
1084
- if (!checkConfinementScope(distributionIds)) {failed = true;}
1085
-
1086
- // 1b. Capability-domain reservation table (see checkOwnershipInvariant).
1087
- if (!(await checkOwnershipInvariant(distributionIds))) {failed = true;}
1088
-
1089
- // The pinned kernel's authorization composer (null when the pin predates it).
1090
- const { green: authorizationKernelGreen, kernel: authorizationKernel } = await loadPlaneAuthorizationKernel();
1091
- if (!authorizationKernelGreen) {failed = true;}
1092
-
1093
- // The fleet chart-set pin every edition must carry (edition-chart-set.mjs).
1094
- const chartSetPinText = readFleetChartSetPin();
1095
- if (chartSetPinText === null) {failed = true;}
1096
-
1097
- // 3 + 4 + 5 + 6 + 7. Every distribution: distribution.lock, images.lock,
1098
- // authorization.lock, chart-set.lock.
1099
- for (const id of distributionIds) {
1100
- if (chartSetPinText !== null) {
1101
- const verdict = checkEditionChartSet(join(editionsRoot(), id), chartSetPinText);
1102
- if (verdict === EditionChartSetCheck.GREEN) {
1103
- console.log(`[dist:check] ${id}: ${EDITION_CHART_SET_FILE} carries the fleet chart-set pin.`);
1104
- } else {
1105
- console.error(
1106
- `[dist:check] ${id}: ${EDITION_CHART_SET_FILE} is ${verdict === EditionChartSetCheck.MISSING ? 'missing' : 'not the fleet pin'} — ` +
1107
- `an edition carries the chart generation it is rendered with. Run \`${commandFor('resolve-chart-set.mjs')}\`.`,
1108
- );
1109
- failed = true;
1110
- }
1111
- }
1112
- const resolutionIndex = await checkDistributionLock(id);
1113
- if (resolutionIndex === null) {
1114
- // A stale/missing distribution lock would only make the image check emit a
1115
- // misleading error (resolve-images reads it) — let the distribution-lock
1116
- // failure stand as the single actionable message for this distribution.
1117
- failed = true;
1118
- continue;
1119
- }
1120
- const imagesLockGreen = await checkImagesLock(id, checkSources);
1121
- if (!imagesLockGreen) {failed = true;}
1122
- else if (!(await checkBiomeContentHashes(id))) {failed = true;}
1123
- if (authorizationKernel !== undefined && !(await checkAuthorizationLock(id, authorizationKernel, resolutionIndex))) {
1124
- failed = true;
1125
- }
1126
- }
1127
-
1128
- if (failed) {process.exit(1);}
1129
- console.log('[dist:check] all distributions green.');
1130
- }
1131
-
1132
- if (isEntryModule(import.meta.url)) {
1133
- main().catch((err) => {
1134
- console.error(`[dist:check] ${err.message}`);
1135
- process.exit(1);
1136
- });
1137
- }