@xemahq/xema 0.13.0 → 0.14.0

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 (331) hide show
  1. package/README.md +68 -20
  2. package/dist/assets/boot-graph.json +57 -15
  3. package/dist/assets/core/distribution.lock.json +667 -297
  4. package/dist/assets/core/images.lock.json +136 -136
  5. package/dist/assets/oss/distribution.lock.json +1497 -461
  6. package/dist/assets/oss/images.lock.json +423 -188
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +36 -1
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/apply.d.ts.map +1 -1
  11. package/dist/commands/apply.js +1 -1
  12. package/dist/commands/apply.js.map +1 -1
  13. package/dist/commands/biome-dev.d.ts +3 -0
  14. package/dist/commands/biome-dev.d.ts.map +1 -0
  15. package/dist/commands/biome-dev.js +176 -0
  16. package/dist/commands/biome-dev.js.map +1 -0
  17. package/dist/commands/biome-validate.d.ts +10 -0
  18. package/dist/commands/biome-validate.d.ts.map +1 -0
  19. package/dist/commands/biome-validate.js +49 -0
  20. package/dist/commands/biome-validate.js.map +1 -0
  21. package/dist/commands/biome.d.ts.map +1 -1
  22. package/dist/commands/biome.js +359 -25
  23. package/dist/commands/biome.js.map +1 -1
  24. package/dist/commands/canopy.d.ts +3 -0
  25. package/dist/commands/canopy.d.ts.map +1 -0
  26. package/dist/commands/canopy.js +214 -0
  27. package/dist/commands/canopy.js.map +1 -0
  28. package/dist/commands/config.d.ts +3 -0
  29. package/dist/commands/config.d.ts.map +1 -0
  30. package/dist/commands/config.js +78 -0
  31. package/dist/commands/config.js.map +1 -0
  32. package/dist/commands/dev.d.ts.map +1 -1
  33. package/dist/commands/dev.js +71 -21
  34. package/dist/commands/dev.js.map +1 -1
  35. package/dist/commands/dist.js +1 -1
  36. package/dist/commands/dist.js.map +1 -1
  37. package/dist/commands/down.d.ts.map +1 -1
  38. package/dist/commands/down.js +40 -6
  39. package/dist/commands/down.js.map +1 -1
  40. package/dist/commands/import.d.ts.map +1 -1
  41. package/dist/commands/import.js +1 -1
  42. package/dist/commands/import.js.map +1 -1
  43. package/dist/commands/installation.d.ts +3 -0
  44. package/dist/commands/installation.d.ts.map +1 -0
  45. package/dist/commands/installation.js +101 -0
  46. package/dist/commands/installation.js.map +1 -0
  47. package/dist/commands/logs.d.ts.map +1 -1
  48. package/dist/commands/logs.js +6 -14
  49. package/dist/commands/logs.js.map +1 -1
  50. package/dist/commands/objects.d.ts.map +1 -1
  51. package/dist/commands/objects.js +85 -6
  52. package/dist/commands/objects.js.map +1 -1
  53. package/dist/commands/plan.d.ts.map +1 -1
  54. package/dist/commands/plan.js +1 -1
  55. package/dist/commands/plan.js.map +1 -1
  56. package/dist/commands/run.d.ts.map +1 -1
  57. package/dist/commands/run.js +61 -9
  58. package/dist/commands/run.js.map +1 -1
  59. package/dist/commands/serve.d.ts.map +1 -1
  60. package/dist/commands/serve.js +33 -13
  61. package/dist/commands/serve.js.map +1 -1
  62. package/dist/commands/shell.d.ts.map +1 -1
  63. package/dist/commands/shell.js +190 -6
  64. package/dist/commands/shell.js.map +1 -1
  65. package/dist/commands/source.d.ts +3 -0
  66. package/dist/commands/source.d.ts.map +1 -0
  67. package/dist/commands/source.js +120 -0
  68. package/dist/commands/source.js.map +1 -0
  69. package/dist/commands/status.d.ts.map +1 -1
  70. package/dist/commands/status.js +29 -3
  71. package/dist/commands/status.js.map +1 -1
  72. package/dist/commands/up.d.ts.map +1 -1
  73. package/dist/commands/up.js +55 -5
  74. package/dist/commands/up.js.map +1 -1
  75. package/dist/dev/env-defaults.d.ts.map +1 -1
  76. package/dist/dev/env-defaults.js +9 -6
  77. package/dist/dev/env-defaults.js.map +1 -1
  78. package/dist/dev/forked-worker.d.ts +15 -0
  79. package/dist/dev/forked-worker.d.ts.map +1 -1
  80. package/dist/dev/forked-worker.js +72 -14
  81. package/dist/dev/forked-worker.js.map +1 -1
  82. package/dist/dev/opa-policies.d.ts +3 -0
  83. package/dist/dev/opa-policies.d.ts.map +1 -0
  84. package/dist/dev/opa-policies.js +64 -0
  85. package/dist/dev/opa-policies.js.map +1 -0
  86. package/dist/lib/cli-errors.d.ts +7 -0
  87. package/dist/lib/cli-errors.d.ts.map +1 -0
  88. package/dist/lib/cli-errors.js +30 -0
  89. package/dist/lib/cli-errors.js.map +1 -0
  90. package/dist/lib/control-plane.d.ts.map +1 -1
  91. package/dist/lib/control-plane.js +5 -2
  92. package/dist/lib/control-plane.js.map +1 -1
  93. package/dist/lib/exit-codes.d.ts +3 -4
  94. package/dist/lib/exit-codes.d.ts.map +1 -1
  95. package/dist/lib/exit-codes.js +3 -4
  96. package/dist/lib/exit-codes.js.map +1 -1
  97. package/dist/lib/http-error.d.ts +2 -0
  98. package/dist/lib/http-error.d.ts.map +1 -0
  99. package/dist/lib/http-error.js +51 -0
  100. package/dist/lib/http-error.js.map +1 -0
  101. package/dist/lib/roster-profile.d.ts +10 -0
  102. package/dist/lib/roster-profile.d.ts.map +1 -0
  103. package/dist/lib/roster-profile.js +44 -0
  104. package/dist/lib/roster-profile.js.map +1 -0
  105. package/dist/runtime/biome-dev.d.ts +28 -0
  106. package/dist/runtime/biome-dev.d.ts.map +1 -0
  107. package/dist/runtime/biome-dev.js +131 -0
  108. package/dist/runtime/biome-dev.js.map +1 -0
  109. package/dist/runtime/biome-local-install.d.ts +29 -0
  110. package/dist/runtime/biome-local-install.d.ts.map +1 -0
  111. package/dist/runtime/biome-local-install.js +243 -0
  112. package/dist/runtime/biome-local-install.js.map +1 -0
  113. package/dist/runtime/biome-publish.d.ts +34 -0
  114. package/dist/runtime/biome-publish.d.ts.map +1 -0
  115. package/dist/runtime/biome-publish.js +214 -0
  116. package/dist/runtime/biome-publish.js.map +1 -0
  117. package/dist/runtime/biome-scaffold.d.ts +35 -0
  118. package/dist/runtime/biome-scaffold.d.ts.map +1 -0
  119. package/dist/runtime/biome-scaffold.js +153 -0
  120. package/dist/runtime/biome-scaffold.js.map +1 -0
  121. package/dist/runtime/biome-validate.d.ts +28 -0
  122. package/dist/runtime/biome-validate.d.ts.map +1 -0
  123. package/dist/runtime/biome-validate.js +450 -0
  124. package/dist/runtime/biome-validate.js.map +1 -0
  125. package/dist/runtime/boot-graph-loader.d.ts +1 -0
  126. package/dist/runtime/boot-graph-loader.d.ts.map +1 -1
  127. package/dist/runtime/boot-graph-loader.js +99 -7
  128. package/dist/runtime/boot-graph-loader.js.map +1 -1
  129. package/dist/runtime/canopy-refs.d.ts +8 -0
  130. package/dist/runtime/canopy-refs.d.ts.map +1 -0
  131. package/dist/runtime/canopy-refs.js +51 -0
  132. package/dist/runtime/canopy-refs.js.map +1 -0
  133. package/dist/runtime/canopy-replies.d.ts +14 -0
  134. package/dist/runtime/canopy-replies.d.ts.map +1 -0
  135. package/dist/runtime/canopy-replies.js +39 -0
  136. package/dist/runtime/canopy-replies.js.map +1 -0
  137. package/dist/runtime/capability-invoke.d.ts +35 -0
  138. package/dist/runtime/capability-invoke.d.ts.map +1 -0
  139. package/dist/runtime/capability-invoke.js +119 -0
  140. package/dist/runtime/capability-invoke.js.map +1 -0
  141. package/dist/runtime/config/dev-mode.d.ts +8 -0
  142. package/dist/runtime/config/dev-mode.d.ts.map +1 -0
  143. package/dist/runtime/config/dev-mode.js +84 -0
  144. package/dist/runtime/config/dev-mode.js.map +1 -0
  145. package/dist/runtime/config/init-presets.d.ts +1 -1
  146. package/dist/runtime/config/init-presets.d.ts.map +1 -1
  147. package/dist/runtime/config/init-presets.js +63 -11
  148. package/dist/runtime/config/init-presets.js.map +1 -1
  149. package/dist/runtime/config/loader.d.ts +1 -0
  150. package/dist/runtime/config/loader.d.ts.map +1 -1
  151. package/dist/runtime/config/loader.js +41 -5
  152. package/dist/runtime/config/loader.js.map +1 -1
  153. package/dist/runtime/config/schema.d.ts +27 -12
  154. package/dist/runtime/config/schema.d.ts.map +1 -1
  155. package/dist/runtime/config/schema.js +113 -8
  156. package/dist/runtime/config/schema.js.map +1 -1
  157. package/dist/runtime/config/sources-config.d.ts +14 -0
  158. package/dist/runtime/config/sources-config.d.ts.map +1 -0
  159. package/dist/runtime/config/sources-config.js +79 -0
  160. package/dist/runtime/config/sources-config.js.map +1 -0
  161. package/dist/runtime/distribution/compose.d.ts.map +1 -1
  162. package/dist/runtime/distribution/compose.js +3 -1
  163. package/dist/runtime/distribution/compose.js.map +1 -1
  164. package/dist/runtime/env-seeder.d.ts +5 -0
  165. package/dist/runtime/env-seeder.d.ts.map +1 -1
  166. package/dist/runtime/env-seeder.js +118 -16
  167. package/dist/runtime/env-seeder.js.map +1 -1
  168. package/dist/runtime/foreground.d.ts +4 -0
  169. package/dist/runtime/foreground.d.ts.map +1 -1
  170. package/dist/runtime/foreground.js +11 -0
  171. package/dist/runtime/foreground.js.map +1 -1
  172. package/dist/runtime/infra/infra-catalog.d.ts +1 -0
  173. package/dist/runtime/infra/infra-catalog.d.ts.map +1 -1
  174. package/dist/runtime/infra/infra-catalog.js +2 -1
  175. package/dist/runtime/infra/infra-catalog.js.map +1 -1
  176. package/dist/runtime/infra/infra-runner.d.ts +5 -0
  177. package/dist/runtime/infra/infra-runner.d.ts.map +1 -1
  178. package/dist/runtime/infra/infra-runner.js +82 -13
  179. package/dist/runtime/infra/infra-runner.js.map +1 -1
  180. package/dist/runtime/installation/compiler.d.ts +37 -0
  181. package/dist/runtime/installation/compiler.d.ts.map +1 -0
  182. package/dist/runtime/installation/compiler.js +190 -0
  183. package/dist/runtime/installation/compiler.js.map +1 -0
  184. package/dist/runtime/installation/contract.d.ts +125 -0
  185. package/dist/runtime/installation/contract.d.ts.map +1 -0
  186. package/dist/runtime/installation/contract.js +182 -0
  187. package/dist/runtime/installation/contract.js.map +1 -0
  188. package/dist/runtime/installation/diagnostics.d.ts +16 -0
  189. package/dist/runtime/installation/diagnostics.d.ts.map +1 -0
  190. package/dist/runtime/installation/diagnostics.js +21 -0
  191. package/dist/runtime/installation/diagnostics.js.map +1 -0
  192. package/dist/runtime/installation/diff.d.ts +17 -0
  193. package/dist/runtime/installation/diff.d.ts.map +1 -0
  194. package/dist/runtime/installation/diff.js +99 -0
  195. package/dist/runtime/installation/diff.js.map +1 -0
  196. package/dist/runtime/installation/format.d.ts +3 -0
  197. package/dist/runtime/installation/format.d.ts.map +1 -0
  198. package/dist/runtime/installation/format.js +22 -0
  199. package/dist/runtime/installation/format.js.map +1 -0
  200. package/dist/runtime/installation/from-current-config.d.ts +8 -0
  201. package/dist/runtime/installation/from-current-config.d.ts.map +1 -0
  202. package/dist/runtime/installation/from-current-config.js +75 -0
  203. package/dist/runtime/installation/from-current-config.js.map +1 -0
  204. package/dist/runtime/installation/index.d.ts +13 -0
  205. package/dist/runtime/installation/index.d.ts.map +1 -0
  206. package/dist/runtime/installation/index.js +29 -0
  207. package/dist/runtime/installation/index.js.map +1 -0
  208. package/dist/runtime/installation/lifecycle.d.ts +23 -0
  209. package/dist/runtime/installation/lifecycle.d.ts.map +1 -0
  210. package/dist/runtime/installation/lifecycle.js +70 -0
  211. package/dist/runtime/installation/lifecycle.js.map +1 -0
  212. package/dist/runtime/installation/serialization.d.ts +3 -0
  213. package/dist/runtime/installation/serialization.d.ts.map +1 -0
  214. package/dist/runtime/installation/serialization.js +39 -0
  215. package/dist/runtime/installation/serialization.js.map +1 -0
  216. package/dist/runtime/installation/state-store.d.ts +20 -0
  217. package/dist/runtime/installation/state-store.d.ts.map +1 -0
  218. package/dist/runtime/installation/state-store.js +257 -0
  219. package/dist/runtime/installation/state-store.js.map +1 -0
  220. package/dist/runtime/installation/status.d.ts +30 -0
  221. package/dist/runtime/installation/status.d.ts.map +1 -0
  222. package/dist/runtime/installation/status.js +138 -0
  223. package/dist/runtime/installation/status.js.map +1 -0
  224. package/dist/runtime/installation/support-bundle.d.ts +30 -0
  225. package/dist/runtime/installation/support-bundle.d.ts.map +1 -0
  226. package/dist/runtime/installation/support-bundle.js +130 -0
  227. package/dist/runtime/installation/support-bundle.js.map +1 -0
  228. package/dist/runtime/installation/validation.d.ts +8 -0
  229. package/dist/runtime/installation/validation.d.ts.map +1 -0
  230. package/dist/runtime/installation/validation.js +39 -0
  231. package/dist/runtime/installation/validation.js.map +1 -0
  232. package/dist/runtime/installation/validators/common.d.ts +4 -0
  233. package/dist/runtime/installation/validators/common.d.ts.map +1 -0
  234. package/dist/runtime/installation/validators/common.js +29 -0
  235. package/dist/runtime/installation/validators/common.js.map +1 -0
  236. package/dist/runtime/installation/validators/infrastructure.d.ts +4 -0
  237. package/dist/runtime/installation/validators/infrastructure.d.ts.map +1 -0
  238. package/dist/runtime/installation/validators/infrastructure.js +78 -0
  239. package/dist/runtime/installation/validators/infrastructure.js.map +1 -0
  240. package/dist/runtime/installation/validators/operational.d.ts +4 -0
  241. package/dist/runtime/installation/validators/operational.d.ts.map +1 -0
  242. package/dist/runtime/installation/validators/operational.js +126 -0
  243. package/dist/runtime/installation/validators/operational.js.map +1 -0
  244. package/dist/runtime/installation/validators/profile.d.ts +4 -0
  245. package/dist/runtime/installation/validators/profile.d.ts.map +1 -0
  246. package/dist/runtime/installation/validators/profile.js +78 -0
  247. package/dist/runtime/installation/validators/profile.js.map +1 -0
  248. package/dist/runtime/installation/validators/secrets.d.ts +4 -0
  249. package/dist/runtime/installation/validators/secrets.d.ts.map +1 -0
  250. package/dist/runtime/installation/validators/secrets.js +68 -0
  251. package/dist/runtime/installation/validators/secrets.js.map +1 -0
  252. package/dist/runtime/launch-plan-format.d.ts +3 -0
  253. package/dist/runtime/launch-plan-format.d.ts.map +1 -0
  254. package/dist/runtime/launch-plan-format.js +57 -0
  255. package/dist/runtime/launch-plan-format.js.map +1 -0
  256. package/dist/runtime/launch.d.ts +25 -3
  257. package/dist/runtime/launch.d.ts.map +1 -1
  258. package/dist/runtime/launch.js +264 -24
  259. package/dist/runtime/launch.js.map +1 -1
  260. package/dist/runtime/object-registry-client.d.ts +31 -0
  261. package/dist/runtime/object-registry-client.d.ts.map +1 -0
  262. package/dist/runtime/object-registry-client.js +54 -0
  263. package/dist/runtime/object-registry-client.js.map +1 -0
  264. package/dist/runtime/paths.d.ts +1 -0
  265. package/dist/runtime/paths.d.ts.map +1 -1
  266. package/dist/runtime/paths.js +2 -0
  267. package/dist/runtime/paths.js.map +1 -1
  268. package/dist/runtime/roster.d.ts +10 -4
  269. package/dist/runtime/roster.d.ts.map +1 -1
  270. package/dist/runtime/roster.js +73 -7
  271. package/dist/runtime/roster.js.map +1 -1
  272. package/dist/runtime/run-manifest.d.ts +23 -0
  273. package/dist/runtime/run-manifest.d.ts.map +1 -0
  274. package/dist/runtime/run-manifest.js +273 -0
  275. package/dist/runtime/run-manifest.js.map +1 -0
  276. package/dist/runtime/runner/container-runner.d.ts +6 -0
  277. package/dist/runtime/runner/container-runner.d.ts.map +1 -1
  278. package/dist/runtime/runner/container-runner.js +25 -6
  279. package/dist/runtime/runner/container-runner.js.map +1 -1
  280. package/dist/runtime/runner/docker-cli.d.ts +6 -1
  281. package/dist/runtime/runner/docker-cli.d.ts.map +1 -1
  282. package/dist/runtime/runner/docker-cli.js +47 -6
  283. package/dist/runtime/runner/docker-cli.js.map +1 -1
  284. package/dist/runtime/runner/native-runner.d.ts.map +1 -1
  285. package/dist/runtime/runner/native-runner.js +21 -14
  286. package/dist/runtime/runner/native-runner.js.map +1 -1
  287. package/dist/runtime/secrets/managed-local-store.d.ts +26 -0
  288. package/dist/runtime/secrets/managed-local-store.d.ts.map +1 -0
  289. package/dist/runtime/secrets/managed-local-store.js +202 -0
  290. package/dist/runtime/secrets/managed-local-store.js.map +1 -0
  291. package/dist/runtime/secrets/resolver.d.ts +23 -0
  292. package/dist/runtime/secrets/resolver.d.ts.map +1 -0
  293. package/dist/runtime/secrets/resolver.js +265 -0
  294. package/dist/runtime/secrets/resolver.js.map +1 -0
  295. package/dist/runtime/secrets/url-security.d.ts +3 -0
  296. package/dist/runtime/secrets/url-security.d.ts.map +1 -0
  297. package/dist/runtime/secrets/url-security.js +13 -0
  298. package/dist/runtime/secrets/url-security.js.map +1 -0
  299. package/dist/runtime/sources/credentials.d.ts.map +1 -1
  300. package/dist/runtime/sources/credentials.js +2 -1
  301. package/dist/runtime/sources/credentials.js.map +1 -1
  302. package/dist/runtime/sources/kinds/git.d.ts +6 -3
  303. package/dist/runtime/sources/kinds/git.d.ts.map +1 -1
  304. package/dist/runtime/sources/kinds/git.js +99 -22
  305. package/dist/runtime/sources/kinds/git.js.map +1 -1
  306. package/dist/runtime/sources/resolve-context.d.ts +7 -0
  307. package/dist/runtime/sources/resolve-context.d.ts.map +1 -0
  308. package/dist/runtime/sources/resolve-context.js +3 -0
  309. package/dist/runtime/sources/resolve-context.js.map +1 -0
  310. package/dist/runtime/sources/resolver.d.ts +2 -2
  311. package/dist/runtime/sources/resolver.d.ts.map +1 -1
  312. package/dist/runtime/sources/resolver.js +11 -5
  313. package/dist/runtime/sources/resolver.js.map +1 -1
  314. package/dist/runtime/store-client.d.ts +59 -0
  315. package/dist/runtime/store-client.d.ts.map +1 -0
  316. package/dist/runtime/store-client.js +71 -0
  317. package/dist/runtime/store-client.js.map +1 -0
  318. package/dist/runtime/supervisor.d.ts +6 -0
  319. package/dist/runtime/supervisor.d.ts.map +1 -1
  320. package/dist/runtime/supervisor.js +37 -5
  321. package/dist/runtime/supervisor.js.map +1 -1
  322. package/dist/runtime/waves.d.ts +1 -1
  323. package/dist/runtime/waves.d.ts.map +1 -1
  324. package/dist/runtime/waves.js +86 -19
  325. package/dist/runtime/waves.js.map +1 -1
  326. package/examples/01-local-native.yaml +4 -1
  327. package/examples/03-byo-infra.yaml +17 -7
  328. package/examples/05-appliance-helm.yaml +1 -1
  329. package/examples/06-biome-sources.yaml +4 -1
  330. package/package.json +6 -5
  331. package/xema.config.example.yaml +22 -18
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateXemaInstallation = validateXemaInstallation;
4
+ const zod_1 = require("zod");
5
+ const contract_1 = require("./contract");
6
+ const diagnostics_1 = require("./diagnostics");
7
+ const common_1 = require("./validators/common");
8
+ const infrastructure_1 = require("./validators/infrastructure");
9
+ const operational_1 = require("./validators/operational");
10
+ const profile_1 = require("./validators/profile");
11
+ const secrets_1 = require("./validators/secrets");
12
+ function validateXemaInstallation(raw) {
13
+ let installation;
14
+ try {
15
+ installation = contract_1.XemaInstallationSchema.parse(raw);
16
+ }
17
+ catch (error) {
18
+ if (!(error instanceof zod_1.ZodError)) {
19
+ throw error;
20
+ }
21
+ return {
22
+ issues: error.issues.map((issue) => ({
23
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
24
+ code: 'SCHEMA_INVALID',
25
+ path: issue.path.join('.'),
26
+ message: issue.message,
27
+ })),
28
+ };
29
+ }
30
+ const issues = [
31
+ ...(0, common_1.validateUniqueEntries)(installation),
32
+ ...(0, infrastructure_1.validateInfrastructure)(installation),
33
+ ...(0, secrets_1.validateSecretReferences)(installation),
34
+ ...(0, profile_1.validateProfile)(installation),
35
+ ...(0, operational_1.validateOperationalPolicy)(installation),
36
+ ];
37
+ return { installation, issues };
38
+ }
39
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../src/runtime/installation/validation.ts"],"names":[],"mappings":";;AAkBA,4DA2BC;AA7CD,6BAA+B;AAE/B,yCAGoB;AACpB,+CAA8E;AAC9E,gDAA4D;AAC5D,gEAAqE;AACrE,0DAAqE;AACrE,kDAAuD;AACvD,kDAAgE;AAOhE,SAAgB,wBAAwB,CAAC,GAAY;IACnD,IAAI,YAAoC,CAAC;IACzC,IAAI,CAAC;QACH,YAAY,GAAG,iCAAsB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,KAAK,YAAY,cAAQ,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO;YACL,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACnC,IAAI,EAAE,mCAAqB,CAAC,OAAO;gBACnC,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;SACJ,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG;QACb,GAAG,IAAA,8BAAqB,EAAC,YAAY,CAAC;QACtC,GAAG,IAAA,uCAAsB,EAAC,YAAY,CAAC;QACvC,GAAG,IAAA,kCAAwB,EAAC,YAAY,CAAC;QACzC,GAAG,IAAA,yBAAe,EAAC,YAAY,CAAC;QAChC,GAAG,IAAA,uCAAyB,EAAC,YAAY,CAAC;KAC3C,CAAC;IAEF,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type InstallationIssue } from '../diagnostics';
2
+ import type { ParsedXemaInstallation } from '../contract';
3
+ export declare function validateUniqueEntries(installation: ParsedXemaInstallation): readonly InstallationIssue[];
4
+ //# sourceMappingURL=common.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/common.ts"],"names":[],"mappings":"AAAA,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,sBAAsB,GACnC,SAAS,iBAAiB,EAAE,CAyB9B"}
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateUniqueEntries = validateUniqueEntries;
4
+ const diagnostics_1 = require("../diagnostics");
5
+ function validateUniqueEntries(installation) {
6
+ return [
7
+ ...duplicateIssues(installation.infrastructure.map((binding) => binding.component), 'infrastructure', 'DUPLICATE_INFRASTRUCTURE_COMPONENT'),
8
+ ...duplicateIssues(installation.secrets.map((secret) => secret.name), 'secrets', 'DUPLICATE_SECRET_REFERENCE'),
9
+ ...duplicateIssues(installation.domains.map((domain) => `${domain.purpose}:${domain.hostname}`), 'domains', 'DUPLICATE_DOMAIN'),
10
+ ...duplicateIssues(installation.deployment.regions ?? [], 'deployment.regions', 'DUPLICATE_REGION'),
11
+ ];
12
+ }
13
+ function duplicateIssues(values, path, code) {
14
+ const seen = new Set();
15
+ const duplicates = new Set();
16
+ for (const value of values) {
17
+ if (seen.has(value)) {
18
+ duplicates.add(value);
19
+ }
20
+ seen.add(value);
21
+ }
22
+ return [...duplicates].sort().map((value) => ({
23
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
24
+ code,
25
+ path,
26
+ message: `contains duplicate entry "${value}"`,
27
+ }));
28
+ }
29
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/common.ts"],"names":[],"mappings":";;AAIA,sDA2BC;AA/BD,gDAA+E;AAI/E,SAAgB,qBAAqB,CACnC,YAAoC;IAEpC,OAAO;QACL,GAAG,eAAe,CAChB,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAC/D,gBAAgB,EAChB,oCAAoC,CACrC;QACD,GAAG,eAAe,CAChB,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EACjD,SAAS,EACT,4BAA4B,CAC7B;QACD,GAAG,eAAe,CAChB,YAAY,CAAC,OAAO,CAAC,GAAG,CACtB,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CACnD,EACD,SAAS,EACT,kBAAkB,CACnB;QACD,GAAG,eAAe,CAChB,YAAY,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,EACrC,oBAAoB,EACpB,kBAAkB,CACnB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CACtB,MAAyB,EACzB,IAAY,EACZ,IAAY;IAEZ,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IACrC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,IAAI,EAAE,mCAAqB,CAAC,OAAO;QACnC,IAAI;QACJ,IAAI;QACJ,OAAO,EAAE,6BAA6B,KAAK,GAAG;KAC/C,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type InstallationIssue } from '../diagnostics';
2
+ import type { ParsedXemaInstallation } from '../contract';
3
+ export declare function validateInfrastructure(installation: ParsedXemaInstallation): readonly InstallationIssue[];
4
+ //# sourceMappingURL=infrastructure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infrastructure.d.ts","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/infrastructure.ts"],"names":[],"mappings":"AAGA,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAE1D,wBAAgB,sBAAsB,CACpC,YAAY,EAAE,sBAAsB,GACnC,SAAS,iBAAiB,EAAE,CAuD9B"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateInfrastructure = validateInfrastructure;
4
+ const schema_1 = require("../../config/schema");
5
+ const infra_catalog_1 = require("../../infra/infra-catalog");
6
+ const url_security_1 = require("../../secrets/url-security");
7
+ const diagnostics_1 = require("../diagnostics");
8
+ function validateInfrastructure(installation) {
9
+ const issues = [];
10
+ for (const binding of installation.infrastructure) {
11
+ const path = `infrastructure.${binding.component}`;
12
+ if (binding.ownership === schema_1.InfraMode.External &&
13
+ binding.endpoint === undefined) {
14
+ issues.push({
15
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
16
+ code: 'EXTERNAL_ENDPOINT_REQUIRED',
17
+ path: `${path}.endpoint`,
18
+ message: 'external infrastructure requires an endpoint',
19
+ });
20
+ }
21
+ if (binding.component === schema_1.InfraComponent.Postgres &&
22
+ binding.ownership === schema_1.InfraMode.External &&
23
+ binding.secretRefs.length !== 1) {
24
+ issues.push({
25
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
26
+ code: 'POSTGRES_SECRET_REFERENCE_REQUIRED',
27
+ path: `${path}.secretRefs`,
28
+ message: 'external PostgreSQL requires exactly one password secret reference',
29
+ });
30
+ }
31
+ if (binding.ownership !== schema_1.InfraMode.External &&
32
+ binding.endpoint !== undefined) {
33
+ issues.push({
34
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
35
+ code: 'ENDPOINT_NOT_ALLOWED',
36
+ path: `${path}.endpoint`,
37
+ message: `endpoint is not allowed for ${binding.ownership} infrastructure`,
38
+ });
39
+ }
40
+ if (binding.ownership === schema_1.InfraMode.Disabled &&
41
+ infra_catalog_1.INFRA_CATALOG[binding.component].mandatory) {
42
+ issues.push({
43
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
44
+ code: 'MANDATORY_INFRASTRUCTURE_DISABLED',
45
+ path: `${path}.ownership`,
46
+ message: 'mandatory infrastructure cannot be disabled',
47
+ });
48
+ }
49
+ if (binding.endpoint !== undefined) {
50
+ validateEndpoint(binding.endpoint, `${path}.endpoint`, issues);
51
+ }
52
+ }
53
+ return issues;
54
+ }
55
+ function validateEndpoint(endpoint, path, issues) {
56
+ let parsed;
57
+ try {
58
+ parsed = new URL(endpoint);
59
+ }
60
+ catch {
61
+ issues.push({
62
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
63
+ code: 'ENDPOINT_INVALID',
64
+ path,
65
+ message: 'must be an absolute URL',
66
+ });
67
+ return;
68
+ }
69
+ if ((0, url_security_1.urlContainsCredentialMaterial)(parsed)) {
70
+ issues.push({
71
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
72
+ code: 'SECRET_VALUE_IN_ENDPOINT',
73
+ path,
74
+ message: 'must reference credentials through secretRefs, never inline values',
75
+ });
76
+ }
77
+ }
78
+ //# sourceMappingURL=infrastructure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infrastructure.js","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/infrastructure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ParsedXemaInstallation } from '../contract';
2
+ import { type InstallationIssue } from '../diagnostics';
3
+ export declare function validateOperationalPolicy(installation: ParsedXemaInstallation): readonly InstallationIssue[];
4
+ //# sourceMappingURL=operational.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operational.d.ts","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/operational.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,sBAAsB,GACnC,SAAS,iBAAiB,EAAE,CAM9B"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateOperationalPolicy = validateOperationalPolicy;
4
+ const contract_1 = require("../contract");
5
+ const diagnostics_1 = require("../diagnostics");
6
+ function validateOperationalPolicy(installation) {
7
+ return [
8
+ ...validateStorage(installation),
9
+ ...validateCapacity(installation),
10
+ ...validateUpgrade(installation),
11
+ ];
12
+ }
13
+ function validateStorage(installation) {
14
+ const issues = [];
15
+ if (installation.storage.class === contract_1.StorageClass.External &&
16
+ installation.storage.externalBinding === undefined) {
17
+ issues.push({
18
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
19
+ code: 'EXTERNAL_STORAGE_BINDING_REQUIRED',
20
+ path: 'storage.externalBinding',
21
+ message: 'external storage requires a binding reference',
22
+ });
23
+ }
24
+ if (installation.storage.class !== contract_1.StorageClass.External &&
25
+ installation.storage.externalBinding !== undefined) {
26
+ issues.push({
27
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
28
+ code: 'EXTERNAL_STORAGE_BINDING_NOT_ALLOWED',
29
+ path: 'storage.externalBinding',
30
+ message: 'externalBinding is only valid for external storage',
31
+ });
32
+ }
33
+ if (installation.storage.backup.mode === contract_1.BackupMode.Disabled &&
34
+ installation.storage.backup.destinationSecretRef !== undefined) {
35
+ issues.push({
36
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
37
+ code: 'BACKUP_DESTINATION_NOT_ALLOWED',
38
+ path: 'storage.backup.destinationSecretRef',
39
+ message: 'a disabled backup policy cannot declare a destination',
40
+ });
41
+ }
42
+ if (installation.deployment.profile ===
43
+ contract_1.InstallationDeploymentProfile.Regulated &&
44
+ installation.storage.backup.mode !== undefined &&
45
+ installation.storage.backup.mode !== contract_1.BackupMode.Continuous) {
46
+ issues.push({
47
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
48
+ code: 'REGULATED_BACKUP_REQUIRED',
49
+ path: 'storage.backup.mode',
50
+ message: 'regulated installations require continuous backup',
51
+ });
52
+ }
53
+ if (installation.deployment.profile ===
54
+ contract_1.InstallationDeploymentProfile.Regulated &&
55
+ installation.domains.some((domain) => domain.tls.mode === contract_1.TlsMode.Disabled)) {
56
+ issues.push({
57
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
58
+ code: 'REGULATED_TLS_REQUIRED',
59
+ path: 'domains',
60
+ message: 'regulated installation domains require TLS',
61
+ });
62
+ }
63
+ for (const domain of installation.domains) {
64
+ const path = `domains.${domain.purpose}.${domain.hostname}.tls.secretRef`;
65
+ if (domain.tls.mode === contract_1.TlsMode.External &&
66
+ domain.tls.secretRef === undefined) {
67
+ issues.push({
68
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
69
+ code: 'EXTERNAL_TLS_SECRET_REQUIRED',
70
+ path,
71
+ message: 'external TLS requires a certificate secret reference',
72
+ });
73
+ }
74
+ if (domain.tls.mode !== contract_1.TlsMode.External &&
75
+ domain.tls.secretRef !== undefined) {
76
+ issues.push({
77
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
78
+ code: 'TLS_SECRET_NOT_ALLOWED',
79
+ path,
80
+ message: `a ${domain.tls.mode} TLS policy cannot declare an external certificate secret`,
81
+ });
82
+ }
83
+ }
84
+ return issues;
85
+ }
86
+ function validateCapacity(installation) {
87
+ const { minReplicas, maxReplicas } = installation.capacity;
88
+ if (minReplicas !== undefined &&
89
+ maxReplicas !== undefined &&
90
+ minReplicas > maxReplicas) {
91
+ return [
92
+ {
93
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
94
+ code: 'CAPACITY_RANGE_INVALID',
95
+ path: 'capacity',
96
+ message: 'minReplicas cannot exceed maxReplicas',
97
+ },
98
+ ];
99
+ }
100
+ return [];
101
+ }
102
+ function validateUpgrade(installation) {
103
+ const { channel, releaseRef } = installation.upgrade;
104
+ if (channel === contract_1.UpgradeChannel.Pinned && releaseRef === undefined) {
105
+ return [
106
+ {
107
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
108
+ code: 'PINNED_RELEASE_REQUIRED',
109
+ path: 'upgrade.releaseRef',
110
+ message: 'pinned upgrade channel requires a releaseRef',
111
+ },
112
+ ];
113
+ }
114
+ if (channel !== contract_1.UpgradeChannel.Pinned && releaseRef !== undefined) {
115
+ return [
116
+ {
117
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
118
+ code: 'RELEASE_REF_NOT_ALLOWED',
119
+ path: 'upgrade.releaseRef',
120
+ message: 'releaseRef is only valid for the pinned upgrade channel',
121
+ },
122
+ ];
123
+ }
124
+ return [];
125
+ }
126
+ //# sourceMappingURL=operational.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operational.js","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/operational.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type ParsedXemaInstallation } from '../contract';
2
+ import { type InstallationIssue } from '../diagnostics';
3
+ export declare function validateProfile(installation: ParsedXemaInstallation): readonly InstallationIssue[];
4
+ //# sourceMappingURL=profile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,wBAAgB,eAAe,CAC7B,YAAY,EAAE,sBAAsB,GACnC,SAAS,iBAAiB,EAAE,CA6E9B"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateProfile = validateProfile;
4
+ const contract_1 = require("../contract");
5
+ const diagnostics_1 = require("../diagnostics");
6
+ function validateProfile(installation) {
7
+ const issues = [];
8
+ const { profile, substrate } = installation.deployment;
9
+ const regions = installation.deployment.regions ?? [];
10
+ if (profile === contract_1.InstallationDeploymentProfile.MultiRegion) {
11
+ issues.push({
12
+ kind: diagnostics_1.InstallationIssueKind.Unsupported,
13
+ code: 'MULTI_REGION_NOT_EXECUTABLE',
14
+ path: 'deployment.profile',
15
+ message: 'multi-region is accepted as declared intent but this compiler version cannot produce an executable plan',
16
+ });
17
+ }
18
+ if (profile === contract_1.InstallationDeploymentProfile.Developer &&
19
+ substrate !== undefined &&
20
+ substrate !== contract_1.InstallationSubstrate.Local) {
21
+ issues.push(profileSubstrateIssue(profile, contract_1.InstallationSubstrate.Local));
22
+ }
23
+ if (profile === contract_1.InstallationDeploymentProfile.StarterPme &&
24
+ substrate === contract_1.InstallationSubstrate.Cluster) {
25
+ issues.push({
26
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
27
+ code: 'PROFILE_SUBSTRATE_MISMATCH',
28
+ path: 'deployment.substrate',
29
+ message: 'starter-pme supports local or single-node substrate',
30
+ });
31
+ }
32
+ if ((profile === contract_1.InstallationDeploymentProfile.HighAvailability ||
33
+ profile === contract_1.InstallationDeploymentProfile.Regulated ||
34
+ profile === contract_1.InstallationDeploymentProfile.MultiRegion) &&
35
+ substrate !== undefined &&
36
+ substrate !== contract_1.InstallationSubstrate.Cluster) {
37
+ issues.push(profileSubstrateIssue(profile, contract_1.InstallationSubstrate.Cluster));
38
+ }
39
+ if (profile !== contract_1.InstallationDeploymentProfile.MultiRegion &&
40
+ installation.deployment.regions !== undefined &&
41
+ regions.length !== 1) {
42
+ issues.push({
43
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
44
+ code: 'PROFILE_REGION_MISMATCH',
45
+ path: 'deployment.regions',
46
+ message: `${profile} requires exactly one explicitly declared region when regions are overridden`,
47
+ });
48
+ }
49
+ if (profile === contract_1.InstallationDeploymentProfile.MultiRegion &&
50
+ regions.length > 0 &&
51
+ regions.length < 2) {
52
+ issues.push({
53
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
54
+ code: 'MULTI_REGION_REQUIRES_REGIONS',
55
+ path: 'deployment.regions',
56
+ message: 'multi-region requires at least two regions',
57
+ });
58
+ }
59
+ if (profile === contract_1.InstallationDeploymentProfile.Regulated &&
60
+ installation.tenancy.isolation === contract_1.TenantIsolation.Shared) {
61
+ issues.push({
62
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
63
+ code: 'REGULATED_SHARED_ISOLATION',
64
+ path: 'tenancy.isolation',
65
+ message: 'regulated installations cannot use shared tenant isolation',
66
+ });
67
+ }
68
+ return issues;
69
+ }
70
+ function profileSubstrateIssue(profile, required) {
71
+ return {
72
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
73
+ code: 'PROFILE_SUBSTRATE_MISMATCH',
74
+ path: 'deployment.substrate',
75
+ message: `${profile} requires ${required} substrate`,
76
+ };
77
+ }
78
+ //# sourceMappingURL=profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/profile.ts"],"names":[],"mappings":";;AAQA,0CA+EC;AAvFD,0CAKqB;AACrB,gDAA+E;AAE/E,SAAgB,eAAe,CAC7B,YAAoC;IAEpC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC;IACvD,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;IAEtD,IAAI,OAAO,KAAK,wCAA6B,CAAC,WAAW,EAAE,CAAC;QAC1D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAqB,CAAC,WAAW;YACvC,IAAI,EAAE,6BAA6B;YACnC,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EACL,yGAAyG;SAC5G,CAAC,CAAC;IACL,CAAC;IACD,IACE,OAAO,KAAK,wCAA6B,CAAC,SAAS;QACnD,SAAS,KAAK,SAAS;QACvB,SAAS,KAAK,gCAAqB,CAAC,KAAK,EACzC,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,gCAAqB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,IACE,OAAO,KAAK,wCAA6B,CAAC,UAAU;QACpD,SAAS,KAAK,gCAAqB,CAAC,OAAO,EAC3C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAqB,CAAC,OAAO;YACnC,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,qDAAqD;SAC/D,CAAC,CAAC;IACL,CAAC;IACD,IACE,CAAC,OAAO,KAAK,wCAA6B,CAAC,gBAAgB;QACzD,OAAO,KAAK,wCAA6B,CAAC,SAAS;QACnD,OAAO,KAAK,wCAA6B,CAAC,WAAW,CAAC;QACxD,SAAS,KAAK,SAAS;QACvB,SAAS,KAAK,gCAAqB,CAAC,OAAO,EAC3C,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,gCAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7E,CAAC;IACD,IACE,OAAO,KAAK,wCAA6B,CAAC,WAAW;QACrD,YAAY,CAAC,UAAU,CAAC,OAAO,KAAK,SAAS;QAC7C,OAAO,CAAC,MAAM,KAAK,CAAC,EACpB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAqB,CAAC,OAAO;YACnC,IAAI,EAAE,yBAAyB;YAC/B,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,GAAG,OAAO,8EAA8E;SAClG,CAAC,CAAC;IACL,CAAC;IACD,IACE,OAAO,KAAK,wCAA6B,CAAC,WAAW;QACrD,OAAO,CAAC,MAAM,GAAG,CAAC;QAClB,OAAO,CAAC,MAAM,GAAG,CAAC,EAClB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAqB,CAAC,UAAU;YACtC,IAAI,EAAE,+BAA+B;YACrC,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,4CAA4C;SACtD,CAAC,CAAC;IACL,CAAC;IACD,IACE,OAAO,KAAK,wCAA6B,CAAC,SAAS;QACnD,YAAY,CAAC,OAAO,CAAC,SAAS,KAAK,0BAAe,CAAC,MAAM,EACzD,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,mCAAqB,CAAC,OAAO;YACnC,IAAI,EAAE,4BAA4B;YAClC,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,4DAA4D;SACtE,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAsC,EACtC,QAA+B;IAE/B,OAAO;QACL,IAAI,EAAE,mCAAqB,CAAC,OAAO;QACnC,IAAI,EAAE,4BAA4B;QAClC,IAAI,EAAE,sBAAsB;QAC5B,OAAO,EAAE,GAAG,OAAO,aAAa,QAAQ,YAAY;KACrD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ParsedXemaInstallation } from '../contract';
2
+ import { type InstallationIssue } from '../diagnostics';
3
+ export declare function validateSecretReferences(installation: ParsedXemaInstallation): readonly InstallationIssue[];
4
+ //# sourceMappingURL=secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAyB,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,sBAAsB,GACnC,SAAS,iBAAiB,EAAE,CAsC9B"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateSecretReferences = validateSecretReferences;
4
+ const contract_1 = require("../contract");
5
+ const diagnostics_1 = require("../diagnostics");
6
+ function validateSecretReferences(installation) {
7
+ const issues = [];
8
+ const declared = new Set(installation.secrets.map((secret) => secret.name));
9
+ const referenced = collectReferences(installation);
10
+ for (const reference of referenced) {
11
+ if (!declared.has(reference.ref)) {
12
+ issues.push({
13
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
14
+ code: 'SECRET_REFERENCE_UNRESOLVED',
15
+ path: reference.path,
16
+ message: `references undeclared secret "${reference.ref}"`,
17
+ });
18
+ }
19
+ }
20
+ for (const secret of installation.secrets) {
21
+ const locatorRequired = secret.provider !== contract_1.SecretReferenceProvider.Prompt &&
22
+ secret.provider !== contract_1.SecretReferenceProvider.ManagedLocal;
23
+ if (locatorRequired && secret.locator === undefined) {
24
+ issues.push({
25
+ kind: diagnostics_1.InstallationIssueKind.Unresolved,
26
+ code: 'SECRET_LOCATOR_REQUIRED',
27
+ path: `secrets.${secret.name}.locator`,
28
+ message: `${secret.provider} secret reference requires a locator`,
29
+ });
30
+ }
31
+ if (!locatorRequired && secret.locator !== undefined) {
32
+ issues.push({
33
+ kind: diagnostics_1.InstallationIssueKind.Invalid,
34
+ code: 'SECRET_LOCATOR_NOT_ALLOWED',
35
+ path: `secrets.${secret.name}.locator`,
36
+ message: `${secret.provider} secret reference cannot carry a locator`,
37
+ });
38
+ }
39
+ }
40
+ return issues;
41
+ }
42
+ function collectReferences(installation) {
43
+ const referenced = [];
44
+ for (const binding of installation.infrastructure) {
45
+ for (const ref of binding.secretRefs) {
46
+ referenced.push({
47
+ ref,
48
+ path: `infrastructure.${binding.component}.secretRefs`,
49
+ });
50
+ }
51
+ }
52
+ for (const domain of installation.domains) {
53
+ if (domain.tls.secretRef !== undefined) {
54
+ referenced.push({
55
+ ref: domain.tls.secretRef,
56
+ path: `domains.${domain.purpose}.${domain.hostname}.tls.secretRef`,
57
+ });
58
+ }
59
+ }
60
+ if (installation.storage.backup.destinationSecretRef !== undefined) {
61
+ referenced.push({
62
+ ref: installation.storage.backup.destinationSecretRef,
63
+ path: 'storage.backup.destinationSecretRef',
64
+ });
65
+ }
66
+ return referenced;
67
+ }
68
+ //# sourceMappingURL=secrets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../../../src/runtime/installation/validators/secrets.ts"],"names":[],"mappings":";;AAMA,4DAwCC;AA9CD,0CAGqB;AACrB,gDAA+E;AAE/E,SAAgB,wBAAwB,CACtC,YAAoC;IAEpC,MAAM,MAAM,GAAwB,EAAE,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAEnD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,mCAAqB,CAAC,UAAU;gBACtC,IAAI,EAAE,6BAA6B;gBACnC,IAAI,EAAE,SAAS,CAAC,IAAI;gBACpB,OAAO,EAAE,iCAAiC,SAAS,CAAC,GAAG,GAAG;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1C,MAAM,eAAe,GACnB,MAAM,CAAC,QAAQ,KAAK,kCAAuB,CAAC,MAAM;YAClD,MAAM,CAAC,QAAQ,KAAK,kCAAuB,CAAC,YAAY,CAAC;QAC3D,IAAI,eAAe,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,mCAAqB,CAAC,UAAU;gBACtC,IAAI,EAAE,yBAAyB;gBAC/B,IAAI,EAAE,WAAW,MAAM,CAAC,IAAI,UAAU;gBACtC,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,sCAAsC;aAClE,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,eAAe,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,mCAAqB,CAAC,OAAO;gBACnC,IAAI,EAAE,4BAA4B;gBAClC,IAAI,EAAE,WAAW,MAAM,CAAC,IAAI,UAAU;gBACtC,OAAO,EAAE,GAAG,MAAM,CAAC,QAAQ,0CAA0C;aACtE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CACxB,YAAoC;IAEpC,MAAM,UAAU,GAAyC,EAAE,CAAC;IAC5D,KAAK,MAAM,OAAO,IAAI,YAAY,CAAC,cAAc,EAAE,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC;gBACd,GAAG;gBACH,IAAI,EAAE,kBAAkB,OAAO,CAAC,SAAS,aAAa;aACvD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;QAC1C,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC;gBACd,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS;gBACzB,IAAI,EAAE,WAAW,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,gBAAgB;aACnE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,IAAI,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACnE,UAAU,CAAC,IAAI,CAAC;YACd,GAAG,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB;YACrD,IAAI,EAAE,qCAAqC;SAC5C,CAAC,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { LaunchPlan } from './launch';
2
+ export declare function formatLaunchPlan(plan: LaunchPlan): string;
3
+ //# sourceMappingURL=launch-plan-format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-plan-format.d.ts","sourceRoot":"","sources":["../../src/runtime/launch-plan-format.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAQ3C,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAqEzD"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatLaunchPlan = formatLaunchPlan;
4
+ function formatLaunchPlan(plan) {
5
+ const lines = [];
6
+ const rule = '─'.repeat(72);
7
+ lines.push('xema — boot preview (dry run: nothing was started)');
8
+ lines.push(rule);
9
+ lines.push(`substrate : ${plan.substrate}`);
10
+ lines.push(`edition : ${plan.lock.path} (${plan.lock.source})`);
11
+ const managed = plan.infra.managed.length > 0
12
+ ? plan.infra.managed.map((m) => m.component).join(', ')
13
+ : '(none — assumed already running)';
14
+ lines.push(`infra : ${managed}`);
15
+ if (plan.addedPrerequisites.length > 0) {
16
+ lines.push(`prereqs : +${String(plan.addedPrerequisites.length)} hard prerequisite(s) pulled in: ` +
17
+ plan.addedPrerequisites.join(', '));
18
+ }
19
+ if (plan.skippedOptionalBiomes.length > 0) {
20
+ lines.push(`optional : skipping optional biome(s) not explicitly included: ` +
21
+ `${plan.skippedOptionalBiomes.join(', ')} (add them to app.include, or use include: 'all')`);
22
+ }
23
+ if (plan.infraWarnings.length > 0) {
24
+ for (const w of plan.infraWarnings) {
25
+ lines.push(`warn : ${w}`);
26
+ }
27
+ }
28
+ lines.push('');
29
+ lines.push(`services : ${String(plan.roster.length)} across ${String(plan.waves.length)} wave(s) ` +
30
+ `(waves boot in order; members within a wave boot concurrently)`);
31
+ lines.push(rule);
32
+ const nameWidth = Math.min(40, Math.max(20, ...plan.roster.map((e) => e.name.length)));
33
+ for (const wave of plan.waves) {
34
+ lines.push(`wave ${String(wave.index)} — ${wave.tier} (${String(wave.members.length)})`);
35
+ const members = [...wave.members].sort((a, b) => a.name.localeCompare(b.name));
36
+ for (const m of members) {
37
+ const port = plan.ports.get(m.name);
38
+ const portCol = port !== undefined ? `:${String(port)}` : '(image)';
39
+ const from = m.sourceRoot ?? m.servicePath ?? '';
40
+ const src = m.sourceName ? ` [${m.sourceName}]` : '';
41
+ lines.push(` ${m.name.padEnd(nameWidth)} ${portCol.padEnd(8)} ${from}${src}`.trimEnd());
42
+ }
43
+ }
44
+ if (plan.unresolvedSources.length > 0) {
45
+ lines.push(rule);
46
+ lines.push('unresolved (offline preview — would clone):');
47
+ for (const note of plan.unresolvedSources) {
48
+ lines.push(` ${note}`);
49
+ }
50
+ }
51
+ lines.push(rule);
52
+ lines.push('Native services run compiled dist/main.js — build changed services first ' +
53
+ '(`pnpm --filter <svc> build`) or use `xema dev --watch`.');
54
+ lines.push('Re-run without --dry-run to boot.');
55
+ return lines.join('\n');
56
+ }
57
+ //# sourceMappingURL=launch-plan-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch-plan-format.js","sourceRoot":"","sources":["../../src/runtime/launch-plan-format.ts"],"names":[],"mappings":"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"}
@@ -1,22 +1,44 @@
1
- import { type XemaConfig } from './config/schema';
1
+ import { Substrate, type XemaConfig } from './config/schema';
2
+ import { resolveInfraPlan } from './infra/infra-plan';
2
3
  import { type RosterEntry, type RosterInclude, type RosterSelection } from './roster';
