engram-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/CONTRIBUTING.md +65 -0
  2. package/Dockerfile +21 -0
  3. package/EVAL-FRAMEWORK.md +70 -0
  4. package/EVAL.md +127 -0
  5. package/LICENSE +17 -0
  6. package/README.md +309 -0
  7. package/ROADMAP.md +113 -0
  8. package/deploy/fly.toml +26 -0
  9. package/dist/auto-ingest.d.ts +3 -0
  10. package/dist/auto-ingest.d.ts.map +1 -0
  11. package/dist/auto-ingest.js +334 -0
  12. package/dist/auto-ingest.js.map +1 -0
  13. package/dist/brief.d.ts +45 -0
  14. package/dist/brief.d.ts.map +1 -0
  15. package/dist/brief.js +183 -0
  16. package/dist/brief.js.map +1 -0
  17. package/dist/claude-watcher.d.ts +3 -0
  18. package/dist/claude-watcher.d.ts.map +1 -0
  19. package/dist/claude-watcher.js +385 -0
  20. package/dist/claude-watcher.js.map +1 -0
  21. package/dist/cli.d.ts +3 -0
  22. package/dist/cli.d.ts.map +1 -0
  23. package/dist/cli.js +764 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/embeddings.d.ts +42 -0
  26. package/dist/embeddings.d.ts.map +1 -0
  27. package/dist/embeddings.js +145 -0
  28. package/dist/embeddings.js.map +1 -0
  29. package/dist/eval.d.ts +2 -0
  30. package/dist/eval.d.ts.map +1 -0
  31. package/dist/eval.js +281 -0
  32. package/dist/eval.js.map +1 -0
  33. package/dist/extract.d.ts +11 -0
  34. package/dist/extract.d.ts.map +1 -0
  35. package/dist/extract.js +139 -0
  36. package/dist/extract.js.map +1 -0
  37. package/dist/hosted.d.ts +3 -0
  38. package/dist/hosted.d.ts.map +1 -0
  39. package/dist/hosted.js +144 -0
  40. package/dist/hosted.js.map +1 -0
  41. package/dist/index.d.ts +11 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +7 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/ingest.d.ts +28 -0
  46. package/dist/ingest.d.ts.map +1 -0
  47. package/dist/ingest.js +192 -0
  48. package/dist/ingest.js.map +1 -0
  49. package/dist/mcp.d.ts +3 -0
  50. package/dist/mcp.d.ts.map +1 -0
  51. package/dist/mcp.js +349 -0
  52. package/dist/mcp.js.map +1 -0
  53. package/dist/server.d.ts +17 -0
  54. package/dist/server.d.ts.map +1 -0
  55. package/dist/server.js +515 -0
  56. package/dist/server.js.map +1 -0
  57. package/dist/store.d.ts +87 -0
  58. package/dist/store.d.ts.map +1 -0
  59. package/dist/store.js +548 -0
  60. package/dist/store.js.map +1 -0
  61. package/dist/types.d.ts +204 -0
  62. package/dist/types.d.ts.map +1 -0
  63. package/dist/types.js +77 -0
  64. package/dist/types.js.map +1 -0
  65. package/dist/vault.d.ts +116 -0
  66. package/dist/vault.d.ts.map +1 -0
  67. package/dist/vault.js +1234 -0
  68. package/dist/vault.js.map +1 -0
  69. package/package.json +61 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env node
