@raviolelabs/engram-mcp 0.2.2 → 0.4.2
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/LICENSE +1 -1
- package/README.md +139 -134
- package/SKILL.md +33 -0
- package/dist/core/db/index.d.ts.map +1 -1
- package/dist/core/db/index.js +27 -1
- package/dist/core/db/index.js.map +1 -1
- package/dist/core/logger.d.ts.map +1 -1
- package/dist/core/logger.js +4 -4
- package/dist/core/logger.js.map +1 -1
- package/dist/core/server/http.d.ts +3 -0
- package/dist/core/server/http.d.ts.map +1 -1
- package/dist/core/server/http.js +6 -0
- package/dist/core/server/http.js.map +1 -1
- package/dist/core/server/instructions.js +1 -1
- package/dist/core/server/mcp-handler.d.ts.map +1 -1
- package/dist/core/server/mcp-handler.js +28 -1
- package/dist/core/server/mcp-handler.js.map +1 -1
- package/dist/embeddings/index.d.ts +6 -0
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +31 -3
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/providers/engram.d.ts +10 -0
- package/dist/embeddings/providers/engram.d.ts.map +1 -1
- package/dist/embeddings/providers/engram.js +35 -12
- package/dist/embeddings/providers/engram.js.map +1 -1
- package/dist/mcp-server/tests/mcp-e2e.test.js +1 -1
- package/dist/mcp-server/tests/mcp-e2e.test.js.map +1 -1
- package/dist/memory/core/store.d.ts.map +1 -1
- package/dist/memory/core/store.js +5 -4
- package/dist/memory/core/store.js.map +1 -1
- package/dist/memory/modules/team/keystore.d.ts +38 -0
- package/dist/memory/modules/team/keystore.d.ts.map +1 -0
- package/dist/memory/modules/team/keystore.js +117 -0
- package/dist/memory/modules/team/keystore.js.map +1 -0
- package/dist/memory/modules/team/tools.d.ts +10 -0
- package/dist/memory/modules/team/tools.d.ts.map +1 -0
- package/dist/memory/modules/team/tools.js +252 -0
- package/dist/memory/modules/team/tools.js.map +1 -0
- package/dist/memory/public/tools.d.ts.map +1 -1
- package/dist/memory/public/tools.js +33 -5
- package/dist/memory/public/tools.js.map +1 -1
- package/dist/server/api/memories.d.ts.map +1 -1
- package/dist/server/api/memories.js +79 -8
- package/dist/server/api/memories.js.map +1 -1
- package/dist/server/api/types.d.ts +5 -0
- package/dist/server/api/types.d.ts.map +1 -1
- package/dist/server/api/types.js +90 -2
- package/dist/server/api/types.js.map +1 -1
- package/dist/sync/team-sync.d.ts +19 -0
- package/dist/sync/team-sync.d.ts.map +1 -0
- package/dist/sync/team-sync.js +80 -0
- package/dist/sync/team-sync.js.map +1 -0
- package/dist/tests/scope-encryption.test.d.ts +2 -0
- package/dist/tests/scope-encryption.test.d.ts.map +1 -0
- package/dist/tests/scope-encryption.test.js +71 -0
- package/dist/tests/scope-encryption.test.js.map +1 -0
- package/dist/types.d.ts +5 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/webapp/api/team.d.ts +7 -0
- package/dist/webapp/api/team.d.ts.map +1 -0
- package/dist/webapp/api/team.js +57 -0
- package/dist/webapp/api/team.js.map +1 -0
- package/package.json +2 -1
- package/CLAUDE.md +0 -232
|
@@ -15,6 +15,7 @@ import { createYoutubeModule } from '../../memory/modules/youtube/module.js';
|
|
|
15
15
|
import { buildPublicTools } from '../../memory/public/tools.js';
|
|
16
16
|
import { createObsidianModule, } from '../../memory/modules/obsidian/module.js';
|
|
17
17
|
import { loadAndRegisterCustomTypes, } from '../../memory/modules/_custom/tools.js';
|
|
18
|
+
import { buildWorkspaceTools } from '../../memory/modules/team/tools.js';
|
|
18
19
|
import { ToolRouter } from './tool-router.js';
|
|
19
20
|
import { ENGRAM_INSTRUCTIONS } from './instructions.js';
|
|
20
21
|
import { startTransitPoller } from '../../cloud/transit-poller.js';
|
|
@@ -53,10 +54,36 @@ export async function buildEngramRuntime(config, opts = {}) {
|
|
|
53
54
|
moduleRegistry.register(createYoutubeModule(config));
|
|
54
55
|
moduleRegistry.register(createObsidianModule(config));
|
|
55
56
|
await moduleRegistry.bootAll({ store });
|
|
56
|
-
// Build tool router — all
|
|
57
|
+
// Build tool router — all tools always registered (no admin flag needed)
|
|
57
58
|
const router = new ToolRouter();
|
|
58
59
|
router.registerMany(buildPublicTools(store, config));
|
|
59
60
|
loadAndRegisterCustomTypes(store, config, router);
|
|
61
|
+
// Workspace (team) tools — registered only when cloud sync is configured
|
|
62
|
+
// (requires masterKey; falls back gracefully if no passphrase set)
|
|
63
|
+
let workspaceMasterKey = null;
|
|
64
|
+
if (config.engramAccount) {
|
|
65
|
+
const passphrase = process.env.ENGRAM_PASSPHRASE ?? '';
|
|
66
|
+
if (passphrase) {
|
|
67
|
+
try {
|
|
68
|
+
const mk = await deriveMasterKey(passphrase, config.engramAccount.masterKeySalt);
|
|
69
|
+
workspaceMasterKey = Buffer.from(mk);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Non-critical
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (workspaceMasterKey) {
|
|
77
|
+
const wsMasterKey = workspaceMasterKey;
|
|
78
|
+
const wsJwt = config.engramAccount?.jwt ?? null;
|
|
79
|
+
const workspaceTools = buildWorkspaceTools({
|
|
80
|
+
config,
|
|
81
|
+
masterKey: wsMasterKey,
|
|
82
|
+
getJwt: async () => wsJwt,
|
|
83
|
+
});
|
|
84
|
+
router.registerMany(workspaceTools);
|
|
85
|
+
log.info(`Workspace tools registered (${workspaceTools.length} tools)`);
|
|
86
|
+
}
|
|
60
87
|
// --- Cloud transit poller (opt-in, only if user has paired) ---
|
|
61
88
|
let pollerStop = null;
|
|
62
89
|
if (config.engramAccount) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-handler.js","sourceRoot":"","sources":["../../../src/core/server/mcp-handler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mcp-handler.js","sourceRoot":"","sources":["../../../src/core/server/mcp-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,14 @@
|
|
|
9
9
|
* - openai-compatible (BYO endpoint, requires baseUrl)
|
|
10
10
|
*/
|
|
11
11
|
import type { EmbeddingsConfig } from '../config/schema.js';
|
|
12
|
+
/** Exported for testing — reset between test runs */
|
|
13
|
+
export declare function resetSessionFallback(): void;
|
|
12
14
|
/**
|
|
13
15
|
* Embed a single text string. Returns a Float32Array of the embedding vector.
|
|
16
|
+
*
|
|
17
|
+
* When provider is 'engram'/'engram-hosted' and the hosted endpoint returns
|
|
18
|
+
* {used_fallback: true}, automatically retries via local Ollama and marks the
|
|
19
|
+
* session so future calls skip the hosted endpoint entirely.
|
|
14
20
|
*/
|
|
15
21
|
export declare function embed(text: string, config: EmbeddingsConfig): Promise<Float32Array>;
|
|
16
22
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAc5D,qDAAqD;AACrD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAID;;;;;;GAMG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAuCzF;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,YAAY,EAAE,CAAC,CAIzB;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAWzE;AAID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE5D;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAE9D;AAID,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CASpF"}
|
package/dist/embeddings/index.js
CHANGED
|
@@ -10,22 +10,50 @@
|
|
|
10
10
|
*/
|
|
11
11
|
import { createLogger } from '../logger.js';
|
|
12
12
|
import { embedOllama } from './providers/ollama.js';
|
|
13
|
-
import { embedEngram } from './providers/engram.js';
|
|
13
|
+
import { embedEngram, QuotaFallbackError } from './providers/engram.js';
|
|
14
14
|
import { embedVoyage } from './providers/voyage.js';
|
|
15
15
|
import { embedOpenAI } from './providers/openai.js';
|
|
16
16
|
import { embedOpenAICompat } from './providers/openai-compat.js';
|
|
17
17
|
const log = createLogger('embeddings');
|
|
18
|
+
// ─── Session-level fallback flag ──────────────────────────────────────────────
|
|
19
|
+
// Set to true when the hosted endpoint signals quota exhaustion (used_fallback).
|
|
20
|
+
// All subsequent requests in this process session use Ollama directly.
|
|
21
|
+
let _sessionFallbackActive = false;
|
|
22
|
+
/** Exported for testing — reset between test runs */
|
|
23
|
+
export function resetSessionFallback() {
|
|
24
|
+
_sessionFallbackActive = false;
|
|
25
|
+
}
|
|
18
26
|
// ─── Core embed call ──────────────────────────────────────────────────────────
|
|
19
27
|
/**
|
|
20
28
|
* Embed a single text string. Returns a Float32Array of the embedding vector.
|
|
29
|
+
*
|
|
30
|
+
* When provider is 'engram'/'engram-hosted' and the hosted endpoint returns
|
|
31
|
+
* {used_fallback: true}, automatically retries via local Ollama and marks the
|
|
32
|
+
* session so future calls skip the hosted endpoint entirely.
|
|
21
33
|
*/
|
|
22
34
|
export async function embed(text, config) {
|
|
23
35
|
switch (config.provider) {
|
|
24
36
|
case 'ollama':
|
|
25
37
|
return embedOllama(text, config);
|
|
26
38
|
case 'engram':
|
|
27
|
-
case 'engram-hosted':
|
|
28
|
-
|
|
39
|
+
case 'engram-hosted': {
|
|
40
|
+
// If this session already fell back, skip to Ollama immediately
|
|
41
|
+
if (_sessionFallbackActive) {
|
|
42
|
+
return embedOllama(text, config);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
return await embedEngram(text, config);
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
if (e instanceof QuotaFallbackError) {
|
|
49
|
+
_sessionFallbackActive = true;
|
|
50
|
+
log.info(`Session fallback active — all embeddings this session will use local Ollama. ` +
|
|
51
|
+
`Hosted quota resets: ${e.exhaustedUntil ?? 'next month'}.`);
|
|
52
|
+
return embedOllama(text, config);
|
|
53
|
+
}
|
|
54
|
+
throw e;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
29
57
|
case 'voyage':
|
|
30
58
|
return embedVoyage(text, config);
|
|
31
59
|
case 'openai':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/embeddings/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAEjE,MAAM,GAAG,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAEvC,iFAAiF;AACjF,iFAAiF;AACjF,uEAAuE;AACvE,IAAI,sBAAsB,GAAG,KAAK,CAAC;AAEnC,qDAAqD;AACrD,MAAM,UAAU,oBAAoB;IAClC,sBAAsB,GAAG,KAAK,CAAC;AACjC,CAAC;AAED,iFAAiF;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,IAAY,EAAE,MAAwB;IAChE,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxB,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,QAAQ,CAAC;QACd,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,gEAAgE;YAChE,IAAI,sBAAsB,EAAE,CAAC;gBAC3B,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACzC,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;oBACpC,sBAAsB,GAAG,IAAI,CAAC;oBAC9B,GAAG,CAAC,IAAI,CACN,+EAA+E;wBAC/E,wBAAwB,CAAC,CAAC,cAAc,IAAI,YAAY,GAAG,CAC5D,CAAC;oBACF,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACnC,CAAC;gBACD,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QACD,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,QAAQ;YACX,OAAO,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,KAAK,mBAAmB;YACtB,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YAC3E,OAAO,iBAAiB,CAAC,IAAI,EAAE;gBAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B,CAAC,CAAC;QACL;YACE,MAAM,IAAI,KAAK,CAAC,gCAAiC,MAA+B,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAe,EACf,MAAwB;IAExB,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,CAAC,IAAI,KAAK;QAAE,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,gBAAgB,CAAC,CAAe,EAAE,CAAe;IAC/D,IAAI,GAAG,GAAG,CAAC,EACT,EAAE,GAAG,CAAC,EACN,EAAE,GAAG,CAAC,CAAC;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,iFAAiF;AAEjF,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IAClD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;AAC1E,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,MAAwB;IAChE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5B,GAAG,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
import type { EmbeddingsConfig } from '../../config/schema.js';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown when the hosted endpoint returns {used_fallback: true}.
|
|
4
|
+
* The dispatcher catches this and retries with Ollama.
|
|
5
|
+
*/
|
|
6
|
+
export declare class QuotaFallbackError extends Error {
|
|
7
|
+
readonly exhaustedUntil?: string;
|
|
8
|
+
constructor(message: string, exhaustedUntil?: string);
|
|
9
|
+
}
|
|
2
10
|
/**
|
|
3
11
|
* Embed a single text via the Engram-hosted endpoint.
|
|
4
12
|
* Internally uses the batch API (texts: [text]) and returns the first vector.
|
|
13
|
+
*
|
|
14
|
+
* Throws QuotaFallbackError when the server indicates fallback mode.
|
|
5
15
|
*/
|
|
6
16
|
export declare function embedEngram(text: string, config: EmbeddingsConfig): Promise<Float32Array>;
|
|
7
17
|
//# sourceMappingURL=engram.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engram.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/engram.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engram.d.ts","sourceRoot":"","sources":["../../../src/embeddings/providers/engram.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAM/D;;;GAGG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;gBACrB,OAAO,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM;CAKrD;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,YAAY,CAAC,CAmF/F"}
|
|
@@ -4,13 +4,29 @@
|
|
|
4
4
|
* Auth: Bearer <engramAccount.apiKey> from ~/.engram/config.json.
|
|
5
5
|
*
|
|
6
6
|
* Falls back gracefully on quota errors with clear messages.
|
|
7
|
+
* When the server returns used_fallback:true, throws QuotaFallbackError
|
|
8
|
+
* so the dispatcher can transparently retry with local Ollama.
|
|
7
9
|
*/
|
|
8
10
|
import { createLogger } from '../../logger.js';
|
|
9
11
|
const log = createLogger('embeddings:engram');
|
|
10
12
|
const ENGRAM_DEFAULT_BASE_URL = 'https://api.engram-mcp.com';
|
|
13
|
+
/**
|
|
14
|
+
* Thrown when the hosted endpoint returns {used_fallback: true}.
|
|
15
|
+
* The dispatcher catches this and retries with Ollama.
|
|
16
|
+
*/
|
|
17
|
+
export class QuotaFallbackError extends Error {
|
|
18
|
+
exhaustedUntil;
|
|
19
|
+
constructor(message, exhaustedUntil) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'QuotaFallbackError';
|
|
22
|
+
this.exhaustedUntil = exhaustedUntil;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
11
25
|
/**
|
|
12
26
|
* Embed a single text via the Engram-hosted endpoint.
|
|
13
27
|
* Internally uses the batch API (texts: [text]) and returns the first vector.
|
|
28
|
+
*
|
|
29
|
+
* Throws QuotaFallbackError when the server indicates fallback mode.
|
|
14
30
|
*/
|
|
15
31
|
export async function embedEngram(text, config) {
|
|
16
32
|
if (!config.apiKey) {
|
|
@@ -34,27 +50,34 @@ export async function embedEngram(text, config) {
|
|
|
34
50
|
catch (err) {
|
|
35
51
|
throw new Error(`Engram embeddings network error: ${err instanceof Error ? err.message : String(err)}`);
|
|
36
52
|
}
|
|
53
|
+
// Parse body first so we can check used_fallback on 200
|
|
54
|
+
const body = await res.text();
|
|
55
|
+
let data = {};
|
|
56
|
+
try {
|
|
57
|
+
data = JSON.parse(body);
|
|
58
|
+
}
|
|
59
|
+
catch { /* ignore */ }
|
|
60
|
+
// Fallback signal — server says "use local provider"
|
|
61
|
+
if (res.ok && data.used_fallback) {
|
|
62
|
+
const msg = data.message ?? 'Hosted embedding quota exhausted.';
|
|
63
|
+
log.warn(`Hosted embeddings quota exhausted: ${msg}`);
|
|
64
|
+
log.info('Falling back to local Ollama provider for this and future requests this session.');
|
|
65
|
+
throw new QuotaFallbackError(msg, data.quota_exhausted_until);
|
|
66
|
+
}
|
|
37
67
|
if (!res.ok) {
|
|
38
|
-
|
|
39
|
-
let parsed = {};
|
|
40
|
-
try {
|
|
41
|
-
parsed = JSON.parse(body);
|
|
42
|
-
}
|
|
43
|
-
catch { /* ignore */ }
|
|
44
|
-
if (res.status === 403 || parsed.error === 'pro_required') {
|
|
68
|
+
if (res.status === 403 || data.error === 'pro_required') {
|
|
45
69
|
throw new Error('Engram-hosted embeddings require a Pro subscription ($9/mo). ' +
|
|
46
70
|
'Upgrade at https://engram-mcp.com/billing, or switch provider to "ollama".');
|
|
47
71
|
}
|
|
48
|
-
if (res.status === 402 ||
|
|
49
|
-
throw new Error('Engram embedding quota exceeded for this month. ' +
|
|
50
|
-
'
|
|
72
|
+
if (res.status === 402 || data.error === 'quota_exceeded') {
|
|
73
|
+
throw new Error('Engram embedding quota exceeded for this month (block mode). ' +
|
|
74
|
+
'Change overage_mode in your dashboard, or wait for the next billing cycle.');
|
|
51
75
|
}
|
|
52
76
|
throw new Error(`Engram embeddings API ${res.status}: ${body.slice(0, 200)}`);
|
|
53
77
|
}
|
|
54
|
-
const data = (await res.json());
|
|
55
78
|
if (data.overage_billed) {
|
|
56
79
|
log.warn(`Engram embeddings overage billed — ${data.tokens_used} tokens used this request. ` +
|
|
57
|
-
`Check your usage at https://engram-mcp.com/
|
|
80
|
+
`Check your usage at https://engram-mcp.com/dashboard.`);
|
|
58
81
|
}
|
|
59
82
|
const vec = data.embeddings?.[0];
|
|
60
83
|
if (!vec?.length)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engram.js","sourceRoot":"","sources":["../../../src/embeddings/providers/engram.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"engram.js","sourceRoot":"","sources":["../../../src/embeddings/providers/engram.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,7 +15,7 @@ describe('MCP E2E (real subprocess) — full 24-tool public surface', () => {
|
|
|
15
15
|
command: 'npx',
|
|
16
16
|
args: ['tsx', 'src/scripts/serve.ts', '--no-http'],
|
|
17
17
|
env: { ...process.env, ENGRAM_CONFIG_DIR: tmpDir, DATA_DIR: tmpDir },
|
|
18
|
-
cwd:
|
|
18
|
+
cwd: process.cwd(),
|
|
19
19
|
});
|
|
20
20
|
client = new Client({ name: 'engram-e2e-test', version: '0.0.0' }, { capabilities: {} });
|
|
21
21
|
await client.connect(transport);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-e2e.test.js","sourceRoot":"","sources":["../../../src/mcp-server/tests/mcp-e2e.test.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,qDAAqD;AACrD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,QAAQ,CAAC,yDAAyD,EAAE,GAAG,EAAE;IACvE,IAAI,MAAc,CAAC;IACnB,IAAI,MAAc,CAAC;IAEnB,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAE/D,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,CAAC,KAAK,EAAE,sBAAsB,EAAE,WAAW,CAAC;YAClD,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE;YACpE,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"mcp-e2e.test.js","sourceRoot":"","sources":["../../../src/mcp-server/tests/mcp-e2e.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/memory/core/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,KAAK,EACV,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAIxF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,8DAA8D;IAC9D,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,WAAW;IAIV,OAAO,CAAC,OAAO;IAH3B,QAAQ,CAAC,MAAM,wBAAsB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAY;gBAEV,OAAO,EAAE,kBAAkB;IAE/C,oGAAoG;IACpG,IAAI,UAAU,IAAI,gBAAgB,CAEjC;IAED,qFAAqF;IACrF,IAAI,OAAO,IAAI,aAAa,CAE3B;IAED,kEAAkE;IAClE,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAI/B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/memory/core/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAWtC,OAAO,KAAK,EACV,gBAAgB,EAChB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAIxF,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,kBAAkB,CAAC,EAAE,wBAAwB,CAAC;IAC9C,8DAA8D;IAC9D,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,qBAAa,WAAW;IAIV,OAAO,CAAC,OAAO;IAH3B,QAAQ,CAAC,MAAM,wBAAsB;IACrC,OAAO,CAAC,SAAS,CAAC,CAAY;gBAEV,OAAO,EAAE,kBAAkB;IAE/C,oGAAoG;IACpG,IAAI,UAAU,IAAI,gBAAgB,CAEjC;IAED,qFAAqF;IACrF,IAAI,OAAO,IAAI,aAAa,CAE3B;IAED,kEAAkE;IAClE,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAI/B,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAoF7C,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAoCrC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAiB9E,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCjC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASjD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAQxE,qDAAqD;IAC/C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA2C7E,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,gBAAgB,EAAE,gBAAgB,CAAC,GAAG,OAAO;IAqB7F,6FAA6F;IACvF,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvD,6FAA6F;IACvF,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB3D,SAAS,IAAI,MAAM,EAAE;CAMtB"}
|
|
@@ -54,10 +54,10 @@ export class MemoryStore {
|
|
|
54
54
|
const insert = db.prepare(`
|
|
55
55
|
INSERT OR REPLACE INTO memories
|
|
56
56
|
(id, type, source_id, content, content_hash, properties_json,
|
|
57
|
-
wikilinks_json, related_ids_json, embedding_model, created_at)
|
|
58
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
57
|
+
wikilinks_json, related_ids_json, embedding_model, created_at, scope)
|
|
58
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
59
59
|
`);
|
|
60
|
-
insert.run(item.id, item.type, item.source_id, item.content, item.content_hash, JSON.stringify(item.properties), JSON.stringify(item.wikilinks), JSON.stringify(item.related_ids), item.embedding_model, Date.parse(item.properties.created_at));
|
|
60
|
+
insert.run(item.id, item.type, item.source_id, item.content, item.content_hash, JSON.stringify(item.properties), JSON.stringify(item.wikilinks), JSON.stringify(item.related_ids), item.embedding_model, Date.parse(item.properties.created_at), item.scope ?? 'personal');
|
|
61
61
|
// FTS index
|
|
62
62
|
db.prepare(`INSERT INTO memories_fts (id, content, title, tags) VALUES (?, ?, ?, ?)`).run(item.id, item.content, item.properties.title ?? '', (item.properties.tags ?? []).join(' '));
|
|
63
63
|
// Vector index — chunk + embed + store per chunk
|
|
@@ -83,7 +83,7 @@ export class MemoryStore {
|
|
|
83
83
|
getById(id) {
|
|
84
84
|
const row = getDb()
|
|
85
85
|
.prepare(`SELECT id, type, source_id, content, content_hash, properties_json,
|
|
86
|
-
wikilinks_json, related_ids_json, embedding_model
|
|
86
|
+
wikilinks_json, related_ids_json, embedding_model, scope
|
|
87
87
|
FROM memories WHERE id = ?`)
|
|
88
88
|
.get(id);
|
|
89
89
|
if (!row)
|
|
@@ -91,6 +91,7 @@ export class MemoryStore {
|
|
|
91
91
|
return {
|
|
92
92
|
id: row.id,
|
|
93
93
|
type: row.type,
|
|
94
|
+
scope: row.scope ?? 'personal',
|
|
94
95
|
source_id: row.source_id,
|
|
95
96
|
content: row.content,
|
|
96
97
|
content_hash: row.content_hash,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/memory/core/store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/memory/core/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface X25519Keypair {
|
|
2
|
+
publicKey: Uint8Array;
|
|
3
|
+
privateKey: Uint8Array;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Generate or load the user's X25519 keypair.
|
|
7
|
+
* Private key is stored encrypted with `masterKey` (XSalsa20-Poly1305).
|
|
8
|
+
* Layout: nonce(24 bytes) || ciphertext
|
|
9
|
+
*/
|
|
10
|
+
export declare function getOrCreateX25519Keypair(dataDir: string, masterKey: Uint8Array): Promise<X25519Keypair>;
|
|
11
|
+
/**
|
|
12
|
+
* Return the hex-encoded X25519 public key if it exists, or null.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getX25519PubkeyHex(dataDir: string): Promise<string | null>;
|
|
15
|
+
/**
|
|
16
|
+
* Load a workspace's team master key from disk.
|
|
17
|
+
* Returns null if the workspace key has not been stored yet.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadWorkspaceKey(dataDir: string, workspaceId: string): Promise<Uint8Array | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Unwrap a team_master_key from a crypto_box_seal ciphertext using our X25519
|
|
22
|
+
* keypair, then persist it at ~/.engram/keys/workspaces/<id>.key
|
|
23
|
+
*/
|
|
24
|
+
export declare function unwrapAndStoreWorkspaceKey(dataDir: string, workspaceId: string, wrappedHex: string, keypair: X25519Keypair): Promise<Uint8Array>;
|
|
25
|
+
/**
|
|
26
|
+
* Generate a fresh 32-byte team master key.
|
|
27
|
+
*/
|
|
28
|
+
export declare function generateWorkspaceKey(): Promise<Uint8Array>;
|
|
29
|
+
/**
|
|
30
|
+
* Wrap a team_master_key for a recipient's X25519 public key.
|
|
31
|
+
* Returns hex-encoded crypto_box_seal ciphertext (48 bytes → 96 hex chars).
|
|
32
|
+
*/
|
|
33
|
+
export declare function wrapKeyForRecipient(teamKey: Uint8Array, recipientPubkeyHex: string): Promise<string>;
|
|
34
|
+
/**
|
|
35
|
+
* Delete a workspace key from local disk (after leaving the workspace).
|
|
36
|
+
*/
|
|
37
|
+
export declare function deleteWorkspaceKey(dataDir: string, workspaceId: string): Promise<void>;
|
|
38
|
+
//# sourceMappingURL=keystore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.d.ts","sourceRoot":"","sources":["../../../../src/memory/modules/team/keystore.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,UAAU,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;CACxB;AAgBD;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,aAAa,CAAC,CAgCxB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMhF;AAID;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAQ5B;AAED;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAiBrB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,CAGhE;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,UAAU,EACnB,kBAAkB,EAAE,MAAM,GACzB,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// src/memory/modules/team/keystore.ts
|
|
2
|
+
// X25519 keypair generation + storage, and team master key management.
|
|
3
|
+
// Private key is encrypted with the user's personal master key (XSalsa20-Poly1305).
|
|
4
|
+
// Team master keys are stored at ~/.engram/keys/workspaces/<workspace_id>.key
|
|
5
|
+
import sodium from 'libsodium-wrappers';
|
|
6
|
+
import fs from 'fs/promises';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { createLogger } from '../../../logger.js';
|
|
9
|
+
const log = createLogger('team:keystore');
|
|
10
|
+
// ── Internal helpers ──────────────────────────────────────────────────────────
|
|
11
|
+
async function keysDir(dataDir) {
|
|
12
|
+
const dir = path.join(dataDir, 'keys');
|
|
13
|
+
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
14
|
+
return dir;
|
|
15
|
+
}
|
|
16
|
+
async function fileExists(p) {
|
|
17
|
+
return fs.access(p).then(() => true).catch(() => false);
|
|
18
|
+
}
|
|
19
|
+
// ── X25519 keypair ────────────────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Generate or load the user's X25519 keypair.
|
|
22
|
+
* Private key is stored encrypted with `masterKey` (XSalsa20-Poly1305).
|
|
23
|
+
* Layout: nonce(24 bytes) || ciphertext
|
|
24
|
+
*/
|
|
25
|
+
export async function getOrCreateX25519Keypair(dataDir, masterKey) {
|
|
26
|
+
await sodium.ready;
|
|
27
|
+
const dir = await keysDir(dataDir);
|
|
28
|
+
const pubPath = path.join(dir, 'x25519.pub');
|
|
29
|
+
const encPath = path.join(dir, 'x25519.enc');
|
|
30
|
+
if ((await fileExists(pubPath)) && (await fileExists(encPath))) {
|
|
31
|
+
const pubBuf = await fs.readFile(pubPath);
|
|
32
|
+
const encBuf = await fs.readFile(encPath);
|
|
33
|
+
const nonce = encBuf.subarray(0, sodium.crypto_secretbox_NONCEBYTES);
|
|
34
|
+
const ciphertext = encBuf.subarray(sodium.crypto_secretbox_NONCEBYTES);
|
|
35
|
+
const privKey = sodium.crypto_secretbox_open_easy(ciphertext, nonce, masterKey);
|
|
36
|
+
return { publicKey: new Uint8Array(pubBuf), privateKey: privKey };
|
|
37
|
+
}
|
|
38
|
+
// Generate fresh keypair
|
|
39
|
+
const kp = sodium.crypto_kx_keypair();
|
|
40
|
+
const nonce = sodium.randombytes_buf(sodium.crypto_secretbox_NONCEBYTES);
|
|
41
|
+
const encPriv = sodium.crypto_secretbox_easy(kp.privateKey, nonce, masterKey);
|
|
42
|
+
await fs.writeFile(pubPath, Buffer.from(kp.publicKey), { mode: 0o600 });
|
|
43
|
+
const encBuf = Buffer.alloc(nonce.length + encPriv.length);
|
|
44
|
+
Buffer.from(nonce).copy(encBuf, 0);
|
|
45
|
+
Buffer.from(encPriv).copy(encBuf, nonce.length);
|
|
46
|
+
await fs.writeFile(encPath, encBuf, { mode: 0o600 });
|
|
47
|
+
log.info('Generated new X25519 keypair');
|
|
48
|
+
return { publicKey: kp.publicKey, privateKey: kp.privateKey };
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Return the hex-encoded X25519 public key if it exists, or null.
|
|
52
|
+
*/
|
|
53
|
+
export async function getX25519PubkeyHex(dataDir) {
|
|
54
|
+
await sodium.ready;
|
|
55
|
+
const pubPath = path.join(await keysDir(dataDir), 'x25519.pub');
|
|
56
|
+
if (!(await fileExists(pubPath)))
|
|
57
|
+
return null;
|
|
58
|
+
const buf = await fs.readFile(pubPath);
|
|
59
|
+
return sodium.to_hex(new Uint8Array(buf));
|
|
60
|
+
}
|
|
61
|
+
// ── Team (workspace) master keys ─────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* Load a workspace's team master key from disk.
|
|
64
|
+
* Returns null if the workspace key has not been stored yet.
|
|
65
|
+
*/
|
|
66
|
+
export async function loadWorkspaceKey(dataDir, workspaceId) {
|
|
67
|
+
const p = path.join(await keysDir(dataDir), 'workspaces', `${workspaceId}.key`);
|
|
68
|
+
try {
|
|
69
|
+
const buf = await fs.readFile(p);
|
|
70
|
+
return new Uint8Array(buf);
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Unwrap a team_master_key from a crypto_box_seal ciphertext using our X25519
|
|
78
|
+
* keypair, then persist it at ~/.engram/keys/workspaces/<id>.key
|
|
79
|
+
*/
|
|
80
|
+
export async function unwrapAndStoreWorkspaceKey(dataDir, workspaceId, wrappedHex, keypair) {
|
|
81
|
+
await sodium.ready;
|
|
82
|
+
const wrapped = sodium.from_hex(wrappedHex);
|
|
83
|
+
const teamKey = sodium.crypto_box_seal_open(wrapped, keypair.publicKey, keypair.privateKey);
|
|
84
|
+
const dir = path.join(await keysDir(dataDir), 'workspaces');
|
|
85
|
+
await fs.mkdir(dir, { recursive: true, mode: 0o700 });
|
|
86
|
+
await fs.writeFile(path.join(dir, `${workspaceId}.key`), Buffer.from(teamKey), {
|
|
87
|
+
mode: 0o600,
|
|
88
|
+
});
|
|
89
|
+
log.info(`Stored workspace key for ${workspaceId}`);
|
|
90
|
+
return teamKey;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Generate a fresh 32-byte team master key.
|
|
94
|
+
*/
|
|
95
|
+
export async function generateWorkspaceKey() {
|
|
96
|
+
await sodium.ready;
|
|
97
|
+
return sodium.randombytes_buf(32);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Wrap a team_master_key for a recipient's X25519 public key.
|
|
101
|
+
* Returns hex-encoded crypto_box_seal ciphertext (48 bytes → 96 hex chars).
|
|
102
|
+
*/
|
|
103
|
+
export async function wrapKeyForRecipient(teamKey, recipientPubkeyHex) {
|
|
104
|
+
await sodium.ready;
|
|
105
|
+
const recipientPub = sodium.from_hex(recipientPubkeyHex);
|
|
106
|
+
const sealed = sodium.crypto_box_seal(teamKey, recipientPub);
|
|
107
|
+
return sodium.to_hex(sealed);
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Delete a workspace key from local disk (after leaving the workspace).
|
|
111
|
+
*/
|
|
112
|
+
export async function deleteWorkspaceKey(dataDir, workspaceId) {
|
|
113
|
+
const p = path.join(await keysDir(dataDir), 'workspaces', `${workspaceId}.key`);
|
|
114
|
+
await fs.unlink(p).catch(() => { });
|
|
115
|
+
log.info(`Deleted workspace key for ${workspaceId}`);
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=keystore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../../../src/memory/modules/team/keystore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { MCPToolDefinition } from '../../core/module-interface.js';
|
|
2
|
+
import type { EngramConfig } from '../../../config/schema.js';
|
|
3
|
+
export interface WorkspaceToolsContext {
|
|
4
|
+
config: EngramConfig;
|
|
5
|
+
masterKey: Uint8Array;
|
|
6
|
+
/** Optional: pre-resolved jwt for cloud API calls. */
|
|
7
|
+
getJwt: () => Promise<string | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildWorkspaceTools(ctx: WorkspaceToolsContext): MCPToolDefinition[];
|
|
10
|
+
//# sourceMappingURL=tools.d.ts.map
|