opalserve 3.3.1 → 3.4.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 (49) hide show
  1. package/README.md +9 -6
  2. package/dist/cli/commands/doctor.d.ts.map +1 -1
  3. package/dist/cli/commands/doctor.js +39 -0
  4. package/dist/cli/commands/doctor.js.map +1 -1
  5. package/dist/cli/commands/drift.d.ts +2 -0
  6. package/dist/cli/commands/drift.d.ts.map +1 -0
  7. package/dist/cli/commands/drift.js +81 -0
  8. package/dist/cli/commands/drift.js.map +1 -0
  9. package/dist/cli/commands/graph.d.ts +8 -0
  10. package/dist/cli/commands/graph.d.ts.map +1 -0
  11. package/dist/cli/commands/graph.js +221 -0
  12. package/dist/cli/commands/graph.js.map +1 -0
  13. package/dist/cli/commands/start.d.ts.map +1 -1
  14. package/dist/cli/commands/start.js +15 -0
  15. package/dist/cli/commands/start.js.map +1 -1
  16. package/dist/cli/index.js +45 -0
  17. package/dist/cli/index.js.map +1 -1
  18. package/dist/config/defaults.d.ts +5 -0
  19. package/dist/config/defaults.d.ts.map +1 -1
  20. package/dist/config/defaults.js +15 -0
  21. package/dist/config/defaults.js.map +1 -1
  22. package/dist/constants.d.ts +1 -1
  23. package/dist/constants.js +1 -1
  24. package/dist/dashboard/assets/{icons-DciuKSzL.js → icons-BKTSOEel.js} +57 -27
  25. package/dist/dashboard/assets/index-DXqLuHqr.css +1 -0
  26. package/dist/dashboard/assets/index-DaHAEV48.js +33 -0
  27. package/dist/dashboard/index.html +3 -3
  28. package/dist/graph/config.d.ts +45 -0
  29. package/dist/graph/config.d.ts.map +1 -0
  30. package/dist/graph/config.js +81 -0
  31. package/dist/graph/config.js.map +1 -0
  32. package/dist/graph/python.d.ts +13 -0
  33. package/dist/graph/python.d.ts.map +1 -0
  34. package/dist/graph/python.js +68 -0
  35. package/dist/graph/python.js.map +1 -0
  36. package/dist/graph/sidecar.d.ts +28 -0
  37. package/dist/graph/sidecar.d.ts.map +1 -0
  38. package/dist/graph/sidecar.js +143 -0
  39. package/dist/graph/sidecar.js.map +1 -0
  40. package/dist/server/app.d.ts.map +1 -1
  41. package/dist/server/app.js +2 -0
  42. package/dist/server/app.js.map +1 -1
  43. package/dist/server/routes/drift.d.ts +5 -0
  44. package/dist/server/routes/drift.d.ts.map +1 -0
  45. package/dist/server/routes/drift.js +99 -0
  46. package/dist/server/routes/drift.js.map +1 -0
  47. package/package.json +14 -1
  48. package/dist/dashboard/assets/index-BrOv-3xx.css +0 -1
  49. package/dist/dashboard/assets/index-DnqqzxX6.js +0 -33
@@ -5,11 +5,11 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>OpalServe Dashboard</title>
7
7
  <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>&#x1F4A0;</text></svg>" />
8
- <script type="module" crossorigin src="/dashboard/assets/index-DnqqzxX6.js"></script>
8
+ <script type="module" crossorigin src="/dashboard/assets/index-DaHAEV48.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/dashboard/assets/react-BJczIp53.js">
10
- <link rel="modulepreload" crossorigin href="/dashboard/assets/icons-DciuKSzL.js">
10
+ <link rel="modulepreload" crossorigin href="/dashboard/assets/icons-BKTSOEel.js">
11
11
  <link rel="modulepreload" crossorigin href="/dashboard/assets/charts-CKTlvUso.js">
12
- <link rel="stylesheet" crossorigin href="/dashboard/assets/index-BrOv-3xx.css">
12
+ <link rel="stylesheet" crossorigin href="/dashboard/assets/index-DXqLuHqr.css">
13
13
  </head>
14
14
  <body class="bg-gray-950 text-gray-100">
