4runr-os 2.10.71 → 2.10.73

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.
@@ -1,208 +1,208 @@
1
- /**
2
- * Persist operator Sentinel limits to disk (survives Gateway restart).
3
- * File: {4Runr data dir}/config/sentinel-limits.json
4
- *
5
- * Boot order: env defaults (packages/sentinel) → overlay saved file when present.
6
- * Explicit env vars for a field are not overwritten by the saved file.
7
- */
8
-
9
- import * as fs from 'fs';
10
- import * as path from 'path';
11
- import { get4RunrConfigDir } from '@4runr/shared';
12
- import { Sentinel, type SentinelConfig } from '@4runr/sentinel';
13
-
14
- const FILE_NAME = 'sentinel-limits.json';
15
-
16
- const ENV_FIELD_KEYS: Array<{
17
- field: keyof SentinelConfig;
18
- envKeys: string[];
19
- }> = [
20
- { field: 'enabled', envKeys: ['SENTINEL_ENABLED'] },
21
- { field: 'runMaxDurationMs', envKeys: ['RUN_MAX_DURATION_MS'] },
22
- { field: 'runMaxTokens', envKeys: ['RUN_MAX_TOKENS'] },
23
- { field: 'runIdleMs', envKeys: ['SENTINEL_IDLE_MS', 'RUN_IDLE_MS'] },
24
- { field: 'loopWindow', envKeys: ['SENTINEL_LOOP_WINDOW'] },
25
- { field: 'loopMax', envKeys: ['SENTINEL_LOOP_MAX'] },
26
- { field: 'runMaxCost', envKeys: ['RUN_MAX_COST', 'SENTINEL_MAX_COST'] },
27
- ];
28
-
29
- export function getSentinelLimitsFilePath(): string {
30
- return path.join(get4RunrConfigDir(), FILE_NAME);
31
- }
32
-
33
- function envDefinesField(field: keyof SentinelConfig): boolean {
34
- const entry = ENV_FIELD_KEYS.find((e) => e.field === field);
35
- if (!entry) return false;
36
- return entry.envKeys.some((k) => {
37
- const v = process.env[k];
38
- return v !== undefined && v.trim() !== '';
39
- });
40
- }
41
-
42
- function parseSavedPayload(raw: unknown): SentinelConfig | null {
43
- if (!raw || typeof raw !== 'object') return null;
44
- const o = raw as Record<string, unknown>;
45
- const num = (key: string): number | undefined => {
46
- const v = o[key];
47
- if (typeof v === 'number' && Number.isFinite(v)) return v;
48
- return undefined;
49
- };
50
- const enabled = o['enabled'];
51
- if (typeof enabled !== 'boolean') return null;
52
- const runMaxDurationMs = num('runMaxDurationMs');
53
- const runMaxTokens = num('runMaxTokens');
54
- const runIdleMs = num('runIdleMs');
55
- const loopWindow = num('loopWindow');
56
- const loopMax = num('loopMax');
57
- if (
58
- runMaxDurationMs === undefined ||
59
- runMaxTokens === undefined ||
60
- runIdleMs === undefined ||
61
- loopWindow === undefined ||
62
- loopMax === undefined
63
- ) {
64
- return null;
65
- }
66
- const runMaxCost = num('runMaxCost');
67
- return {
68
- enabled,
69
- runMaxDurationMs,
70
- runMaxTokens,
71
- runIdleMs,
72
- loopWindow,
73
- loopMax,
74
- ...(runMaxCost !== undefined ? { runMaxCost } : {}),
75
- };
76
- }
77
-
78
- export function loadSentinelLimitsFromDisk(): SentinelConfig | null {
79
- const filePath = getSentinelLimitsFilePath();
80
- try {
81
- if (!fs.existsSync(filePath)) return null;
82
- const text = fs.readFileSync(filePath, 'utf8');
83
- const parsed = JSON.parse(text) as unknown;
84
- const inner =
85
- parsed && typeof parsed === 'object' && 'config' in (parsed as object)
86
- ? (parsed as { config: unknown }).config
87
- : parsed;
88
- return parseSavedPayload(inner);
89
- } catch {
90
- return null;
91
- }
92
- }
93
-
94
- export function saveSentinelLimitsToDisk(config: SentinelConfig): void {
95
- const filePath = getSentinelLimitsFilePath();
96
- const payload = {
97
- version: 1,
98
- updatedAt: new Date().toISOString(),
99
- config: {
100
- enabled: config.enabled,
101
- runMaxDurationMs: config.runMaxDurationMs,
102
- runMaxTokens: config.runMaxTokens,
103
- runIdleMs: config.runIdleMs,
104
- loopWindow: config.loopWindow,
105
- loopMax: config.loopMax,
106
- runMaxCost: config.runMaxCost ?? 1.0,
107
- },
108
- };
109
- fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });
110
- }
111
-
112
- /** Merge saved limits from disk into the live Sentinel singleton (env wins per field). */
113
- export function mergePersistedSentinelConfig(sentinel: Sentinel): boolean {
114
- const saved = loadSentinelLimitsFromDisk();
115
- if (!saved) return false;
116
-
117
- const current = sentinel.getConfig();
118
- const merged: SentinelConfig = { ...current };
119
-
120
- for (const { field } of ENV_FIELD_KEYS) {
121
- if (envDefinesField(field)) continue;
122
- (merged as any)[field] = saved[field];
123
- }
124
-
125
- try {
126
- sentinel.updateConfig(merged);
127
- return true;
128
- } catch {
129
- return false;
130
- }
131
- }
132
-
133
- /**
134
- * Apply saved limits on Gateway boot. Env-defined fields keep env values.
135
- */
136
- export function applyPersistedSentinelConfig(sentinel: Sentinel, logger?: {
137
- info: (msg: string, meta?: Record<string, unknown>) => void;
138
- warn: (msg: string, meta?: Record<string, unknown>) => void;
139
- }): boolean {
140
- const filePath = getSentinelLimitsFilePath();
141
- const saved = loadSentinelLimitsFromDisk();
142
-
143
- if (!saved) {
144
- logger?.info('No Sentinel limits file found on disk (will use env defaults)', {
145
- expectedPath: filePath,
146
- });
147
- return false;
148
- }
149
-
150
- // Check which env vars are set and will override the disk values
151
- const envOverrides: string[] = [];
152
- const diskApplied: string[] = [];
153
-
154
- for (const { field, envKeys } of ENV_FIELD_KEYS) {
155
- if (envDefinesField(field)) {
156
- const activeEnv = envKeys.find(k => process.env[k] !== undefined && process.env[k]?.trim() !== '');
157
- if (activeEnv) {
158
- envOverrides.push(`${field} (via ${activeEnv}=${process.env[activeEnv]})`);
159
- }
160
- } else {
161
- diskApplied.push(`${field}=${saved[field]}`);
162
- }
163
- }
164
-
165
- const ok = mergePersistedSentinelConfig(sentinel);
166
-
167
- if (ok) {
168
- const finalConfig = sentinel.getConfig();
169
- logger?.info('✅ Sentinel limits loaded from disk and merged', {
170
- diskPath: filePath,
171
- diskValues: saved,
172
- envOverrides: envOverrides.length > 0 ? envOverrides : 'none',
173
- diskAppliedFields: diskApplied.length > 0 ? diskApplied : 'none (all env-overridden)',
174
- finalActiveConfig: finalConfig,
175
- });
176
- } else {
177
- logger?.warn('Failed to apply Sentinel limits from disk', {
178
- diskPath: filePath,
179
- savedConfig: saved,
180
- });
181
- }
182
-
183
- return ok;
184
- }
185
-
186
- /** Call before returning policy config to clients so long-lived Gateway picks up disk saves. */
187
- export function hydrateSentinelConfigFromDisk(sentinel: Sentinel): void {
188
- mergePersistedSentinelConfig(sentinel);
189
- }
190
-
191
- export function persistSentinelConfigAfterApply(
192
- sentinel: Sentinel,
193
- config: SentinelConfig,
194
- logger?: {
195
- info: (msg: string, meta?: Record<string, unknown>) => void;
196
- }
197
- ): string {
198
- const filePath = getSentinelLimitsFilePath();
199
- saveSentinelLimitsToDisk(config);
200
-
201
- logger?.info('✅ Sentinel limits saved to disk', {
202
- path: filePath,
203
- config: config,
204
- note: 'Survives Gateway restart. Env vars in docker-compose override individual fields when set.',
205
- });
206
-
207
- return filePath;
208
- }
1
+ /**
2
+ * Persist operator Sentinel limits to disk (survives Gateway restart).
3
+ * File: {4Runr data dir}/config/sentinel-limits.json
4
+ *
5
+ * Boot order: env defaults (packages/sentinel) → overlay saved file when present.
6
+ * Explicit env vars for a field are not overwritten by the saved file.
7
+ */
8
+
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { get4RunrConfigDir } from '@4runr/shared';
12
+ import { Sentinel, type SentinelConfig } from '@4runr/sentinel';
13
+
14
+ const FILE_NAME = 'sentinel-limits.json';
15
+
16
+ const ENV_FIELD_KEYS: Array<{
17
+ field: keyof SentinelConfig;
18
+ envKeys: string[];
19
+ }> = [
20
+ { field: 'enabled', envKeys: ['SENTINEL_ENABLED'] },
21
+ { field: 'runMaxDurationMs', envKeys: ['RUN_MAX_DURATION_MS'] },
22
+ { field: 'runMaxTokens', envKeys: ['RUN_MAX_TOKENS'] },
23
+ { field: 'runIdleMs', envKeys: ['SENTINEL_IDLE_MS', 'RUN_IDLE_MS'] },
24
+ { field: 'loopWindow', envKeys: ['SENTINEL_LOOP_WINDOW'] },
25
+ { field: 'loopMax', envKeys: ['SENTINEL_LOOP_MAX'] },
26
+ { field: 'runMaxCost', envKeys: ['RUN_MAX_COST', 'SENTINEL_MAX_COST'] },
27
+ ];
28
+
29
+ export function getSentinelLimitsFilePath(): string {
30
+ return path.join(get4RunrConfigDir(), FILE_NAME);
31
+ }
32
+
33
+ function envDefinesField(field: keyof SentinelConfig): boolean {
34
+ const entry = ENV_FIELD_KEYS.find((e) => e.field === field);
35
+ if (!entry) return false;
36
+ return entry.envKeys.some((k) => {
37
+ const v = process.env[k];
38
+ return v !== undefined && v.trim() !== '';
39
+ });
40
+ }
41
+
42
+ function parseSavedPayload(raw: unknown): SentinelConfig | null {
43
+ if (!raw || typeof raw !== 'object') return null;
44
+ const o = raw as Record<string, unknown>;
45
+ const num = (key: string): number | undefined => {
46
+ const v = o[key];
47
+ if (typeof v === 'number' && Number.isFinite(v)) return v;
48
+ return undefined;
49
+ };
50
+ const enabled = o['enabled'];
51
+ if (typeof enabled !== 'boolean') return null;
52
+ const runMaxDurationMs = num('runMaxDurationMs');
53
+ const runMaxTokens = num('runMaxTokens');
54
+ const runIdleMs = num('runIdleMs');
55
+ const loopWindow = num('loopWindow');
56
+ const loopMax = num('loopMax');
57
+ if (
58
+ runMaxDurationMs === undefined ||
59
+ runMaxTokens === undefined ||
60
+ runIdleMs === undefined ||
61
+ loopWindow === undefined ||
62
+ loopMax === undefined
63
+ ) {
64
+ return null;
65
+ }
66
+ const runMaxCost = num('runMaxCost');
67
+ return {
68
+ enabled,
69
+ runMaxDurationMs,
70
+ runMaxTokens,
71
+ runIdleMs,
72
+ loopWindow,
73
+ loopMax,
74
+ ...(runMaxCost !== undefined ? { runMaxCost } : {}),
75
+ };
76
+ }
77
+
78
+ export function loadSentinelLimitsFromDisk(): SentinelConfig | null {
79
+ const filePath = getSentinelLimitsFilePath();
80
+ try {
81
+ if (!fs.existsSync(filePath)) return null;
82
+ const text = fs.readFileSync(filePath, 'utf8');
83
+ const parsed = JSON.parse(text) as unknown;
84
+ const inner =
85
+ parsed && typeof parsed === 'object' && 'config' in (parsed as object)
86
+ ? (parsed as { config: unknown }).config
87
+ : parsed;
88
+ return parseSavedPayload(inner);
89
+ } catch {
90
+ return null;
91
+ }
92
+ }
93
+
94
+ export function saveSentinelLimitsToDisk(config: SentinelConfig): void {
95
+ const filePath = getSentinelLimitsFilePath();
96
+ const payload = {
97
+ version: 1,
98
+ updatedAt: new Date().toISOString(),
99
+ config: {
100
+ enabled: config.enabled,
101
+ runMaxDurationMs: config.runMaxDurationMs,
102
+ runMaxTokens: config.runMaxTokens,
103
+ runIdleMs: config.runIdleMs,
104
+ loopWindow: config.loopWindow,
105
+ loopMax: config.loopMax,
106
+ runMaxCost: config.runMaxCost ?? 1.0,
107
+ },
108
+ };
109
+ fs.writeFileSync(filePath, JSON.stringify(payload, null, 2), { mode: 0o600 });
110
+ }
111
+
112
+ /** Merge saved limits from disk into the live Sentinel singleton (env wins per field). */
113
+ export function mergePersistedSentinelConfig(sentinel: Sentinel): boolean {
114
+ const saved = loadSentinelLimitsFromDisk();
115
+ if (!saved) return false;
116
+
117
+ const current = sentinel.getConfig();
118
+ const merged: SentinelConfig = { ...current };
119
+
120
+ for (const { field } of ENV_FIELD_KEYS) {
121
+ if (envDefinesField(field)) continue;
122
+ (merged as any)[field] = saved[field];
123
+ }
124
+
125
+ try {
126
+ sentinel.updateConfig(merged);
127
+ return true;
128
+ } catch {
129
+ return false;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * Apply saved limits on Gateway boot. Env-defined fields keep env values.
135
+ */
136
+ export function applyPersistedSentinelConfig(sentinel: Sentinel, logger?: {
137
+ info: (msg: string, meta?: Record<string, unknown>) => void;
138
+ warn: (msg: string, meta?: Record<string, unknown>) => void;
139
+ }): boolean {
140
+ const filePath = getSentinelLimitsFilePath();
141
+ const saved = loadSentinelLimitsFromDisk();
142
+
143
+ if (!saved) {
144
+ logger?.info('No Sentinel limits file found on disk (will use env defaults)', {
145
+ expectedPath: filePath,
146
+ });
147
+ return false;
148
+ }
149
+
150
+ // Check which env vars are set and will override the disk values
151
+ const envOverrides: string[] = [];
152
+ const diskApplied: string[] = [];
153
+
154
+ for (const { field, envKeys } of ENV_FIELD_KEYS) {
155
+ if (envDefinesField(field)) {
156
+ const activeEnv = envKeys.find(k => process.env[k] !== undefined && process.env[k]?.trim() !== '');
157
+ if (activeEnv) {
158
+ envOverrides.push(`${field} (via ${activeEnv}=${process.env[activeEnv]})`);
159
+ }
160
+ } else {
161
+ diskApplied.push(`${field}=${saved[field]}`);
162
+ }
163
+ }
164
+
165
+ const ok = mergePersistedSentinelConfig(sentinel);
166
+
167
+ if (ok) {
168
+ const finalConfig = sentinel.getConfig();
169
+ logger?.info('✅ Sentinel limits loaded from disk and merged', {
170
+ diskPath: filePath,
171
+ diskValues: saved,
172
+ envOverrides: envOverrides.length > 0 ? envOverrides : 'none',
173
+ diskAppliedFields: diskApplied.length > 0 ? diskApplied : 'none (all env-overridden)',
174
+ finalActiveConfig: finalConfig,
175
+ });
176
+ } else {
177
+ logger?.warn('Failed to apply Sentinel limits from disk', {
178
+ diskPath: filePath,
179
+ savedConfig: saved,
180
+ });
181
+ }
182
+
183
+ return ok;
184
+ }
185
+
186
+ /** Call before returning policy config to clients so long-lived Gateway picks up disk saves. */
187
+ export function hydrateSentinelConfigFromDisk(sentinel: Sentinel): void {
188
+ mergePersistedSentinelConfig(sentinel);
189
+ }
190
+
191
+ export function persistSentinelConfigAfterApply(
192
+ sentinel: Sentinel,
193
+ config: SentinelConfig,
194
+ logger?: {
195
+ info: (msg: string, meta?: Record<string, unknown>) => void;
196
+ }
197
+ ): string {
198
+ const filePath = getSentinelLimitsFilePath();
199
+ saveSentinelLimitsToDisk(config);
200
+
201
+ logger?.info('✅ Sentinel limits saved to disk', {
202
+ path: filePath,
203
+ config: config,
204
+ note: 'Survives Gateway restart. Env vars in docker-compose override individual fields when set.',
205
+ });
206
+
207
+ return filePath;
208
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"boot-orchestrator.d.ts","sourceRoot":"","sources":["../src/boot-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAkB;;IAOnC,OAAO,CAAC,eAAe;IAwCvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,UAAU;IAsBlB;;OAEG;YACW,YAAY;IAmC1B;;OAEG;YACW,qBAAqB;IAiBnC;;;;;OAKG;YACW,WAAW;IA4EzB;;OAEG;YACW,WAAW;IAezB;;OAEG;YACW,kBAAkB;IAqBhC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;CAiClC;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,UAAU,CAAC,CAGnE"}
1
+ {"version":3,"file":"boot-orchestrator.d.ts","sourceRoot":"","sources":["../src/boot-orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,UAAU,QAAQ;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,CAAC;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,UAAU;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,SAAS,CAAkB;;IAOnC,OAAO,CAAC,eAAe;IAwCvB;;;OAGG;IACH,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,UAAU;IAsBlB;;OAEG;YACW,YAAY;IAmC1B;;OAEG;YACW,qBAAqB;IAiBnC;;;;;OAKG;YACW,WAAW;IAoFzB;;OAEG;YACW,WAAW;IAezB;;OAEG;YACW,kBAAkB;IAqBhC;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC;CAiClC;AAED,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,UAAU,CAAC,CAGnE"}
@@ -167,6 +167,11 @@ export class BootOrchestrator {
167
167
  this.updateStep('health', 'running');
168
168
  try {
169
169
  const packageRoot = path.join(__dirname, '..');
170
+ const { ensureGatewayPrismaReady, isGatewayPrismaReady } = await import('./gateway-prisma-bootstrap.js');
171
+ if (!isGatewayPrismaReady(packageRoot)) {
172
+ this.updateStep('health', 'running', 'Generating Gateway Prisma client...');
173
+ ensureGatewayPrismaReady(packageRoot);
174
+ }
170
175
  const execGlobalRoot = () => {
171
176
  try {
172
177
  return execSync('npm root -g', {
@@ -1 +1 @@
1
- {"version":3,"file":"boot-orchestrator.js","sourceRoot":"","sources":["../src/boot-orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"boot-orchestrator.js","sourceRoot":"","sources":["../src/boot-orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Ensure vendored Gateway has node_modules + generated Prisma client.
3
+ * prepublishOnly prunes apps/gateway/node_modules; postinstall restores for consumers,
4
+ * but linked/global installs from a dev tree need this at boot too.
5
+ */
6
+ export declare function isGatewayPrismaReady(packageRoot: string): boolean;
7
+ /**
8
+ * npm install (if needed) + prisma generate for the vendored Gateway bundle.
9
+ */
10
+ export declare function ensureGatewayPrismaReady(packageRoot: string): boolean;
11
+ //# sourceMappingURL=gateway-prisma-bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-prisma-bootstrap.d.ts","sourceRoot":"","sources":["../src/gateway-prisma-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEjE;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CA4CrE"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Ensure vendored Gateway has node_modules + generated Prisma client.
3
+ * prepublishOnly prunes apps/gateway/node_modules; postinstall restores for consumers,
4
+ * but linked/global installs from a dev tree need this at boot too.
5
+ */
6
+ import { execSync } from 'child_process';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ function shell() {
10
+ return process.platform === 'win32' ? process.env['COMSPEC'] || 'cmd.exe' : undefined;
11
+ }
12
+ function gatewayPrismaClientPath(packageRoot) {
13
+ return path.join(packageRoot, 'apps', 'gateway', 'node_modules', '.prisma', 'client');
14
+ }
15
+ function gatewayDistPath(packageRoot) {
16
+ return path.join(packageRoot, 'apps', 'gateway', 'dist', 'index.js');
17
+ }
18
+ export function isGatewayPrismaReady(packageRoot) {
19
+ return fs.existsSync(gatewayDistPath(packageRoot)) && fs.existsSync(gatewayPrismaClientPath(packageRoot));
20
+ }
21
+ /**
22
+ * npm install (if needed) + prisma generate for the vendored Gateway bundle.
23
+ */
24
+ export function ensureGatewayPrismaReady(packageRoot) {
25
+ if (isGatewayPrismaReady(packageRoot)) {
26
+ return true;
27
+ }
28
+ const gatewayDir = path.join(packageRoot, 'apps', 'gateway');
29
+ const packageJson = path.join(gatewayDir, 'package.json');
30
+ const schema = path.join(packageRoot, 'prisma', 'schema.prisma');
31
+ if (!fs.existsSync(packageJson) || !fs.existsSync(schema)) {
32
+ return false;
33
+ }
34
+ const sh = shell();
35
+ const execOpts = {
36
+ stdio: 'pipe',
37
+ windowsHide: true,
38
+ ...(sh ? { shell: sh } : {}),
39
+ };
40
+ const nodeModules = path.join(gatewayDir, 'node_modules');
41
+ if (!fs.existsSync(nodeModules) || fs.readdirSync(nodeModules).length === 0) {
42
+ try {
43
+ execSync('npm install --omit=dev --no-audit --no-fund --loglevel=error', {
44
+ ...execOpts,
45
+ cwd: gatewayDir,
46
+ timeout: 180000,
47
+ });
48
+ }
49
+ catch {
50
+ return false;
51
+ }
52
+ }
53
+ try {
54
+ execSync('npm run db:generate', {
55
+ ...execOpts,
56
+ cwd: gatewayDir,
57
+ timeout: 120000,
58
+ });
59
+ }
60
+ catch {
61
+ return false;
62
+ }
63
+ return isGatewayPrismaReady(packageRoot);
64
+ }
65
+ //# sourceMappingURL=gateway-prisma-bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-prisma-bootstrap.js","sourceRoot":"","sources":["../src/gateway-prisma-bootstrap.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACxF,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,eAAe,CAAC,WAAmB;IAC1C,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5G,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,IAAI,oBAAoB,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;IAEjE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;IACnB,MAAM,QAAQ,GAAG;QACf,KAAK,EAAE,MAAe;QACtB,WAAW,EAAE,IAAI;QACjB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7B,CAAC;IAEF,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5E,IAAI,CAAC;YACH,QAAQ,CAAC,8DAA8D,EAAE;gBACvE,GAAG,QAAQ;gBACX,GAAG,EAAE,UAAU;gBACf,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,QAAQ,CAAC,qBAAqB,EAAE;YAC9B,GAAG,QAAQ;YACX,GAAG,EAAE,UAAU;YACf,OAAO,EAAE,MAAM;SAChB,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC"}