@xemahq/xema 0.1.4 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/README.md +64 -15
  2. package/dist/assets/boot-graph.json +72 -0
  3. package/dist/assets/core/distribution.lock.json +1244 -0
  4. package/dist/assets/core/images.lock.json +428 -0
  5. package/dist/assets/oss/distribution.lock.json +1978 -0
  6. package/dist/assets/oss/images.lock.json +594 -0
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +9 -1
  9. package/dist/cli.js.map +1 -1
  10. package/dist/commands/dev.d.ts.map +1 -1
  11. package/dist/commands/dev.js +36 -14
  12. package/dist/commands/dev.js.map +1 -1
  13. package/dist/commands/doctor.js +1 -1
  14. package/dist/commands/doctor.js.map +1 -1
  15. package/dist/commands/down.d.ts +3 -0
  16. package/dist/commands/down.d.ts.map +1 -0
  17. package/dist/commands/down.js +54 -0
  18. package/dist/commands/down.js.map +1 -0
  19. package/dist/commands/logs.d.ts +3 -0
  20. package/dist/commands/logs.d.ts.map +1 -0
  21. package/dist/commands/logs.js +61 -0
  22. package/dist/commands/logs.js.map +1 -0
  23. package/dist/commands/serve.d.ts.map +1 -1
  24. package/dist/commands/serve.js +38 -8
  25. package/dist/commands/serve.js.map +1 -1
  26. package/dist/commands/status.d.ts +3 -0
  27. package/dist/commands/status.d.ts.map +1 -0
  28. package/dist/commands/status.js +41 -0
  29. package/dist/commands/status.js.map +1 -0
  30. package/dist/commands/up.d.ts +3 -0
  31. package/dist/commands/up.d.ts.map +1 -0
  32. package/dist/commands/up.js +44 -0
  33. package/dist/commands/up.js.map +1 -0
  34. package/dist/dev/infra-preflight.js +1 -1
  35. package/dist/dev/infra-preflight.js.map +1 -1
  36. package/dist/lib/command-registry.d.ts +1 -1
  37. package/dist/lib/command-registry.d.ts.map +1 -1
  38. package/dist/lib/command-registry.js +4 -0
  39. package/dist/lib/command-registry.js.map +1 -1
  40. package/dist/runtime/boot-graph-loader.d.ts +17 -0
  41. package/dist/runtime/boot-graph-loader.d.ts.map +1 -0
  42. package/dist/runtime/boot-graph-loader.js +40 -0
  43. package/dist/runtime/boot-graph-loader.js.map +1 -0
  44. package/dist/runtime/config/loader.d.ts +11 -0
  45. package/dist/runtime/config/loader.d.ts.map +1 -0
  46. package/dist/runtime/config/loader.js +38 -0
  47. package/dist/runtime/config/loader.js.map +1 -0
  48. package/dist/runtime/config/schema.d.ts +202 -0
  49. package/dist/runtime/config/schema.d.ts.map +1 -0
  50. package/dist/runtime/config/schema.js +125 -0
  51. package/dist/runtime/config/schema.js.map +1 -0
  52. package/dist/runtime/env-seeder.d.ts +17 -0
  53. package/dist/runtime/env-seeder.d.ts.map +1 -0
  54. package/dist/runtime/env-seeder.js +80 -0
  55. package/dist/runtime/env-seeder.js.map +1 -0
  56. package/dist/runtime/foreground.d.ts +8 -0
  57. package/dist/runtime/foreground.d.ts.map +1 -0
  58. package/dist/runtime/foreground.js +71 -0
  59. package/dist/runtime/foreground.js.map +1 -0
  60. package/dist/runtime/infra/infra-catalog.d.ts +19 -0
  61. package/dist/runtime/infra/infra-catalog.d.ts.map +1 -0
  62. package/dist/runtime/infra/infra-catalog.js +128 -0
  63. package/dist/runtime/infra/infra-catalog.js.map +1 -0
  64. package/dist/runtime/infra/infra-plan.d.ts +16 -0
  65. package/dist/runtime/infra/infra-plan.d.ts.map +1 -0
  66. package/dist/runtime/infra/infra-plan.js +44 -0
  67. package/dist/runtime/infra/infra-plan.js.map +1 -0
  68. package/dist/runtime/infra/infra-runner.d.ts +26 -0
  69. package/dist/runtime/infra/infra-runner.d.ts.map +1 -0
  70. package/dist/runtime/infra/infra-runner.js +135 -0
  71. package/dist/runtime/infra/infra-runner.js.map +1 -0
  72. package/dist/runtime/launch.d.ts +24 -0
  73. package/dist/runtime/launch.d.ts.map +1 -0
  74. package/dist/runtime/launch.js +116 -0
  75. package/dist/runtime/launch.js.map +1 -0
  76. package/dist/runtime/lock-loader.d.ts +26 -0
  77. package/dist/runtime/lock-loader.d.ts.map +1 -0
  78. package/dist/runtime/lock-loader.js +61 -0
  79. package/dist/runtime/lock-loader.js.map +1 -0
  80. package/dist/runtime/paths.d.ts +14 -0
  81. package/dist/runtime/paths.d.ts.map +1 -0
  82. package/dist/runtime/paths.js +109 -0
  83. package/dist/runtime/paths.js.map +1 -0
  84. package/dist/runtime/platform-services.d.ts +2 -0
  85. package/dist/runtime/platform-services.d.ts.map +1 -0
  86. package/dist/runtime/platform-services.js +8 -0
  87. package/dist/runtime/platform-services.js.map +1 -0
  88. package/dist/runtime/port-map.d.ts +3 -0
  89. package/dist/runtime/port-map.d.ts.map +1 -0
  90. package/dist/runtime/port-map.js +25 -0
  91. package/dist/runtime/port-map.js.map +1 -0
  92. package/dist/runtime/roster.d.ts +32 -0
  93. package/dist/runtime/roster.d.ts.map +1 -0
  94. package/dist/runtime/roster.js +106 -0
  95. package/dist/runtime/roster.js.map +1 -0
  96. package/dist/runtime/runner/container-runner.d.ts +14 -0
  97. package/dist/runtime/runner/container-runner.d.ts.map +1 -0
  98. package/dist/runtime/runner/container-runner.js +61 -0
  99. package/dist/runtime/runner/container-runner.js.map +1 -0
  100. package/dist/runtime/runner/docker-cli.d.ts +11 -0
  101. package/dist/runtime/runner/docker-cli.d.ts.map +1 -0
  102. package/dist/runtime/runner/docker-cli.js +53 -0
  103. package/dist/runtime/runner/docker-cli.js.map +1 -0
  104. package/dist/runtime/runner/health-probe.d.ts +2 -0
  105. package/dist/runtime/runner/health-probe.d.ts.map +1 -0
  106. package/dist/runtime/runner/health-probe.js +38 -0
  107. package/dist/runtime/runner/health-probe.js.map +1 -0
  108. package/dist/runtime/runner/helm-runner.d.ts +19 -0
  109. package/dist/runtime/runner/helm-runner.d.ts.map +1 -0
  110. package/dist/runtime/runner/helm-runner.js +70 -0
  111. package/dist/runtime/runner/helm-runner.js.map +1 -0
  112. package/dist/runtime/runner/native-runner.d.ts +9 -0
  113. package/dist/runtime/runner/native-runner.d.ts.map +1 -0
  114. package/dist/runtime/runner/native-runner.js +85 -0
  115. package/dist/runtime/runner/native-runner.js.map +1 -0
  116. package/dist/runtime/runner/service-runner.d.ts +23 -0
  117. package/dist/runtime/runner/service-runner.d.ts.map +1 -0
  118. package/dist/runtime/runner/service-runner.js +10 -0
  119. package/dist/runtime/runner/service-runner.js.map +1 -0
  120. package/dist/runtime/supervisor.d.ts +46 -0
  121. package/dist/runtime/supervisor.d.ts.map +1 -0
  122. package/dist/runtime/supervisor.js +77 -0
  123. package/dist/runtime/supervisor.js.map +1 -0
  124. package/dist/runtime/unit-type.d.ts +9 -0
  125. package/dist/runtime/unit-type.d.ts.map +1 -0
  126. package/dist/runtime/unit-type.js +19 -0
  127. package/dist/runtime/unit-type.js.map +1 -0
  128. package/dist/runtime/waves.d.ts +15 -0
  129. package/dist/runtime/waves.d.ts.map +1 -0
  130. package/dist/runtime/waves.js +77 -0
  131. package/dist/runtime/waves.js.map +1 -0
  132. package/package.json +9 -10
  133. package/xema.config.example.yaml +45 -0
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHARED_BIOMES_DATABASE = exports.OBJECT_STORE_BUCKETS = exports.INFRA_COMPONENTS = exports.INFRA_CATALOG = void 0;
4
+ const schema_1 = require("../config/schema");
5
+ exports.INFRA_CATALOG = Object.freeze({
6
+ [schema_1.InfraComponent.Postgres]: {
7
+ component: schema_1.InfraComponent.Postgres,
8
+ mandatory: true,
9
+ managed: {
10
+ image: 'pgvector/pgvector:pg16',
11
+ containerName: 'xema-postgres',
12
+ ports: [[5432, 5432]],
13
+ dataPath: '/var/lib/postgresql/data',
14
+ healthCmd: 'pg_isready -U postgres',
15
+ },
16
+ },
17
+ [schema_1.InfraComponent.Redis]: {
18
+ component: schema_1.InfraComponent.Redis,
19
+ mandatory: true,
20
+ managed: {
21
+ image: 'redis:7-alpine',
22
+ containerName: 'xema-redis',
23
+ ports: [[6379, 6379]],
24
+ dataPath: '/data',
25
+ healthCmd: 'redis-cli ping',
26
+ },
27
+ defaultLocalUrl: 'redis://127.0.0.1:6379',
28
+ },
29
+ [schema_1.InfraComponent.Etcd]: {
30
+ component: schema_1.InfraComponent.Etcd,
31
+ mandatory: true,
32
+ managed: {
33
+ image: 'quay.io/coreos/etcd:v3.6.4',
34
+ containerName: 'xema-etcd',
35
+ ports: [[2379, 2379]],
36
+ dataPath: '/etcd-data',
37
+ healthCmd: 'etcdctl endpoint health',
38
+ },
39
+ defaultLocalUrl: '127.0.0.1:2379',
40
+ },
41
+ [schema_1.InfraComponent.Keycloak]: {
42
+ component: schema_1.InfraComponent.Keycloak,
43
+ mandatory: true,
44
+ managed: {
45
+ image: 'quay.io/keycloak/keycloak:26.0',
46
+ containerName: 'xema-keycloak',
47
+ ports: [[8180, 8080]],
48
+ healthCmd: '/opt/healthcheck.sh',
49
+ },
50
+ defaultLocalUrl: 'http://127.0.0.1:8180',
51
+ },
52
+ [schema_1.InfraComponent.ObjectStore]: {
53
+ component: schema_1.InfraComponent.ObjectStore,
54
+ mandatory: true,
55
+ managed: {
56
+ image: 'minio/minio:RELEASE.2025-01-20T14-49-07Z',
57
+ containerName: 'xema-minio',
58
+ ports: [
59
+ [9000, 9000],
60
+ [9001, 9001],
61
+ ],
62
+ dataPath: '/data',
63
+ healthCmd: 'mc ready local',
64
+ },
65
+ defaultLocalUrl: 'http://127.0.0.1:9000',
66
+ },
67
+ [schema_1.InfraComponent.Search]: {
68
+ component: schema_1.InfraComponent.Search,
69
+ mandatory: false,
70
+ managed: {
71
+ image: 'opensearchproject/opensearch:2.18.0',
72
+ containerName: 'xema-opensearch',
73
+ ports: [[9200, 9200]],
74
+ dataPath: '/usr/share/opensearch/data',
75
+ healthCmd: 'curl -fsS http://localhost:9200/_cluster/health',
76
+ },
77
+ defaultLocalUrl: 'http://127.0.0.1:9200',
78
+ },
79
+ [schema_1.InfraComponent.Fga]: {
80
+ component: schema_1.InfraComponent.Fga,
81
+ mandatory: false,
82
+ managed: {
83
+ image: 'openfga/openfga:v1.16.1',
84
+ containerName: 'xema-openfga',
85
+ ports: [
86
+ [8088, 8080],
87
+ [8081, 8081],
88
+ ],
89
+ },
90
+ defaultLocalUrl: 'http://127.0.0.1:8088',
91
+ },
92
+ [schema_1.InfraComponent.Git]: {
93
+ component: schema_1.InfraComponent.Git,
94
+ mandatory: false,
95
+ managed: {
96
+ image: 'gitea/gitea:1.25-rootless',
97
+ containerName: 'xema-gitea',
98
+ ports: [
99
+ [3000, 3000],
100
+ [2222, 2222],
101
+ ],
102
+ dataPath: '/var/lib/gitea',
103
+ healthCmd: 'wget -qO- http://localhost:3000/api/v1/version',
104
+ },
105
+ defaultLocalUrl: 'http://127.0.0.1:3000',
106
+ },
107
+ [schema_1.InfraComponent.Temporal]: {
108
+ component: schema_1.InfraComponent.Temporal,
109
+ mandatory: false,
110
+ managed: {
111
+ image: 'temporalio/auto-setup:1.28.2',
112
+ containerName: 'xema-temporal',
113
+ ports: [[7233, 7233]],
114
+ },
115
+ defaultLocalUrl: '127.0.0.1:7233',
116
+ },
117
+ });
118
+ exports.INFRA_COMPONENTS = Object.freeze(Object.values(schema_1.InfraComponent));
119
+ exports.OBJECT_STORE_BUCKETS = Object.freeze([
120
+ 'session-session-attachments',
121
+ 'session-opencode-sessions',
122
+ 'kb-knowledge-base-pages',
123
+ 'plugin-bundles',
124
+ 'artifact-store',
125
+ 'artifact-store-web-biome-remotes',
126
+ ]);
127
+ exports.SHARED_BIOMES_DATABASE = 'xema_biomes';
128
+ //# sourceMappingURL=infra-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-catalog.js","sourceRoot":"","sources":["../../../src/runtime/infra/infra-catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { InfraMode, type InfraComponent, type InfraComponentConfig, type XemaConfig } from '../config/schema';
2
+ export interface ResolvedInfraComponent {
3
+ readonly component: InfraComponent;
4
+ readonly mode: InfraMode;
5
+ readonly url?: string;
6
+ readonly config: InfraComponentConfig;
7
+ }
8
+ export interface InfraPlan {
9
+ readonly managed: readonly ResolvedInfraComponent[];
10
+ readonly external: readonly ResolvedInfraComponent[];
11
+ readonly disabled: readonly ResolvedInfraComponent[];
12
+ readonly byComponent: ReadonlyMap<InfraComponent, ResolvedInfraComponent>;
13
+ readonly warnings: readonly string[];
14
+ }
15
+ export declare function resolveInfraPlan(config: XemaConfig): InfraPlan;
16
+ //# sourceMappingURL=infra-plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-plan.d.ts","sourceRoot":"","sources":["../../../src/runtime/infra/infra-plan.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAC;AAgB1B,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAEzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACpD,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACrD,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,cAAc,EAAE,sBAAsB,CAAC,CAAC;IAC1E,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;CACtC;AAID,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAgD9D"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveInfraPlan = resolveInfraPlan;
4
+ const infra_catalog_1 = require("./infra-catalog");
5
+ const schema_1 = require("../config/schema");
6
+ const DEFAULT_MODE = schema_1.InfraMode.Managed;
7
+ function resolveInfraPlan(config) {
8
+ const managed = [];
9
+ const external = [];
10
+ const disabled = [];
11
+ const byComponent = new Map();
12
+ const warnings = [];
13
+ for (const component of infra_catalog_1.INFRA_COMPONENTS) {
14
+ const raw = config.infra[component] ?? { mode: DEFAULT_MODE };
15
+ const catalog = infra_catalog_1.INFRA_CATALOG[component];
16
+ if (raw.mode === schema_1.InfraMode.Disabled) {
17
+ if (catalog.mandatory) {
18
+ throw new Error(`Infra component "${component}" is mandatory and cannot be disabled — ` +
19
+ `every Xema service depends on it. Set it to "managed" or "external".`);
20
+ }
21
+ const resolved = { component, mode: raw.mode, config: raw };
22
+ disabled.push(resolved);
23
+ byComponent.set(component, resolved);
24
+ warnings.push(`infra.${component} is disabled — capabilities that require it will be unavailable; ` +
25
+ `services that hard-depend on it will fail-fast at boot.`);
26
+ continue;
27
+ }
28
+ if (raw.mode === schema_1.InfraMode.External) {
29
+ if (!raw.url) {
30
+ throw new Error(`Infra component "${component}" is "external" but has no "url". Provide the ` +
31
+ `pre-provisioned endpoint so the launcher can inject it into consumers.`);
32
+ }
33
+ const resolved = { component, mode: raw.mode, url: raw.url, config: raw };
34
+ external.push(resolved);
35
+ byComponent.set(component, resolved);
36
+ continue;
37
+ }
38
+ const resolved = { component, mode: schema_1.InfraMode.Managed, config: raw };
39
+ managed.push(resolved);
40
+ byComponent.set(component, resolved);
41
+ }
42
+ return { managed, external, disabled, byComponent, warnings };
43
+ }
44
+ //# sourceMappingURL=infra-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-plan.js","sourceRoot":"","sources":["../../../src/runtime/infra/infra-plan.ts"],"names":[],"mappings":";;AAwCA,4CAgDC;AAxFD,mDAAkE;AAClE,6CAK0B;AAgC1B,MAAM,YAAY,GAAG,kBAAS,CAAC,OAAO,CAAC;AAEvC,SAAgB,gBAAgB,CAAC,MAAkB;IACjD,MAAM,OAAO,GAA6B,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0C,CAAC;IACtE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,SAAS,IAAI,gCAAgB,EAAE,CAAC;QACzC,MAAM,GAAG,GAAyB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;QACpF,MAAM,OAAO,GAAG,6BAAa,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAS,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CACb,oBAAoB,SAAS,0CAA0C;oBACrE,sEAAsE,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACpF,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACrC,QAAQ,CAAC,IAAI,CACX,SAAS,SAAS,mEAAmE;gBACnF,yDAAyD,CAC5D,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAS,CAAC,QAAQ,EAAE,CAAC;YACpC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,oBAAoB,SAAS,gDAAgD;oBAC3E,wEAAwE,CAC3E,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YAClG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QAGD,MAAM,QAAQ,GAA2B,EAAE,SAAS,EAAE,IAAI,EAAE,kBAAS,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;AAChE,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { InfraComponent } from '../config/schema';
2
+ import type { InfraPlan } from './infra-plan';
3
+ import type { RosterEntry } from '../roster';
4
+ export interface ManagedInfraHandle {
5
+ readonly component: InfraComponent;
6
+ readonly containerName: string;
7
+ }
8
+ export interface InfraRunnerOptions {
9
+ readonly network: string;
10
+ readonly bin?: string;
11
+ readonly volumePrefix?: string;
12
+ readonly healthTimeoutMs?: number;
13
+ }
14
+ export declare class InfraRunner {
15
+ private readonly opts;
16
+ private readonly docker;
17
+ private readonly volumePrefix;
18
+ constructor(opts: InfraRunnerOptions);
19
+ bringUp(plan: InfraPlan): Promise<ManagedInfraHandle[]>;
20
+ waitHealthy(plan: InfraPlan): Promise<void>;
21
+ bootstrap(plan: InfraPlan, roster: readonly RosterEntry[]): Promise<void>;
22
+ private bootstrapPostgres;
23
+ private bootstrapObjectStore;
24
+ private execOk;
25
+ }
26
+ //# sourceMappingURL=infra-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-runner.d.ts","sourceRoot":"","sources":["../../../src/runtime/infra/infra-runner.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAgB7C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAE/B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAKD,qBAAa,WAAW;IAIV,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAET,IAAI,EAAE,kBAAkB;IAK/C,OAAO,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;IAkCvD,WAAW,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B3C,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;YAcjE,iBAAiB;YAyBjB,oBAAoB;YAkBpB,MAAM;CAQrB"}
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InfraRunner = void 0;
4
+ const infra_catalog_1 = require("./infra-catalog");
5
+ const schema_1 = require("../config/schema");
6
+ const docker_cli_1 = require("../runner/docker-cli");
7
+ const DEFAULT_HEALTH_TIMEOUT_MS = 60_000;
8
+ const HEALTH_INTERVAL_MS = 1_000;
9
+ class InfraRunner {
10
+ opts;
11
+ docker;
12
+ volumePrefix;
13
+ constructor(opts) {
14
+ this.opts = opts;
15
+ this.docker = new docker_cli_1.DockerCli(opts.bin ?? 'docker');
16
+ this.volumePrefix = opts.volumePrefix ?? 'xema';
17
+ }
18
+ async bringUp(plan) {
19
+ await this.docker.ensureNetwork(this.opts.network);
20
+ const handles = [];
21
+ for (const resolved of plan.managed) {
22
+ const spec = infra_catalog_1.INFRA_CATALOG[resolved.component].managed;
23
+ await this.docker.runQuiet(['rm', '-f', spec.containerName]);
24
+ const args = [
25
+ 'run',
26
+ '-d',
27
+ '--name',
28
+ spec.containerName,
29
+ '--label',
30
+ `${docker_cli_1.LAUNCHER_LABEL}=infra`,
31
+ '--network',
32
+ this.opts.network,
33
+ '--restart',
34
+ 'unless-stopped',
35
+ ];
36
+ for (const [hostPort, containerPort] of spec.ports) {
37
+ args.push('-p', `${String(hostPort)}:${String(containerPort)}`);
38
+ }
39
+ if (spec.dataPath) {
40
+ args.push('-v', `${this.volumePrefix}-${resolved.component}-data:${spec.dataPath}`);
41
+ }
42
+ args.push(spec.image);
43
+ await this.docker.run(args);
44
+ handles.push({ component: resolved.component, containerName: spec.containerName });
45
+ }
46
+ return handles;
47
+ }
48
+ async waitHealthy(plan) {
49
+ const timeout = this.opts.healthTimeoutMs ?? DEFAULT_HEALTH_TIMEOUT_MS;
50
+ for (const resolved of plan.managed) {
51
+ const spec = infra_catalog_1.INFRA_CATALOG[resolved.component].managed;
52
+ if (!spec.healthCmd) {
53
+ continue;
54
+ }
55
+ const deadline = Date.now() + timeout;
56
+ for (;;) {
57
+ if (await this.execOk(spec.containerName, spec.healthCmd)) {
58
+ break;
59
+ }
60
+ if (Date.now() >= deadline) {
61
+ throw new Error(`infra component ${resolved.component} did not become healthy within ${String(timeout)}ms`);
62
+ }
63
+ await delay(HEALTH_INTERVAL_MS);
64
+ }
65
+ }
66
+ }
67
+ async bootstrap(plan, roster) {
68
+ if (plan.byComponent.get(schema_1.InfraComponent.Postgres)?.mode === undefined) {
69
+ return;
70
+ }
71
+ const pgManaged = plan.managed.some((m) => m.component === schema_1.InfraComponent.Postgres);
72
+ if (pgManaged) {
73
+ await this.bootstrapPostgres(roster);
74
+ }
75
+ const minioManaged = plan.managed.some((m) => m.component === schema_1.InfraComponent.ObjectStore);
76
+ if (minioManaged) {
77
+ await this.bootstrapObjectStore();
78
+ }
79
+ }
80
+ async bootstrapPostgres(roster) {
81
+ const pg = infra_catalog_1.INFRA_CATALOG[schema_1.InfraComponent.Postgres].managed.containerName;
82
+ const databases = new Set([infra_catalog_1.SHARED_BIOMES_DATABASE]);
83
+ for (const entry of roster) {
84
+ databases.add(`${entry.name.replace(/-/g, '_')}_db`);
85
+ }
86
+ for (const db of databases) {
87
+ const out = await this.docker.runQuiet([
88
+ 'exec',
89
+ pg,
90
+ 'psql',
91
+ '-U',
92
+ 'postgres',
93
+ '-tc',
94
+ `SELECT 1 FROM pg_database WHERE datname='${db}'`,
95
+ ]);
96
+ if (out.trim() === '1') {
97
+ continue;
98
+ }
99
+ await this.docker.runQuiet(['exec', pg, 'createdb', '-U', 'postgres', db]);
100
+ }
101
+ }
102
+ async bootstrapObjectStore() {
103
+ const minio = infra_catalog_1.INFRA_CATALOG[schema_1.InfraComponent.ObjectStore].managed.containerName;
104
+ await this.docker.runQuiet([
105
+ 'exec',
106
+ minio,
107
+ 'mc',
108
+ 'alias',
109
+ 'set',
110
+ 'local',
111
+ 'http://localhost:9000',
112
+ 'minioadmin',
113
+ 'minioadmin',
114
+ ]);
115
+ for (const bucket of infra_catalog_1.OBJECT_STORE_BUCKETS) {
116
+ await this.docker.runQuiet(['exec', minio, 'mc', 'mb', '-p', `local/${bucket}`]);
117
+ }
118
+ }
119
+ async execOk(container, cmd) {
120
+ try {
121
+ await this.docker.run(['exec', container, 'sh', '-c', cmd]);
122
+ return true;
123
+ }
124
+ catch {
125
+ return false;
126
+ }
127
+ }
128
+ }
129
+ exports.InfraRunner = InfraRunner;
130
+ function delay(ms) {
131
+ return new Promise((resolve) => {
132
+ setTimeout(resolve, ms);
133
+ });
134
+ }
135
+ //# sourceMappingURL=infra-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra-runner.js","sourceRoot":"","sources":["../../../src/runtime/infra/infra-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { type XemaConfig } from './config/schema';
2
+ import { type RosterEntry, type RosterInclude, type RosterSelection } from './roster';
3
+ import { type BringUpResult, type LifecycleEvent } from './supervisor';
4
+ export interface LaunchOptions {
5
+ readonly config: XemaConfig;
6
+ readonly includeWeb: boolean;
7
+ readonly lockPathOverride?: string | undefined;
8
+ readonly bootGraphPathOverride?: string | undefined;
9
+ readonly onEvent?: (event: LifecycleEvent) => void;
10
+ readonly log?: (line: string) => void;
11
+ }
12
+ export interface LaunchHandle {
13
+ readonly result: BringUpResult;
14
+ readonly roster: readonly RosterEntry[];
15
+ shutdown(): Promise<void>;
16
+ }
17
+ export declare function launch(opts: LaunchOptions): Promise<LaunchHandle>;
18
+ export declare function buildSelection(config: XemaConfig, includeWeb: boolean): RosterSelection;
19
+ export declare function normalizeInclude(include: 'all' | readonly string[], features: readonly string[]): RosterInclude;
20
+ export declare function splitIncludeTokens(tokens: readonly string[]): {
21
+ tiers: string[];
22
+ services: string[];
23
+ };
24
+ //# sourceMappingURL=launch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../src/runtime/launch.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAK7D,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AAIlB,OAAO,EAAc,KAAK,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAYnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,CAAC;IACnD,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IACxC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAOD,wBAAsB,MAAM,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAyEvE;AAaD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,GAAG,eAAe,CAQvF;AAYD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,KAAK,GAAG,SAAS,MAAM,EAAE,EAClC,QAAQ,EAAE,SAAS,MAAM,EAAE,GAC1B,aAAa,CAMf;AAGD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG;IAC7D,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAWA"}
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.launch = launch;
4
+ exports.buildSelection = buildSelection;
5
+ exports.normalizeInclude = normalizeInclude;
6
+ exports.splitIncludeTokens = splitIncludeTokens;
7
+ const boot_graph_loader_1 = require("./boot-graph-loader");
8
+ const schema_1 = require("./config/schema");
9
+ const infra_plan_1 = require("./infra/infra-plan");
10
+ const infra_runner_1 = require("./infra/infra-runner");
11
+ const lock_loader_1 = require("./lock-loader");
12
+ const port_map_1 = require("./port-map");
13
+ const roster_1 = require("./roster");
14
+ const container_runner_1 = require("./runner/container-runner");
15
+ const helm_runner_1 = require("./runner/helm-runner");
16
+ const native_runner_1 = require("./runner/native-runner");
17
+ const supervisor_1 = require("./supervisor");
18
+ const unit_type_1 = require("./unit-type");
19
+ const waves_1 = require("./waves");
20
+ const KNOWN_TIERS = new Set(['kernel', 'system', 'base', 'platform', 'edge']);
21
+ const NETWORK = 'xema';
22
+ const CONTAINER_PORT = 3000;
23
+ async function launch(opts) {
24
+ const { config } = opts;
25
+ const log = opts.log ?? (() => undefined);
26
+ const substrate = config.app.substrate;
27
+ const infra = (0, infra_plan_1.resolveInfraPlan)(config);
28
+ for (const warning of infra.warnings) {
29
+ log(`WARN ${warning}`);
30
+ }
31
+ const { lock, resolution: lockRes } = (0, lock_loader_1.loadDistributionLock)({
32
+ edition: config.edition,
33
+ explicit: opts.lockPathOverride,
34
+ envVar: process.env.XEMA_DISTRIBUTION_LOCK_PATH,
35
+ });
36
+ log(`lock : ${lockRes.path} (${lockRes.source})`);
37
+ const usesImages = substrate === schema_1.Substrate.Container || substrate === schema_1.Substrate.Helm;
38
+ let imagesByBiome;
39
+ if (usesImages) {
40
+ imagesByBiome = (0, lock_loader_1.loadImageLock)({ edition: config.edition }).imagesByBiome;
41
+ }
42
+ const bootGraph = (0, boot_graph_loader_1.loadBootGraph)({ explicit: opts.bootGraphPathOverride, envVar: process.env.XEMA_BOOT_GRAPH_PATH });
43
+ const selection = buildSelection(config, opts.includeWeb);
44
+ const roster = (0, roster_1.resolveRoster)(lock, selection, imagesByBiome);
45
+ const waves = (0, waves_1.deriveWaves)(roster, bootGraph);
46
+ const violations = (0, waves_1.findWaveOrderViolations)(waves, bootGraph);
47
+ if (violations.length > 0) {
48
+ throw new Error(`Boot-graph invariant violated (a service hard-requires a same/later-wave peer):\n` +
49
+ violations.map((v) => ` ${v.service} (${v.serviceTier}) → ${v.requires} (${v.requiresTier})`).join('\n'));
50
+ }
51
+ if (substrate === schema_1.Substrate.Container && infra.managed.length > 0) {
52
+ log(`infra : bringing up ${infra.managed.map((m) => m.component).join(', ')}`);
53
+ const infraRunner = new infra_runner_1.InfraRunner({ network: NETWORK });
54
+ await infraRunner.bringUp(infra);
55
+ await infraRunner.waitHealthy(infra);
56
+ await infraRunner.bootstrap(infra, roster);
57
+ log('infra : healthy + bootstrapped (per-service databases, object-store buckets)');
58
+ }
59
+ const ports = (0, port_map_1.assignPorts)(roster);
60
+ const runner = selectRunner(substrate);
61
+ const supervisor = new supervisor_1.Supervisor({
62
+ roster,
63
+ waves,
64
+ runner,
65
+ config,
66
+ infra,
67
+ substrate,
68
+ ports,
69
+ containerPort: CONTAINER_PORT,
70
+ ...(opts.onEvent ? { onEvent: opts.onEvent } : {}),
71
+ });
72
+ const result = await supervisor.bringUp();
73
+ return {
74
+ result,
75
+ roster,
76
+ shutdown: () => supervisor.shutdown(),
77
+ };
78
+ }
79
+ function selectRunner(substrate) {
80
+ if (substrate === schema_1.Substrate.Container) {
81
+ return new container_runner_1.ContainerRunner({ network: NETWORK, containerPort: CONTAINER_PORT });
82
+ }
83
+ if (substrate === schema_1.Substrate.Helm) {
84
+ return new helm_runner_1.HelmRunner();
85
+ }
86
+ return new native_runner_1.NativeRunner();
87
+ }
88
+ function buildSelection(config, includeWeb) {
89
+ const include = normalizeInclude(config.app.include, config.app.features);
90
+ const exclude = [...config.app.exclude];
91
+ if (!includeWeb && !exclude.includes(unit_type_1.WEB_SERVICE_NAME)) {
92
+ exclude.push(unit_type_1.WEB_SERVICE_NAME);
93
+ }
94
+ return { include, exclude };
95
+ }
96
+ function normalizeInclude(include, features) {
97
+ if (include === 'all') {
98
+ return 'all';
99
+ }
100
+ const tokens = Array.from(new Set([...include, ...features]));
101
+ return splitIncludeTokens(tokens);
102
+ }
103
+ function splitIncludeTokens(tokens) {
104
+ const tiers = [];
105
+ const services = [];
106
+ for (const token of tokens) {
107
+ if (KNOWN_TIERS.has(token)) {
108
+ tiers.push(token);
109
+ }
110
+ else {
111
+ services.push(token);
112
+ }
113
+ }
114
+ return { tiers, services };
115
+ }
116
+ //# sourceMappingURL=launch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launch.js","sourceRoot":"","sources":["../../src/runtime/launch.ts"],"names":[],"mappings":"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"}
@@ -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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"}