@xemahq/xema 0.1.4 → 0.2.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 (133) hide show
  1. package/README.md +64 -15
  2. package/dist/assets/boot-graph.json +72 -0
  3. package/dist/assets/core/distribution.lock.json +1244 -0
  4. package/dist/assets/core/images.lock.json +428 -0
  5. package/dist/assets/oss/distribution.lock.json +1978 -0
  6. package/dist/assets/oss/images.lock.json +594 -0
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +9 -1
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/dev.d.ts.map +1 -1
  11. package/dist/commands/dev.js +36 -14
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/doctor.js +1 -1
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/down.d.ts +3 -0
  16. package/dist/commands/down.d.ts.map +1 -0
  17. package/dist/commands/down.js +54 -0
  18. package/dist/commands/down.js.map +1 -0
  19. package/dist/commands/logs.d.ts +3 -0
  20. package/dist/commands/logs.d.ts.map +1 -0
  21. package/dist/commands/logs.js +61 -0
  22. package/dist/commands/logs.js.map +1 -0
  23. package/dist/commands/serve.d.ts.map +1 -1
  24. package/dist/commands/serve.js +38 -8
  25. package/dist/commands/serve.js.map +1 -1
  26. package/dist/commands/status.d.ts +3 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +41 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/commands/up.d.ts +3 -0
  31. package/dist/commands/up.d.ts.map +1 -0
  32. package/dist/commands/up.js +44 -0
  33. package/dist/commands/up.js.map +1 -0
  34. package/dist/dev/infra-preflight.js +1 -1
  35. package/dist/dev/infra-preflight.js.map +1 -1
  36. package/dist/lib/command-registry.d.ts +1 -1
  37. package/dist/lib/command-registry.d.ts.map +1 -1
  38. package/dist/lib/command-registry.js +4 -0
  39. package/dist/lib/command-registry.js.map +1 -1
  40. package/dist/runtime/boot-graph-loader.d.ts +17 -0
  41. package/dist/runtime/boot-graph-loader.d.ts.map +1 -0
  42. package/dist/runtime/boot-graph-loader.js +40 -0
  43. package/dist/runtime/boot-graph-loader.js.map +1 -0
  44. package/dist/runtime/config/loader.d.ts +11 -0
  45. package/dist/runtime/config/loader.d.ts.map +1 -0
  46. package/dist/runtime/config/loader.js +38 -0
  47. package/dist/runtime/config/loader.js.map +1 -0
  48. package/dist/runtime/config/schema.d.ts +202 -0
  49. package/dist/runtime/config/schema.d.ts.map +1 -0
  50. package/dist/runtime/config/schema.js +125 -0
  51. package/dist/runtime/config/schema.js.map +1 -0
  52. package/dist/runtime/env-seeder.d.ts +17 -0
  53. package/dist/runtime/env-seeder.d.ts.map +1 -0
  54. package/dist/runtime/env-seeder.js +80 -0
  55. package/dist/runtime/env-seeder.js.map +1 -0
  56. package/dist/runtime/foreground.d.ts +8 -0
  57. package/dist/runtime/foreground.d.ts.map +1 -0
  58. package/dist/runtime/foreground.js +71 -0
  59. package/dist/runtime/foreground.js.map +1 -0
  60. package/dist/runtime/infra/infra-catalog.d.ts +19 -0
  61. package/dist/runtime/infra/infra-catalog.d.ts.map +1 -0
  62. package/dist/runtime/infra/infra-catalog.js +128 -0
  63. package/dist/runtime/infra/infra-catalog.js.map +1 -0
  64. package/dist/runtime/infra/infra-plan.d.ts +16 -0
  65. package/dist/runtime/infra/infra-plan.d.ts.map +1 -0
  66. package/dist/runtime/infra/infra-plan.js +44 -0
  67. package/dist/runtime/infra/infra-plan.js.map +1 -0
  68. package/dist/runtime/infra/infra-runner.d.ts +26 -0
  69. package/dist/runtime/infra/infra-runner.d.ts.map +1 -0
  70. package/dist/runtime/infra/infra-runner.js +135 -0
  71. package/dist/runtime/infra/infra-runner.js.map +1 -0
  72. package/dist/runtime/launch.d.ts +24 -0
  73. package/dist/runtime/launch.d.ts.map +1 -0
  74. package/dist/runtime/launch.js +116 -0
  75. package/dist/runtime/launch.js.map +1 -0
  76. package/dist/runtime/lock-loader.d.ts +26 -0
  77. package/dist/runtime/lock-loader.d.ts.map +1 -0
  78. package/dist/runtime/lock-loader.js +61 -0
  79. package/dist/runtime/lock-loader.js.map +1 -0
  80. package/dist/runtime/paths.d.ts +14 -0
  81. package/dist/runtime/paths.d.ts.map +1 -0
  82. package/dist/runtime/paths.js +109 -0
  83. package/dist/runtime/paths.js.map +1 -0
  84. package/dist/runtime/platform-services.d.ts +2 -0
  85. package/dist/runtime/platform-services.d.ts.map +1 -0
  86. package/dist/runtime/platform-services.js +8 -0
  87. package/dist/runtime/platform-services.js.map +1 -0
  88. package/dist/runtime/port-map.d.ts +3 -0
  89. package/dist/runtime/port-map.d.ts.map +1 -0
  90. package/dist/runtime/port-map.js +25 -0
  91. package/dist/runtime/port-map.js.map +1 -0
  92. package/dist/runtime/roster.d.ts +32 -0
  93. package/dist/runtime/roster.d.ts.map +1 -0
  94. package/dist/runtime/roster.js +106 -0
  95. package/dist/runtime/roster.js.map +1 -0
  96. package/dist/runtime/runner/container-runner.d.ts +14 -0
  97. package/dist/runtime/runner/container-runner.d.ts.map +1 -0
  98. package/dist/runtime/runner/container-runner.js +61 -0
  99. package/dist/runtime/runner/container-runner.js.map +1 -0
  100. package/dist/runtime/runner/docker-cli.d.ts +11 -0
  101. package/dist/runtime/runner/docker-cli.d.ts.map +1 -0
  102. package/dist/runtime/runner/docker-cli.js +53 -0
  103. package/dist/runtime/runner/docker-cli.js.map +1 -0
  104. package/dist/runtime/runner/health-probe.d.ts +2 -0
  105. package/dist/runtime/runner/health-probe.d.ts.map +1 -0
  106. package/dist/runtime/runner/health-probe.js +38 -0
  107. package/dist/runtime/runner/health-probe.js.map +1 -0
  108. package/dist/runtime/runner/helm-runner.d.ts +19 -0
  109. package/dist/runtime/runner/helm-runner.d.ts.map +1 -0
  110. package/dist/runtime/runner/helm-runner.js +70 -0
  111. package/dist/runtime/runner/helm-runner.js.map +1 -0
  112. package/dist/runtime/runner/native-runner.d.ts +9 -0
  113. package/dist/runtime/runner/native-runner.d.ts.map +1 -0
  114. package/dist/runtime/runner/native-runner.js +85 -0
  115. package/dist/runtime/runner/native-runner.js.map +1 -0
  116. package/dist/runtime/runner/service-runner.d.ts +23 -0
  117. package/dist/runtime/runner/service-runner.d.ts.map +1 -0
  118. package/dist/runtime/runner/service-runner.js +10 -0
  119. package/dist/runtime/runner/service-runner.js.map +1 -0
  120. package/dist/runtime/supervisor.d.ts +46 -0
  121. package/dist/runtime/supervisor.d.ts.map +1 -0
  122. package/dist/runtime/supervisor.js +77 -0
  123. package/dist/runtime/supervisor.js.map +1 -0
  124. package/dist/runtime/unit-type.d.ts +9 -0
  125. package/dist/runtime/unit-type.d.ts.map +1 -0
  126. package/dist/runtime/unit-type.js +19 -0
  127. package/dist/runtime/unit-type.js.map +1 -0
  128. package/dist/runtime/waves.d.ts +15 -0
  129. package/dist/runtime/waves.d.ts.map +1 -0
  130. package/dist/runtime/waves.js +77 -0
  131. package/dist/runtime/waves.js.map +1 -0
  132. package/package.json +9 -10
  133. package/xema.config.example.yaml +45 -0
