@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.
- package/README.md +64 -15
- package/dist/assets/boot-graph.json +72 -0
- package/dist/assets/core/distribution.lock.json +1244 -0
- package/dist/assets/core/images.lock.json +428 -0
- package/dist/assets/oss/distribution.lock.json +1978 -0
- package/dist/assets/oss/images.lock.json +594 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +9 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +36 -14
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/down.d.ts +3 -0
- package/dist/commands/down.d.ts.map +1 -0
- package/dist/commands/down.js +54 -0
- package/dist/commands/down.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +61 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +38 -8
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +41 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/up.d.ts +3 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +44 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/dev/infra-preflight.js +1 -1
- package/dist/dev/infra-preflight.js.map +1 -1
- package/dist/lib/command-registry.d.ts +1 -1
- package/dist/lib/command-registry.d.ts.map +1 -1
- package/dist/lib/command-registry.js +4 -0
- package/dist/lib/command-registry.js.map +1 -1
- package/dist/runtime/boot-graph-loader.d.ts +17 -0
- package/dist/runtime/boot-graph-loader.d.ts.map +1 -0
- package/dist/runtime/boot-graph-loader.js +40 -0
- package/dist/runtime/boot-graph-loader.js.map +1 -0
- package/dist/runtime/config/loader.d.ts +11 -0
- package/dist/runtime/config/loader.d.ts.map +1 -0
- package/dist/runtime/config/loader.js +38 -0
- package/dist/runtime/config/loader.js.map +1 -0
- package/dist/runtime/config/schema.d.ts +202 -0
- package/dist/runtime/config/schema.d.ts.map +1 -0
- package/dist/runtime/config/schema.js +125 -0
- package/dist/runtime/config/schema.js.map +1 -0
- package/dist/runtime/env-seeder.d.ts +17 -0
- package/dist/runtime/env-seeder.d.ts.map +1 -0
- package/dist/runtime/env-seeder.js +80 -0
- package/dist/runtime/env-seeder.js.map +1 -0
- package/dist/runtime/foreground.d.ts +8 -0
- package/dist/runtime/foreground.d.ts.map +1 -0
- package/dist/runtime/foreground.js +71 -0
- package/dist/runtime/foreground.js.map +1 -0
- package/dist/runtime/infra/infra-catalog.d.ts +19 -0
- package/dist/runtime/infra/infra-catalog.d.ts.map +1 -0
- package/dist/runtime/infra/infra-catalog.js +128 -0
- package/dist/runtime/infra/infra-catalog.js.map +1 -0
- package/dist/runtime/infra/infra-plan.d.ts +16 -0
- package/dist/runtime/infra/infra-plan.d.ts.map +1 -0
- package/dist/runtime/infra/infra-plan.js +44 -0
- package/dist/runtime/infra/infra-plan.js.map +1 -0
- package/dist/runtime/infra/infra-runner.d.ts +26 -0
- package/dist/runtime/infra/infra-runner.d.ts.map +1 -0
- package/dist/runtime/infra/infra-runner.js +135 -0
- package/dist/runtime/infra/infra-runner.js.map +1 -0
- package/dist/runtime/launch.d.ts +24 -0
- package/dist/runtime/launch.d.ts.map +1 -0
- package/dist/runtime/launch.js +116 -0
- package/dist/runtime/launch.js.map +1 -0
- package/dist/runtime/lock-loader.d.ts +26 -0
- package/dist/runtime/lock-loader.d.ts.map +1 -0
- package/dist/runtime/lock-loader.js +61 -0
- package/dist/runtime/lock-loader.js.map +1 -0
- package/dist/runtime/paths.d.ts +14 -0
- package/dist/runtime/paths.d.ts.map +1 -0
- package/dist/runtime/paths.js +109 -0
- package/dist/runtime/paths.js.map +1 -0
- package/dist/runtime/platform-services.d.ts +2 -0
- package/dist/runtime/platform-services.d.ts.map +1 -0
- package/dist/runtime/platform-services.js +8 -0
- package/dist/runtime/platform-services.js.map +1 -0
- package/dist/runtime/port-map.d.ts +3 -0
- package/dist/runtime/port-map.d.ts.map +1 -0
- package/dist/runtime/port-map.js +25 -0
- package/dist/runtime/port-map.js.map +1 -0
- package/dist/runtime/roster.d.ts +32 -0
- package/dist/runtime/roster.d.ts.map +1 -0
- package/dist/runtime/roster.js +106 -0
- package/dist/runtime/roster.js.map +1 -0
- package/dist/runtime/runner/container-runner.d.ts +14 -0
- package/dist/runtime/runner/container-runner.d.ts.map +1 -0
- package/dist/runtime/runner/container-runner.js +61 -0
- package/dist/runtime/runner/container-runner.js.map +1 -0
- package/dist/runtime/runner/docker-cli.d.ts +11 -0
- package/dist/runtime/runner/docker-cli.d.ts.map +1 -0
- package/dist/runtime/runner/docker-cli.js +53 -0
- package/dist/runtime/runner/docker-cli.js.map +1 -0
- package/dist/runtime/runner/health-probe.d.ts +2 -0
- package/dist/runtime/runner/health-probe.d.ts.map +1 -0
- package/dist/runtime/runner/health-probe.js +38 -0
- package/dist/runtime/runner/health-probe.js.map +1 -0
- package/dist/runtime/runner/helm-runner.d.ts +19 -0
- package/dist/runtime/runner/helm-runner.d.ts.map +1 -0
- package/dist/runtime/runner/helm-runner.js +70 -0
- package/dist/runtime/runner/helm-runner.js.map +1 -0
- package/dist/runtime/runner/native-runner.d.ts +9 -0
- package/dist/runtime/runner/native-runner.d.ts.map +1 -0
- package/dist/runtime/runner/native-runner.js +85 -0
- package/dist/runtime/runner/native-runner.js.map +1 -0
- package/dist/runtime/runner/service-runner.d.ts +23 -0
- package/dist/runtime/runner/service-runner.d.ts.map +1 -0
- package/dist/runtime/runner/service-runner.js +10 -0
- package/dist/runtime/runner/service-runner.js.map +1 -0
- package/dist/runtime/supervisor.d.ts +46 -0
- package/dist/runtime/supervisor.d.ts.map +1 -0
- package/dist/runtime/supervisor.js +77 -0
- package/dist/runtime/supervisor.js.map +1 -0
- package/dist/runtime/unit-type.d.ts +9 -0
- package/dist/runtime/unit-type.d.ts.map +1 -0
- package/dist/runtime/unit-type.js +19 -0
- package/dist/runtime/unit-type.js.map +1 -0
- package/dist/runtime/waves.d.ts +15 -0
- package/dist/runtime/waves.d.ts.map +1 -0
- package/dist/runtime/waves.js +77 -0
- package/dist/runtime/waves.js.map +1 -0
- package/package.json +9 -10
- package/xema.config.example.yaml +45 -0
|
@@ -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,9 @@
|
|
|
1
|
+
import { ServiceRunnerKind, type RunningService, type ServiceRunner, type StartServiceInput } from './service-runner';
|
|
2
|
+
export declare class NativeRunner implements ServiceRunner {
|
|
3
|
+
readonly kind = ServiceRunnerKind.Native;
|
|
4
|
+
private readonly monorepoRoot;
|
|
5
|
+
constructor(monorepoRoot?: string);
|
|
6
|
+
start(input: StartServiceInput): Promise<RunningService>;
|
|
7
|
+
private bootInProcess;
|
|
8
|
+
}
|
|
9
|
+
//# 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,qBAAa,YAAa,YAAW,aAAa;IAChD,QAAQ,CAAC,IAAI,4BAA4B;IACzC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,YAAY,CAAC,EAAE,MAAM;IAW3B,KAAK,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC;YAwChD,aAAa;CA6B5B"}
|
|
@@ -0,0 +1,85 @@
|
|
|
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
|
+
constructor(monorepoRoot) {
|
|
14
|
+
const root = monorepoRoot ?? (0, paths_1.findMonorepoRoot)();
|
|
15
|
+
if (!root) {
|
|
16
|
+
throw new Error('NativeRunner requires a monorepo checkout (built service dist/ trees). ' +
|
|
17
|
+
'Run inside the monorepo, or use the container substrate.');
|
|
18
|
+
}
|
|
19
|
+
this.monorepoRoot = root;
|
|
20
|
+
}
|
|
21
|
+
async start(input) {
|
|
22
|
+
const { entry, env, port, readinessTimeoutMs } = input;
|
|
23
|
+
if (!entry.servicePath) {
|
|
24
|
+
throw new Error(`${entry.name}: no servicePath (platform-substrate service) — not bootable natively. ` +
|
|
25
|
+
`Use the container substrate for this service.`);
|
|
26
|
+
}
|
|
27
|
+
const serviceRoot = (0, node_path_1.join)(this.monorepoRoot, entry.servicePath);
|
|
28
|
+
const distMain = (0, node_path_1.join)(serviceRoot, 'dist', 'main.js');
|
|
29
|
+
if (!(0, node_fs_1.existsSync)(distMain)) {
|
|
30
|
+
throw new Error(`${entry.name} dist not found at ${distMain}. Run \`pnpm --filter ${entry.name} build\` first.`);
|
|
31
|
+
}
|
|
32
|
+
const needsFork = (0, node_fs_1.existsSync)((0, node_path_1.join)(serviceRoot, 'prisma', 'schema.prisma'));
|
|
33
|
+
applyEnv(env);
|
|
34
|
+
if (needsFork) {
|
|
35
|
+
const child = await (0, forked_worker_1.spawnForkedWorker)({
|
|
36
|
+
name: entry.name,
|
|
37
|
+
port,
|
|
38
|
+
siblingAppDir: serviceRoot,
|
|
39
|
+
readinessTimeoutMs,
|
|
40
|
+
}, '/');
|
|
41
|
+
return {
|
|
42
|
+
name: entry.name,
|
|
43
|
+
url: child.url,
|
|
44
|
+
handle: `pid:${String(child.pid)}`,
|
|
45
|
+
close: () => child.close(),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
return this.bootInProcess(entry.name, serviceRoot, port, readinessTimeoutMs);
|
|
49
|
+
}
|
|
50
|
+
async bootInProcess(name, serviceRoot, port, readinessTimeoutMs) {
|
|
51
|
+
const appModulePath = (0, node_path_1.join)(serviceRoot, 'dist', 'app.module.js');
|
|
52
|
+
if (!(0, node_fs_1.existsSync)(appModulePath)) {
|
|
53
|
+
throw new Error(`${name} dist did not produce app.module.js at ${appModulePath}.`);
|
|
54
|
+
}
|
|
55
|
+
const bundle = requireCommonJs(appModulePath);
|
|
56
|
+
const nestCore = requireCommonJs(require.resolve('@nestjs/core'));
|
|
57
|
+
const app = await nestCore.NestFactory.create(bundle.AppModule, {
|
|
58
|
+
logger: ['error', 'warn', 'log'],
|
|
59
|
+
abortOnError: false,
|
|
60
|
+
});
|
|
61
|
+
await app.listen(port);
|
|
62
|
+
const url = await app.getUrl();
|
|
63
|
+
await (0, health_probe_1.waitForReady)(url, readinessTimeoutMs).catch(async (err) => {
|
|
64
|
+
await app.close();
|
|
65
|
+
throw err;
|
|
66
|
+
});
|
|
67
|
+
return {
|
|
68
|
+
name,
|
|
69
|
+
url,
|
|
70
|
+
handle: 'in-process',
|
|
71
|
+
close: () => app.close(),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.NativeRunner = NativeRunner;
|
|
76
|
+
function applyEnv(env) {
|
|
77
|
+
for (const [k, v] of Object.entries(env)) {
|
|
78
|
+
process.env[k] = v;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
function requireCommonJs(modulePath) {
|
|
82
|
+
const loaded = require(modulePath);
|
|
83
|
+
return loaded;
|
|
84
|
+
}
|
|
85
|
+
//# 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":"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"}
|
|
@@ -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":";;;AAAA,6CAAuC;AAqDvC,MAAM,oBAAoB,GAAG,MAAM,CAAC;AACpC,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,cAAc,GAAG,QAAQ,CAAC;AAEhC,MAAa,UAAU;IAKQ;IAJZ,OAAO,GAAqB,EAAE,CAAC;IAC/B,OAAO,GAAqB,EAAE,CAAC;IAC/B,MAAM,CAAC;IAExB,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;QAClD,IAAI,CAAC,MAAM,GAAG,IAAA,oBAAO,EAAC;YACpB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,oBAAoB,CAAC;QAChF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CACzE,CAAC;YACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;oBACvB,SAAS;gBACX,CAAC;gBACD,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;gBACvF,CAAC;qBAAM,CAAC;oBACN,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAC9F,IAAI,MAAM,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACnC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;wBACtB,MAAM,IAAI,KAAK,CAAC,qBAAqB,MAAM,CAAC,IAAI,qBAAqB,MAAM,EAAE,CAAC,CAAC;oBACjF,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBACjD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,KAAkB,EAAE,kBAA0B;QACtE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC1E,CAAC;IAGD,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,gBAAgB,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;IAEO,IAAI,CAAC,KAAqB;QAChC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAzED,gCAyEC"}
|
|
@@ -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.
|
|
3
|
+
"version": "0.2.0",
|
|
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",
|
|
21
|
-
"@xemahq/kernel-
|
|
22
|
-
"@xemahq/
|
|
22
|
+
"@xemahq/kernel-contracts": "^0.22.0",
|
|
23
|
+
"@xemahq/kernel-state-runtime": "^0.1.5",
|
|
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",
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Xema launcher topology — copy to `xema.config.yaml` and edit.
|
|
2
|
+
# Docs: https://xema.dev | CLI: `xema up`, `xema down`, `xema status`, `xema logs`.
|
|
3
|
+
#
|
|
4
|
+
# Every value shown is the default; delete what you don't override.
|
|
5
|
+
|
|
6
|
+
edition: oss # which distribution edition to launch
|
|
7
|
+
|
|
8
|
+
# ── backing infrastructure (BYO model) ───────────────────────────────────────
|
|
9
|
+
# mode ∈ managed | external | disabled
|
|
10
|
+
# managed — the launcher starts + owns it (and its data volume)
|
|
11
|
+
# external — you already run it; give the URL (launcher health-probes it)
|
|
12
|
+
# disabled — not run (only allowed for optional components)
|
|
13
|
+
infra:
|
|
14
|
+
postgres: { mode: managed } # mandatory
|
|
15
|
+
redis: { mode: managed } # mandatory
|
|
16
|
+
etcd: { mode: managed } # mandatory (service discovery)
|
|
17
|
+
keycloak: { mode: managed } # mandatory (identity)
|
|
18
|
+
objectStore: { mode: managed } # mandatory (blobs/artifacts)
|
|
19
|
+
search: { mode: managed } # optional (full-text / vectors)
|
|
20
|
+
fga: { mode: managed } # optional (authorization ReBAC)
|
|
21
|
+
git: { mode: disabled } # optional (SCM integration)
|
|
22
|
+
temporal: { mode: managed } # optional (durable workflows)
|
|
23
|
+
# Example BYO:
|
|
24
|
+
# keycloak: { mode: external, url: https://sso.example.com/realms/xema, realm: xema }
|
|
25
|
+
# objectStore: { mode: external, url: https://s3.example.com, secretRef: my-s3 }
|
|
26
|
+
|
|
27
|
+
# ── application services ─────────────────────────────────────────────────────
|
|
28
|
+
app:
|
|
29
|
+
substrate: container # container | native | helm
|
|
30
|
+
include: [ all ] # all | tier names (kernel/system/base/platform) | service names
|
|
31
|
+
exclude: [] # service names to drop
|
|
32
|
+
features: [] # curated capability bundles (union with include)
|
|
33
|
+
web:
|
|
34
|
+
enabled: false # start the host-shell frontend (or use `xema up --web`)
|
|
35
|
+
|
|
36
|
+
# ── persistence ──────────────────────────────────────────────────────────────
|
|
37
|
+
state:
|
|
38
|
+
workspaces:
|
|
39
|
+
driver: docker_local # docker_local (container) | host_path (native)
|
|
40
|
+
|
|
41
|
+
# ── secrets the launcher must obtain (never dev-defaulted in production) ──────
|
|
42
|
+
secrets:
|
|
43
|
+
OPENCODE_SERVER_PASSWORD: { from: prompt }
|
|
44
|
+
# DELEGATED_SESSION_JWT_PRIVATE_KEY: { from: file, path: ./keys/session.pem }
|
|
45
|
+
# LLM_PROVIDER_ANTHROPIC_API_KEY: { from: env }
|