@xemahq/xema 0.12.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 (335) 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 +668 -297
  4. package/dist/assets/core/images.lock.json +136 -136
  5. package/dist/assets/oss/distribution.lock.json +1532 -444
  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 +33 -11
  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/infra-preflight.d.ts +2 -1
  83. package/dist/dev/infra-preflight.d.ts.map +1 -1
  84. package/dist/dev/infra-preflight.js +10 -0
  85. package/dist/dev/infra-preflight.js.map +1 -1
  86. package/dist/dev/opa-policies.d.ts +3 -0
  87. package/dist/dev/opa-policies.d.ts.map +1 -0
  88. package/dist/dev/opa-policies.js +64 -0
  89. package/dist/dev/opa-policies.js.map +1 -0
  90. package/dist/lib/cli-errors.d.ts +7 -0
  91. package/dist/lib/cli-errors.d.ts.map +1 -0
  92. package/dist/lib/cli-errors.js +30 -0
  93. package/dist/lib/cli-errors.js.map +1 -0
  94. package/dist/lib/control-plane.d.ts.map +1 -1
  95. package/dist/lib/control-plane.js +5 -2
  96. package/dist/lib/control-plane.js.map +1 -1
  97. package/dist/lib/exit-codes.d.ts +3 -4
  98. package/dist/lib/exit-codes.d.ts.map +1 -1
  99. package/dist/lib/exit-codes.js +3 -4
  100. package/dist/lib/exit-codes.js.map +1 -1
  101. package/dist/lib/http-error.d.ts +2 -0
  102. package/dist/lib/http-error.d.ts.map +1 -0
  103. package/dist/lib/http-error.js +51 -0
  104. package/dist/lib/http-error.js.map +1 -0
  105. package/dist/lib/roster-profile.d.ts +10 -0
  106. package/dist/lib/roster-profile.d.ts.map +1 -0
  107. package/dist/lib/roster-profile.js +44 -0
  108. package/dist/lib/roster-profile.js.map +1 -0
  109. package/dist/runtime/biome-dev.d.ts +28 -0
  110. package/dist/runtime/biome-dev.d.ts.map +1 -0
  111. package/dist/runtime/biome-dev.js +131 -0
  112. package/dist/runtime/biome-dev.js.map +1 -0
  113. package/dist/runtime/biome-local-install.d.ts +29 -0
  114. package/dist/runtime/biome-local-install.d.ts.map +1 -0
  115. package/dist/runtime/biome-local-install.js +243 -0
  116. package/dist/runtime/biome-local-install.js.map +1 -0
  117. package/dist/runtime/biome-publish.d.ts +34 -0
  118. package/dist/runtime/biome-publish.d.ts.map +1 -0
  119. package/dist/runtime/biome-publish.js +214 -0
  120. package/dist/runtime/biome-publish.js.map +1 -0
  121. package/dist/runtime/biome-scaffold.d.ts +35 -0
  122. package/dist/runtime/biome-scaffold.d.ts.map +1 -0
  123. package/dist/runtime/biome-scaffold.js +153 -0
  124. package/dist/runtime/biome-scaffold.js.map +1 -0
  125. package/dist/runtime/biome-validate.d.ts +28 -0
  126. package/dist/runtime/biome-validate.d.ts.map +1 -0
  127. package/dist/runtime/biome-validate.js +450 -0
  128. package/dist/runtime/biome-validate.js.map +1 -0
  129. package/dist/runtime/boot-graph-loader.d.ts +1 -0
  130. package/dist/runtime/boot-graph-loader.d.ts.map +1 -1
  131. package/dist/runtime/boot-graph-loader.js +99 -7
  132. package/dist/runtime/boot-graph-loader.js.map +1 -1
  133. package/dist/runtime/canopy-refs.d.ts +8 -0
  134. package/dist/runtime/canopy-refs.d.ts.map +1 -0
  135. package/dist/runtime/canopy-refs.js +51 -0
  136. package/dist/runtime/canopy-refs.js.map +1 -0
  137. package/dist/runtime/canopy-replies.d.ts +14 -0
  138. package/dist/runtime/canopy-replies.d.ts.map +1 -0
  139. package/dist/runtime/canopy-replies.js +39 -0
  140. package/dist/runtime/canopy-replies.js.map +1 -0
  141. package/dist/runtime/capability-invoke.d.ts +35 -0
  142. package/dist/runtime/capability-invoke.d.ts.map +1 -0
  143. package/dist/runtime/capability-invoke.js +119 -0
  144. package/dist/runtime/capability-invoke.js.map +1 -0
  145. package/dist/runtime/config/dev-mode.d.ts +8 -0
  146. package/dist/runtime/config/dev-mode.d.ts.map +1 -0
  147. package/dist/runtime/config/dev-mode.js +84 -0
  148. package/dist/runtime/config/dev-mode.js.map +1 -0
  149. package/dist/runtime/config/init-presets.d.ts +1 -1
  150. package/dist/runtime/config/init-presets.d.ts.map +1 -1
  151. package/dist/runtime/config/init-presets.js +63 -11
  152. package/dist/runtime/config/init-presets.js.map +1 -1
  153. package/dist/runtime/config/loader.d.ts +1 -0
  154. package/dist/runtime/config/loader.d.ts.map +1 -1
  155. package/dist/runtime/config/loader.js +41 -5
  156. package/dist/runtime/config/loader.js.map +1 -1
  157. package/dist/runtime/config/schema.d.ts +27 -12
  158. package/dist/runtime/config/schema.d.ts.map +1 -1
  159. package/dist/runtime/config/schema.js +113 -8
  160. package/dist/runtime/config/schema.js.map +1 -1
  161. package/dist/runtime/config/sources-config.d.ts +14 -0
  162. package/dist/runtime/config/sources-config.d.ts.map +1 -0
  163. package/dist/runtime/config/sources-config.js +79 -0
  164. package/dist/runtime/config/sources-config.js.map +1 -0
  165. package/dist/runtime/distribution/compose.d.ts.map +1 -1
  166. package/dist/runtime/distribution/compose.js +3 -1
  167. package/dist/runtime/distribution/compose.js.map +1 -1
  168. package/dist/runtime/env-seeder.d.ts +5 -0
  169. package/dist/runtime/env-seeder.d.ts.map +1 -1
  170. package/dist/runtime/env-seeder.js +120 -17
  171. package/dist/runtime/env-seeder.js.map +1 -1
  172. package/dist/runtime/foreground.d.ts +4 -0
  173. package/dist/runtime/foreground.d.ts.map +1 -1
  174. package/dist/runtime/foreground.js +11 -0
  175. package/dist/runtime/foreground.js.map +1 -1
  176. package/dist/runtime/infra/infra-catalog.d.ts +1 -0
  177. package/dist/runtime/infra/infra-catalog.d.ts.map +1 -1
  178. package/dist/runtime/infra/infra-catalog.js +2 -1
  179. package/dist/runtime/infra/infra-catalog.js.map +1 -1
  180. package/dist/runtime/infra/infra-runner.d.ts +5 -0
  181. package/dist/runtime/infra/infra-runner.d.ts.map +1 -1
  182. package/dist/runtime/infra/infra-runner.js +82 -13
  183. package/dist/runtime/infra/infra-runner.js.map +1 -1
  184. package/dist/runtime/installation/compiler.d.ts +37 -0
  185. package/dist/runtime/installation/compiler.d.ts.map +1 -0
  186. package/dist/runtime/installation/compiler.js +190 -0
  187. package/dist/runtime/installation/compiler.js.map +1 -0
  188. package/dist/runtime/installation/contract.d.ts +125 -0
  189. package/dist/runtime/installation/contract.d.ts.map +1 -0
  190. package/dist/runtime/installation/contract.js +182 -0
  191. package/dist/runtime/installation/contract.js.map +1 -0
  192. package/dist/runtime/installation/diagnostics.d.ts +16 -0
  193. package/dist/runtime/installation/diagnostics.d.ts.map +1 -0
  194. package/dist/runtime/installation/diagnostics.js +21 -0
  195. package/dist/runtime/installation/diagnostics.js.map +1 -0
  196. package/dist/runtime/installation/diff.d.ts +17 -0
  197. package/dist/runtime/installation/diff.d.ts.map +1 -0
  198. package/dist/runtime/installation/diff.js +99 -0
  199. package/dist/runtime/installation/diff.js.map +1 -0
  200. package/dist/runtime/installation/format.d.ts +3 -0
  201. package/dist/runtime/installation/format.d.ts.map +1 -0
  202. package/dist/runtime/installation/format.js +22 -0
  203. package/dist/runtime/installation/format.js.map +1 -0
  204. package/dist/runtime/installation/from-current-config.d.ts +8 -0
  205. package/dist/runtime/installation/from-current-config.d.ts.map +1 -0
  206. package/dist/runtime/installation/from-current-config.js +75 -0
  207. package/dist/runtime/installation/from-current-config.js.map +1 -0
  208. package/dist/runtime/installation/index.d.ts +13 -0
  209. package/dist/runtime/installation/index.d.ts.map +1 -0
  210. package/dist/runtime/installation/index.js +29 -0
  211. package/dist/runtime/installation/index.js.map +1 -0
  212. package/dist/runtime/installation/lifecycle.d.ts +23 -0
  213. package/dist/runtime/installation/lifecycle.d.ts.map +1 -0
  214. package/dist/runtime/installation/lifecycle.js +70 -0
  215. package/dist/runtime/installation/lifecycle.js.map +1 -0
  216. package/dist/runtime/installation/serialization.d.ts +3 -0
  217. package/dist/runtime/installation/serialization.d.ts.map +1 -0
  218. package/dist/runtime/installation/serialization.js +39 -0
  219. package/dist/runtime/installation/serialization.js.map +1 -0
  220. package/dist/runtime/installation/state-store.d.ts +20 -0
  221. package/dist/runtime/installation/state-store.d.ts.map +1 -0
  222. package/dist/runtime/installation/state-store.js +257 -0
  223. package/dist/runtime/installation/state-store.js.map +1 -0
  224. package/dist/runtime/installation/status.d.ts +30 -0
  225. package/dist/runtime/installation/status.d.ts.map +1 -0
  226. package/dist/runtime/installation/status.js +138 -0
  227. package/dist/runtime/installation/status.js.map +1 -0
  228. package/dist/runtime/installation/support-bundle.d.ts +30 -0
  229. package/dist/runtime/installation/support-bundle.d.ts.map +1 -0
  230. package/dist/runtime/installation/support-bundle.js +130 -0
  231. package/dist/runtime/installation/support-bundle.js.map +1 -0
  232. package/dist/runtime/installation/validation.d.ts +8 -0
  233. package/dist/runtime/installation/validation.d.ts.map +1 -0
  234. package/dist/runtime/installation/validation.js +39 -0
  235. package/dist/runtime/installation/validation.js.map +1 -0
  236. package/dist/runtime/installation/validators/common.d.ts +4 -0
  237. package/dist/runtime/installation/validators/common.d.ts.map +1 -0
  238. package/dist/runtime/installation/validators/common.js +29 -0
  239. package/dist/runtime/installation/validators/common.js.map +1 -0
  240. package/dist/runtime/installation/validators/infrastructure.d.ts +4 -0
  241. package/dist/runtime/installation/validators/infrastructure.d.ts.map +1 -0
  242. package/dist/runtime/installation/validators/infrastructure.js +78 -0
  243. package/dist/runtime/installation/validators/infrastructure.js.map +1 -0
  244. package/dist/runtime/installation/validators/operational.d.ts +4 -0
  245. package/dist/runtime/installation/validators/operational.d.ts.map +1 -0
  246. package/dist/runtime/installation/validators/operational.js +126 -0
  247. package/dist/runtime/installation/validators/operational.js.map +1 -0
  248. package/dist/runtime/installation/validators/profile.d.ts +4 -0
  249. package/dist/runtime/installation/validators/profile.d.ts.map +1 -0
  250. package/dist/runtime/installation/validators/profile.js +78 -0
  251. package/dist/runtime/installation/validators/profile.js.map +1 -0
  252. package/dist/runtime/installation/validators/secrets.d.ts +4 -0
  253. package/dist/runtime/installation/validators/secrets.d.ts.map +1 -0
  254. package/dist/runtime/installation/validators/secrets.js +68 -0
  255. package/dist/runtime/installation/validators/secrets.js.map +1 -0
  256. package/dist/runtime/launch-plan-format.d.ts +3 -0
  257. package/dist/runtime/launch-plan-format.d.ts.map +1 -0
  258. package/dist/runtime/launch-plan-format.js +57 -0
  259. package/dist/runtime/launch-plan-format.js.map +1 -0
  260. package/dist/runtime/launch.d.ts +25 -3
  261. package/dist/runtime/launch.d.ts.map +1 -1
  262. package/dist/runtime/launch.js +264 -24
  263. package/dist/runtime/launch.js.map +1 -1
  264. package/dist/runtime/object-registry-client.d.ts +31 -0
  265. package/dist/runtime/object-registry-client.d.ts.map +1 -0
  266. package/dist/runtime/object-registry-client.js +54 -0
  267. package/dist/runtime/object-registry-client.js.map +1 -0
  268. package/dist/runtime/paths.d.ts +1 -0
  269. package/dist/runtime/paths.d.ts.map +1 -1
  270. package/dist/runtime/paths.js +2 -0
  271. package/dist/runtime/paths.js.map +1 -1
  272. package/dist/runtime/roster.d.ts +11 -4
  273. package/dist/runtime/roster.d.ts.map +1 -1
  274. package/dist/runtime/roster.js +78 -7
  275. package/dist/runtime/roster.js.map +1 -1
  276. package/dist/runtime/run-manifest.d.ts +23 -0
  277. package/dist/runtime/run-manifest.d.ts.map +1 -0
  278. package/dist/runtime/run-manifest.js +273 -0
  279. package/dist/runtime/run-manifest.js.map +1 -0
  280. package/dist/runtime/runner/container-runner.d.ts +6 -0
  281. package/dist/runtime/runner/container-runner.d.ts.map +1 -1
  282. package/dist/runtime/runner/container-runner.js +25 -6
  283. package/dist/runtime/runner/container-runner.js.map +1 -1
  284. package/dist/runtime/runner/docker-cli.d.ts +6 -1
  285. package/dist/runtime/runner/docker-cli.d.ts.map +1 -1
  286. package/dist/runtime/runner/docker-cli.js +47 -6
  287. package/dist/runtime/runner/docker-cli.js.map +1 -1
  288. package/dist/runtime/runner/native-runner.d.ts.map +1 -1
  289. package/dist/runtime/runner/native-runner.js +21 -14
  290. package/dist/runtime/runner/native-runner.js.map +1 -1
  291. package/dist/runtime/secrets/managed-local-store.d.ts +26 -0
  292. package/dist/runtime/secrets/managed-local-store.d.ts.map +1 -0
  293. package/dist/runtime/secrets/managed-local-store.js +202 -0
  294. package/dist/runtime/secrets/managed-local-store.js.map +1 -0
  295. package/dist/runtime/secrets/resolver.d.ts +23 -0
  296. package/dist/runtime/secrets/resolver.d.ts.map +1 -0
  297. package/dist/runtime/secrets/resolver.js +265 -0
  298. package/dist/runtime/secrets/resolver.js.map +1 -0
  299. package/dist/runtime/secrets/url-security.d.ts +3 -0
  300. package/dist/runtime/secrets/url-security.d.ts.map +1 -0
  301. package/dist/runtime/secrets/url-security.js +13 -0
  302. package/dist/runtime/secrets/url-security.js.map +1 -0
  303. package/dist/runtime/sources/credentials.d.ts.map +1 -1
  304. package/dist/runtime/sources/credentials.js +2 -1
  305. package/dist/runtime/sources/credentials.js.map +1 -1
  306. package/dist/runtime/sources/kinds/git.d.ts +6 -3
  307. package/dist/runtime/sources/kinds/git.d.ts.map +1 -1
  308. package/dist/runtime/sources/kinds/git.js +99 -22
  309. package/dist/runtime/sources/kinds/git.js.map +1 -1
  310. package/dist/runtime/sources/resolve-context.d.ts +7 -0
  311. package/dist/runtime/sources/resolve-context.d.ts.map +1 -0
  312. package/dist/runtime/sources/resolve-context.js +3 -0
  313. package/dist/runtime/sources/resolve-context.js.map +1 -0
  314. package/dist/runtime/sources/resolver.d.ts +2 -2
  315. package/dist/runtime/sources/resolver.d.ts.map +1 -1
  316. package/dist/runtime/sources/resolver.js +11 -5
  317. package/dist/runtime/sources/resolver.js.map +1 -1
  318. package/dist/runtime/store-client.d.ts +59 -0
  319. package/dist/runtime/store-client.d.ts.map +1 -0
  320. package/dist/runtime/store-client.js +71 -0
  321. package/dist/runtime/store-client.js.map +1 -0
  322. package/dist/runtime/supervisor.d.ts +6 -0
  323. package/dist/runtime/supervisor.d.ts.map +1 -1
  324. package/dist/runtime/supervisor.js +37 -5
  325. package/dist/runtime/supervisor.js.map +1 -1
  326. package/dist/runtime/waves.d.ts +1 -1
  327. package/dist/runtime/waves.d.ts.map +1 -1
  328. package/dist/runtime/waves.js +86 -19
  329. package/dist/runtime/waves.js.map +1 -1
  330. package/examples/01-local-native.yaml +4 -1
  331. package/examples/03-byo-infra.yaml +17 -7
  332. package/examples/05-appliance-helm.yaml +1 -1
  333. package/examples/06-biome-sources.yaml +4 -1
  334. package/package.json +6 -5
  335. package/xema.config.example.yaml +22 -18
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.installationContext = installationContext;
4
+ exports.compileCurrentInstallation = compileCurrentInstallation;
5
+ exports.planInstallation = planInstallation;
6
+ exports.applyInstallation = applyInstallation;
7
+ const compiler_1 = require("./compiler");
8
+ const diff_1 = require("./diff");
9
+ const from_current_config_1 = require("./from-current-config");
10
+ const serialization_1 = require("./serialization");
11
+ function installationContext(installationIdentity) {
12
+ return {
13
+ installationId: `local-${(0, serialization_1.hashInstallation)(installationIdentity).slice(0, 20)}`,
14
+ };
15
+ }
16
+ function compileCurrentInstallation(config, installationIdentity) {
17
+ return (0, compiler_1.compileXemaInstallation)((0, from_current_config_1.installationFromCurrentConfig)(config, installationContext(installationIdentity)));
18
+ }
19
+ function planInstallation(desired, store) {
20
+ const appliedState = store.read(desired.installationId);
21
+ const applied = appliedState?.plan;
22
+ return {
23
+ desired,
24
+ ...(applied === undefined ? {} : { applied }),
25
+ diff: applied === undefined
26
+ ? {
27
+ classification: diff_1.InstallationChangeClass.RequiresRollout,
28
+ changes: [
29
+ {
30
+ path: '<installation>',
31
+ classification: diff_1.InstallationChangeClass.RequiresRollout,
32
+ },
33
+ ],
34
+ }
35
+ : (0, diff_1.diffInstallationPlans)(applied, desired),
36
+ };
37
+ }
38
+ async function applyInstallation(desired, store, executor, opts = {}) {
39
+ const release = store.acquireApplyLock(desired.installationId);
40
+ let ready = false;
41
+ try {
42
+ const planned = planInstallation(desired, store);
43
+ assertChangeAuthorized(planned.diff, opts);
44
+ if (planned.diff.changes.length === 0 && opts.forceExecution !== true) {
45
+ return { ...planned, executed: false };
46
+ }
47
+ await executor(async () => {
48
+ store.write(desired);
49
+ ready = true;
50
+ release();
51
+ });
52
+ if (!ready) {
53
+ throw new Error('Installation executor completed without reporting a ready installation.');
54
+ }
55
+ return { ...planned, executed: true };
56
+ }
57
+ finally {
58
+ release();
59
+ }
60
+ }
61
+ function assertChangeAuthorized(diff, opts) {
62
+ if (diff.classification === diff_1.InstallationChangeClass.Rejected) {
63
+ throw new Error('Installation apply rejected this identity/schema transition. Create a distinct installation or restore the previous desired state.');
64
+ }
65
+ if (diff.classification === diff_1.InstallationChangeClass.Destructive &&
66
+ opts.allowDestructive !== true) {
67
+ throw new Error('Installation plan contains destructive changes. Re-run with --allow-destructive after reviewing the plan.');
68
+ }
69
+ }
70
+ //# sourceMappingURL=lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/installation/lifecycle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function serializeInstallation(value: unknown): string;
2
+ export declare function hashInstallation(value: unknown): string;
3
+ //# sourceMappingURL=serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../../../src/runtime/installation/serialization.ts"],"names":[],"mappings":"AAEA,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAIvD"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.serializeInstallation = serializeInstallation;
4
+ exports.hashInstallation = hashInstallation;
5
+ const node_crypto_1 = require("node:crypto");
6
+ function serializeInstallation(value) {
7
+ return serializeValue(value);
8
+ }
9
+ function hashInstallation(value) {
10
+ return (0, node_crypto_1.createHash)('sha256')
11
+ .update(serializeInstallation(value))
12
+ .digest('hex');
13
+ }
14
+ function serializeValue(value) {
15
+ if (value === null ||
16
+ typeof value === 'boolean' ||
17
+ typeof value === 'string') {
18
+ return JSON.stringify(value);
19
+ }
20
+ if (typeof value === 'number') {
21
+ if (!Number.isFinite(value)) {
22
+ throw new Error('Installation plans cannot contain non-finite numbers');
23
+ }
24
+ return JSON.stringify(value);
25
+ }
26
+ if (Array.isArray(value)) {
27
+ return `[${value.map((entry) => serializeValue(entry)).join(',')}]`;
28
+ }
29
+ if (typeof value === 'object') {
30
+ const record = value;
31
+ return `{${Object.keys(record)
32
+ .filter((key) => record[key] !== undefined)
33
+ .sort()
34
+ .map((key) => `${JSON.stringify(key)}:${serializeValue(record[key])}`)
35
+ .join(',')}}`;
36
+ }
37
+ throw new Error(`Installation plans cannot contain values of type ${typeof value}`);
38
+ }
39
+ //# sourceMappingURL=serialization.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.js","sourceRoot":"","sources":["../../../src/runtime/installation/serialization.ts"],"names":[],"mappings":";;AAEA,sDAEC;AAED,4CAIC;AAVD,6CAAyC;AAEzC,SAAgB,qBAAqB,CAAC,KAAc;IAClD,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC;SACxB,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;SACpC,MAAM,CAAC,KAAK,CAAC,CAAC;AACnB,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,SAAS;QAC1B,OAAO,KAAK,KAAK,QAAQ,EACzB,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACtE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,KAA0C,CAAC;QAC1D,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;aAC3B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;aAC1C,IAAI,EAAE;aACN,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;aACrE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAClB,CAAC;IACD,MAAM,IAAI,KAAK,CACb,oDAAoD,OAAO,KAAK,EAAE,CACnE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type CompiledXemaInstallation } from './compiler';
2
+ export interface AppliedInstallationState {
3
+ readonly schemaVersion: 1;
4
+ readonly appliedAt: string;
5
+ readonly planHash: string;
6
+ readonly plan: CompiledXemaInstallation;
7
+ }
8
+ export interface InstallationStateStoreOptions {
9
+ readonly root?: string;
10
+ }
11
+ export declare class InstallationStateStore {
12
+ private readonly root;
13
+ constructor(opts?: InstallationStateStoreOptions);
14
+ read(installationId: string): AppliedInstallationState | undefined;
15
+ write(plan: CompiledXemaInstallation, appliedAt?: string): AppliedInstallationState;
16
+ acquireApplyLock(installationId: string): () => void;
17
+ private appliedPath;
18
+ private installationDirectory;
19
+ }
20
+ //# sourceMappingURL=state-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.d.ts","sourceRoot":"","sources":["../../../src/runtime/installation/state-store.ts"],"names":[],"mappings":"AAkBA,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC;CACzC;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAWD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;gBAEX,IAAI,GAAE,6BAAkC;IAIpD,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAclE,KAAK,CACV,IAAI,EAAE,wBAAwB,EAC9B,SAAS,SAA2B,GACnC,wBAAwB;IAWpB,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,IAAI;IA8D3D,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,qBAAqB;CAQ9B"}
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InstallationStateStore = void 0;
4
+ const node_crypto_1 = require("node:crypto");
5
+ const node_fs_1 = require("node:fs");
6
+ const node_os_1 = require("node:os");
7
+ const node_path_1 = require("node:path");
8
+ const compiler_1 = require("./compiler");
9
+ const serialization_1 = require("./serialization");
10
+ const PRIVATE_DIRECTORY_MODE = 0o700;
11
+ const PRIVATE_FILE_MODE = 0o600;
12
+ class InstallationStateStore {
13
+ root;
14
+ constructor(opts = {}) {
15
+ this.root = opts.root ?? (0, node_path_1.join)((0, node_os_1.homedir)(), '.xema', 'installations');
16
+ }
17
+ read(installationId) {
18
+ const path = this.appliedPath(installationId);
19
+ const directory = (0, node_path_1.dirname)(path);
20
+ if (!(0, node_fs_1.existsSync)(directory)) {
21
+ return undefined;
22
+ }
23
+ assertPrivateDirectory(directory);
24
+ if (!(0, node_fs_1.existsSync)(path)) {
25
+ return undefined;
26
+ }
27
+ const parsed = JSON.parse(readPrivateFile(path));
28
+ return parseAppliedState(parsed, path);
29
+ }
30
+ write(plan, appliedAt = new Date().toISOString()) {
31
+ const state = {
32
+ schemaVersion: 1,
33
+ appliedAt,
34
+ planHash: plan.planHash,
35
+ plan,
36
+ };
37
+ writeJsonAtomically(this.appliedPath(plan.installationId), state);
38
+ return state;
39
+ }
40
+ acquireApplyLock(installationId) {
41
+ const path = (0, node_path_1.join)(this.installationDirectory(installationId), 'apply.lock');
42
+ const recoveryPath = `${path}.recovery`;
43
+ ensurePrivateDirectory((0, node_path_1.dirname)(path));
44
+ for (let attempt = 0; attempt < 2; attempt += 1) {
45
+ const owner = {
46
+ pid: process.pid,
47
+ token: (0, node_crypto_1.randomUUID)(),
48
+ acquiredAt: new Date().toISOString(),
49
+ };
50
+ try {
51
+ writeExclusiveFile(path, owner);
52
+ let released = false;
53
+ return () => {
54
+ if (!released) {
55
+ assertLockOwnership(path, owner.token);
56
+ released = true;
57
+ (0, node_fs_1.rmSync)(path, { force: true });
58
+ }
59
+ };
60
+ }
61
+ catch (error) {
62
+ const code = error.code;
63
+ if (code !== 'EEXIST') {
64
+ throw error;
65
+ }
66
+ const existing = readLockOwner(path);
67
+ if (existing === undefined) {
68
+ throw new Error(`Installation "${installationId}" has an unreadable apply lock at ${path}; remove it only after confirming no apply process is running.`);
69
+ }
70
+ if (processIsAlive(existing.pid)) {
71
+ throw new Error(`Installation "${installationId}" is already being applied by process ${String(existing.pid)}.`);
72
+ }
73
+ const releaseRecovery = acquireRecoveryLock(recoveryPath, installationId);
74
+ try {
75
+ const rechecked = readLockOwner(path);
76
+ if (rechecked === undefined ||
77
+ rechecked.token !== existing.token ||
78
+ processIsAlive(rechecked.pid)) {
79
+ throw new Error(`Installation "${installationId}" apply-lock ownership changed during stale-lock recovery; retry after the active apply completes.`);
80
+ }
81
+ (0, node_fs_1.rmSync)(path);
82
+ }
83
+ finally {
84
+ releaseRecovery();
85
+ }
86
+ }
87
+ }
88
+ throw new Error(`Could not acquire the apply lock for installation "${installationId}".`);
89
+ }
90
+ appliedPath(installationId) {
91
+ return (0, node_path_1.join)(this.installationDirectory(installationId), 'last-applied.json');
92
+ }
93
+ installationDirectory(installationId) {
94
+ if (!/^[A-Za-z0-9._-]+$/.test(installationId)) {
95
+ throw new Error(`Installation id "${installationId}" is unsafe for local state storage.`);
96
+ }
97
+ return (0, node_path_1.join)(this.root, installationId);
98
+ }
99
+ }
100
+ exports.InstallationStateStore = InstallationStateStore;
101
+ function parseAppliedState(value, path) {
102
+ if (value === null ||
103
+ typeof value !== 'object' ||
104
+ value.schemaVersion !== 1) {
105
+ throw new Error(`Applied installation state is invalid: ${path}`);
106
+ }
107
+ const state = value;
108
+ if (typeof state.appliedAt !== 'string' ||
109
+ !Number.isFinite(Date.parse(state.appliedAt)) ||
110
+ typeof state.planHash !== 'string' ||
111
+ !/^[a-f0-9]{64}$/.test(state.planHash) ||
112
+ state.plan === undefined ||
113
+ state.plan.planHash !== state.planHash) {
114
+ throw new Error(`Applied installation state is corrupt: ${path}`);
115
+ }
116
+ const { planHash: _planHash, ...planPayload } = state.plan;
117
+ if ((0, serialization_1.hashInstallation)(planPayload) !== state.planHash) {
118
+ throw new Error(`Applied installation state hash is invalid: ${path}`);
119
+ }
120
+ let plan;
121
+ try {
122
+ plan = (0, compiler_1.compileXemaInstallation)(planPayload);
123
+ }
124
+ catch {
125
+ throw new Error(`Applied installation state plan is invalid: ${path}`);
126
+ }
127
+ if (plan.planHash !== state.planHash) {
128
+ throw new Error(`Applied installation state plan is non-canonical: ${path}`);
129
+ }
130
+ return {
131
+ schemaVersion: 1,
132
+ appliedAt: state.appliedAt,
133
+ planHash: state.planHash,
134
+ plan,
135
+ };
136
+ }
137
+ function readLockOwner(path) {
138
+ try {
139
+ const value = JSON.parse(readPrivateFile(path));
140
+ return typeof value.pid === 'number' &&
141
+ Number.isInteger(value.pid) &&
142
+ typeof value.token === 'string' &&
143
+ value.token.length > 0 &&
144
+ typeof value.acquiredAt === 'string'
145
+ ? value
146
+ : undefined;
147
+ }
148
+ catch {
149
+ return undefined;
150
+ }
151
+ }
152
+ function processIsAlive(pid) {
153
+ try {
154
+ process.kill(pid, 0);
155
+ return true;
156
+ }
157
+ catch (error) {
158
+ return error.code === 'EPERM';
159
+ }
160
+ }
161
+ function writeJsonAtomically(path, value) {
162
+ const directory = (0, node_path_1.dirname)(path);
163
+ ensurePrivateDirectory(directory);
164
+ const temporary = (0, node_path_1.join)(directory, `.last-applied.${String(process.pid)}.${Date.now().toString(36)}.tmp`);
165
+ const fd = (0, node_fs_1.openSync)(temporary, 'wx', PRIVATE_FILE_MODE);
166
+ try {
167
+ (0, node_fs_1.writeFileSync)(fd, `${(0, serialization_1.serializeInstallation)(value)}\n`, 'utf8');
168
+ (0, node_fs_1.fsyncSync)(fd);
169
+ }
170
+ finally {
171
+ (0, node_fs_1.closeSync)(fd);
172
+ }
173
+ try {
174
+ (0, node_fs_1.renameSync)(temporary, path);
175
+ const directoryFd = (0, node_fs_1.openSync)(directory, 'r');
176
+ try {
177
+ (0, node_fs_1.fsyncSync)(directoryFd);
178
+ }
179
+ finally {
180
+ (0, node_fs_1.closeSync)(directoryFd);
181
+ }
182
+ }
183
+ catch (error) {
184
+ (0, node_fs_1.rmSync)(temporary, { force: true });
185
+ throw error;
186
+ }
187
+ }
188
+ function ensurePrivateDirectory(directory) {
189
+ (0, node_fs_1.mkdirSync)(directory, { recursive: true, mode: PRIVATE_DIRECTORY_MODE });
190
+ assertPrivateDirectory(directory);
191
+ }
192
+ function assertPrivateDirectory(directory) {
193
+ const stat = (0, node_fs_1.lstatSync)(directory);
194
+ if (!stat.isDirectory() ||
195
+ !ownedByCurrentUser(stat.uid) ||
196
+ (process.platform !== 'win32' && (stat.mode & 0o077) !== 0)) {
197
+ throw new Error(`Installation state directory is unsafe at ${directory}; expected an installer-owned directory with mode 0700.`);
198
+ }
199
+ }
200
+ function readPrivateFile(path) {
201
+ let fd;
202
+ try {
203
+ fd = (0, node_fs_1.openSync)(path, node_fs_1.constants.O_RDONLY | (node_fs_1.constants.O_NOFOLLOW ?? 0));
204
+ const stat = (0, node_fs_1.fstatSync)(fd);
205
+ if (!stat.isFile() ||
206
+ !ownedByCurrentUser(stat.uid) ||
207
+ (process.platform !== 'win32' && (stat.mode & 0o077) !== 0)) {
208
+ throw new Error(`Installation state file is unsafe at ${path}; expected an installer-owned regular file with mode 0600.`);
209
+ }
210
+ return (0, node_fs_1.readFileSync)(fd, 'utf8');
211
+ }
212
+ finally {
213
+ if (fd !== undefined) {
214
+ (0, node_fs_1.closeSync)(fd);
215
+ }
216
+ }
217
+ }
218
+ function writeExclusiveFile(path, value) {
219
+ const fd = (0, node_fs_1.openSync)(path, 'wx', PRIVATE_FILE_MODE);
220
+ try {
221
+ (0, node_fs_1.writeFileSync)(fd, `${(0, serialization_1.serializeInstallation)(value)}\n`, 'utf8');
222
+ (0, node_fs_1.fsyncSync)(fd);
223
+ }
224
+ finally {
225
+ (0, node_fs_1.closeSync)(fd);
226
+ }
227
+ }
228
+ function acquireRecoveryLock(path, installationId) {
229
+ const owner = {
230
+ pid: process.pid,
231
+ token: (0, node_crypto_1.randomUUID)(),
232
+ acquiredAt: new Date().toISOString(),
233
+ };
234
+ try {
235
+ writeExclusiveFile(path, owner);
236
+ }
237
+ catch (error) {
238
+ if (error.code !== 'EEXIST') {
239
+ throw error;
240
+ }
241
+ throw new Error(`Installation "${installationId}" stale-lock recovery is already in progress. Retry after it completes.`);
242
+ }
243
+ return () => {
244
+ assertLockOwnership(path, owner.token);
245
+ (0, node_fs_1.rmSync)(path);
246
+ };
247
+ }
248
+ function assertLockOwnership(path, token) {
249
+ const owner = readLockOwner(path);
250
+ if (owner?.token !== token) {
251
+ throw new Error(`Installation apply lock ownership changed unexpectedly at ${path}; refusing to remove another process's lock.`);
252
+ }
253
+ }
254
+ function ownedByCurrentUser(uid) {
255
+ return typeof process.getuid !== 'function' || process.getuid() === uid;
256
+ }
257
+ //# sourceMappingURL=state-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-store.js","sourceRoot":"","sources":["../../../src/runtime/installation/state-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Substrate } from '../config/schema';
2
+ import type { CompiledXemaInstallation } from './compiler';
3
+ import type { InstallationStateStore } from './state-store';
4
+ export declare enum InstallationObservedCondition {
5
+ Running = "running",
6
+ Stopped = "stopped",
7
+ Degraded = "degraded",
8
+ Unavailable = "unavailable"
9
+ }
10
+ export interface ObservedInstallationState {
11
+ readonly substrate: Substrate;
12
+ readonly condition: InstallationObservedCondition;
13
+ readonly workloads: readonly {
14
+ readonly name: string;
15
+ readonly state: string;
16
+ }[];
17
+ readonly detail?: string;
18
+ }
19
+ export interface InstallationStatusReport {
20
+ readonly installationId: string;
21
+ readonly desiredPlanHash: string;
22
+ readonly appliedPlanHash?: string;
23
+ readonly desiredAppliedDrift: boolean;
24
+ readonly observedAppliedDrift: boolean;
25
+ readonly observed: ObservedInstallationState;
26
+ }
27
+ export declare function installationStatus(desired: CompiledXemaInstallation, substrate: Substrate, store: InstallationStateStore): Promise<InstallationStatusReport>;
28
+ export declare function installationStatusFromObserved(desired: CompiledXemaInstallation, store: InstallationStateStore, observed: ObservedInstallationState): InstallationStatusReport;
29
+ export declare function observeInstallation(substrate: Substrate): Promise<ObservedInstallationState>;
30
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/runtime/installation/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAK7C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE5D,oBAAY,6BAA6B;IACvC,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,QAAQ,aAAa;IACrB,WAAW,gBAAgB;CAC5B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,6BAA6B,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,SAAS;QAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;IACJ,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;CAC9C;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,wBAAwB,EACjC,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,sBAAsB,GAC5B,OAAO,CAAC,wBAAwB,CAAC,CAMnC;AAED,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,wBAAwB,EACjC,KAAK,EAAE,sBAAsB,EAC7B,QAAQ,EAAE,yBAAyB,GAClC,wBAAwB,CAc1B;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,SAAS,GACnB,OAAO,CAAC,yBAAyB,CAAC,CASpC"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InstallationObservedCondition = void 0;
4
+ exports.installationStatus = installationStatus;
5
+ exports.installationStatusFromObserved = installationStatusFromObserved;
6
+ exports.observeInstallation = observeInstallation;
7
+ const schema_1 = require("../config/schema");
8
+ const run_manifest_1 = require("../run-manifest");
9
+ const docker_cli_1 = require("../runner/docker-cli");
10
+ const helm_cli_1 = require("../runner/helm-cli");
11
+ var InstallationObservedCondition;
12
+ (function (InstallationObservedCondition) {
13
+ InstallationObservedCondition["Running"] = "running";
14
+ InstallationObservedCondition["Stopped"] = "stopped";
15
+ InstallationObservedCondition["Degraded"] = "degraded";
16
+ InstallationObservedCondition["Unavailable"] = "unavailable";
17
+ })(InstallationObservedCondition || (exports.InstallationObservedCondition = InstallationObservedCondition = {}));
18
+ async function installationStatus(desired, substrate, store) {
19
+ return installationStatusFromObserved(desired, store, await observeInstallation(substrate));
20
+ }
21
+ function installationStatusFromObserved(desired, store, observed) {
22
+ const applied = store.read(desired.installationId);
23
+ return {
24
+ installationId: desired.installationId,
25
+ desiredPlanHash: desired.planHash,
26
+ ...(applied === undefined ? {} : { appliedPlanHash: applied.planHash }),
27
+ desiredAppliedDrift: applied === undefined || applied.planHash !== desired.planHash,
28
+ observedAppliedDrift: applied === undefined
29
+ ? observed.condition !== InstallationObservedCondition.Stopped
30
+ : observed.condition !== InstallationObservedCondition.Running,
31
+ observed,
32
+ };
33
+ }
34
+ async function observeInstallation(substrate) {
35
+ switch (substrate) {
36
+ case schema_1.Substrate.Native:
37
+ return observeNative();
38
+ case schema_1.Substrate.Container:
39
+ return observeContainers();
40
+ case schema_1.Substrate.Helm:
41
+ return observeHelm();
42
+ }
43
+ }
44
+ function observeNative() {
45
+ const services = (0, run_manifest_1.readRunManifest)();
46
+ const workloads = services.map((service) => ({
47
+ name: service.name,
48
+ state: processIsAlive(service.pid) ? 'running' : 'stale',
49
+ }));
50
+ const running = workloads.filter((workload) => workload.state === 'running');
51
+ return {
52
+ substrate: schema_1.Substrate.Native,
53
+ condition: workloads.length === 0
54
+ ? InstallationObservedCondition.Stopped
55
+ : running.length === workloads.length
56
+ ? InstallationObservedCondition.Running
57
+ : InstallationObservedCondition.Degraded,
58
+ workloads,
59
+ };
60
+ }
61
+ async function observeContainers() {
62
+ const docker = new docker_cli_1.DockerCli();
63
+ if (!(await docker.available())) {
64
+ return {
65
+ substrate: schema_1.Substrate.Container,
66
+ condition: InstallationObservedCondition.Unavailable,
67
+ workloads: [],
68
+ detail: 'container runtime is not reachable',
69
+ };
70
+ }
71
+ const output = await docker.run([
72
+ 'ps',
73
+ '-a',
74
+ '--filter',
75
+ 'label=xema.launcher',
76
+ '--format',
77
+ '{{.Names}}\t{{.State}}',
78
+ ]);
79
+ const workloads = parseWorkloadLines(output);
80
+ return {
81
+ substrate: schema_1.Substrate.Container,
82
+ condition: conditionForWorkloads(workloads, 'running'),
83
+ workloads,
84
+ };
85
+ }
86
+ async function observeHelm() {
87
+ const helm = new helm_cli_1.HelmCli();
88
+ if (!(await helm.available())) {
89
+ return {
90
+ substrate: schema_1.Substrate.Helm,
91
+ condition: InstallationObservedCondition.Unavailable,
92
+ workloads: [],
93
+ detail: 'helm is not reachable',
94
+ };
95
+ }
96
+ const output = await helm.exec(['list', '-q', '--namespace', helm.namespace]);
97
+ const names = output
98
+ .split('\n')
99
+ .map((line) => line.trim())
100
+ .filter((line) => line.length > 0);
101
+ const workloads = names.map((name) => ({ name, state: 'deployed' }));
102
+ return {
103
+ substrate: schema_1.Substrate.Helm,
104
+ condition: conditionForWorkloads(workloads, 'deployed'),
105
+ workloads,
106
+ };
107
+ }
108
+ function parseWorkloadLines(output) {
109
+ return output
110
+ .split('\n')
111
+ .map((line) => line.trim())
112
+ .filter((line) => line.length > 0)
113
+ .map((line) => {
114
+ const [name, state] = line.split('\t');
115
+ if (name === undefined || state === undefined) {
116
+ throw new Error(`Unexpected container status row: ${line}`);
117
+ }
118
+ return { name, state };
119
+ });
120
+ }
121
+ function conditionForWorkloads(workloads, healthyState) {
122
+ if (workloads.length === 0) {
123
+ return InstallationObservedCondition.Stopped;
124
+ }
125
+ return workloads.every((workload) => workload.state === healthyState)
126
+ ? InstallationObservedCondition.Running
127
+ : InstallationObservedCondition.Degraded;
128
+ }
129
+ function processIsAlive(pid) {
130
+ try {
131
+ process.kill(pid, 0);
132
+ return true;
133
+ }
134
+ catch (error) {
135
+ return error.code === 'EPERM';
136
+ }
137
+ }
138
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/runtime/installation/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { CompiledXemaInstallation } from './compiler';
2
+ import type { InstallationStatusReport } from './status';
3
+ import type { XemaConfig } from '../config/schema';
4
+ export interface InstallationSupportBundle {
5
+ readonly schemaVersion: 1;
6
+ readonly createdAt: string;
7
+ readonly payload: {
8
+ readonly config: unknown;
9
+ readonly desiredPlan: unknown;
10
+ readonly status: InstallationStatusReport;
11
+ readonly logMetadata: {
12
+ readonly includedContent: false;
13
+ readonly workloads: readonly {
14
+ readonly name: string;
15
+ readonly state: string;
16
+ }[];
17
+ };
18
+ };
19
+ readonly manifest: {
20
+ readonly algorithm: 'sha256';
21
+ readonly payloadHash: string;
22
+ };
23
+ }
24
+ export declare function createSupportBundle(config: XemaConfig, desiredPlan: CompiledXemaInstallation, status: InstallationStatusReport, createdAt?: string): InstallationSupportBundle;
25
+ export declare function writeSupportBundle(outputPath: string, bundle: InstallationSupportBundle, opts?: Readonly<{
26
+ overwrite?: boolean;
27
+ }>): void;
28
+ export declare function verifySupportBundle(bundle: InstallationSupportBundle): boolean;
29
+ export declare function redactSupportValue(value: unknown, parentKey?: string): unknown;
30
+ //# sourceMappingURL=support-bundle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-bundle.d.ts","sourceRoot":"","sources":["../../../src/runtime/installation/support-bundle.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;QAC9B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;QAC1C,QAAQ,CAAC,WAAW,EAAE;YACpB,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;YAChC,QAAQ,CAAC,SAAS,EAAE,SAAS;gBAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;aACxB,EAAE,CAAC;SACL,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;QAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;KAC9B,CAAC;CACH;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,EAClB,WAAW,EAAE,wBAAwB,EACrC,MAAM,EAAE,wBAAwB,EAChC,SAAS,SAA2B,GACnC,yBAAyB,CAmB3B;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,yBAAyB,EACjC,IAAI,GAAE,QAAQ,CAAC;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAM,GAC3C,IAAI,CAwCN;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAET;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,SAAK,GAAG,OAAO,CAyB1E"}