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
package/README.md
CHANGED
|
@@ -9,9 +9,11 @@
|
|
|
9
9
|
<p align="center">
|
|
10
10
|
<a href="https://www.npmjs.com/package/opalserve"><img src="https://img.shields.io/npm/v/opalserve?style=flat-square&color=F97316" alt="npm version" /></a>
|
|
11
11
|
<a href="https://www.npmjs.com/package/opalserve"><img src="https://img.shields.io/npm/dm/opalserve?style=flat-square" alt="downloads" /></a>
|
|
12
|
+
<a href="https://github.com/adityaidev/opalserve/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/adityaidev/opalserve/ci.yml?branch=master&style=flat-square&label=CI" alt="CI status" /></a>
|
|
12
13
|
<a href="https://github.com/adityaidev/opalserve/blob/master/LICENSE"><img src="https://img.shields.io/github/license/adityaidev/opalserve?style=flat-square" alt="license" /></a>
|
|
13
14
|
<a href="https://nodejs.org"><img src="https://img.shields.io/badge/node-%3E%3D20-brightgreen?style=flat-square" alt="node version" /></a>
|
|
14
15
|
<a href="https://github.com/adityaidev/opalserve"><img src="https://img.shields.io/github/stars/adityaidev/opalserve?style=flat-square" alt="GitHub stars" /></a>
|
|
16
|
+
<a href="https://github.com/adityaidev/opalserve/blob/master/CONTRIBUTING.md"><img src="https://img.shields.io/badge/PRs-welcome-brightgreen?style=flat-square" alt="PRs welcome" /></a>
|
|
15
17
|
</p>
|
|
16
18
|
|
|
17
19
|
---
|
|
@@ -25,12 +27,13 @@
|
|
|
25
27
|
| | Feature | Status | Description |
|
|
26
28
|
|---|---|---|---|
|
|
27
29
|
| :books: | **Team MCP Registry** | ✅ Stable | Admin registers servers once; every developer pulls them with `opalserve sync` |
|
|
28
|
-
| :brain: | **
|
|
29
|
-
| :bar_chart: | **Usage Analytics Dashboard** | ✅ Stable (v3.3.0
|
|
30
|
-
| :
|
|
31
|
-
| :
|
|
32
|
-
| :
|
|
33
|
-
| :
|
|
30
|
+
| :brain: | **Team Brain (Graphiti)** | 🆕 v3.4 preview | Run `opalserve enable graph` to spawn a Graphiti sidecar — temporal knowledge graph that every linked editor inherits via `graph_search` |
|
|
31
|
+
| :bar_chart: | **Usage Analytics Dashboard** | ✅ Stable (v3.3.0) | Every tool call (HTTP + MCP gateway) is captured in `usage_events`. Dashboard renders real numbers; `/api/v1/me/activity` for personal audit; `opalserve admin audit --since 7d` for team feed |
|
|
32
|
+
| :twisted_rightwards_arrows: | **Drift Detection** | 🆕 v3.4 | `opalserve drift` compares local registry to team config; flags match/drift/missing/local-only servers. REST endpoint + Dashboard tab |
|
|
33
|
+
| :lock: | **Auth & Access Control** | ✅ Stable (v3.1.1 hardened) | User accounts (scrypt-hashed), HMAC-secured API keys, per-IP/key rate limits |
|
|
34
|
+
| :electric_plug: | **Editor adapters** | ✅ Stable (v3.2) | `opalserve link` auto-configures Claude Desktop, Cursor, Cline with one command |
|
|
35
|
+
| :globe_with_meridians: | **MCP Gateway** | ✅ Stable (stdio); SSE/HTTP transports targeted for v3.5 | OpalServe is itself an MCP server — connect any MCP client over stdio today |
|
|
36
|
+
| :art: | **Beautiful CLI** | ✅ Stable | Interactive setup wizard, gradient banners, color-coded tables, 25+ commands |
|
|
34
37
|
| :seedling: | **100% Open Source** | ✅ Stable | MIT licensed, self-host for free, no vendor lock-in |
|
|
35
38
|
|
|
36
39
|
---
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AA2BA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiInD"}
|
|
@@ -4,6 +4,9 @@ import chalk from 'chalk';
|
|
|
4
4
|
import { OpalServeRegistry } from '../../core/registry.js';
|
|
5
5
|
import { getApiKeySecretPath, getDefaultDbPath } from '../../config/defaults.js';
|
|
6
6
|
import { SUPPORTED_EDITORS, OPALSERVE_ENTRY_NAME } from '../editors/index.js';
|
|
7
|
+
import { readGraphConfig } from '../../graph/config.js';
|
|
8
|
+
import { getSidecarStatus } from '../../graph/sidecar.js';
|
|
9
|
+
import { detectPython, checkGraphitiInstalled } from '../../graph/python.js';
|
|
7
10
|
import { showMiniBanner, showSuccess, showError, showInfo, showWarning } from '../ui/banner.js';
|
|
8
11
|
function isPortFree(host, port, timeoutMs = 800) {
|
|
9
12
|
return new Promise(resolve => {
|
|
@@ -62,6 +65,42 @@ export async function doctorCommand() {
|
|
|
62
65
|
? 'none registered yet — try `opalserve add` or `opalserve init`'
|
|
63
66
|
: `${servers.length} (${servers.filter(s => s.status === 'connected').length} connected)`,
|
|
64
67
|
});
|
|
68
|
+
const graphCfg = readGraphConfig();
|
|
69
|
+
if (graphCfg.enabled) {
|
|
70
|
+
const sidecar = getSidecarStatus();
|
|
71
|
+
checks.push({
|
|
72
|
+
name: 'graph: sidecar',
|
|
73
|
+
ok: sidecar.running,
|
|
74
|
+
level: sidecar.running ? 'info' : 'warn',
|
|
75
|
+
detail: sidecar.running ? `running (pid ${sidecar.pid})` : 'not running — `opalserve start` will spawn it',
|
|
76
|
+
});
|
|
77
|
+
const py = graphCfg.pythonBin ? { bin: graphCfg.pythonBin, version: '', major: 3, minor: 10 } : detectPython(3, 10);
|
|
78
|
+
checks.push({
|
|
79
|
+
name: 'graph: python',
|
|
80
|
+
ok: !!py,
|
|
81
|
+
level: py ? 'info' : 'warn',
|
|
82
|
+
detail: py ? py.bin : 'Python 3.10+ not detected — re-run `opalserve enable graph`',
|
|
83
|
+
});
|
|
84
|
+
if (graphCfg.pythonBin) {
|
|
85
|
+
const installed = checkGraphitiInstalled(graphCfg.pythonBin);
|
|
86
|
+
checks.push({
|
|
87
|
+
name: 'graph: graphiti-core',
|
|
88
|
+
ok: installed,
|
|
89
|
+
level: installed ? 'info' : 'warn',
|
|
90
|
+
detail: installed
|
|
91
|
+
? 'installed'
|
|
92
|
+
: `not importable — try \`${graphCfg.pythonBin} -m pip install --user 'graphiti-core[kuzu]'\``,
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
checks.push({
|
|
98
|
+
name: 'graph: integration',
|
|
99
|
+
ok: true,
|
|
100
|
+
level: 'info',
|
|
101
|
+
detail: 'disabled (run `opalserve enable graph` to turn on the team brain)',
|
|
102
|
+
});
|
|
103
|
+
}
|
|
65
104
|
for (const editor of SUPPORTED_EDITORS) {
|
|
66
105
|
const status = editor.status(OPALSERVE_ENTRY_NAME);
|
|
67
106
|
checks.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/drift.ts"],"names":[],"mappings":"AA8BA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA6ElD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import Table from 'cli-table3';
|
|
3
|
+
import { showMiniBanner, showError, showInfo, showSuccess } from '../ui/banner.js';
|
|
4
|
+
import { loadCredentials } from '../../config/credentials.js';
|
|
5
|
+
import { OpalServeRegistry } from '../../core/registry.js';
|
|
6
|
+
const STATUS_LABELS = {
|
|
7
|
+
match: chalk.green('✓ match'),
|
|
8
|
+
drift: chalk.yellow('⚠ drift'),
|
|
9
|
+
missing: chalk.red('✗ missing'),
|
|
10
|
+
extra: chalk.blue('+ local-only'),
|
|
11
|
+
};
|
|
12
|
+
export async function driftCommand() {
|
|
13
|
+
showMiniBanner();
|
|
14
|
+
const creds = loadCredentials();
|
|
15
|
+
if (!creds) {
|
|
16
|
+
showError('Not logged in. Run `opalserve login` first.');
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
showInfo(`Comparing local registry to team config at ${chalk.cyan(creds.serverUrl)}...`);
|
|
20
|
+
const registry = await OpalServeRegistry.create({ logging: { level: 'silent' } });
|
|
21
|
+
const localServers = registry.config.servers;
|
|
22
|
+
await registry.stop();
|
|
23
|
+
let result;
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch(`${creds.serverUrl}/api/v1/drift`, {
|
|
26
|
+
method: 'POST',
|
|
27
|
+
headers: {
|
|
28
|
+
Authorization: `Bearer ${creds.apiKey}`,
|
|
29
|
+
'Content-Type': 'application/json',
|
|
30
|
+
},
|
|
31
|
+
body: JSON.stringify({ servers: localServers }),
|
|
32
|
+
});
|
|
33
|
+
result = await res.json();
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
showError(`Drift check failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
}
|
|
39
|
+
if (!result.ok || !result.data) {
|
|
40
|
+
showError(result.error ?? 'Drift check failed');
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
const { summary, entries } = result.data;
|
|
44
|
+
if (entries.length === 0) {
|
|
45
|
+
showInfo('No servers on either side.');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const table = new Table({
|
|
49
|
+
head: [chalk.bold('Status'), chalk.bold('Server'), chalk.bold('Notes')],
|
|
50
|
+
style: { head: [], border: ['gray'] },
|
|
51
|
+
});
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
let notes = '';
|
|
54
|
+
if (entry.status === 'drift' && entry.changedFields) {
|
|
55
|
+
notes = chalk.dim(entry.changedFields.join(', '));
|
|
56
|
+
}
|
|
57
|
+
else if (entry.status === 'missing') {
|
|
58
|
+
notes = chalk.dim('on team server, not local — run `opalserve sync`');
|
|
59
|
+
}
|
|
60
|
+
else if (entry.status === 'extra') {
|
|
61
|
+
notes = chalk.dim('local only — admin can register on team server');
|
|
62
|
+
}
|
|
63
|
+
table.push([STATUS_LABELS[entry.status], entry.name, notes]);
|
|
64
|
+
}
|
|
65
|
+
console.log('\n' + table.toString() + '\n');
|
|
66
|
+
const total = summary.match + summary.drift + summary.missing + summary.extra;
|
|
67
|
+
const summaryLine = [
|
|
68
|
+
chalk.green(`${summary.match} match`),
|
|
69
|
+
summary.drift > 0 ? chalk.yellow(`${summary.drift} drift`) : null,
|
|
70
|
+
summary.missing > 0 ? chalk.red(`${summary.missing} missing`) : null,
|
|
71
|
+
summary.extra > 0 ? chalk.blue(`${summary.extra} local-only`) : null,
|
|
72
|
+
].filter(Boolean).join(chalk.dim(' · '));
|
|
73
|
+
console.log(chalk.dim(' ') + summaryLine + chalk.dim(` (${total} servers compared)\n`));
|
|
74
|
+
if (summary.drift === 0 && summary.missing === 0) {
|
|
75
|
+
showSuccess('Local registry is in sync with team config.');
|
|
76
|
+
}
|
|
77
|
+
else if (summary.missing > 0) {
|
|
78
|
+
showInfo('Run `opalserve sync` to pull missing servers from the team.');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift.js","sourceRoot":"","sources":["../../../src/cli/commands/drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare function enableGraphCommand(): Promise<void>;
|
|
2
|
+
export declare function disableGraphCommand(): Promise<void>;
|
|
3
|
+
export declare function graphStatusCommand(): void;
|
|
4
|
+
export declare function graphSpawnCommand(): void;
|
|
5
|
+
export declare function graphResetCommand(): Promise<void>;
|
|
6
|
+
export declare function graphAddCommand(text: string): void;
|
|
7
|
+
export declare function graphSearchCommand(query: string): void;
|
|
8
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"AAuCA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiHxD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBzD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CA8BzC;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAOxC;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAavD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAgBlD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAStD"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import boxen from 'boxen';
|
|
3
|
+
import ora from 'ora';
|
|
4
|
+
import { confirm, select, input } from '@inquirer/prompts';
|
|
5
|
+
import { readGraphConfig, writeGraphConfig, ensureGraphDir, resetGraphData, defaultGraphConfig, PROVIDER_LABELS, PROVIDER_DEFAULT_MODELS, PROVIDER_API_KEY_ENV, } from '../../graph/config.js';
|
|
6
|
+
import { detectPython, checkGraphitiInstalled, pipInstallGraphiti } from '../../graph/python.js';
|
|
7
|
+
import { getSidecarStatus, spawnSidecar, stopSidecar } from '../../graph/sidecar.js';
|
|
8
|
+
import { getGraphConfigPath, getGraphDataDir } from '../../config/defaults.js';
|
|
9
|
+
function teamBrainBanner() {
|
|
10
|
+
console.log(boxen([
|
|
11
|
+
chalk.bold.magenta('🧠 Team Brain') + chalk.dim(' × Graphiti Knowledge Graph'),
|
|
12
|
+
'',
|
|
13
|
+
'Persistent, queryable memory across every AI coding session.',
|
|
14
|
+
chalk.dim('Architecture → docs/GRAPHITI_ARCHITECTURE.md'),
|
|
15
|
+
].join('\n'), {
|
|
16
|
+
padding: 1,
|
|
17
|
+
margin: { top: 0, bottom: 1, left: 2, right: 2 },
|
|
18
|
+
borderStyle: 'round',
|
|
19
|
+
borderColor: 'magenta',
|
|
20
|
+
}));
|
|
21
|
+
}
|
|
22
|
+
export async function enableGraphCommand() {
|
|
23
|
+
teamBrainBanner();
|
|
24
|
+
// 1. Python check
|
|
25
|
+
const pySpinner = ora({ text: 'Checking for Python 3.10+...', color: 'yellow' }).start();
|
|
26
|
+
const py = detectPython(3, 10);
|
|
27
|
+
if (!py) {
|
|
28
|
+
pySpinner.fail('Python 3.10+ not found on PATH');
|
|
29
|
+
console.log(chalk.dim('\n Install Python from https://www.python.org/downloads/ and try again.\n'));
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
pySpinner.succeed(`Python detected: ${chalk.cyan(py.version)} ${chalk.dim(`(${py.bin})`)}`);
|
|
33
|
+
// 2. Provider selection
|
|
34
|
+
const provider = await select({
|
|
35
|
+
message: 'Choose an LLM provider for entity extraction',
|
|
36
|
+
choices: [
|
|
37
|
+
{ name: PROVIDER_LABELS.openai, value: 'openai', description: 'Best quality, paid' },
|
|
38
|
+
{ name: PROVIDER_LABELS.anthropic, value: 'anthropic', description: 'High quality, paid' },
|
|
39
|
+
{ name: PROVIDER_LABELS.ollama, value: 'ollama', description: 'Free, local — needs Ollama running' },
|
|
40
|
+
{ name: PROVIDER_LABELS.none, value: 'none', description: 'Configure later' },
|
|
41
|
+
],
|
|
42
|
+
});
|
|
43
|
+
let model = '';
|
|
44
|
+
let ollamaBaseUrl = 'http://localhost:11434';
|
|
45
|
+
if (provider !== 'none') {
|
|
46
|
+
model = await input({
|
|
47
|
+
message: `Model name`,
|
|
48
|
+
default: PROVIDER_DEFAULT_MODELS[provider],
|
|
49
|
+
});
|
|
50
|
+
const keyEnv = PROVIDER_API_KEY_ENV[provider];
|
|
51
|
+
if (keyEnv && !process.env[keyEnv]) {
|
|
52
|
+
console.log(chalk.yellow(` ⚠ ${keyEnv} is not set in your environment.`));
|
|
53
|
+
console.log(chalk.dim(` Export it before starting OpalServe, e.g. export ${keyEnv}=...\n`));
|
|
54
|
+
}
|
|
55
|
+
if (provider === 'ollama') {
|
|
56
|
+
ollamaBaseUrl = await input({
|
|
57
|
+
message: 'Ollama base URL',
|
|
58
|
+
default: 'http://localhost:11434',
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// 3. Install Graphiti
|
|
63
|
+
ensureGraphDir();
|
|
64
|
+
let installedNow = false;
|
|
65
|
+
if (checkGraphitiInstalled(py.bin)) {
|
|
66
|
+
console.log(chalk.green(' ✓ ') + chalk.dim('graphiti-core already installed'));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const doInstall = await confirm({
|
|
70
|
+
message: 'Install graphiti-core[kuzu] now via pip --user?',
|
|
71
|
+
default: true,
|
|
72
|
+
});
|
|
73
|
+
if (doInstall) {
|
|
74
|
+
const installSpinner = ora({ text: 'pip install graphiti-core[kuzu] ... (this may take a few minutes)', color: 'cyan' }).start();
|
|
75
|
+
const result = pipInstallGraphiti(py.bin);
|
|
76
|
+
if (result.ok) {
|
|
77
|
+
installSpinner.succeed('graphiti-core installed');
|
|
78
|
+
installedNow = true;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
installSpinner.fail('pip install failed');
|
|
82
|
+
console.log(chalk.dim('\n Output:\n'));
|
|
83
|
+
console.log(chalk.dim(result.output.split('\n').slice(-15).join('\n')));
|
|
84
|
+
console.log(chalk.yellow(`\n Run manually: ${py.bin} -m pip install --user 'graphiti-core[kuzu]'\n`));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
console.log(chalk.dim(` Skipped — install later with: ${py.bin} -m pip install --user 'graphiti-core[kuzu]'`));
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// 4. Persist config
|
|
92
|
+
const now = new Date().toISOString();
|
|
93
|
+
const cfg = {
|
|
94
|
+
...defaultGraphConfig(),
|
|
95
|
+
enabled: true,
|
|
96
|
+
provider,
|
|
97
|
+
model,
|
|
98
|
+
apiKeyEnv: PROVIDER_API_KEY_ENV[provider],
|
|
99
|
+
ollamaBaseUrl,
|
|
100
|
+
pythonBin: py.bin,
|
|
101
|
+
dbPath: getGraphDataDir(),
|
|
102
|
+
installedAt: installedNow ? now : readGraphConfig().installedAt,
|
|
103
|
+
lastEnabledAt: now,
|
|
104
|
+
};
|
|
105
|
+
writeGraphConfig(cfg);
|
|
106
|
+
// 5. Summary
|
|
107
|
+
console.log(boxen([
|
|
108
|
+
chalk.bold.green('✓ Graph integration enabled'),
|
|
109
|
+
'',
|
|
110
|
+
`${chalk.dim('Provider:')} ${chalk.cyan(PROVIDER_LABELS[provider])}`,
|
|
111
|
+
provider !== 'none' ? `${chalk.dim('Model:')} ${chalk.cyan(model)}` : '',
|
|
112
|
+
`${chalk.dim('Python:')} ${chalk.cyan(py.bin)}`,
|
|
113
|
+
`${chalk.dim('Data path:')} ${chalk.dim(cfg.dbPath)}`,
|
|
114
|
+
`${chalk.dim('Config:')} ${chalk.dim(getGraphConfigPath())}`,
|
|
115
|
+
'',
|
|
116
|
+
chalk.bold('Next steps:'),
|
|
117
|
+
` ${chalk.dim('1.')} ${chalk.bold('opalserve start')} — sidecar will spawn automatically`,
|
|
118
|
+
` ${chalk.dim('2.')} ${chalk.bold('opalserve graph status')} — verify the sidecar is running`,
|
|
119
|
+
` ${chalk.dim('3.')} Restart your AI editor — the ${chalk.cyan('graph_search')} tool becomes available`,
|
|
120
|
+
].filter(Boolean).join('\n'), {
|
|
121
|
+
padding: 1,
|
|
122
|
+
margin: { top: 1, bottom: 1, left: 2, right: 2 },
|
|
123
|
+
borderStyle: 'round',
|
|
124
|
+
borderColor: 'green',
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
export async function disableGraphCommand() {
|
|
128
|
+
teamBrainBanner();
|
|
129
|
+
const cfg = readGraphConfig();
|
|
130
|
+
if (!cfg.enabled) {
|
|
131
|
+
console.log(chalk.dim(' Graph integration is not currently enabled.\n'));
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
const stopResult = stopSidecar();
|
|
135
|
+
if (stopResult.ok) {
|
|
136
|
+
console.log(chalk.green(' ✓ ') + (stopResult.reason ?? 'sidecar stopped'));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
console.log(chalk.yellow(' ⚠ ') + chalk.dim(`could not stop sidecar: ${stopResult.reason}`));
|
|
140
|
+
}
|
|
141
|
+
writeGraphConfig({ ...cfg, enabled: false });
|
|
142
|
+
console.log(chalk.green(' ✓ ') + 'graph integration disabled (data preserved)\n');
|
|
143
|
+
console.log(chalk.dim(' Re-enable with `opalserve enable graph`. To wipe data, use `opalserve graph reset`.\n'));
|
|
144
|
+
}
|
|
145
|
+
export function graphStatusCommand() {
|
|
146
|
+
teamBrainBanner();
|
|
147
|
+
const cfg = readGraphConfig();
|
|
148
|
+
const status = getSidecarStatus();
|
|
149
|
+
const lines = [];
|
|
150
|
+
lines.push(`${chalk.dim('Enabled:')} ${cfg.enabled ? chalk.green('yes') : chalk.dim('no')}`);
|
|
151
|
+
lines.push(`${chalk.dim('Provider:')} ${chalk.cyan(PROVIDER_LABELS[cfg.provider])}`);
|
|
152
|
+
if (cfg.provider !== 'none') {
|
|
153
|
+
lines.push(`${chalk.dim('Model:')} ${chalk.cyan(cfg.model || '(unset)')}`);
|
|
154
|
+
}
|
|
155
|
+
lines.push(`${chalk.dim('Python:')} ${cfg.pythonBin ? chalk.cyan(cfg.pythonBin) : chalk.dim('(not configured)')}`);
|
|
156
|
+
lines.push(`${chalk.dim('Sidecar PID:')} ${status.pid ? chalk.cyan(String(status.pid)) : chalk.dim('not running')}`);
|
|
157
|
+
lines.push(`${chalk.dim('Sidecar:')} ${status.running ? chalk.green('running') : chalk.dim('stopped')}`);
|
|
158
|
+
lines.push(`${chalk.dim('Data path:')} ${chalk.dim(cfg.dbPath || getGraphDataDir())}`);
|
|
159
|
+
console.log(boxen(lines.join('\n'), {
|
|
160
|
+
padding: 1,
|
|
161
|
+
margin: { top: 0, bottom: 1, left: 2, right: 2 },
|
|
162
|
+
borderStyle: 'round',
|
|
163
|
+
borderColor: status.running ? 'green' : 'gray',
|
|
164
|
+
title: 'Graph status',
|
|
165
|
+
titleAlignment: 'center',
|
|
166
|
+
}));
|
|
167
|
+
if (cfg.enabled && !status.running) {
|
|
168
|
+
console.log(chalk.dim(' Sidecar is not running. It will spawn on next `opalserve start`,\n or run `opalserve graph spawn` to start it manually.\n'));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
export function graphSpawnCommand() {
|
|
172
|
+
const result = spawnSidecar();
|
|
173
|
+
if (result.ok) {
|
|
174
|
+
console.log(chalk.green(' ✓ ') + `sidecar running (pid ${result.pid})\n`);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
console.log(chalk.yellow(' ⚠ ') + chalk.dim(result.reason ?? 'failed to start') + '\n');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
export async function graphResetCommand() {
|
|
181
|
+
teamBrainBanner();
|
|
182
|
+
const ok = await confirm({
|
|
183
|
+
message: chalk.red('This will permanently delete all graph data. Continue?'),
|
|
184
|
+
default: false,
|
|
185
|
+
});
|
|
186
|
+
if (!ok) {
|
|
187
|
+
console.log(chalk.dim(' Cancelled.\n'));
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
stopSidecar();
|
|
191
|
+
resetGraphData();
|
|
192
|
+
console.log(chalk.green(' ✓ ') + 'graph data wiped\n');
|
|
193
|
+
}
|
|
194
|
+
export function graphAddCommand(text) {
|
|
195
|
+
teamBrainBanner();
|
|
196
|
+
const cfg = readGraphConfig();
|
|
197
|
+
if (!cfg.enabled) {
|
|
198
|
+
console.log(chalk.yellow(' ⚠ ') + 'graph integration not enabled — run `opalserve enable graph` first\n');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
const status = getSidecarStatus();
|
|
202
|
+
if (!status.running) {
|
|
203
|
+
console.log(chalk.yellow(' ⚠ ') + 'sidecar not running — start OpalServe with `opalserve start`\n');
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
// The actual MCP call into the sidecar is done by the gateway. From the CLI
|
|
207
|
+
// we delegate to the running OpalServe process by talking to its HTTP API.
|
|
208
|
+
console.log(chalk.dim(' (manual episode injection routes through the running server — coming next)\n'));
|
|
209
|
+
console.log(chalk.dim(` Episode payload: ${text.slice(0, 80)}${text.length > 80 ? '...' : ''}\n`));
|
|
210
|
+
}
|
|
211
|
+
export function graphSearchCommand(query) {
|
|
212
|
+
teamBrainBanner();
|
|
213
|
+
const cfg = readGraphConfig();
|
|
214
|
+
if (!cfg.enabled) {
|
|
215
|
+
console.log(chalk.yellow(' ⚠ ') + 'graph integration not enabled — run `opalserve enable graph` first\n');
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
console.log(chalk.dim(` Tip: search through your AI editor's MCP tool — the sidecar exposes \`graph_search\` automatically.\n`));
|
|
219
|
+
console.log(chalk.dim(` Query: ${query}\n`));
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=graph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AASA,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuF/H"}
|
|
@@ -4,6 +4,8 @@ import { OpalServeRegistry } from '../../core/registry.js';
|
|
|
4
4
|
import { startServer } from '../../server/app.js';
|
|
5
5
|
import { openInBrowser } from '../../utils/browser.js';
|
|
6
6
|
import { showMiniBanner, showSuccess, showError, showInfo } from '../ui/banner.js';
|
|
7
|
+
import { isGraphEnabled } from '../../graph/config.js';
|
|
8
|
+
import { spawnSidecar, stopSidecar } from '../../graph/sidecar.js';
|
|
7
9
|
export async function startCommand(options) {
|
|
8
10
|
showMiniBanner();
|
|
9
11
|
const spinner = ora({ text: 'Loading configuration...', color: 'yellow' }).start();
|
|
@@ -33,6 +35,17 @@ export async function startCommand(options) {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
}
|
|
38
|
+
// Auto-spawn graph sidecar (if enabled)
|
|
39
|
+
if (isGraphEnabled()) {
|
|
40
|
+
const graphSpinner = ora({ text: 'Starting graph sidecar...', color: 'magenta' }).start();
|
|
41
|
+
const result = spawnSidecar();
|
|
42
|
+
if (result.ok) {
|
|
43
|
+
graphSpinner.succeed(`Graph sidecar running ${chalk.dim(`(pid ${result.pid})`)}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
graphSpinner.warn(`Graph sidecar not started: ${chalk.dim(result.reason ?? 'unknown')}`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
36
49
|
// Start HTTP API
|
|
37
50
|
const port = options.port ? parseInt(options.port, 10) : undefined;
|
|
38
51
|
const app = await startServer(registry, { port, host: options.host });
|
|
@@ -61,6 +74,8 @@ export async function startCommand(options) {
|
|
|
61
74
|
const stopSpinner = ora('Shutting down...').start();
|
|
62
75
|
await app.close();
|
|
63
76
|
await registry.stop();
|
|
77
|
+
if (isGraphEnabled())
|
|
78
|
+
stopSidecar();
|
|
64
79
|
stopSpinner.succeed('Stopped');
|
|
65
80
|
process.exit(0);
|
|
66
81
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/cli/commands/start.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -15,6 +15,8 @@ import { linkCommand, unlinkCommand } from './commands/link.js';
|
|
|
15
15
|
import { doctorCommand } from './commands/doctor.js';
|
|
16
16
|
import { addCommand } from './commands/add.js';
|
|
17
17
|
import { defaultCommand } from './commands/default.js';
|
|
18
|
+
import { driftCommand } from './commands/drift.js';
|
|
19
|
+
import { enableGraphCommand, disableGraphCommand, graphStatusCommand, graphSpawnCommand, graphResetCommand, graphAddCommand, graphSearchCommand, } from './commands/graph.js';
|
|
18
20
|
import { VERSION } from '../constants.js';
|
|
19
21
|
const program = new Command()
|
|
20
22
|
.name('opalserve')
|
|
@@ -169,6 +171,11 @@ program
|
|
|
169
171
|
.description('Health check all servers')
|
|
170
172
|
.option('-s, --server <name>', 'Check specific server')
|
|
171
173
|
.action(healthCommand);
|
|
174
|
+
// --- Drift ---
|
|
175
|
+
program
|
|
176
|
+
.command('drift')
|
|
177
|
+
.description('Compare local registry to team config; show match/drift/missing')
|
|
178
|
+
.action(driftCommand);
|
|
172
179
|
// --- Doctor ---
|
|
173
180
|
program
|
|
174
181
|
.command('doctor')
|
|
@@ -191,6 +198,44 @@ program
|
|
|
191
198
|
.description('Remove OpalServe from an AI editor')
|
|
192
199
|
.option('--all', 'Unlink from every editor where present')
|
|
193
200
|
.action(unlinkCommand);
|
|
201
|
+
// --- Enable / Disable graph (Graphiti team brain — v3.4.0) ---
|
|
202
|
+
const enableCmd = program
|
|
203
|
+
.command('enable')
|
|
204
|
+
.description('Enable optional OpalServe features');
|
|
205
|
+
enableCmd
|
|
206
|
+
.command('graph')
|
|
207
|
+
.description('Enable the Graphiti team brain (temporal knowledge graph)')
|
|
208
|
+
.action(enableGraphCommand);
|
|
209
|
+
const disableCmd = program
|
|
210
|
+
.command('disable')
|
|
211
|
+
.description('Disable optional OpalServe features');
|
|
212
|
+
disableCmd
|
|
213
|
+
.command('graph')
|
|
214
|
+
.description('Disable the Graphiti team brain')
|
|
215
|
+
.action(disableGraphCommand);
|
|
216
|
+
const graphCmd = program
|
|
217
|
+
.command('graph')
|
|
218
|
+
.description('Manage the Graphiti team brain (v3.4.0)');
|
|
219
|
+
graphCmd
|
|
220
|
+
.command('status')
|
|
221
|
+
.description('Show graph sidecar status and config')
|
|
222
|
+
.action(graphStatusCommand);
|
|
223
|
+
graphCmd
|
|
224
|
+
.command('spawn')
|
|
225
|
+
.description('Manually spawn the graph sidecar')
|
|
226
|
+
.action(graphSpawnCommand);
|
|
227
|
+
graphCmd
|
|
228
|
+
.command('add <text>')
|
|
229
|
+
.description('Manually add an episode to the graph')
|
|
230
|
+
.action((text) => graphAddCommand(text));
|
|
231
|
+
graphCmd
|
|
232
|
+
.command('search <query>')
|
|
233
|
+
.description('Search the knowledge graph')
|
|
234
|
+
.action((query) => graphSearchCommand(query));
|
|
235
|
+
graphCmd
|
|
236
|
+
.command('reset')
|
|
237
|
+
.description('Wipe all graph data (irreversible)')
|
|
238
|
+
.action(graphResetCommand);
|
|
194
239
|
// Bare `opalserve` (no subcommand): context-aware welcome.
|
|
195
240
|
if (process.argv.length <= 2) {
|
|
196
241
|
defaultCommand().catch((err) => {
|