@raviolelabs/engram-mcp 0.5.1 → 0.5.3
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 +13 -1
- package/dist/scripts/pair.js +71 -9
- package/dist/scripts/pair.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,9 +13,11 @@ EngramMCP is the memory layer your agents need — ingests from your real source
|
|
|
13
13
|
|
|
14
14
|
## Install
|
|
15
15
|
|
|
16
|
+
Every install ends with one shared step: **open your dashboard at [engram-mcp.com/dashboard](https://engram-mcp.com/dashboard)** to link your PC and watch your memory graph build itself in real time. Pick whichever install path fits your workflow.
|
|
17
|
+
|
|
16
18
|
### One command (recommended)
|
|
17
19
|
|
|
18
|
-
|
|
20
|
+
Sign up at **[engram-mcp.com](https://engram-mcp.com)** (signup is free + open). The dashboard gives you a personalized one-line install command:
|
|
19
21
|
|
|
20
22
|
```bash
|
|
21
23
|
curl -fsSL https://engram-mcp.com/install/<INVITE_TOKEN> | sh
|
|
@@ -23,6 +25,8 @@ curl -fsSL https://engram-mcp.com/install/<INVITE_TOKEN> | sh
|
|
|
23
25
|
|
|
24
26
|
This `npm install`s the package, sets up Ollama (auto-installed if missing), pulls `nomic-embed-text`, writes `~/.engram/config.json`, links your account, registers a background service (LaunchAgent on macOS, systemd-user on Linux, NSSM on Windows), updates `~/.claude/mcp.json` + `~/.cursor/mcp.json`, and opens your dashboard at engram-mcp.com — all in under 60 seconds.
|
|
25
27
|
|
|
28
|
+
**Next step**: the install script ends by pointing you to `https://engram-mcp.com/dashboard`. Open it — your PC appears under **Devices**, and the **Brain** tab visualises memories as you add them.
|
|
29
|
+
|
|
26
30
|
### Manual install (no cloud account needed)
|
|
27
31
|
|
|
28
32
|
The local server is source-available under the Elastic License 2.0 and works fully offline. Install via npm:
|
|
@@ -33,6 +37,14 @@ npm install -g @raviolelabs/engram-mcp
|
|
|
33
37
|
npx -y @raviolelabs/engram-mcp --no-http
|
|
34
38
|
```
|
|
35
39
|
|
|
40
|
+
**Want to link this PC to the dashboard later?** Sign up at [engram-mcp.com](https://engram-mcp.com), click *Connect this PC* on the dashboard, copy the token shown, then on your machine:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
engram-mcp pair --token <TOKEN_FROM_DASHBOARD>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
That re-pairs an already-installed PC without re-running the full installer — useful after revoking a device, switching accounts, or pairing a second machine.
|
|
47
|
+
|
|
36
48
|
Then add to your agent's MCP config (`~/.claude/mcp.json` for Claude Code, similar for Cursor):
|
|
37
49
|
|
|
38
50
|
```json
|
package/dist/scripts/pair.js
CHANGED
|
@@ -33,21 +33,64 @@ async function main() {
|
|
|
33
33
|
? process.argv[baseUrlArg + 1]?.replace('engram-mcp.com', 'api.engram-mcp.com') ??
|
|
34
34
|
'https://api.engram-mcp.com'
|
|
35
35
|
: 'https://api.engram-mcp.com';
|
|
36
|
+
// --token <TOKEN> short-circuit: skip the browser callback flow and redeem
|
|
37
|
+
// an invite token directly. This is what the dashboard surfaces when a user
|
|
38
|
+
// already has engram-mcp installed and just wants to re-pair after a revoke.
|
|
39
|
+
const tokenArg = process.argv.indexOf('--token');
|
|
40
|
+
const inviteToken = tokenArg !== -1 ? process.argv[tokenArg + 1] : process.env.ENGRAM_INVITE_TOKEN || null;
|
|
36
41
|
// Load config to get dataDir
|
|
37
42
|
const config = loadConfig();
|
|
38
43
|
initDb(config.dataDir);
|
|
39
44
|
if (config.engramAccount) {
|
|
40
45
|
console.log('\n Note: Re-pairing will replace existing tokens.\n');
|
|
41
46
|
}
|
|
42
|
-
// Start pairing flow — opens browser automatically
|
|
43
47
|
let result;
|
|
44
|
-
|
|
45
|
-
|
|
48
|
+
if (inviteToken) {
|
|
49
|
+
// Direct redemption — same endpoint install.sh hits at step 8
|
|
50
|
+
if (!/^[A-Za-z0-9_-]{6,32}$/.test(inviteToken)) {
|
|
51
|
+
console.error('\n Invalid token format (expected 6-32 url-safe chars)\n');
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const res = await fetch(`${apiBaseUrl}/api/pair/redeem-invite`, {
|
|
56
|
+
method: 'POST',
|
|
57
|
+
headers: { 'Content-Type': 'application/json' },
|
|
58
|
+
body: JSON.stringify({ token: inviteToken }),
|
|
59
|
+
});
|
|
60
|
+
if (!res.ok) {
|
|
61
|
+
const body = await res.text();
|
|
62
|
+
console.error(`\n Redeem failed (HTTP ${res.status}): ${body.slice(0, 200)}\n`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
const data = (await res.json());
|
|
66
|
+
if (!data.jwt || !data.api_key) {
|
|
67
|
+
console.error('\n Redeem response missing tokens\n');
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
result = {
|
|
71
|
+
jwt: data.jwt,
|
|
72
|
+
refreshToken: data.refresh_token,
|
|
73
|
+
apiKey: data.api_key,
|
|
74
|
+
expiresAt: data.expires_at ?? Date.now() + 30 * 24 * 60 * 60 * 1000,
|
|
75
|
+
};
|
|
76
|
+
console.log(`\n ✓ Linked to ${data.user?.email ?? 'your account'}`);
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
console.error(`\n Pairing failed: ${e instanceof Error ? e.message : String(e)}\n`);
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
46
82
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
83
|
+
else {
|
|
84
|
+
// Interactive browser flow (kept for users who run `engram-mcp pair`
|
|
85
|
+
// without any args — same UX as install.sh's initial pair step).
|
|
86
|
+
try {
|
|
87
|
+
result = await startPairing({ baseUrl });
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
log.error(`Pairing failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
91
|
+
console.error(`\n Pairing failed: ${e instanceof Error ? e.message : String(e)}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
51
94
|
}
|
|
52
95
|
// Generate or reuse master key salt
|
|
53
96
|
const existingSalt = config.engramAccount?.masterKeySalt;
|
|
@@ -67,8 +110,27 @@ async function main() {
|
|
|
67
110
|
fs.mkdirSync(ENGRAM_DIR, { recursive: true, mode: 0o700 });
|
|
68
111
|
fs.writeFileSync(CONFIG_PATH, JSON.stringify(updatedConfig, null, 2));
|
|
69
112
|
fs.chmodSync(CONFIG_PATH, 0o600);
|
|
70
|
-
console.log('\n Paired successfully (
|
|
71
|
-
|
|
113
|
+
console.log('\n ✓ Paired successfully (tokens saved to ~/.engram/config.json)');
|
|
114
|
+
// Restart the service so the bridge picks up the fresh tokens. Without
|
|
115
|
+
// this the user has to manually kickstart, which defeats the one-command
|
|
116
|
+
// re-pair UX.
|
|
117
|
+
try {
|
|
118
|
+
const { spawnSync } = await import('node:child_process');
|
|
119
|
+
if (process.platform === 'darwin') {
|
|
120
|
+
const uid = process.getuid?.() ?? 0;
|
|
121
|
+
const r = spawnSync('launchctl', ['kickstart', '-k', `gui/${uid}/com.ravolelabs.engram`]);
|
|
122
|
+
if (r.status === 0)
|
|
123
|
+
console.log(' ✓ Restarted background service — bridge now connecting');
|
|
124
|
+
}
|
|
125
|
+
else if (process.platform === 'linux') {
|
|
126
|
+
const r = spawnSync('systemctl', ['--user', 'restart', 'engram.service']);
|
|
127
|
+
if (r.status === 0)
|
|
128
|
+
console.log(' ✓ Restarted background service — bridge now connecting');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
console.log(' (Bridge will connect on next engram-mcp start.)');
|
|
133
|
+
}
|
|
72
134
|
console.log(`\n Open your dashboard: https://engram-mcp.com/dashboard\n`);
|
|
73
135
|
}
|
|
74
136
|
main().catch((e) => {
|
package/dist/scripts/pair.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/scripts/pair.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AAErC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,KAAK,UAAU,IAAI;IACjB,wBAAwB;IACxB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB,CAAC;IAC5F,MAAM,UAAU,GACd,UAAU,KAAK,CAAC,CAAC;QACf,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,gBAAgB,EAAE,oBAAoB,CAAC;YAC7E,4BAA4B;QAC9B,CAAC,CAAC,4BAA4B,CAAC;IAEnC,6BAA6B;IAC7B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvB,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IACtE,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"pair.js","sourceRoot":"","sources":["../../src/scripts/pair.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED