@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,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"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HelmRunner = void 0;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const service_runner_1 = require("./service-runner");
6
+ const DEFAULT_CHART_REPO = 'oci://registry.local/xema/charts';
7
+ const DEFAULT_NAMESPACE = 'xema';
8
+ const DEFAULT_WAIT_TIMEOUT = '5m';
9
+ class HelmRunner {
10
+ opts;
11
+ kind = service_runner_1.ServiceRunnerKind.Helm;
12
+ bin;
13
+ namespace;
14
+ chartRepo;
15
+ constructor(opts = {}) {
16
+ this.opts = opts;
17
+ this.bin = opts.bin ?? 'helm';
18
+ this.namespace = opts.namespace ?? process.env.XEMA_NAMESPACE ?? DEFAULT_NAMESPACE;
19
+ this.chartRepo = opts.chartRepo ?? process.env.XEMA_CHART_REPO ?? DEFAULT_CHART_REPO;
20
+ }
21
+ async start(input) {
22
+ const { entry } = input;
23
+ const release = entry.name;
24
+ const args = [
25
+ 'upgrade',
26
+ '--install',
27
+ release,
28
+ `${this.chartRepo}/${entry.name}`,
29
+ '--namespace',
30
+ this.namespace,
31
+ '--create-namespace',
32
+ '--wait',
33
+ '--timeout',
34
+ this.opts.waitTimeout ?? DEFAULT_WAIT_TIMEOUT,
35
+ ];
36
+ if (entry.imageTag) {
37
+ args.push('--set', `image.tag=${entry.imageTag}`);
38
+ }
39
+ if (entry.imageRef) {
40
+ args.push('--set', `image.repository=${entry.imageRef}`);
41
+ }
42
+ await this.helm(args);
43
+ const url = `http://${entry.name}.${this.namespace}.svc.cluster.local`;
44
+ return {
45
+ name: entry.name,
46
+ url,
47
+ handle: `helm:${release}`,
48
+ close: async () => {
49
+ await this.helm(['uninstall', release, '--namespace', this.namespace]).catch(() => undefined);
50
+ },
51
+ };
52
+ }
53
+ helm(args) {
54
+ const env = { ...process.env };
55
+ if (this.opts.kubeconfig) {
56
+ env.KUBECONFIG = this.opts.kubeconfig;
57
+ }
58
+ return new Promise((resolve, reject) => {
59
+ (0, node_child_process_1.execFile)(this.bin, [...args], { env, maxBuffer: 32 * 1024 * 1024 }, (err, stdout, stderr) => {
60
+ if (err) {
61
+ reject(new Error(`${this.bin} ${args.join(' ')} failed: ${stderr || err.message}`));
62
+ return;
63
+ }
64
+ resolve(stdout);
65
+ });
66
+ });
67
+ }
68
+ }
69
+ exports.HelmRunner = HelmRunner;
70
+ //# sourceMappingURL=helm-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helm-runner.js","sourceRoot":"","sources":["../../../src/runtime/runner/helm-runner.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 NativeRunnerOptions {
3
+ readonly monorepoRoot?: string;
4
+ readonly noFork?: boolean;
5
+ }
6
+ export declare class NativeRunner implements ServiceRunner {
7
+ readonly kind = ServiceRunnerKind.Native;
8
+ private readonly monorepoRoot;
9
+ private readonly noFork;
10
+ constructor(opts?: NativeRunnerOptions);
11
+ start(input: StartServiceInput): Promise<RunningService>;
12
+ private bootInProcess;
13
+ }
14
+ //# sourceMappingURL=native-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/native-runner.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,iBAAiB,EACjB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAC;AAqB1B,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAU/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAErB,IAAI,GAAE,mBAAwB;IAYpC,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;YAgDhD,aAAa;CA6B5B"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NativeRunner = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_path_1 = require("node:path");
6
+ const forked_worker_1 = require("../../dev/forked-worker");
7
+ const paths_1 = require("../paths");
8
+ const health_probe_1 = require("./health-probe");
9
+ const service_runner_1 = require("./service-runner");
10
+ class NativeRunner {
11
+ kind = service_runner_1.ServiceRunnerKind.Native;
12
+ monorepoRoot;
13
+ noFork;
14
+ constructor(opts = {}) {
15
+ const root = opts.monorepoRoot ?? (0, paths_1.findMonorepoRoot)();
16
+ if (!root) {
17
+ throw new Error('NativeRunner requires a monorepo checkout (built service dist/ trees). ' +
18
+ 'Run inside the monorepo, or use the container substrate.');
19
+ }
20
+ this.monorepoRoot = root;
21
+ this.noFork = opts.noFork ?? false;
22
+ }
23
+ async start(input) {
24
+ const { entry, env, port, readinessTimeoutMs } = input;
25
+ if (!entry.servicePath) {
26
+ throw new Error(`${entry.name}: no servicePath (platform-substrate service) — not bootable natively. ` +
27
+ `Use the container substrate for this service.`);
28
+ }
29
+ const serviceRoot = (0, node_path_1.join)(this.monorepoRoot, entry.servicePath);
30
+ const distMain = (0, node_path_1.join)(serviceRoot, 'dist', 'main.js');
31
+ if (!(0, node_fs_1.existsSync)(distMain)) {
32
+ throw new Error(`${entry.name} dist not found at ${distMain}. Run \`pnpm --filter ${entry.name} build\` first.`);
33
+ }
34
+ const needsFork = (0, node_fs_1.existsSync)((0, node_path_1.join)(serviceRoot, 'prisma', 'schema.prisma'));
35
+ applyEnv(env);
36
+ if (needsFork && this.noFork) {
37
+ throw new Error(`monolith mode: ${entry.name} is Prisma-bound and cannot run in-process ` +
38
+ `(the generated .prisma/client does not resolve under pnpm's isolated linker). ` +
39
+ `Use the distributed process model, or land the Prisma generator-output relocation (plan §18).`);
40
+ }
41
+ if (needsFork) {
42
+ const child = await (0, forked_worker_1.spawnForkedWorker)({
43
+ name: entry.name,
44
+ port,
45
+ siblingAppDir: serviceRoot,
46
+ readinessTimeoutMs,
47
+ }, '/');
48
+ return {
49
+ name: entry.name,
50
+ url: child.url,
51
+ handle: `pid:${String(child.pid)}`,
52
+ close: () => child.close(),
53
+ };
54
+ }
55
+ return this.bootInProcess(entry.name, serviceRoot, port, readinessTimeoutMs);
56
+ }
57
+ async bootInProcess(name, serviceRoot, port, readinessTimeoutMs) {
58
+ const appModulePath = (0, node_path_1.join)(serviceRoot, 'dist', 'app.module.js');
59
+ if (!(0, node_fs_1.existsSync)(appModulePath)) {
60
+ throw new Error(`${name} dist did not produce app.module.js at ${appModulePath}.`);
61
+ }
62
+ const bundle = requireCommonJs(appModulePath);
63
+ const nestCore = requireCommonJs(require.resolve('@nestjs/core'));
64
+ const app = await nestCore.NestFactory.create(bundle.AppModule, {
65
+ logger: ['error', 'warn', 'log'],
66
+ abortOnError: false,
67
+ });
68
+ await app.listen(port);
69
+ const url = await app.getUrl();
70
+ await (0, health_probe_1.waitForReady)(url, readinessTimeoutMs).catch(async (err) => {
71
+ await app.close();
72
+ throw err;
73
+ });
74
+ return {
75
+ name,
76
+ url,
77
+ handle: 'in-process',
78
+ close: () => app.close(),
79
+ };
80
+ }
81
+ }
82
+ exports.NativeRunner = NativeRunner;
83
+ function applyEnv(env) {
84
+ for (const [k, v] of Object.entries(env)) {
85
+ process.env[k] = v;
86
+ }
87
+ }
88
+ function requireCommonJs(modulePath) {
89
+ const loaded = require(modulePath);
90
+ return loaded;
91
+ }
92
+ //# sourceMappingURL=native-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-runner.js","sourceRoot":"","sources":["../../../src/runtime/runner/native-runner.ts"],"names":[],"mappings":";;;AAAA,qCAAqC;AACrC,yCAAiC;AAEjC,2DAA4D;AAC5D,oCAA4C;AAC5C,iDAA8C;AAC9C,qDAK0B;AAmC1B,MAAa,YAAY;IACd,IAAI,GAAG,kCAAiB,CAAC,MAAM,CAAC;IACxB,YAAY,CAAS;IACrB,MAAM,CAAU;IAEjC,YAAY,OAA4B,EAAE;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,IAAI,IAAA,wBAAgB,GAAE,CAAC;QACrD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,yEAAyE;gBACvE,0DAA0D,CAC7D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACrC,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,WAAW,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,IAAI,yEAAyE;gBACpF,+CAA+C,CAClD,CAAC;QACJ,CAAC;QACD,MAAM,WAAW,GAAG,IAAA,gBAAI,EAAC,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QACtD,IAAI,CAAC,IAAA,oBAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,GAAG,KAAK,CAAC,IAAI,sBAAsB,QAAQ,yBAAyB,KAAK,CAAC,IAAI,iBAAiB,CAChG,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,oBAAU,EAAC,IAAA,gBAAI,EAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QAC3E,QAAQ,CAAC,GAAG,CAAC,CAAC;QAEd,IAAI,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,kBAAkB,KAAK,CAAC,IAAI,6CAA6C;gBACvE,gFAAgF;gBAChF,+FAA+F,CAClG,CAAC;QACJ,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,IAAA,iCAAiB,EACnC;gBACE,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI;gBACJ,aAAa,EAAE,WAAW;gBAC1B,kBAAkB;aACnB,EACD,GAAG,CACJ,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,MAAM,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;gBAClC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE;aAC3B,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC;IAC/E,CAAC;IAEO,KAAK,CAAC,aAAa,CACzB,IAAY,EACZ,WAAmB,EACnB,IAAY,EACZ,kBAA0B;QAE1B,MAAM,aAAa,GAAG,IAAA,gBAAI,EAAC,WAAW,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;QACjE,IAAI,CAAC,IAAA,oBAAU,EAAC,aAAa,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0CAA0C,aAAa,GAAG,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,MAAM,GAAG,eAAe,CAAyB,aAAa,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,eAAe,CAAqC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;QACtG,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9D,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC;YAChC,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,IAAA,2BAAY,EAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAY,EAAE,EAAE;YACvE,MAAM,GAAG,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO;YACL,IAAI;YACJ,GAAG;YACH,MAAM,EAAE,YAAY;YACpB,KAAK,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE;SACzB,CAAC;IACJ,CAAC;CACF;AA9FD,oCA8FC;AAED,SAAS,QAAQ,CAAC,GAAqC;IACrD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAI,UAAkB;IAE5C,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAY,CAAC;IAC9C,OAAO,MAAW,CAAC;AACrB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { RosterEntry } from '../roster';
2
+ export interface RunningService {
3
+ readonly name: string;
4
+ readonly url: string;
5
+ readonly handle: string;
6
+ close(graceMs: number): Promise<void>;
7
+ }
8
+ export interface StartServiceInput {
9
+ readonly entry: RosterEntry;
10
+ readonly env: Readonly<Record<string, string>>;
11
+ readonly port: number;
12
+ readonly readinessTimeoutMs: number;
13
+ }
14
+ export declare enum ServiceRunnerKind {
15
+ Native = "native",
16
+ Container = "container",
17
+ Helm = "helm"
18
+ }
19
+ export interface ServiceRunner {
20
+ readonly kind: ServiceRunnerKind;
21
+ start(input: StartServiceInput): Promise<RunningService>;
22
+ }
23
+ //# sourceMappingURL=service-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/runner/service-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAS7C,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAErB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAExB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAE5B,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE/C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACrC;AAED,oBAAY,iBAAiB;IAC3B,MAAM,WAAW;IACjB,SAAS,cAAc;IACvB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IAOjC,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAC1D"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ServiceRunnerKind = void 0;
4
+ var ServiceRunnerKind;
5
+ (function (ServiceRunnerKind) {
6
+ ServiceRunnerKind["Native"] = "native";
7
+ ServiceRunnerKind["Container"] = "container";
8
+ ServiceRunnerKind["Helm"] = "helm";
9
+ })(ServiceRunnerKind || (exports.ServiceRunnerKind = ServiceRunnerKind = {}));
10
+ //# sourceMappingURL=service-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service-runner.js","sourceRoot":"","sources":["../../../src/runtime/runner/service-runner.ts"],"names":[],"mappings":";;;AA6BA,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IAC3B,sCAAiB,CAAA;IACjB,4CAAuB,CAAA;IACvB,kCAAa,CAAA;AACf,CAAC,EAJW,iBAAiB,iCAAjB,iBAAiB,QAI5B"}
@@ -0,0 +1,46 @@
1
+ import type { XemaConfig, Substrate } from './config/schema';
2
+ import type { InfraPlan } from './infra/infra-plan';
3
+ import type { RosterEntry } from './roster';
4
+ import type { RunningService, ServiceRunner } from './runner/service-runner';
5
+ import type { Wave } from './waves';
6
+ export interface SupervisorOptions {
7
+ readonly roster: readonly RosterEntry[];
8
+ readonly waves: readonly Wave[];
9
+ readonly runner: ServiceRunner;
10
+ readonly config: XemaConfig;
11
+ readonly infra: InfraPlan;
12
+ readonly substrate: Substrate;
13
+ readonly ports: ReadonlyMap<string, number>;
14
+ readonly containerPort?: number;
15
+ readonly readinessTimeoutMs?: number;
16
+ readonly graceMs?: number;
17
+ readonly onEvent?: (event: LifecycleEvent) => void;
18
+ }
19
+ export interface LifecycleEvent {
20
+ readonly kind: 'wave-start' | 'service-starting' | 'service-ready' | 'service-skipped' | 'wave-complete';
21
+ readonly service?: string;
22
+ readonly wave?: number;
23
+ readonly tier?: string;
24
+ readonly detail?: string;
25
+ }
26
+ export interface SkippedService {
27
+ readonly name: string;
28
+ readonly reason: string;
29
+ }
30
+ export interface BringUpResult {
31
+ readonly running: readonly RunningService[];
32
+ readonly skipped: readonly SkippedService[];
33
+ }
34
+ export declare class Supervisor {
35
+ private readonly opts;
36
+ private readonly running;
37
+ private readonly skipped;
38
+ private readonly seeded;
39
+ constructor(opts: SupervisorOptions);
40
+ bringUp(): Promise<BringUpResult>;
41
+ private startMember;
42
+ shutdown(): Promise<void>;
43
+ get current(): readonly RunningService[];
44
+ private emit;
45
+ }
46
+ //# sourceMappingURL=supervisor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.d.ts","sourceRoot":"","sources":["../../src/runtime/supervisor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAG,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAUpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EACT,YAAY,GACZ,kBAAkB,GAClB,eAAe,GACf,iBAAiB,GACjB,eAAe,CAAC;IACpB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,cAAc,EAAE,CAAC;CAC7C;AAMD,qBAAa,UAAU;IAKT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAEK,IAAI,EAAE,iBAAiB;IAW9C,OAAO,IAAI,OAAO,CAAC,aAAa,CAAC;YA+BzB,WAAW;IAWnB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,IAAI,OAAO,IAAI,SAAS,cAAc,EAAE,CAEvC;IAED,OAAO,CAAC,IAAI;CAGb"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Supervisor = void 0;
4
+ const env_seeder_1 = require("./env-seeder");
5
+ const DEFAULT_READINESS_MS = 45_000;
6
+ const DEFAULT_GRACE_MS = 5_000;
7
+ const MANDATORY_TIER = 'kernel';
8
+ class Supervisor {
9
+ opts;
10
+ running = [];
11
+ skipped = [];
12
+ seeded;
13
+ constructor(opts) {
14
+ this.opts = opts;
15
+ this.seeded = (0, env_seeder_1.seedEnv)({
16
+ config: opts.config,
17
+ infra: opts.infra,
18
+ roster: opts.roster,
19
+ substrate: opts.substrate,
20
+ ports: opts.ports,
21
+ ...(opts.containerPort !== undefined ? { containerPort: opts.containerPort } : {}),
22
+ });
23
+ }
24
+ async bringUp() {
25
+ const readinessTimeoutMs = this.opts.readinessTimeoutMs ?? DEFAULT_READINESS_MS;
26
+ for (const wave of this.opts.waves) {
27
+ this.emit({ kind: 'wave-start', wave: wave.index, tier: wave.tier });
28
+ const results = await Promise.allSettled(wave.members.map((entry) => this.startMember(entry, readinessTimeoutMs)));
29
+ for (let i = 0; i < results.length; i += 1) {
30
+ const member = wave.members[i];
31
+ const result = results[i];
32
+ if (!member || !result) {
33
+ continue;
34
+ }
35
+ if (result.status === 'fulfilled') {
36
+ this.running.push(result.value);
37
+ this.emit({ kind: 'service-ready', service: member.name, detail: result.value.url });
38
+ }
39
+ else {
40
+ const reason = result.reason instanceof Error ? result.reason.message : String(result.reason);
41
+ if (member.tier === MANDATORY_TIER) {
42
+ await this.shutdown();
43
+ throw new Error(`Mandatory service ${member.name} failed to start: ${reason}`);
44
+ }
45
+ this.skipped.push({ name: member.name, reason });
46
+ this.emit({ kind: 'service-skipped', service: member.name, detail: reason });
47
+ }
48
+ }
49
+ this.emit({ kind: 'wave-complete', wave: wave.index, tier: wave.tier });
50
+ }
51
+ return { running: [...this.running], skipped: [...this.skipped] };
52
+ }
53
+ async startMember(entry, readinessTimeoutMs) {
54
+ this.emit({ kind: 'service-starting', service: entry.name, tier: entry.tier });
55
+ const port = this.opts.ports.get(entry.name);
56
+ if (port === undefined) {
57
+ throw new Error(`no port assigned for ${entry.name}`);
58
+ }
59
+ const env = { ...this.seeded.base, ...this.seeded.perService(entry) };
60
+ return this.opts.runner.start({ entry, env, port, readinessTimeoutMs });
61
+ }
62
+ async shutdown() {
63
+ const graceMs = this.opts.graceMs ?? DEFAULT_GRACE_MS;
64
+ for (const svc of [...this.running].reverse()) {
65
+ await svc.close(graceMs).catch(() => undefined);
66
+ }
67
+ this.running.length = 0;
68
+ }
69
+ get current() {
70
+ return [...this.running];
71
+ }
72
+ emit(event) {
73
+ this.opts.onEvent?.(event);
74
+ }
75
+ }
76
+ exports.Supervisor = Supervisor;
77
+ //# sourceMappingURL=supervisor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supervisor.js","sourceRoot":"","sources":["../../src/runtime/supervisor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare enum RuntimeUnitType {
2
+ Infra = "infra",
3
+ BootstrapJob = "bootstrap-job",
4
+ Service = "service",
5
+ Web = "web"
6
+ }
7
+ export declare const WEB_SERVICE_NAME = "xema-host-web";
8
+ export declare function classifyService(name: string, tier: string): RuntimeUnitType;
9
+ //# sourceMappingURL=unit-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-type.d.ts","sourceRoot":"","sources":["../../src/runtime/unit-type.ts"],"names":[],"mappings":"AAiBA,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,YAAY,kBAAkB;IAC9B,OAAO,YAAY;IACnB,GAAG,QAAQ;CACZ;AAGD,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAOhD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAK3E"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WEB_SERVICE_NAME = exports.RuntimeUnitType = void 0;
4
+ exports.classifyService = classifyService;
5
+ var RuntimeUnitType;
6
+ (function (RuntimeUnitType) {
7
+ RuntimeUnitType["Infra"] = "infra";
8
+ RuntimeUnitType["BootstrapJob"] = "bootstrap-job";
9
+ RuntimeUnitType["Service"] = "service";
10
+ RuntimeUnitType["Web"] = "web";
11
+ })(RuntimeUnitType || (exports.RuntimeUnitType = RuntimeUnitType = {}));
12
+ exports.WEB_SERVICE_NAME = 'xema-host-web';
13
+ function classifyService(name, tier) {
14
+ if (name === exports.WEB_SERVICE_NAME || tier === 'edge') {
15
+ return RuntimeUnitType.Web;
16
+ }
17
+ return RuntimeUnitType.Service;
18
+ }
19
+ //# sourceMappingURL=unit-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unit-type.js","sourceRoot":"","sources":["../../src/runtime/unit-type.ts"],"names":[],"mappings":";;;AAgCA,0CAKC;AApBD,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,kCAAe,CAAA;IACf,iDAA8B,CAAA;IAC9B,sCAAmB,CAAA;IACnB,8BAAW,CAAA;AACb,CAAC,EALW,eAAe,+BAAf,eAAe,QAK1B;AAGY,QAAA,gBAAgB,GAAG,eAAe,CAAC;AAOhD,SAAgB,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,IAAI,IAAI,KAAK,wBAAgB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACjD,OAAO,eAAe,CAAC,GAAG,CAAC;IAC7B,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,CAAC;AACjC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BootGraph } from './boot-graph-loader';
2
+ import type { RosterEntry } from './roster';
3
+ export interface Wave {
4
+ readonly index: number;
5
+ readonly tier: string;
6
+ readonly members: readonly RosterEntry[];
7
+ }
8
+ export declare function deriveWaves(roster: readonly RosterEntry[], bootGraph?: BootGraph): Wave[];
9
+ export declare function findWaveOrderViolations(waves: readonly Wave[], bootGraph: BootGraph): Array<{
10
+ service: string;
11
+ requires: string;
12
+ serviceTier: string;
13
+ requiresTier: string;
14
+ }>;
15
+ //# sourceMappingURL=waves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waves.d.ts","sourceRoot":"","sources":["../../src/runtime/waves.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAY5C,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;CAC1C;AAYD,wBAAgB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,EAAE,CA8BzF;AAQD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,IAAI,EAAE,EACtB,SAAS,EAAE,SAAS,GACnB,KAAK,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CA2CzF"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveWaves = deriveWaves;
4
+ exports.findWaveOrderViolations = findWaveOrderViolations;
5
+ const DEFAULT_TIER_RANK = {
6
+ kernel: 0,
7
+ system: 1,
8
+ base: 2,
9
+ platform: 3,
10
+ edge: 4,
11
+ };
12
+ function deriveWaves(roster, bootGraph) {
13
+ const rank = (tier) => {
14
+ const fromGraph = bootGraph?.tiers[tier];
15
+ if (typeof fromGraph === 'number') {
16
+ return fromGraph;
17
+ }
18
+ const fromDefault = DEFAULT_TIER_RANK[tier];
19
+ if (typeof fromDefault === 'number') {
20
+ return fromDefault;
21
+ }
22
+ return Number.MAX_SAFE_INTEGER;
23
+ };
24
+ const byTier = new Map();
25
+ for (const entry of roster) {
26
+ const bucket = byTier.get(entry.tier);
27
+ if (bucket) {
28
+ bucket.push(entry);
29
+ }
30
+ else {
31
+ byTier.set(entry.tier, [entry]);
32
+ }
33
+ }
34
+ const orderedTiers = [...byTier.keys()].sort((a, b) => rank(a) - rank(b));
35
+ return orderedTiers.map((tier, index) => ({
36
+ index,
37
+ tier,
38
+ members: (byTier.get(tier) ?? []).slice().sort((a, b) => a.name.localeCompare(b.name)),
39
+ }));
40
+ }
41
+ function findWaveOrderViolations(waves, bootGraph) {
42
+ const tierOfService = new Map();
43
+ for (const wave of waves) {
44
+ for (const m of wave.members) {
45
+ tierOfService.set(m.name, wave.tier);
46
+ }
47
+ }
48
+ const rank = (tier) => typeof bootGraph.tiers[tier] === 'number' ? bootGraph.tiers[tier] : Number.MAX_SAFE_INTEGER;
49
+ const violations = [];
50
+ for (const wave of waves) {
51
+ for (const m of wave.members) {
52
+ const node = bootGraph.services.get(m.name);
53
+ if (!node) {
54
+ continue;
55
+ }
56
+ for (const req of node.startupRequires) {
57
+ if (bootGraph.infraServices.has(req)) {
58
+ continue;
59
+ }
60
+ const reqTier = tierOfService.get(req);
61
+ if (reqTier === undefined) {
62
+ continue;
63
+ }
64
+ if (rank(reqTier) >= rank(wave.tier)) {
65
+ violations.push({
66
+ service: m.name,
67
+ requires: req,
68
+ serviceTier: wave.tier,
69
+ requiresTier: reqTier,
70
+ });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ return violations;
76
+ }
77
+ //# sourceMappingURL=waves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waves.js","sourceRoot":"","sources":["../../src/runtime/waves.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xemahq/xema",
3
- "version": "0.1.5",
3
+ "version": "0.2.1",
4
4
  "description": "Xema OS global CLI (plan v4.3 §6 Phase J). Single binary day-0 onboarding: `npm i -g @xemahq/xema && xema dev` boots the whole stack; `xema biome scaffold` / `install` / `publish` / `lint` author and ship biomes; `xema run <capability>` invokes through the local capability-router. Multi-platform: works without pnpm or any monorepo clone.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/cli.js",
@@ -8,7 +8,8 @@
8
8
  "xema": "./dist/cli.js"
9
9
  },
10
10
  "files": [
11
- "dist/**/*"
11
+ "dist/**/*",
12
+ "xema.config.example.yaml"
12
13
  ],
13
14
  "publishConfig": {
14
15
  "registry": "https://registry.npmjs.org/",
@@ -18,12 +19,14 @@
18
19
  "@nestjs/common": "11.1.13",
19
20
  "@nestjs/core": "11.1.13",
20
21
  "@nestjs/platform-express": "11.1.13",
22
+ "@xemahq/kernel-contracts": "^0.22.0",
21
23
  "@xemahq/kernel-state-runtime": "^0.1.5",
22
24
  "@xemahq/service-registry-nest": "^0.1.9",
23
25
  "commander": "^12.1.0",
24
26
  "reflect-metadata": "0.2.2",
25
27
  "rxjs": "7.8.2",
26
- "yaml": "^2.6.1"
28
+ "yaml": "^2.6.1",
29
+ "zod": "^4.3.6"
27
30
  },
28
31
  "devDependencies": {
29
32
  "@eslint/js": "^9.39.4",
@@ -39,8 +42,7 @@
39
42
  "ts-jest": "^29.4.9",
40
43
  "ts-node": "^10.9.2",
41
44
  "typescript": "5.9.3",
42
- "typescript-eslint": "^8.56.1",
43
- "@xemahq/kernel-contracts": "^0.13.0"
45
+ "typescript-eslint": "^8.56.1"
44
46
  },
45
47
  "pkg": {
46
48
  "scripts": [
@@ -58,9 +60,6 @@
58
60
  ],
59
61
  "outputPath": "dist/bin"
60
62
  },
61
- "peerDependencies": {
62
- "@xemahq/kernel-contracts": ">=0.13.0"
63
- },
64
63
  "scripts": {
65
64
  "clean": "rm -rf dist",
66
65
  "build": "tsc -p tsconfig.json && node ./scripts/post-build.cjs",