opalserve 3.3.0 → 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.
- package/README.md +9 -6
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +39 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/drift.d.ts +2 -0
- package/dist/cli/commands/drift.d.ts.map +1 -0
- package/dist/cli/commands/drift.js +81 -0
- package/dist/cli/commands/drift.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +8 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +221 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +15 -0
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/index.js +45 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts +5 -0
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +15 -0
- package/dist/config/defaults.js.map +1 -1
- package/dist/constants.d.ts +1 -1
- package/dist/constants.js +1 -1
- package/dist/dashboard/assets/{icons-DciuKSzL.js → icons-BKTSOEel.js} +57 -27
- package/dist/dashboard/assets/index-DXqLuHqr.css +1 -0
- package/dist/dashboard/assets/index-DaHAEV48.js +33 -0
- package/dist/dashboard/index.html +3 -3
- package/dist/graph/config.d.ts +45 -0
- package/dist/graph/config.d.ts.map +1 -0
- package/dist/graph/config.js +81 -0
- package/dist/graph/config.js.map +1 -0
- package/dist/graph/python.d.ts +13 -0
- package/dist/graph/python.d.ts.map +1 -0
- package/dist/graph/python.js +68 -0
- package/dist/graph/python.js.map +1 -0
- package/dist/graph/sidecar.d.ts +28 -0
- package/dist/graph/sidecar.d.ts.map +1 -0
- package/dist/graph/sidecar.js +143 -0
- package/dist/graph/sidecar.js.map +1 -0
- package/dist/server/app.d.ts.map +1 -1
- package/dist/server/app.js +2 -0
- package/dist/server/app.js.map +1 -1
- package/dist/server/routes/drift.d.ts +5 -0
- package/dist/server/routes/drift.d.ts.map +1 -0
- package/dist/server/routes/drift.js +99 -0
- package/dist/server/routes/drift.js.map +1 -0
- package/package.json +20 -2
- package/dist/dashboard/assets/index-BrOv-3xx.css +0 -1
- 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'>💠</text></svg>" />
|
|
8
|
-
<script type="module" crossorigin src="/dashboard/assets/index-
|
|
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-
|
|
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-
|
|
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":"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"}
|
package/dist/server/app.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;
|
|
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"}
|
package/dist/server/app.js
CHANGED
|
@@ -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');
|
package/dist/server/app.js.map
CHANGED
|
@@ -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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"}
|