@xemahq/xema 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +85 -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 +82 -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 +50 -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 +208 -0
  49. package/dist/runtime/config/schema.d.ts.map +1 -0
  50. package/dist/runtime/config/schema.js +132 -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 +89 -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 +124 -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 +14 -0
  113. package/dist/runtime/runner/native-runner.d.ts.map +1 -0
  114. package/dist/runtime/runner/native-runner.js +92 -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 +7 -8
  133. package/xema.config.example.yaml +46 -0
@@ -0,0 +1,26 @@
1
+ import { type DistributionLock } from '@xemahq/kernel-contracts/distribution';
2
+ import { type ArtifactResolution } from './paths';
3
+ export interface LoadedDistributionLock {
4
+ readonly lock: DistributionLock;
5
+ readonly resolution: ArtifactResolution;
6
+ }
7
+ export interface LoadLockOptions {
8
+ readonly edition: string;
9
+ readonly explicit?: string | undefined;
10
+ readonly envVar?: string | undefined;
11
+ }
12
+ export declare function loadDistributionLock(opts: LoadLockOptions): LoadedDistributionLock;
13
+ export interface ImageEntry {
14
+ readonly biomeId: string;
15
+ readonly target: string;
16
+ readonly imageRef: string;
17
+ readonly contentHash: string;
18
+ readonly repo: string;
19
+ readonly path: string;
20
+ }
21
+ export interface LoadedImageLock {
22
+ readonly imagesByBiome: ReadonlyMap<string, ImageEntry>;
23
+ readonly resolution: ArtifactResolution;
24
+ }
25
+ export declare function loadImageLock(opts: LoadLockOptions): LoadedImageLock;
26
+ //# sourceMappingURL=lock-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-loader.d.ts","sourceRoot":"","sources":["../../src/runtime/lock-loader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AAErG,OAAO,EAAqD,KAAK,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAOrG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,sBAAsB,CASlF;AAOD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,eAAe;IAE9B,QAAQ,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxD,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;CACzC;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,CA6BpE"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadDistributionLock = loadDistributionLock;
4
+ exports.loadImageLock = loadImageLock;
5
+ const node_fs_1 = require("node:fs");
6
+ const distribution_1 = require("@xemahq/kernel-contracts/distribution");
7
+ const paths_1 = require("./paths");
8
+ function loadDistributionLock(opts) {
9
+ const resolution = (0, paths_1.resolveDistributionLockPath)({
10
+ edition: opts.edition,
11
+ explicit: opts.explicit,
12
+ envVar: opts.envVar,
13
+ });
14
+ const raw = readJson(resolution.path);
15
+ const lock = (0, distribution_1.parseDistributionLock)(raw);
16
+ return { lock, resolution };
17
+ }
18
+ function loadImageLock(opts) {
19
+ const resolution = (0, paths_1.resolveImageLockPath)({ edition: opts.edition, explicit: opts.explicit });
20
+ const raw = readJson(resolution.path);
21
+ if (!Array.isArray(raw.images)) {
22
+ throw new Error(`Invalid images.lock.json at ${resolution.path}: missing images[] array.`);
23
+ }
24
+ const imagesByBiome = new Map();
25
+ for (const entry of raw.images) {
26
+ if (typeof entry.biomeId !== 'string' ||
27
+ typeof entry.imageRef !== 'string' ||
28
+ typeof entry.contentHash !== 'string') {
29
+ throw new Error(`Invalid images.lock.json at ${resolution.path}: an images[] entry is missing biomeId/imageRef/contentHash.`);
30
+ }
31
+ if (entry.target === 'server') {
32
+ imagesByBiome.set(entry.biomeId, {
33
+ biomeId: entry.biomeId,
34
+ target: entry.target,
35
+ imageRef: entry.imageRef,
36
+ contentHash: entry.contentHash,
37
+ repo: typeof entry.repo === 'string' ? entry.repo : '',
38
+ path: typeof entry.path === 'string' ? entry.path : '',
39
+ });
40
+ }
41
+ }
42
+ return { imagesByBiome, resolution };
43
+ }
44
+ function readJson(path) {
45
+ let text;
46
+ try {
47
+ text = (0, node_fs_1.readFileSync)(path, 'utf8');
48
+ }
49
+ catch (err) {
50
+ const message = err instanceof Error ? err.message : String(err);
51
+ throw new Error(`Failed to read ${path}: ${message}`);
52
+ }
53
+ try {
54
+ return JSON.parse(text);
55
+ }
56
+ catch (err) {
57
+ const message = err instanceof Error ? err.message : String(err);
58
+ throw new Error(`Failed to parse ${path} as JSON: ${message}`);
59
+ }
60
+ }
61
+ //# sourceMappingURL=lock-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock-loader.js","sourceRoot":"","sources":["../../src/runtime/lock-loader.ts"],"names":[],"mappings":"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"}
@@ -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"}