3
4
  import { type BringUpResult, type LifecycleEvent } from './supervisor';
5
+ import { deriveWaves } from './waves';
4
6
  export interface LaunchOptions {
5
7
  readonly config: XemaConfig;
6
8
  readonly includeWeb: boolean;
9
+ readonly installationIdentity?: string;
7
10
  readonly lockPathOverride?: string | undefined;
8
11
  readonly bootGraphPathOverride?: string | undefined;
9
12
  readonly onEvent?: (event: LifecycleEvent) => void;
10
13
  readonly log?: (line: string) => void;
14
+ readonly offline?: boolean;
15
+ readonly includeBiomes?: readonly string[];
11
16
  }
12
17
  export interface LaunchHandle {
13
18
  readonly result: BringUpResult;
14
19
  readonly roster: readonly RosterEntry[];
15
20
  shutdown(): Promise<void>;
16
21
  }
17
- export declare function launch(opts: LaunchOptions): Promise<LaunchHandle>;
22
+ export interface LaunchPlan {
23
+ readonly substrate: Substrate;
24
+ readonly lock: {
25
+ readonly path: string;
26
+ readonly source: string;
27
+ };
28
+ readonly roster: readonly RosterEntry[];
29
+ readonly waves: ReturnType<typeof deriveWaves>;
30
+ readonly ports: ReadonlyMap<string, number>;
31
+ readonly infra: ReturnType<typeof resolveInfraPlan>;
32
+ readonly addedPrerequisites: readonly string[];
33
+ readonly skippedOptionalBiomes: readonly string[];
34
+ readonly infraWarnings: readonly string[];
35
+ readonly unresolvedSources: readonly string[];
36
+ }
37
+ export declare function resolveLaunchPlan(opts: LaunchOptions): LaunchPlan;
38
+ export declare function unionIncludeServices(include: RosterInclude, services: readonly string[]): RosterInclude;
39
+ export declare function launch(opts: LaunchOptions, preResolved?: LaunchPlan): Promise<LaunchHandle>;
18
40
  export declare function buildSelection(config: XemaConfig, includeWeb: boolean): RosterSelection;
19
- export declare function normalizeInclude(include: 'all' | readonly string[], features: readonly string[]): RosterInclude;
41
+ export declare function normalizeInclude(include: 'all' | 'default' | 'minimal' | readonly string[], features: readonly string[]): RosterInclude;
20
42
  export declare function splitIncludeTokens(tokens: readonly string[]): {
21
43
  tiers: string[];
22
44
  services: string[];