2
+ // ============================================================
3
+ // Engram MCP Server — Memory tools for any MCP-compatible agent
4
+ // ============================================================
5
+ //
6
+ // Works with: Claude Code, Cursor, Windsurf, Cline, etc.
7
+ //
8
+ // Setup (Claude Code):
9
+ // Add to ~/.claude/claude_desktop_config.json:
10
+ // {
11
+ // "mcpServers": {
12
+ // "engram": {
13
+ // "command": "npx",
14
+ // "args": ["engram", "mcp"],
15
+ // "env": {
16
+ // "ENGRAM_OWNER": "my-agent",
17
+ // "GEMINI_API_KEY": "your-key-here"
18
+ // }
19
+ // }
20
+ // }
21
+ // }
22
+ //
23
+ // Or run standalone:
24
+ // ENGRAM_OWNER=my-agent npx tsx src/mcp.ts
25
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
26
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
27
+ import { z } from 'zod';
28
+ import { Vault } from './vault.js';
29
+ import { GeminiEmbeddings, OpenAIEmbeddings } from './embeddings.js';
30
+ import path from 'path';
31
+ import { homedir } from 'os';
32
+ import { readFileSync, writeFileSync, existsSync } from 'fs';
33
+ // ============================================================
34
+ // Config from environment
35
+ // ============================================================
36
+ const owner = process.env.ENGRAM_OWNER ?? 'default';
37
+ const engramDir = path.join(homedir(), '.engram');
38
+ const dbPath = process.env.ENGRAM_DB_PATH ?? path.join(engramDir, `${owner}.db`);
39
+ const geminiKey = process.env.GEMINI_API_KEY;
40
+ const openaiKey = process.env.OPENAI_API_KEY;
41
+ const anthropicKey = process.env.ANTHROPIC_API_KEY;
42
+ // Determine LLM provider
43
+ const llmProvider = process.env.ENGRAM_LLM_PROVIDER ??
44
+ (geminiKey ? 'gemini' : openaiKey ? 'openai' : anthropicKey ? 'anthropic' : undefined);
45
+ const llmKey = geminiKey ?? openaiKey ?? anthropicKey;
46
+ // ============================================================
47
+ // Initialize Vault
48
+ // ============================================================
49
+ const vaultConfig = {
50
+ owner,
51
+ dbPath,
52
+ ...(llmProvider && llmKey ? {
53
+ llm: {
54
+ provider: llmProvider,
55
+ apiKey: llmKey,
56
+ },
57
+ } : {}),
58
+ };
59
+ let embedder;
60
+ if (geminiKey) {
61
+ embedder = new GeminiEmbeddings(geminiKey);
62
+ }
63
+ else if (openaiKey) {
64
+ embedder = new OpenAIEmbeddings(openaiKey);
65
+ }
66
+ const vault = new Vault(vaultConfig, embedder);
67
+ // ============================================================
68
+ // Auto-ingest state
69
+ // ============================================================
70
+ const INGEST_STATE_PATH = path.join(homedir(), '.config', 'engram', 'ingest-state.json');
71
+ function loadIngestState() {
72
+ if (existsSync(INGEST_STATE_PATH)) {
73
+ return JSON.parse(readFileSync(INGEST_STATE_PATH, 'utf-8'));
74
+ }
75
+ return { lastIngestedLine: {}, lastRunAt: new Date(0).toISOString(), totalMemoriesCreated: 0, totalRunCount: 0 };
76
+ }
77
+ function saveIngestState(state) {
78
+ const dir = path.dirname(INGEST_STATE_PATH);
79
+ if (!existsSync(dir)) {
80
+ const { mkdirSync } = require('fs');
81
+ mkdirSync(dir, { recursive: true });
82
+ }
83
+ writeFileSync(INGEST_STATE_PATH, JSON.stringify(state, null, 2));
84
+ }
85
+ // ============================================================
86
+ // Create MCP Server
87
+ // ============================================================
88
+ const server = new McpServer({
89
+ name: 'engram',
90
+ version: '0.1.0',
91
+ });
92
+ // ============================================================
93
+ // Tool: remember
94
+ // ============================================================
95
+ server.tool('engram_remember', 'Store a memory in the Engram vault. Auto-extracts entities and topics if not provided.', {
96
+ content: z.string().describe('The memory content — a clear statement worth remembering'),
97
+ type: z.enum(['episodic', 'semantic', 'procedural']).optional().describe('Memory type: episodic (events), semantic (facts), procedural (how-to)'),
98
+ entities: z.array(z.string()).optional().describe('People, projects, tools, places mentioned'),
99
+ topics: z.array(z.string()).optional().describe('Topic tags'),
100
+ salience: z.number().min(0).max(1).optional().describe('Importance 0-1 (default 0.5)'),
101
+ status: z.enum(['active', 'pending', 'fulfilled', 'superseded', 'archived']).optional().describe('Memory lifecycle status'),
102
+ }, async (args) => {
103
+ const memory = vault.remember({
104
+ content: args.content,
105
+ type: args.type,
106
+ entities: args.entities,
107
+ topics: args.topics,
108
+ salience: args.salience,
109
+ status: args.status,
110
+ });
111
+ // Compute embedding async
112
+ if (embedder) {
113
+ vault.computeAndStoreEmbedding(memory.id, memory.content).catch(() => { });
114
+ }
115
+ return {
116
+ content: [{
117
+ type: 'text',
118
+ text: JSON.stringify({
119
+ stored: true,
120
+ id: memory.id,
121
+ entities: memory.entities,
122
+ topics: memory.topics,
123
+ salience: memory.salience,
124
+ status: memory.status,
125
+ }, null, 2),
126
+ }],
127
+ };
128
+ });
129
+ // ============================================================
130
+ // Tool: recall
131
+ // ============================================================
132
+ server.tool('engram_recall', 'Recall relevant memories from the Engram vault. Uses semantic search when embeddings are available.', {
133
+ context: z.string().describe('What you want to remember — a question or topic'),
134
+ entities: z.array(z.string()).optional().describe('Filter by specific entities'),
135
+ topics: z.array(z.string()).optional().describe('Filter by topics'),
136
+ limit: z.number().int().min(1).max(50).optional().describe('Max results (default 10)'),
137
+ }, async (args) => {
138
+ const memories = await vault.recall({
139
+ context: args.context,
140
+ entities: args.entities,
141
+ topics: args.topics,
142
+ limit: args.limit ?? 10,
143
+ });
144
+ if (memories.length === 0) {
145
+ return { content: [{ type: 'text', text: 'No relevant memories found.' }] };
146
+ }
147
+ const formatted = memories.map((m, i) => `[${i + 1}] (${m.type}, salience=${m.salience.toFixed(2)}, status=${m.status})\n${m.content}\nEntities: ${m.entities.join(', ') || 'none'} | Topics: ${m.topics.join(', ') || 'none'}`).join('\n\n');
148
+ return {
149
+ content: [{
150
+ type: 'text',
151
+ text: `Found ${memories.length} memories:\n\n${formatted}`,
152
+ }],
153
+ };
154
+ });
155
+ // ============================================================
156
+ // Tool: forget
157
+ // ============================================================
158
+ server.tool('engram_forget', 'Forget a memory. Soft forget reduces salience to 0; hard forget permanently deletes.', {
159
+ id: z.string().describe('Memory ID to forget'),
160
+ hard: z.boolean().optional().describe('Permanently delete (default: soft forget)'),
161
+ }, async (args) => {
162
+ vault.forget(args.id, args.hard ?? false);
163
+ return {
164
+ content: [{ type: 'text', text: `Memory ${args.id} ${args.hard ? 'permanently deleted' : 'soft forgotten (salience → 0)'}.` }],
165
+ };
166
+ });
167
+ // ============================================================
168
+ // Tool: consolidate
169
+ // ============================================================
170
+ server.tool('engram_consolidate', 'Run the consolidation engine — distills recent episodes into semantic knowledge, discovers entities, finds contradictions, forms connections.', {}, async () => {
171
+ const report = await vault.consolidate();
172
+ return {
173
+ content: [{
174
+ type: 'text',
175
+ text: JSON.stringify(report, null, 2),
176
+ }],
177
+ };
178
+ });
179
+ // ============================================================
180
+ // Tool: connect
181
+ // ============================================================
182
+ server.tool('engram_connect', 'Create a relationship between two memories in the knowledge graph.', {
183
+ sourceId: z.string().describe('Source memory ID'),
184
+ targetId: z.string().describe('Target memory ID'),
185
+ type: z.enum([
186
+ 'supports', 'contradicts', 'elaborates', 'supersedes',
187
+ 'causes', 'caused_by', 'part_of', 'instance_of',
188
+ 'associated_with', 'temporal_next', 'derived_from',
189
+ ]).describe('Relationship type'),
190
+ strength: z.number().min(0).max(1).optional().describe('Connection strength 0-1'),
191
+ }, async (args) => {
192
+ const edge = vault.connect(args.sourceId, args.targetId, args.type, args.strength);
193
+ return {
194
+ content: [{ type: 'text', text: `Connected: ${args.sourceId} —[${args.type}]→ ${args.targetId} (strength: ${edge.strength})` }],
195
+ };
196
+ });
197
+ // ============================================================
198
+ // Tool: stats
199
+ // ============================================================
200
+ server.tool('engram_stats', 'Get vault statistics — memory counts by type, entity count, etc.', {}, async () => {
201
+ const stats = vault.stats();
202
+ const entities = vault.entities();
203
+ return {
204
+ content: [{
205
+ type: 'text',
206
+ text: JSON.stringify({
207
+ ...stats,
208
+ topEntities: entities.slice(0, 10).map(e => ({ name: e.name, memories: e.memoryCount })),
209
+ }, null, 2),
210
+ }],
211
+ };
212
+ });
213
+ // ============================================================
214
+ // Tool: ingest
215
+ // ============================================================
216
+ server.tool('engram_ingest', 'Auto-ingest a conversation transcript or raw text. Extracts structured memories using LLM.', {
217
+ text: z.string().describe('Raw conversation text or transcript to ingest'),
218
+ humanName: z.string().optional().describe('Name of the human in the conversation'),
219
+ }, async (args) => {
220
+ if (!geminiKey) {
221
+ // Simple mode: just remember with auto-extraction
222
+ const memory = vault.remember({ content: args.text });
223
+ return { content: [{ type: 'text', text: `Stored 1 memory (simple mode — set GEMINI_API_KEY for LLM extraction).` }] };
224
+ }
225
+ // LLM extraction
226
+ const prompt = `You are a memory extraction engine. Analyze this text and extract structured memories.
227
+
228
+ TEXT:
229
+ ${args.text.slice(0, 4000)}
230
+
231
+ Extract memories worth keeping long-term. For each:
232
+ - content: Clear standalone statement
233
+ - type: "episodic", "semantic", or "procedural"
234
+ - entities: People, projects, tools mentioned
235
+ - topics: Topic tags
236
+ - salience: 0.0-1.0
237
+ - status: "active" or "pending" (for commitments)
238
+
239
+ Be selective. Skip trivial content.
240
+
241
+ JSON: {"memories": [{"content":"...","type":"...","entities":["..."],"topics":["..."],"salience":0.5,"status":"active"}]}
242
+ If nothing worth remembering: {"memories": []}`;
243
+ try {
244
+ const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${geminiKey}`, {
245
+ method: 'POST',
246
+ headers: { 'Content-Type': 'application/json' },
247
+ body: JSON.stringify({
248
+ contents: [{ parts: [{ text: prompt }] }],
249
+ generationConfig: { responseMimeType: 'application/json', maxOutputTokens: 2048 },
250
+ }),
251
+ });
252
+ if (!response.ok) {
253
+ const memory = vault.remember({ content: args.text });
254
+ return { content: [{ type: 'text', text: `LLM unavailable, stored 1 raw memory as fallback.` }] };
255
+ }
256
+ const data = await response.json();
257
+ const text = data.candidates?.[0]?.content?.parts?.[0]?.text ?? '{}';
258
+ const parsed = JSON.parse(text);
259
+ let created = 0;
260
+ for (const mem of parsed.memories ?? []) {
261
+ if (mem.salience < 0.2)
262
+ continue;
263
+ // Security filter
264
+ if (/(?:sk-|api[_-]?key|password|token|secret)[:\s=]+\S{10,}/i.test(mem.content))
265
+ continue;
266
+ if (/AIza[a-zA-Z0-9_-]{30,}/.test(mem.content))
267
+ continue;
268
+ vault.remember({
269
+ content: mem.content,
270
+ type: mem.type ?? 'episodic',
271
+ entities: mem.entities ?? [],
272
+ topics: [...(mem.topics ?? []), 'auto-ingested'],
273
+ salience: mem.salience ?? 0.5,
274
+ status: mem.status ?? 'active',
275
+ });
276
+ created++;
277
+ }
278
+ return { content: [{ type: 'text', text: `Extracted ${created} memories from text.` }] };
279
+ }
280
+ catch (err) {
281
+ const memory = vault.remember({ content: args.text });
282
+ return { content: [{ type: 'text', text: `LLM error, stored 1 raw memory as fallback.` }] };
283
+ }
284
+ });
285
+ // ============================================================
286
+ // Tool: surface
287
+ // ============================================================
288
+ server.tool('engram_surface', 'Proactive memory surfacing — send current context and get back memories you SHOULD know about right now. Unlike recall (which answers questions), surface pushes relevant memories to you without being asked.', {
289
+ context: z.string().describe('What is happening right now — current conversation, task, or situation'),
290
+ activeEntities: z.array(z.string()).optional().describe('People, projects, tools currently active in conversation'),
291
+ activeTopics: z.array(z.string()).optional().describe('Topics currently being discussed'),
292
+ seen: z.array(z.string()).optional().describe('Memory IDs already seen this session (to avoid repeats)'),
293
+ }, async (args) => {
294
+ const results = await vault.surface({
295
+ context: args.context,
296
+ activeEntities: args.activeEntities,
297
+ activeTopics: args.activeTopics,
298
+ seen: args.seen,
299
+ });
300
+ if (results.length === 0) {
301
+ return { content: [{ type: 'text', text: 'No proactive memories to surface right now.' }] };
302
+ }
303
+ const formatted = results.map((r, i) => `[${i + 1}] (relevance: ${r.relevance.toFixed(2)}) ${r.memory.content}\n Why: ${r.reason}\n Path: ${r.activationPath}`).join('\n\n');
304
+ return {
305
+ content: [{
306
+ type: 'text',
307
+ text: `💡 ${results.length} memories surfaced:\n\n${formatted}`,
308
+ }],
309
+ };
310
+ });
311
+ // ============================================================
312
+ // Tool: briefing
313
+ // ============================================================
314
+ server.tool('engram_briefing', 'Get a structured session briefing — key facts, pending commitments, recent activity, and contradictions. Use at session start instead of reading flat memory files.', {
315
+ context: z.string().optional().describe('Optional context to focus the briefing on'),
316
+ }, async (args) => {
317
+ const briefing = await vault.briefing(args.context ?? '');
318
+ return {
319
+ content: [{
320
+ type: 'text',
321
+ text: JSON.stringify(briefing, null, 2),
322
+ }],
323
+ };
324
+ });
325
+ // ============================================================
326
+ // Tool: entities
327
+ // ============================================================
328
+ server.tool('engram_entities', 'List all tracked entities (people, projects, concepts) with memory counts.', {}, async () => {
329
+ const entities = vault.entities();
330
+ if (entities.length === 0) {
331
+ return { content: [{ type: 'text', text: 'No entities tracked yet.' }] };
332
+ }
333
+ const formatted = entities.map(e => `${e.name} (${e.type}, ${e.memoryCount} memories, importance: ${e.importance.toFixed(2)})`).join('\n');
334
+ return { content: [{ type: 'text', text: `${entities.length} entities:\n${formatted}` }] };
335
+ });
336
+ // ============================================================
337
+ // Start server
338
+ // ============================================================
339
+ async function main() {
340
+ const transport = new StdioServerTransport();
341
+ await server.connect(transport);
342
+ console.error(`🧠 Engram MCP server running (owner: ${owner}, db: ${dbPath})`);
343
+ if (embedder)
344
+ console.error(` Embeddings: ${geminiKey ? 'Gemini' : 'OpenAI'}`);
345
+ if (llmProvider)
346
+ console.error(` LLM: ${llmProvider} (consolidation enabled)`);
347
+ }
348
+ main().catch(console.error);
349
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env node
2
+ import type { VaultConfig } from './types.js';
3
+ interface ServerConfig {
4
+ port?: number;
5
+ host?: string;
6
+ /** Map of API key → vault config. Each key gets its own vault. */
7
+ vaults: Record<string, VaultConfig>;
8
+ /** Default vault config for single-tenant mode */
9
+ defaultVault?: VaultConfig;
10
+ }
11
+ export declare function createEngramServer(config: ServerConfig): {
12
+ listen: () => Promise<void>;
13
+ close: () => Promise<void>;
14
+ server: import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
15
+ };
16
+ export {};
17
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAO9C,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACpC,kDAAkD;IAClD,YAAY,CAAC,EAAE,WAAW,CAAC;CAC5B;AAkaD,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,YAAY;;;;EAwGtD"}