15
15
  <div id="root"></div>
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod';
2
+ export declare const GraphProviderSchema: z.ZodEnum<["openai", "anthropic", "ollama", "none"]>;
3
+ export type GraphProvider = z.infer<typeof GraphProviderSchema>;
4
+ export declare const GraphConfigSchema: z.ZodObject<{
5
+ enabled: z.ZodDefault<z.ZodBoolean>;
6
+ provider: z.ZodDefault<z.ZodEnum<["openai", "anthropic", "ollama", "none"]>>;
7
+ model: z.ZodDefault<z.ZodString>;
8
+ apiKeyEnv: z.ZodDefault<z.ZodString>;
9
+ ollamaBaseUrl: z.ZodDefault<z.ZodString>;
10
+ dbPath: z.ZodDefault<z.ZodString>;
11
+ pythonBin: z.ZodDefault<z.ZodString>;
12
+ installedAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
13
+ lastEnabledAt: z.ZodDefault<z.ZodNullable<z.ZodString>>;
14
+ }, "strip", z.ZodTypeAny, {
15
+ enabled: boolean;
16
+ model: string;
17
+ provider: "none" | "openai" | "anthropic" | "ollama";
18
+ apiKeyEnv: string;
19
+ ollamaBaseUrl: string;
20
+ dbPath: string;
21
+ pythonBin: string;
22
+ installedAt: string | null;
23
+ lastEnabledAt: string | null;
24
+ }, {
25
+ enabled?: boolean | undefined;
26
+ model?: string | undefined;
27
+ provider?: "none" | "openai" | "anthropic" | "ollama" | undefined;
28
+ apiKeyEnv?: string | undefined;
29
+ ollamaBaseUrl?: string | undefined;
30
+ dbPath?: string | undefined;
31
+ pythonBin?: string | undefined;
32
+ installedAt?: string | null | undefined;
33
+ lastEnabledAt?: string | null | undefined;
34
+ }>;
35
+ export type GraphConfig = z.infer<typeof GraphConfigSchema>;
36
+ export declare function defaultGraphConfig(): GraphConfig;
37
+ export declare function readGraphConfig(): GraphConfig;
38
+ export declare function writeGraphConfig(config: GraphConfig): void;
39
+ export declare function ensureGraphDir(): void;
40
+ export declare function resetGraphData(): void;
41
+ export declare function isGraphEnabled(): boolean;
42
+ export declare const PROVIDER_LABELS: Record<GraphProvider, string>;
43
+ export declare const PROVIDER_DEFAULT_MODELS: Record<GraphProvider, string>;
44
+ export declare const PROVIDER_API_KEY_ENV: Record<GraphProvider, string>;
45
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/graph/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,mBAAmB,sDAAoD,CAAC;AACrF,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAU5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,wBAAgB,kBAAkB,IAAI,WAAW,CAYhD;AAED,wBAAgB,eAAe,IAAI,WAAW,CAW7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAI1D;AAED,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAKzD,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAKjE,CAAC;AAEF,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAK9D,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, rmSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { z } from 'zod';
4
+ import { getGraphConfigPath, getGraphDir, getGraphDataDir, } from '../config/defaults.js';
5
+ export const GraphProviderSchema = z.enum(['openai', 'anthropic', 'ollama', 'none']);
6
+ export const GraphConfigSchema = z.object({
7
+ enabled: z.boolean().default(false),
8
+ provider: GraphProviderSchema.default('none'),
9
+ model: z.string().default(''),
10
+ apiKeyEnv: z.string().default(''),
11
+ ollamaBaseUrl: z.string().default('http://localhost:11434'),
12
+ dbPath: z.string().default(''),
13
+ pythonBin: z.string().default(''),
14
+ installedAt: z.string().nullable().default(null),
15
+ lastEnabledAt: z.string().nullable().default(null),
16
+ });
17
+ export function defaultGraphConfig() {
18
+ return {
19
+ enabled: false,
20
+ provider: 'none',
21
+ model: '',
22
+ apiKeyEnv: '',
23
+ ollamaBaseUrl: 'http://localhost:11434',
24
+ dbPath: getGraphDataDir(),
25
+ pythonBin: '',
26
+ installedAt: null,
27
+ lastEnabledAt: null,
28
+ };
29
+ }
30
+ export function readGraphConfig() {
31
+ const path = getGraphConfigPath();
32
+ if (!existsSync(path))
33
+ return defaultGraphConfig();
34
+ try {
35
+ const raw = JSON.parse(readFileSync(path, 'utf8'));
36
+ const parsed = GraphConfigSchema.safeParse(raw);
37
+ if (!parsed.success)
38
+ return defaultGraphConfig();
39
+ return parsed.data;
40
+ }
41
+ catch {
42
+ return defaultGraphConfig();
43
+ }
44
+ }
45
+ export function writeGraphConfig(config) {
46
+ const path = getGraphConfigPath();
47
+ mkdirSync(dirname(path), { recursive: true });
48
+ writeFileSync(path, JSON.stringify(config, null, 2), { mode: 0o600 });
49
+ }
50
+ export function ensureGraphDir() {
51
+ const dir = getGraphDir();
52
+ if (!existsSync(dir))
53
+ mkdirSync(dir, { recursive: true });
54
+ }
55
+ export function resetGraphData() {
56
+ const dataDir = getGraphDataDir();
57
+ if (existsSync(dataDir))
58
+ rmSync(dataDir, { recursive: true, force: true });
59
+ }
60
+ export function isGraphEnabled() {
61
+ return readGraphConfig().enabled;
62
+ }
63
+ export const PROVIDER_LABELS = {
64
+ openai: 'OpenAI',
65
+ anthropic: 'Anthropic',
66
+ ollama: 'Ollama (local)',
67
+ none: 'No LLM (manual episodes only)',
68
+ };
69
+ export const PROVIDER_DEFAULT_MODELS = {
70
+ openai: 'gpt-4o-mini',
71
+ anthropic: 'claude-haiku-4-5-20251001',
72
+ ollama: 'llama3.2',
73
+ none: '',
74
+ };
75
+ export const PROVIDER_API_KEY_ENV = {
76
+ openai: 'OPENAI_API_KEY',
77
+ anthropic: 'ANTHROPIC_API_KEY',
78
+ ollama: '',
79
+ none: '',
80
+ };
81
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/graph/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface PythonInfo {
2
+ bin: string;
3
+ version: string;
4
+ major: number;
5
+ minor: number;
6
+ }
7
+ export declare function detectPython(minMajor?: number, minMinor?: number): PythonInfo | null;
8
+ export declare function checkGraphitiInstalled(pythonBin: string): boolean;
9
+ export declare function pipInstallGraphiti(pythonBin: string, extras?: string): {
10
+ ok: boolean;
11
+ output: string;
12
+ };
13
+ //# sourceMappingURL=python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.d.ts","sourceRoot":"","sources":["../../src/graph/python.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAmBD,wBAAgB,YAAY,CAAC,QAAQ,SAAI,EAAE,QAAQ,SAAK,GAAG,UAAU,GAAG,IAAI,CAQ3E;AAED,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAajE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,GAAG;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAiBhH"}
@@ -0,0 +1,68 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ const CANDIDATES = process.platform === 'win32'
3
+ ? ['py', 'python3', 'python']
4
+ : ['python3', 'python'];
5
+ const VERSION_RE = /Python\s+(\d+)\.(\d+)\.(\d+)/i;
6
+ function probe(bin) {
7
+ try {
8
+ const args = bin === 'py' ? ['-3', '--version'] : ['--version'];
9
+ const res = spawnSync(bin, args, { encoding: 'utf8', timeout: 4000 });
10
+ const out = `${res.stdout ?? ''}${res.stderr ?? ''}`;
11
+ const m = VERSION_RE.exec(out);
12
+ if (!m)
13
+ return null;
14
+ const major = parseInt(m[1], 10);
15
+ const minor = parseInt(m[2], 10);
16
+ return { bin: args[0] === '-3' ? `${bin} -3` : bin, version: m[0], major, minor };
17
+ }
18
+ catch {
19
+ return null;
20
+ }
21
+ }
22
+ export function detectPython(minMajor = 3, minMinor = 10) {
23
+ for (const bin of CANDIDATES) {
24
+ const info = probe(bin);
25
+ if (!info)
26
+ continue;
27
+ if (info.major > minMajor)
28
+ return info;
29
+ if (info.major === minMajor && info.minor >= minMinor)
30
+ return info;
31
+ }
32
+ return null;
33
+ }
34
+ export function checkGraphitiInstalled(pythonBin) {
35
+ try {
36
+ const parts = pythonBin.split(' ');
37
+ const cmd = parts[0];
38
+ const baseArgs = parts.slice(1);
39
+ const res = spawnSync(cmd, [...baseArgs, '-c', 'import graphiti_core; print(graphiti_core.__version__)'], {
40
+ encoding: 'utf8',
41
+ timeout: 6000,
42
+ });
43
+ return res.status === 0;
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ export function pipInstallGraphiti(pythonBin, extras = '[kuzu]') {
50
+ try {
51
+ const parts = pythonBin.split(' ');
52
+ const cmd = parts[0];
53
+ const baseArgs = parts.slice(1);
54
+ const target = `graphiti-core${extras}`;
55
+ const res = spawnSync(cmd, [...baseArgs, '-m', 'pip', 'install', '--user', target], {
56
+ encoding: 'utf8',
57
+ timeout: 180_000,
58
+ });
59
+ return {
60
+ ok: res.status === 0,
61
+ output: `${res.stdout ?? ''}${res.stderr ?? ''}`,
62
+ };
63
+ }
64
+ catch (err) {
65
+ return { ok: false, output: err instanceof Error ? err.message : String(err) };
66
+ }
67
+ }
68
+ //# sourceMappingURL=python.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"python.js","sourceRoot":"","sources":["../../src/graph/python.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ export interface SidecarStatus {
2
+ running: boolean;
3
+ pid: number | null;
4
+ configured: boolean;
5
+ enabled: boolean;
6
+ pythonBin: string;
7
+ provider: string;
8
+ }
9
+ export declare function getSidecarStatus(): SidecarStatus;
10
+ export interface SpawnResult {
11
+ ok: boolean;
12
+ pid?: number;
13
+ reason?: string;
14
+ }
15
+ /**
16
+ * Spawn the Graphiti MCP server as a detached subprocess.
17
+ * Returns immediately; the sidecar runs until killed.
18
+ *
19
+ * Note: this requires `graphiti-core[kuzu]` installed and a working Python
20
+ * binary. If those are missing, returns ok:false with a reason — callers
21
+ * should surface this to the user without crashing OpalServe itself.
22
+ */
23
+ export declare function spawnSidecar(): SpawnResult;
24
+ export declare function stopSidecar(): {
25
+ ok: boolean;
26
+ reason?: string;
27
+ };
28
+ //# sourceMappingURL=sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/graph/sidecar.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAiCD,wBAAgB,gBAAgB,IAAI,aAAa,CAYhD;AAiBD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,IAAI,WAAW,CA6C1C;AAED,wBAAgB,WAAW,IAAI;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAmB9D"}
@@ -0,0 +1,143 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync, mkdirSync } from 'node:fs';
2
+ import { spawn } from 'node:child_process';
3
+ import { dirname } from 'node:path';
4
+ import { getGraphPidPath, getGraphLogPath, getGraphDataDir, } from '../config/defaults.js';
5
+ import { readGraphConfig, PROVIDER_API_KEY_ENV } from './config.js';
6
+ import { createLogger } from '../utils/logger.js';
7
+ const log = createLogger('graph-sidecar');
8
+ function readPidFile() {
9
+ const path = getGraphPidPath();
10
+ if (!existsSync(path))
11
+ return null;
12
+ const raw = readFileSync(path, 'utf8').trim();
13
+ const pid = parseInt(raw, 10);
14
+ return Number.isFinite(pid) && pid > 0 ? pid : null;
15
+ }
16
+ function writePidFile(pid) {
17
+ const path = getGraphPidPath();
18
+ mkdirSync(dirname(path), { recursive: true });
19
+ writeFileSync(path, String(pid), 'utf8');
20
+ }
21
+ function clearPidFile() {
22
+ const path = getGraphPidPath();
23
+ if (existsSync(path)) {
24
+ try {
25
+ unlinkSync(path);
26
+ }
27
+ catch { /* best-effort */ }
28
+ }
29
+ }
30
+ function isProcessAlive(pid) {
31
+ try {
32
+ process.kill(pid, 0);
33
+ return true;
34
+ }
35
+ catch (err) {
36
+ const code = err.code;
37
+ return code === 'EPERM';
38
+ }
39
+ }
40
+ export function getSidecarStatus() {
41
+ const cfg = readGraphConfig();
42
+ const pid = readPidFile();
43
+ const running = pid !== null && isProcessAlive(pid);
44
+ return {
45
+ running,
46
+ pid: running ? pid : null,
47
+ configured: cfg.provider !== 'none' || cfg.enabled,
48
+ enabled: cfg.enabled,
49
+ pythonBin: cfg.pythonBin,
50
+ provider: cfg.provider,
51
+ };
52
+ }
53
+ function buildSidecarEnv(cfg) {
54
+ const env = { ...process.env };
55
+ env.GRAPHITI_DB_PATH = cfg.dbPath || getGraphDataDir();
56
+ env.GRAPHITI_PROVIDER = cfg.provider;
57
+ env.GRAPHITI_MODEL = cfg.model;
58
+ if (cfg.provider === 'ollama') {
59
+ env.OLLAMA_BASE_URL = cfg.ollamaBaseUrl;
60
+ }
61
+ const keyEnv = PROVIDER_API_KEY_ENV[cfg.provider];
62
+ if (keyEnv && process.env[keyEnv]) {
63
+ env[keyEnv] = process.env[keyEnv];
64
+ }
65
+ return env;
66
+ }
67
+ /**
68
+ * Spawn the Graphiti MCP server as a detached subprocess.
69
+ * Returns immediately; the sidecar runs until killed.
70
+ *
71
+ * Note: this requires `graphiti-core[kuzu]` installed and a working Python
72
+ * binary. If those are missing, returns ok:false with a reason — callers
73
+ * should surface this to the user without crashing OpalServe itself.
74
+ */
75
+ export function spawnSidecar() {
76
+ const cfg = readGraphConfig();
77
+ if (!cfg.enabled)
78
+ return { ok: false, reason: 'graph not enabled — run `opalserve enable graph`' };
79
+ if (!cfg.pythonBin)
80
+ return { ok: false, reason: 'python binary not configured — run `opalserve enable graph`' };
81
+ const existingPid = readPidFile();
82
+ if (existingPid && isProcessAlive(existingPid)) {
83
+ return { ok: true, pid: existingPid };
84
+ }
85
+ const parts = cfg.pythonBin.split(' ');
86
+ const cmd = parts[0];
87
+ const baseArgs = parts.slice(1);
88
+ try {
89
+ mkdirSync(dirname(getGraphLogPath()), { recursive: true });
90
+ const child = spawn(cmd, [...baseArgs, '-m', 'graphiti_core.mcp_server'], {
91
+ detached: true,
92
+ stdio: ['ignore', 'pipe', 'pipe'],
93
+ env: buildSidecarEnv(cfg),
94
+ });
95
+ if (!child.pid) {
96
+ return { ok: false, reason: 'failed to start sidecar process (no pid)' };
97
+ }
98
+ // Capture logs (best-effort)
99
+ const logPath = getGraphLogPath();
100
+ child.stdout?.on('data', (chunk) => {
101
+ try {
102
+ writeFileSync(logPath, chunk, { flag: 'a' });
103
+ }
104
+ catch { /* ignore */ }
105
+ });
106
+ child.stderr?.on('data', (chunk) => {
107
+ try {
108
+ writeFileSync(logPath, chunk, { flag: 'a' });
109
+ }
110
+ catch { /* ignore */ }
111
+ });
112
+ child.unref();
113
+ writePidFile(child.pid);
114
+ log.info({ pid: child.pid }, 'graph sidecar spawned');
115
+ return { ok: true, pid: child.pid };
116
+ }
117
+ catch (err) {
118
+ return {
119
+ ok: false,
120
+ reason: err instanceof Error ? err.message : String(err),
121
+ };
122
+ }
123
+ }
124
+ export function stopSidecar() {
125
+ const pid = readPidFile();
126
+ if (!pid) {
127
+ return { ok: true, reason: 'no sidecar running' };
128
+ }
129
+ if (!isProcessAlive(pid)) {
130
+ clearPidFile();
131
+ return { ok: true, reason: 'stale pid file cleaned up' };
132
+ }
133
+ try {
134
+ process.kill(pid, 'SIGTERM');
135
+ clearPidFile();
136
+ log.info({ pid }, 'graph sidecar stopped');
137
+ return { ok: true };
138
+ }
139
+ catch (err) {
140
+ return { ok: false, reason: err instanceof Error ? err.message : String(err) };
141
+ }
142
+ }
143
+ //# sourceMappingURL=sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../src/graph/sidecar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAoB,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,eAAe,CAAC,CAAC;AAW1C,SAAS,WAAW;IAClB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AACtD,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY;IACnB,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC;YAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;QACjD,OAAO,IAAI,KAAK,OAAO,CAAC;IAC1B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,GAAG,KAAK,IAAI,IAAI,cAAc,CAAC,GAAG,CAAC,CAAC;IACpD,OAAO;QACL,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI;QACzB,UAAU,EAAE,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,GAAG,CAAC,OAAO;QAClD,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;KACvB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAgB;IACvC,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,MAAM,IAAI,eAAe,EAAE,CAAC;IACvD,GAAG,CAAC,iBAAiB,GAAG,GAAG,CAAC,QAAQ,CAAC;IACrC,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC;IAC/B,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC9B,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,aAAa,CAAC;IAC1C,CAAC;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAQD;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IACnG,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,6DAA6D,EAAE,CAAC;IAEhH,MAAM,WAAW,GAAG,WAAW,EAAE,CAAC;IAClC,IAAI,WAAW,IAAI,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC;IACxC,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACtB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,EAAE;YACxE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC;SAC1B,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,0CAA0C,EAAE,CAAC;QAC3E,CAAC;QAED,6BAA6B;QAC7B,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;QAClC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,CAAC;gBAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,CAAC;gBAAC,aAAa,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxB,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;QACtD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;IACtC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACzD,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,YAAY,EAAE,CAAC;QACf,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,2BAA2B,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC7B,YAAY,EAAE,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,EAAE,uBAAuB,CAAC,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IACtB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACjF,CAAC;AACH,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAmB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,sSA8F7D;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,sSAW3C"}
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAoB9B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,wBAAsB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,sSA+F7D;AAED,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,sSAW3C"}
@@ -15,6 +15,7 @@ import { registerContextRoutes } from './routes/context.js';
15
15
  import { registerStatsRoutes } from './routes/stats.js';