@@ -0,0 +1,14 @@
1
+ export declare function findMonorepoRoot(startDir?: string): string | null;
2
+ export interface ArtifactResolution {
3
+ readonly path: string;
4
+ readonly source: 'flag' | 'env' | 'vendored' | 'monorepo';
5
+ }
6
+ export interface ResolveArtifactOptions {
7
+ readonly explicit?: string | undefined;
8
+ readonly envVar?: string | undefined;
9
+ readonly edition: string;
10
+ }
11
+ export declare function resolveDistributionLockPath(opts: ResolveArtifactOptions): ArtifactResolution;
12
+ export declare function resolveImageLockPath(opts: ResolveArtifactOptions): ArtifactResolution;
13
+ export declare function resolveBootGraphPath(opts: Omit<ResolveArtifactOptions, 'edition'>): ArtifactResolution;
14
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"AAqBA,wBAAgB,gBAAgB,CAAC,QAAQ,GAAE,MAAkB,GAAG,MAAM,GAAG,IAAI,CAY5E;AAQD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,UAAU,GAAG,UAAU,CAAC;CAC3D;AAED,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAcD,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CA2B5F;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,sBAAsB,GAAG,kBAAkB,CAwBrF;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,CAAC,GAAG,kBAAkB,CAwBtG"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.findMonorepoRoot = findMonorepoRoot;
4
+ exports.resolveDistributionLockPath = resolveDistributionLockPath;
5
+ exports.resolveImageLockPath = resolveImageLockPath;
6
+ exports.resolveBootGraphPath = resolveBootGraphPath;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const MONOREPO_ROOT_MARKERS = ['pnpm-workspace.yaml', 'repos-infra/xema-distributions'];
10
+ function findMonorepoRoot(startDir = __dirname) {
11
+ let dir = startDir;
12
+ for (;;) {
13
+ if (MONOREPO_ROOT_MARKERS.every((m) => (0, node_fs_1.existsSync)((0, node_path_1.join)(dir, m)))) {
14
+ return dir;
15
+ }
16
+ const parent = (0, node_path_1.dirname)(dir);
17
+ if (parent === dir) {
18
+ return null;
19
+ }
20
+ dir = parent;
21
+ }
22
+ }
23
+ function vendoredAssetsDir() {
24
+ return (0, node_path_1.resolve)(__dirname, '..', 'assets');
25
+ }
26
+ function firstExisting(candidates) {
27
+ for (const c of candidates) {
28
+ if ((0, node_fs_1.existsSync)(c.path)) {
29
+ return { path: c.path, source: c.source };
30
+ }
31
+ }
32
+ return null;
33
+ }
34
+ function resolveDistributionLockPath(opts) {
35
+ const monorepo = findMonorepoRoot();
36
+ const candidates = [];
37
+ if (opts.explicit) {
38
+ candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
39
+ }
40
+ if (opts.envVar) {
41
+ candidates.push({ path: absolutize(opts.envVar), source: 'env' });
42
+ }
43
+ if (monorepo) {
44
+ candidates.push({
45
+ path: (0, node_path_1.join)(monorepo, 'repos-infra/xema-distributions', opts.edition, 'distribution.lock.json'),
46
+ source: 'monorepo',
47
+ });
48
+ }
49
+ candidates.push({
50
+ path: (0, node_path_1.join)(vendoredAssetsDir(), opts.edition, 'distribution.lock.json'),
51
+ source: 'vendored',
52
+ });
53
+ const found = firstExisting(candidates);
54
+ if (!found) {
55
+ throw new Error(`Could not locate distribution.lock.json for edition "${opts.edition}". Tried:\n` +
56
+ candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
57
+ }
58
+ return found;
59
+ }
60
+ function resolveImageLockPath(opts) {
61
+ const monorepo = findMonorepoRoot();
62
+ const candidates = [];
63
+ if (opts.explicit) {
64
+ candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
65
+ }
66
+ if (monorepo) {
67
+ candidates.push({
68
+ path: (0, node_path_1.join)(monorepo, 'repos-infra/xema-distributions', opts.edition, 'images.lock.json'),
69
+ source: 'monorepo',
70
+ });
71
+ }
72
+ candidates.push({
73
+ path: (0, node_path_1.join)(vendoredAssetsDir(), opts.edition, 'images.lock.json'),
74
+ source: 'vendored',
75
+ });
76
+ const found = firstExisting(candidates);
77
+ if (!found) {
78
+ throw new Error(`Could not locate images.lock.json for edition "${opts.edition}". Tried:\n` +
79
+ candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
80
+ }
81
+ return found;
82
+ }
83
+ function resolveBootGraphPath(opts) {
84
+ const monorepo = findMonorepoRoot();
85
+ const candidates = [];
86
+ if (opts.explicit) {
87
+ candidates.push({ path: absolutize(opts.explicit), source: 'flag' });
88
+ }
89
+ if (opts.envVar) {
90
+ candidates.push({ path: absolutize(opts.envVar), source: 'env' });
91
+ }
92
+ if (monorepo) {
93
+ candidates.push({
94
+ path: (0, node_path_1.join)(monorepo, 'tooling/boundaries/boot-graph.json'),
95
+ source: 'monorepo',
96
+ });
97
+ }
98
+ candidates.push({ path: (0, node_path_1.join)(vendoredAssetsDir(), 'boot-graph.json'), source: 'vendored' });
99
+ const found = firstExisting(candidates);
100
+ if (!found) {
101
+ throw new Error(`Could not locate boot-graph.json. Tried:\n` +
102
+ candidates.map((c) => ` - ${c.path} (${c.source})`).join('\n'));
103
+ }
104
+ return found;
105
+ }
106
+ function absolutize(p) {
107
+ return (0, node_path_1.isAbsolute)(p) ? p : (0, node_path_1.resolve)(process.cwd(), p);
108
+ }
109
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/runtime/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const PLATFORM_SERVICE_PATHS: Readonly<Record<string, string>>;
2
+ //# sourceMappingURL=platform-services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-services.d.ts","sourceRoot":"","sources":["../../src/runtime/platform-services.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlE,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PLATFORM_SERVICE_PATHS = void 0;
4
+ exports.PLATFORM_SERVICE_PATHS = Object.freeze({
5
+ 'xema-kernel-server': 'repos/xema-community/kernel/xema-kernel-server',
6
+ 'xema-capability-router': 'repos/xema-community/biomes/xema-capability-router/api/xema-capability-router',
7
+ });
8
+ //# sourceMappingURL=platform-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-services.js","sourceRoot":"","sources":["../../src/runtime/platform-services.ts"],"names":[],"mappings":";;;AAUa,QAAA,sBAAsB,GAAqC,MAAM,CAAC,MAAM,CAAC;IACpF,oBAAoB,EAAE,gDAAgD;IACtE,wBAAwB,EACtB,+EAA+E;CAClF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { RosterEntry } from './roster';
2
+ export declare function assignPorts(roster: readonly RosterEntry[]): Map<string, number>;
3
+ //# sourceMappingURL=port-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-map.d.ts","sourceRoot":"","sources":["../../src/runtime/port-map.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAW5C,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAmB/E"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assignPorts = assignPorts;
4
+ const env_defaults_1 = require("../dev/env-defaults");
5
+ const FALLBACK_BASE = 7400;
6
+ function assignPorts(roster) {
7
+ const assigned = new Map();
8
+ let next = FALLBACK_BASE;
9
+ const used = new Set(Object.values(env_defaults_1.PORT_MAP));
10
+ for (const entry of [...roster].sort((a, b) => a.name.localeCompare(b.name))) {
11
+ const known = env_defaults_1.PORT_MAP[entry.name];
12
+ if (typeof known === 'number') {
13
+ assigned.set(entry.name, known);
14
+ continue;
15
+ }
16
+ while (used.has(next)) {
17
+ next += 1;
18
+ }
19
+ assigned.set(entry.name, next);
20
+ used.add(next);
21
+ next += 1;
22
+ }
23
+ return assigned;
24
+ }
25
+ //# sourceMappingURL=port-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-map.js","sourceRoot":"","sources":["../../src/runtime/port-map.ts"],"names":[],"mappings":";;AAaA,kCAmBC;AAhCD,sDAA+C;AAW/C,MAAM,aAAa,GAAG,IAAI,CAAC;AAE3B,SAAgB,WAAW,CAAC,MAA8B;IACxD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,IAAI,GAAG,aAAa,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,MAAM,CAAC,MAAM,CAAC,uBAAQ,CAAC,CAAC,CAAC;IAEtD,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,uBAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAChC,SAAS;QACX,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,IAAI,CAAC,CAAC;QACZ,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,IAAI,IAAI,CAAC,CAAC;IACZ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,32 @@
1
+ import { type RuntimeUnitType } from './unit-type';
2
+ import type { ImageEntry } from './lock-loader';
3
+ import type { DistributionLock } from '@xemahq/kernel-contracts/distribution';
4
+ export interface RosterEntry {
5
+ readonly name: string;
6
+ readonly tier: string;
7
+ readonly unitType: RuntimeUnitType;
8
+ readonly biomeId?: string;
9
+ readonly servicePath?: string;
10
+ readonly requiresServerBiomes: readonly string[];
11
+ readonly imageRef?: string;
12
+ readonly imageTag?: string;
13
+ }
14
+ export type RosterInclude = 'all' | {
15
+ readonly tiers?: readonly string[];
16
+ readonly services?: readonly string[];
17
+ };
18
+ export interface RosterSelection {
19
+ readonly include: RosterInclude;
20
+ readonly exclude?: readonly string[];
21
+ readonly pruned?: ReadonlySet<string>;
22
+ }
23
+ interface LockIndex {
24
+ readonly byName: ReadonlyMap<string, RosterEntry>;
25
+ readonly servicesByBiome: ReadonlyMap<string, readonly string[]>;
26
+ readonly requiresByBiome: ReadonlyMap<string, readonly string[]>;
27
+ readonly biomeByService: ReadonlyMap<string, string>;
28
+ }
29
+ export declare function buildLockIndex(lock: DistributionLock, imagesByBiome?: ReadonlyMap<string, ImageEntry>): LockIndex;
30
+ export declare function resolveRoster(lock: DistributionLock, selection: RosterSelection, imagesByBiome?: ReadonlyMap<string, ImageEntry>): RosterEntry[];
31
+ export {};
32
+ //# sourceMappingURL=roster.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster.d.ts","sourceRoot":"","sources":["../../src/runtime/roster.ts"],"names":[],"mappings":"AACA,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAe,MAAM,uCAAuC,CAAC;AAO3F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IAEnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,oBAAoB,EAAE,SAAS,MAAM,EAAE,CAAC;IAEjD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAMD,MAAM,MAAM,aAAa,GACrB,KAAK,GACL;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAElF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAErC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC;AAED,UAAU,SAAS;IAEjB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAElD,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAEjE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAAC;IAEjE,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACtD;AAGD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,gBAAgB,EACtB,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAC9C,SAAS,CAyCX;AAQD,wBAAgB,aAAa,CAC3B,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,eAAe,EAC1B,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,GAC9C,WAAW,EAAE,CA+Cf"}
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildLockIndex = buildLockIndex;
4
+ exports.resolveRoster = resolveRoster;
5
+ const platform_services_1 = require("./platform-services");
6
+ const unit_type_1 = require("./unit-type");
7
+ function buildLockIndex(lock, imagesByBiome) {
8
+ const byName = new Map();
9
+ const servicesByBiome = new Map();
10
+ const requiresByBiome = new Map();
11
+ const biomeByService = new Map();
12
+ for (const biome of lock.biomes) {
13
+ servicesByBiome.set(biome.id, biome.services);
14
+ requiresByBiome.set(biome.id, biome.requiresServerBiomes ?? []);
15
+ const image = imagesByBiome?.get(biome.id);
16
+ for (const svc of biome.services) {
17
+ biomeByService.set(svc, biome.id);
18
+ if (!byName.has(svc)) {
19
+ const entry = {
20
+ name: svc,
21
+ tier: biome.tier,
22
+ unitType: (0, unit_type_1.classifyService)(svc, biome.tier),
23
+ biomeId: biome.id,
24
+ servicePath: `${biome.path}/api/${svc}`,
25
+ requiresServerBiomes: biome.requiresServerBiomes ?? [],
26
+ ...(image !== undefined ? { imageRef: image.imageRef, imageTag: image.contentHash } : {}),
27
+ };
28
+ byName.set(svc, entry);
29
+ }
30
+ }
31
+ }
32
+ for (const ps of lock.platformServices) {
33
+ if (!byName.has(ps.name)) {
34
+ const servicePath = platform_services_1.PLATFORM_SERVICE_PATHS[ps.name];
35
+ byName.set(ps.name, {
36
+ name: ps.name,
37
+ tier: ps.tier,
38
+ unitType: (0, unit_type_1.classifyService)(ps.name, ps.tier),
39
+ requiresServerBiomes: [],
40
+ ...(servicePath !== undefined ? { servicePath } : {}),
41
+ });
42
+ }
43
+ }
44
+ return { byName, servicesByBiome, requiresByBiome, biomeByService };
45
+ }
46
+ function resolveRoster(lock, selection, imagesByBiome) {
47
+ const index = buildLockIndex(lock, imagesByBiome);
48
+ let selected;
49
+ if (selection.include === 'all') {
50
+ selected = new Set(index.byName.keys());
51
+ }
52
+ else {
53
+ selected = new Set();
54
+ const tiers = new Set(selection.include.tiers ?? []);
55
+ if (tiers.size > 0) {
56
+ for (const e of index.byName.values()) {
57
+ if (tiers.has(e.tier)) {
58
+ selected.add(e.name);
59
+ }
60
+ }
61
+ }
62
+ for (const s of selection.include.services ?? []) {
63
+ if (index.byName.has(s)) {
64
+ selected.add(s);
65
+ }
66
+ }
67
+ }
68
+ expandDependencyClosure(selected, index);
69
+ for (const ex of selection.exclude ?? []) {
70
+ selected.delete(ex);
71
+ }
72
+ for (const p of selection.pruned ?? []) {
73
+ selected.delete(p);
74
+ }
75
+ return [...selected]
76
+ .map((name) => {
77
+ const entry = index.byName.get(name);
78
+ if (!entry) {
79
+ throw new Error(`resolveRoster: selected service "${name}" missing from lock index.`);
80
+ }
81
+ return entry;
82
+ })
83
+ .sort((a, b) => a.name.localeCompare(b.name));
84
+ }
85
+ function expandDependencyClosure(selected, index) {
86
+ const queue = [...selected];
87
+ while (queue.length > 0) {
88
+ const svc = queue.shift();
89
+ if (svc === undefined) {
90
+ break;
91
+ }
92
+ const biome = index.biomeByService.get(svc);
93
+ if (biome === undefined) {
94
+ continue;
95
+ }
96
+ for (const requiredBiome of index.requiresByBiome.get(biome) ?? []) {
97
+ for (const depSvc of index.servicesByBiome.get(requiredBiome) ?? []) {
98
+ if (!selected.has(depSvc)) {
99
+ selected.add(depSvc);
100
+ queue.push(depSvc);
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ //# sourceMappingURL=roster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roster.js","sourceRoot":"","sources":["../../src/runtime/roster.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { ServiceRunnerKind, type RunningService, type ServiceRunner, type StartServiceInput } from './service-runner';
2
+ export interface ContainerRunnerOptions {
3
+ readonly bin?: string;
4
+ readonly network: string;
5
+ readonly containerPort: number;
6
+ }
7
+ export declare class ContainerRunner implements ServiceRunner {
8
+ private readonly opts;
9
+ readonly kind = ServiceRunnerKind.Container;
10
+ private readonly docker;
11
+ constructor(opts: ContainerRunnerOptions);
12
+ start(input: StartServiceInput): Promise<RunningService>;
13
+ }
14
+ //# sourceMappingURL=container-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/container-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAY1B,MAAM,WAAW,sBAAsB;IAErC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,eAAgB,YAAW,aAAa;IAIvC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,QAAQ,CAAC,IAAI,+BAA+B;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;gBAEN,IAAI,EAAE,sBAAsB;IAInD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;CAiD/D"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ContainerRunner = void 0;
4
+ const docker_cli_1 = require("./docker-cli");
5
+ const health_probe_1 = require("./health-probe");
6
+ const service_runner_1 = require("./service-runner");
7
+ class ContainerRunner {
8
+ opts;
9
+ kind = service_runner_1.ServiceRunnerKind.Container;
10
+ docker;
11
+ constructor(opts) {
12
+ this.opts = opts;
13
+ this.docker = new docker_cli_1.DockerCli(opts.bin ?? 'docker');
14
+ }
15
+ async start(input) {
16
+ const { entry, env, port, readinessTimeoutMs } = input;
17
+ if (!entry.imageRef) {
18
+ throw new Error(`${entry.name}: no imageRef in images.lock.json — cannot run in the container substrate. ` +
19
+ `Re-resolve the edition's images.lock or use the native substrate.`);
20
+ }
21
+ const image = entry.imageTag ? `${entry.imageRef}:${entry.imageTag}` : entry.imageRef;
22
+ const args = [
23
+ 'run',
24
+ '-d',
25
+ '--name',
26
+ entry.name,
27
+ '--label',
28
+ `${docker_cli_1.LAUNCHER_LABEL}=service`,
29
+ '--network',
30
+ this.opts.network,
31
+ '--restart',
32
+ 'unless-stopped',
33
+ '-p',
34
+ `${String(port)}:${String(this.opts.containerPort)}`,
35
+ ];
36
+ for (const [k, v] of Object.entries(env)) {
37
+ args.push('-e', `${k}=${v}`);
38
+ }
39
+ args.push(image);
40
+ const containerId = (await this.docker.run(args)).trim();
41
+ const url = `http://127.0.0.1:${String(port)}`;
42
+ try {
43
+ await (0, health_probe_1.waitForReady)(url, readinessTimeoutMs);
44
+ }
45
+ catch (err) {
46
+ await this.docker.runQuiet(['rm', '-f', entry.name]);
47
+ throw err;
48
+ }
49
+ return {
50
+ name: entry.name,
51
+ url,
52
+ handle: containerId.slice(0, 12),
53
+ close: async (graceMs) => {
54
+ await this.docker.runQuiet(['stop', '-t', String(Math.ceil(graceMs / 1000)), entry.name]);
55
+ await this.docker.runQuiet(['rm', '-f', entry.name]);
56
+ },
57
+ };
58
+ }
59
+ }
60
+ exports.ContainerRunner = ContainerRunner;
61
+ //# sourceMappingURL=container-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container-runner.js","sourceRoot":"","sources":["../../../src/runtime/runner/container-runner.ts"],"names":[],"mappings":";;;AAAA,6CAAyD;AACzD,iDAA8C;AAC9C,qDAK0B;AAqB1B,MAAa,eAAe;IAIG;IAHpB,IAAI,GAAG,kCAAiB,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAY;IAEnC,YAA6B,IAA4B;QAA5B,SAAI,GAAJ,IAAI,CAAwB;QACvD,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAS,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAAwB;QAClC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,KAAK,CAAC;QACvD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,IAAI,6EAA6E;gBACxF,mEAAmE,CACtE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;QAEtF,MAAM,IAAI,GAAG;YACX,KAAK;YACL,IAAI;YACJ,QAAQ;YACR,KAAK,CAAC,IAAI;YACV,SAAS;YACT,GAAG,2BAAc,UAAU;YAC3B,WAAW;YACX,IAAI,CAAC,IAAI,CAAC,OAAO;YACjB,WAAW;YACX,gBAAgB;YAChB,IAAI;YACJ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE;SACrD,CAAC;QACF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,MAAM,GAAG,GAAG,oBAAoB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,MAAM,IAAA,2BAAY,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACrD,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,GAAG;YACH,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;YAChC,KAAK,EAAE,KAAK,EAAE,OAAe,EAAiB,EAAE;gBAC9C,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC1F,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAzDD,0CAyDC"}
@@ -0,0 +1,11 @@
1
+ export declare const LAUNCHER_LABEL = "xema.launcher";
2
+ export declare class DockerCli {
3
+ private readonly bin;
4
+ constructor(bin?: string);
5
+ run(args: readonly string[]): Promise<string>;
6
+ runQuiet(args: readonly string[]): Promise<string>;
7
+ available(): Promise<boolean>;
8
+ ensureNetwork(name: string): Promise<void>;
9
+ launcherContainers(): Promise<string[]>;
10
+ }
11
+ //# sourceMappingURL=docker-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-cli.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/docker-cli.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,cAAc,kBAAkB,CAAC;AAE9C,qBAAa,SAAS;IACR,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAAH,GAAG,GAAE,MAAiB;IAEnD,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAavC,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IASlD,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAM7B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1C,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;CAW9C"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DockerCli = exports.LAUNCHER_LABEL = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ exports.LAUNCHER_LABEL = 'xema.launcher';
6
+ class DockerCli {
7
+ bin;
8
+ constructor(bin = 'docker') {
9
+ this.bin = bin;
10
+ }
11
+ run(args) {
12
+ return new Promise((resolve, reject) => {
13
+ (0, node_child_process_1.execFile)(this.bin, [...args], { maxBuffer: 32 * 1024 * 1024 }, (err, stdout, stderr) => {
14
+ if (err) {
15
+ reject(new Error(`${this.bin} ${args.join(' ')} failed: ${stderr || err.message}`));
16
+ return;
17
+ }
18
+ resolve(stdout);
19
+ });
20
+ });
21
+ }
22
+ async runQuiet(args) {
23
+ try {
24
+ return await this.run(args);
25
+ }
26
+ catch {
27
+ return '';
28
+ }
29
+ }
30
+ async available() {
31
+ const out = await this.runQuiet(['version', '--format', '{{.Server.Version}}']);
32
+ return out.trim().length > 0;
33
+ }
34
+ async ensureNetwork(name) {
35
+ const existing = await this.runQuiet(['network', 'ls', '--filter', `name=^${name}$`, '--format', '{{.Name}}']);
36
+ if (!existing.split('\n').map((l) => l.trim()).includes(name)) {
37
+ await this.runQuiet(['network', 'create', name]);
38
+ }
39
+ }
40
+ async launcherContainers() {
41
+ const out = await this.runQuiet([
42
+ 'ps',
43
+ '-a',
44
+ '--filter',
45
+ `label=${exports.LAUNCHER_LABEL}`,
46
+ '--format',
47
+ '{{.Names}}',
48
+ ]);
49
+ return out.split('\n').map((l) => l.trim()).filter((l) => l.length > 0);
50
+ }
51
+ }
52
+ exports.DockerCli = DockerCli;
53
+ //# sourceMappingURL=docker-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-cli.js","sourceRoot":"","sources":["../../../src/runtime/runner/docker-cli.ts"],"names":[],"mappings":";;;AAAA,2DAA8C;AAUjC,QAAA,cAAc,GAAG,eAAe,CAAC;AAE9C,MAAa,SAAS;IACS;IAA7B,YAA6B,MAAc,QAAQ;QAAtB,QAAG,GAAH,GAAG,CAAmB;IAAG,CAAC;IAEvD,GAAG,CAAC,IAAuB;QACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAA,6BAAQ,EAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;gBACrF,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;oBACpF,OAAO;gBACT,CAAC;gBACD,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAGD,KAAK,CAAC,QAAQ,CAAC,IAAuB;QACpC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,SAAS;QACb,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;QAChF,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAGD,KAAK,CAAC,aAAa,CAAC,IAAY;QAC9B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,IAAI,GAAG,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAC/G,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAGD,KAAK,CAAC,kBAAkB;QACtB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC;YAC9B,IAAI;YACJ,IAAI;YACJ,UAAU;YACV,SAAS,sBAAc,EAAE;YACzB,UAAU;YACV,YAAY;SACb,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;CACF;AAlDD,8BAkDC"}
@@ -0,0 +1,2 @@
1
+ export declare function waitForReady(baseUrl: string, timeoutMs: number, intervalMs?: number, isAlive?: () => boolean): Promise<void>;
2
+ //# sourceMappingURL=health-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-probe.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/health-probe.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,SAAM,EAChB,OAAO,CAAC,EAAE,MAAM,OAAO,GACtB,OAAO,CAAC,IAAI,CAAC,CAcf"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.waitForReady = waitForReady;
4
+ const node_http_1 = require("node:http");
5
+ async function waitForReady(baseUrl, timeoutMs, intervalMs = 300, isAlive) {
6
+ const deadline = Date.now() + timeoutMs;
7
+ for (;;) {
8
+ if (isAlive && !isAlive()) {
9
+ throw new Error(`process exited before becoming ready`);
10
+ }
11
+ if (await probeOnce(`${baseUrl}/health/ready`)) {
12
+ return;
13
+ }
14
+ if (Date.now() >= deadline) {
15
+ throw new Error(`readiness timeout after ${String(timeoutMs)}ms (${baseUrl}/health/ready)`);
16
+ }
17
+ await delay(intervalMs);
18
+ }
19
+ }
20
+ function probeOnce(url) {
21
+ return new Promise((resolve) => {
22
+ const req = (0, node_http_1.get)(url, (res) => {
23
+ res.resume();
24
+ resolve(res.statusCode === 200);
25
+ });
26
+ req.on('error', () => resolve(false));
27
+ req.setTimeout(2000, () => {
28
+ req.destroy();
29
+ resolve(false);
30
+ });
31
+ });
32
+ }
33
+ function delay(ms) {
34
+ return new Promise((resolve) => {
35
+ setTimeout(resolve, ms);
36
+ });
37
+ }
38
+ //# sourceMappingURL=health-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-probe.js","sourceRoot":"","sources":["../../../src/runtime/runner/health-probe.ts"],"names":[],"mappings":";;AAMA,oCAmBC;AAzBD,yCAA2C;AAMpC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,SAAiB,EACjB,UAAU,GAAG,GAAG,EAChB,OAAuB;IAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,SAAS,CAAC;QACR,IAAI,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,MAAM,SAAS,CAAC,GAAG,OAAO,eAAe,CAAC,EAAE,CAAC;YAC/C,OAAO;QACT,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,SAAS,CAAC,OAAO,OAAO,gBAAgB,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE,CAAC,GAAG,EAAE,EAAE;YAC/B,GAAG,CAAC,MAAM,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;QACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;QACtC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE;YACxB,GAAG,CAAC,OAAO,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ServiceRunnerKind, type RunningService, type ServiceRunner, type StartServiceInput } from './service-runner';
2
+ export interface HelmRunnerOptions {
3
+ readonly chartRepo?: string;
4
+ readonly namespace?: string;
5
+ readonly kubeconfig?: string;
6
+ readonly waitTimeout?: string;
7
+ readonly bin?: string;
8
+ }
9
+ export declare class HelmRunner implements ServiceRunner {
10
+ private readonly opts;
11
+ readonly kind = ServiceRunnerKind.Helm;
12
+ private readonly bin;
13
+ private readonly namespace;
14
+ private readonly chartRepo;
15
+ constructor(opts?: HelmRunnerOptions);
16
+ start(input: StartServiceInput): Promise<RunningService>;
17
+ private helm;
18
+ }
19
+ //# sourceMappingURL=helm-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helm-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/helm-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAc1B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;CACvB;AAMD,qBAAa,UAAW,YAAW,aAAa;IAMlC,OAAO,CAAC,QAAQ,CAAC,IAAI;IALjC,QAAQ,CAAC,IAAI,0BAA0B;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,IAAI,GAAE,iBAAsB;IAMnD,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;IAmC9D,OAAO,CAAC,IAAI;CAeb"}