16
16
  import { registerWebhookRoutes } from './routes/webhooks.js';
17
17
  import { registerAuditRoutes } from './routes/audit.js';
18
+ import { registerDriftRoutes } from './routes/drift.js';
18
19
  import { registerAuthDecorator, createAuthMiddleware } from '../auth/middleware.js';
19
20
  import { createLogger } from '../utils/logger.js';
20
21
  const log = createLogger('http');
@@ -93,6 +94,7 @@ export async function createServer(registry) {
93
94
  registerStatsRoutes(app, registry);
94
95
  registerWebhookRoutes(app, registry);
95
96
  registerAuditRoutes(app, registry);
97
+ registerDriftRoutes(app, registry);
96
98
  // Serve dashboard static files if available
97
99
  const __dirname = dirname(fileURLToPath(import.meta.url));
98
100
  const dashboardPath = join(__dirname, '..', 'dashboard');
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ import type { OpalServeRegistry } from '../../core/registry.js';
3
+ export type DriftStatus = 'match' | 'drift' | 'missing' | 'extra';
4
+ export declare function registerDriftRoutes(app: FastifyInstance, registry: OpalServeRegistry): void;
5
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../../src/server/routes/drift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAUhE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AA6BlE,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAiF3F"}
@@ -0,0 +1,99 @@
1
+ import { z } from 'zod';
2
+ import { createAuthMiddleware } from '../../auth/middleware.js';
3
+ import { McpServerConfigSchema } from '../../types/index.js';
4
+ import { sendValidationError } from './_schemas.js';
5
+ const DriftBody = z.object({
6
+ servers: z.array(McpServerConfigSchema),
7
+ });
8
+ function compareConfigs(local, team) {
9
+ const changed = [];
10
+ if (local.transport.type !== team.transport.type)
11
+ changed.push('transport.type');
12
+ if (local.enabled !== team.enabled)
13
+ changed.push('enabled');
14
+ if (JSON.stringify(local.tags.slice().sort()) !== JSON.stringify(team.tags.slice().sort())) {
15
+ changed.push('tags');
16
+ }
17
+ if (local.transport.type === 'stdio' && team.transport.type === 'stdio') {
18
+ if (local.transport.command !== team.transport.command)
19
+ changed.push('transport.command');
20
+ if (JSON.stringify(local.transport.args) !== JSON.stringify(team.transport.args))
21
+ changed.push('transport.args');
22
+ }
23
+ if (local.transport.type !== 'stdio' && team.transport.type !== 'stdio'
24
+ && 'url' in local.transport && 'url' in team.transport
25
+ && local.transport.url !== team.transport.url) {
26
+ changed.push('transport.url');
27
+ }
28
+ return changed;
29
+ }
30
+ export function registerDriftRoutes(app, registry) {
31
+ const db = registry.getDatabase();
32
+ const requireAuth = createAuthMiddleware(db);
33
+ app.post('/api/v1/drift', { preHandler: requireAuth }, async (request, reply) => {
34
+ if (!request.user) {
35
+ return reply.status(401).send({ ok: false, error: 'Not authenticated' });
36
+ }
37
+ const parsed = DriftBody.safeParse(request.body);
38
+ if (!parsed.success) {
39
+ return sendValidationError(reply, 'Invalid drift payload', parsed.error);
40
+ }
41
+ const membership = db.get('SELECT team_id FROM team_members WHERE user_id = ?', [request.user.id]);
42
+ if (!membership) {
43
+ return reply.status(403).send({
44
+ ok: false,
45
+ error: 'Drift detection requires team membership.',
46
+ });
47
+ }
48
+ const teamRows = db.all('SELECT name, config_json, enabled FROM team_servers WHERE team_id = ?', [membership.team_id]);
49
+ const teamMap = new Map();
50
+ for (const row of teamRows) {
51
+ try {
52
+ const cfg = JSON.parse(row.config_json);
53
+ teamMap.set(row.name, { ...cfg, enabled: row.enabled === 1 });
54
+ }
55
+ catch { /* skip malformed */ }
56
+ }
57
+ const localMap = new Map();
58
+ for (const cfg of parsed.data.servers) {
59
+ localMap.set(cfg.name, cfg);
60
+ }
61
+ const entries = [];
62
+ const allNames = new Set([...teamMap.keys(), ...localMap.keys()]);
63
+ for (const name of allNames) {
64
+ const local = localMap.get(name);
65
+ const team = teamMap.get(name);
66
+ if (local && team) {
67
+ const changed = compareConfigs(local, team);
68
+ entries.push({
69
+ name,
70
+ status: changed.length > 0 ? 'drift' : 'match',
71
+ localConfig: local,
72
+ teamConfig: team,
73
+ changedFields: changed.length > 0 ? changed : undefined,
74
+ });
75
+ }
76
+ else if (local && !team) {
77
+ entries.push({ name, status: 'extra', localConfig: local });
78
+ }
79
+ else if (!local && team) {
80
+ entries.push({ name, status: 'missing', teamConfig: team });
81
+ }
82
+ }
83
+ const summary = {
84
+ match: entries.filter(e => e.status === 'match').length,
85
+ drift: entries.filter(e => e.status === 'drift').length,
86
+ missing: entries.filter(e => e.status === 'missing').length,
87
+ extra: entries.filter(e => e.status === 'extra').length,
88
+ };
89
+ return reply.send({
90
+ ok: true,
91
+ data: {
92
+ teamId: membership.team_id,
93
+ summary,
94
+ entries: entries.sort((a, b) => a.name.localeCompare(b.name)),
95
+ },
96
+ });
97
+ });
98
+ }
99
+ //# sourceMappingURL=drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.js","sourceRoot":"","sources":["../../../src/server/routes/drift.ts"],"names":[],"mappings":"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"}