@cartisien/engram 0.1.0 → 0.3.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # Engram
2
2
 
3
- > **Persistent memory for AI assistants.**
3
+ > **Persistent semantic memory for AI agents.**
4
4
 
5
5
  ```typescript
6
6
  import { Engram } from '@cartisien/engram';
@@ -8,11 +8,11 @@ import { Engram } from '@cartisien/engram';
8
8
  const memory = new Engram({ dbPath: './memory.db' });
9
9
 
10
10
  // Store
11
- await memory.remember('user_123', 'I ride a Triumph Bonneville', 'user');
11
+ await memory.remember('user_123', 'User prefers TypeScript and dark mode', 'user');
12
12
 
13
- // Recall
14
- const context = await memory.recall('user_123', 'What motorcycle?', 5);
15
- // [{ role: 'user', content: 'I ride a Triumph Bonneville', ... }]
13
+ // Recall semantically — finds the right memory even without exact keyword match
14
+ const context = await memory.recall('user_123', 'what are the user\'s preferences?', 5);
15
+ // [{ content: 'User prefers TypeScript and dark mode', similarity: 0.82, ... }]
16
16
  ```
17
17
 
18
18
  ---
@@ -21,15 +21,16 @@ const context = await memory.recall('user_123', 'What motorcycle?', 5);
21
21
 
22
22
  AI assistants are amnesiacs. Every conversation starts fresh. Context windows fill up. Important details get lost.
23
23
 
24
- You wouldn't hire an employee who forgot every meeting. Why accept it from your AI?
24
+ Stuffing everything into the system prompt wastes tokens and still misses things. You need a retrieval layer — not a dump.
25
25
 
26
26
  ## The Solution
27
27
 
28
- Engram gives your assistants **persistent, queryable memory** — backed by SQLite, designed for simplicity.
28
+ Engram gives your agents **persistent, semantically searchable memory** — SQLite-backed, TypeScript-first, zero config.
29
29
 
30
- - **Zero config:** Works out of the box
31
- - **Fast:** SQLite with proper indexes
32
- - **Portable:** Single file database
30
+ - **Semantic search:** Finds relevant memories by meaning, not just keywords (via local Ollama embeddings)
31
+ - **Zero config:** Works out of the box, falls back to keyword search without Ollama
32
+ - **Local-first:** Your data stays on your machine. No API keys, no cloud required
33
+ - **MCP-native:** Drop into Claude Desktop or Cursor via [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp)
33
34
  - **Typed:** Full TypeScript support
34
35
 
35
36
  ## Installation
@@ -38,32 +39,41 @@ Engram gives your assistants **persistent, queryable memory** — backed by SQLi
38
39
  npm install @cartisien/engram
39
40
  ```
40
41
 
42
+ ### Optional: Local Embeddings (Recommended)
43
+
44
+ For semantic search, install [Ollama](https://ollama.ai) and pull the embedding model:
45
+
46
+ ```bash
47
+ ollama pull nomic-embed-text
48
+ ```
49
+
50
+ Without Ollama, Engram falls back to keyword search automatically.
51
+
41
52
  ## Quick Start
42
53
 
43
54
  ```typescript
44
55
  import { Engram } from '@cartisien/engram';
45
56
 
46
57
  const memory = new Engram({
47
- dbPath: './bot-memory.db' // or ':memory:' for ephemeral
58
+ dbPath: './bot-memory.db',
59
+ embeddingUrl: 'http://localhost:11434', // Ollama default
48
60
  });
49
61
 
50
- // In your chat handler
51
- async function handleChat(sessionId: string, message: string) {
52
- // 1. Store the user's message
53
- await memory.remember(sessionId, message, 'user');
54
-
55
- // 2. Retrieve relevant context
62
+ // In your agent/chat handler
63
+ async function handleMessage(sessionId: string, message: string) {
64
+ // 1. Recall relevant context semantically
56
65
  const context = await memory.recall(sessionId, message, 5);
57
-
58
- // 3. Build prompt with memory
66
+
67
+ // 2. Build prompt with memory
59
68
  const prompt = buildPrompt(context, message);
60
-
61
- // 4. Get AI response
62
- const response = await openai.chat.completions.create({ messages: prompt });
63
-
64
- // 5. Store the response
65
- await memory.remember(sessionId, response.choices[0].message.content, 'assistant');
66
-
69
+
70
+ // 3. Get AI response
71
+ const response = await llm.chat(prompt);
72
+
73
+ // 4. Store both sides
74
+ await memory.remember(sessionId, message, 'user');
75
+ await memory.remember(sessionId, response, 'assistant');
76
+
67
77
  return response;
68
78
  }
69
79
  ```
@@ -72,43 +82,36 @@ async function handleChat(sessionId: string, message: string) {
72
82
 
73
83
  ### `new Engram(config?)`
74
84
 
75
- Create a memory instance.
76
-
77
85
  ```typescript
78
86
  const memory = new Engram({
79
- dbPath: './memory.db', // Database file path
80
- maxContextLength: 4000 // Max characters per entry
87
+ dbPath: './memory.db', // SQLite file path (default: ':memory:')
88
+ maxContextLength: 4000, // Max chars per entry (default: 4000)
89
+ embeddingUrl: 'http://localhost:11434', // Ollama base URL
90
+ embeddingModel: 'nomic-embed-text', // Embedding model
91
+ semanticSearch: true, // Enable semantic search (default: true)
81
92
  });
82
93
  ```
83
94
 
84
95
  ### `remember(sessionId, content, role?, metadata?)`
85
96
 
86
- Store a memory entry.
97
+ Store a memory. Embedding is generated automatically.
87
98
 
88
99
  ```typescript
89
- await memory.remember('session_abc', 'User loves Thai food', 'user', {
90
- source: 'preference_extraction'
91
- });
100
+ await memory.remember('session_abc', 'User loves Thai food', 'user');
92
101
  ```
93
102
 
94
103
  ### `recall(sessionId, query?, limit?, options?)`
95
104
 
96
- Retrieve memories for a session.
105
+ Retrieve relevant memories. Uses semantic search when available, keyword fallback otherwise. Returns entries sorted by similarity score.
97
106
 
98
107
  ```typescript
99
- // Recent memories
100
- const recent = await memory.recall('session_abc', undefined, 10);
101
-
102
- // Keyword search
103
- const relevant = await memory.recall('session_abc', 'food preferences', 5);
104
-
105
- // Filtered
106
- const userOnly = await memory.recall('session_abc', undefined, 10, { role: 'user' });
108
+ const results = await memory.recall('session_abc', 'food preferences', 5);
109
+ // [{ content: '...', similarity: 0.84, ... }]
107
110
  ```
108
111
 
109
112
  ### `history(sessionId, limit?)`
110
113
 
111
- Get chronological conversation history.
114
+ Chronological conversation history.
112
115
 
113
116
  ```typescript
114
117
  const chat = await memory.history('session_abc', 20);
@@ -119,56 +122,69 @@ const chat = await memory.history('session_abc', 20);
119
122
  Delete memories.
120
123
 
121
124
  ```typescript
122
- // Delete all for session
123
- await memory.forget('session_abc');
124
-
125
- // Delete specific entry
126
- await memory.forget('session_abc', { id: 'entry_id' });
127
-
128
- // Delete old entries
129
- await memory.forget('session_abc', { before: new Date('2024-01-01') });
125
+ await memory.forget('session_abc'); // all
126
+ await memory.forget('session_abc', { id: 'entry_id' }); // one
127
+ await memory.forget('session_abc', { before: new Date() }); // old entries
130
128
  ```
131
129
 
132
130
  ### `stats(sessionId)`
133
131
 
134
- Get memory statistics.
135
-
136
132
  ```typescript
137
133
  const stats = await memory.stats('session_abc');
138
- // { total: 42, byRole: { user: 21, assistant: 21 }, ... }
134
+ // { total: 42, byRole: { user: 21, assistant: 21 }, withEmbeddings: 42, ... }
135
+ ```
136
+
137
+ ## MCP Server
138
+
139
+ Use Engram directly in Claude Desktop, Cursor, or any MCP client:
140
+
141
+ ```bash
142
+ npx -y @cartisien/engram-mcp
139
143
  ```
140
144
 
145
+ ```json
146
+ {
147
+ "mcpServers": {
148
+ "engram": {
149
+ "command": "npx",
150
+ "args": ["-y", "@cartisien/engram-mcp"]
151
+ }
152
+ }
153
+ }
154
+ ```
155
+
156
+ → [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp) on GitHub
157
+
141
158
  ## Philosophy
142
159
 
143
- > *"The trace precedes presence."* — Derrida
160
+ > *"The trace precedes presence."*
144
161
 
145
162
  Memory isn't storage. It's the substrate of self.
146
163
 
147
- Engram doesn't just persist data. It gives your assistants **continuity** the ability to learn, reference, and grow across conversations. The Cartesian cogito assumed memory was given. We're making it so.
164
+ Engram doesn't just persist data it gives your agents **continuity**. The ability to learn, reference, and grow across conversations.
148
165
 
149
166
  ## Roadmap
150
167
 
151
168
  - **v0.1** ✅ SQLite persistence, keyword search
152
- - **v0.2** 🚧 Semantic search with embeddings
153
- - **v0.3** 📋 Multi-session context, memory consolidation
154
- - **v0.4** 📋 Cloud sync, distributed memory
155
-
156
- ## The Trilogy
169
+ - **v0.2** Semantic search via local Ollama embeddings
170
+ - **v0.3** 🚧 Graph memory — entity relationships, connected context
171
+ - **v0.4** 📋 Memory consolidation, long-term summarization
157
172
 
158
- Engram is part of the **Cartisien Memory Suite**:
173
+ ## The Cartisien Memory Suite
159
174
 
160
175
  | Package | Purpose |
161
176
  |---------|---------|
162
- | `@cartisien/engram` | **This package**persistent memory SDK |
163
- | `@cartisien/extensa` | Vector infrastructure (coming soon) |
164
- | `@cartisien/cogito` | Identity & state management (coming soon) |
177
+ | [`@cartisien/engram`](https://github.com/Cartisien/engram) | Persistent memory SDK **this package** |
178
+ | [`@cartisien/engram-mcp`](https://github.com/Cartisien/engram-mcp) | MCP server for Claude Desktop / Cursor |
179
+ | `@cartisien/extensa` | Vector infrastructure *(coming soon)* |
180
+ | `@cartisien/cogito` | Agent identity & lifecycle *(coming soon)* |
165
181
 
166
182
  *Res cogitans meets res extensa.*
167
183
 
168
184
  ## License
169
185
 
170
- MIT © Cartisien Interactive
186
+ MIT © [Cartisien Interactive](https://cartisien.com)
171
187
 
172
188
  ---
173
189
 
174
- **Built with 🖤 by people who think forgetting is a bug.**
190
+ **Built for people who think forgetting is a bug.**
package/dist/index.d.ts CHANGED
@@ -5,34 +5,60 @@ export interface MemoryEntry {
5
5
  role: 'user' | 'assistant' | 'system';
6
6
  timestamp: Date;
7
7
  metadata?: Record<string, unknown>;
8
+ similarity?: number;
9
+ }
10
+ export interface GraphNode {
11
+ entity: string;
12
+ type?: string;
13
+ }
14
+ export interface GraphEdge {
15
+ from: string;
16
+ relation: string;
17
+ to: string;
18
+ confidence?: number;
19
+ }
20
+ export interface GraphResult {
21
+ entity: string;
22
+ relationships: Array<{
23
+ type: 'outgoing' | 'incoming';
24
+ relation: string;
25
+ target: string;
26
+ confidence?: number;
27
+ }>;
28
+ relatedMemories: MemoryEntry[];
8
29
  }
9
30
  export interface RecallOptions {
10
31
  limit?: number;
11
32
  before?: Date;
12
33
  after?: Date;
13
34
  role?: 'user' | 'assistant' | 'system';
35
+ includeGraph?: boolean;
14
36
  }
15
37
  export interface EngramConfig {
16
38
  dbPath?: string;
17
39
  maxContextLength?: number;
40
+ embeddingUrl?: string;
41
+ embeddingModel?: string;
42
+ semanticSearch?: boolean;
43
+ graphMemory?: boolean;
44
+ graphModel?: string;
18
45
  }
19
46
  /**
20
- * Engram - Persistent memory for AI assistants
47
+ * Engram - Persistent semantic memory for AI agents
21
48
  *
22
- * A lightweight, SQLite-backed memory system that gives your AI assistants
23
- * the ability to remember conversations across sessions.
49
+ * v0.3 adds graph memory entity relationships extracted from memories
50
+ * using a local LLM, enabling richer contextual recall.
24
51
  *
25
52
  * @example
26
53
  * ```typescript
27
54
  * import { Engram } from '@cartisien/engram';
28
55
  *
29
- * const memory = new Engram({ dbPath: './memory.db' });
30
- *
31
- * // Store a memory
32
- * await memory.remember('user_123', 'Jeff loves Triumph motorcycles', 'user');
56
+ * const memory = new Engram({ dbPath: './memory.db', graphMemory: true });
33
57
  *
34
- * // Retrieve relevant memories
35
- * const context = await memory.recall('user_123', 'What does Jeff like?', 3);
58
+ * await memory.remember('session_1', 'Jeff is building GovScout in React 19', 'user');
59
+ * const context = await memory.recall('session_1', 'what is Jeff building?', 5);
60
+ * const graph = await memory.graph('session_1', 'GovScout');
61
+ * // → { entity: 'GovScout', relationships: [{ relation: 'built_with', target: 'React 19' }], ... }
36
62
  * ```
37
63
  */
38
64
  export declare class Engram {
@@ -40,42 +66,72 @@ export declare class Engram {
40
66
  private maxContextLength;
41
67
  private dbPath;
42
68
  private initialized;
69
+ private embeddingUrl;
70
+ private embeddingModel;
71
+ private semanticSearch;
72
+ private graphMemory;
73
+ private graphModel;
43
74
  constructor(config?: EngramConfig);
44
75
  private init;
76
+ /**
77
+ * Fetch embedding vector from Ollama
78
+ */
79
+ private embed;
80
+ /**
81
+ * Extract entity-relationship triples from text using a local LLM
82
+ */
83
+ private extractGraph;
84
+ /**
85
+ * Upsert a graph node
86
+ */
87
+ private upsertNode;
88
+ /**
89
+ * Store a graph edge
90
+ */
91
+ private storeEdge;
92
+ /**
93
+ * Cosine similarity between two vectors
94
+ */
95
+ private cosineSimilarity;
45
96
  /**
46
97
  * Store a memory entry
47
98
  */
48
99
  remember(sessionId: string, content: string, role?: 'user' | 'assistant' | 'system', metadata?: Record<string, unknown>): Promise<MemoryEntry>;
49
100
  /**
50
- * Recall memories for a session
51
- *
52
- * Simple keyword-based retrieval for v0.1.
53
- * Semantic search coming in v0.2.
101
+ * Recall memories with optional graph traversal
54
102
  */
55
103
  recall(sessionId: string, query?: string, limit?: number, options?: RecallOptions): Promise<MemoryEntry[]>;
56
104
  /**
57
- * Get recent conversation history for a session
105
+ * Augment recall results with graph-connected memories
106
+ */
107
+ private augmentWithGraph;
108
+ /**
109
+ * v0.3: Query the knowledge graph for an entity
110
+ */
111
+ graph(sessionId: string, entity: string): Promise<GraphResult>;
112
+ /**
113
+ * Get recent conversation history
58
114
  */
59
115
  history(sessionId: string, limit?: number): Promise<MemoryEntry[]>;
60
116
  /**
61
- * Forget (delete) memories
117
+ * Delete memories
62
118
  */
63
119
  forget(sessionId: string, options?: {
64
120
  before?: Date;
65
121
  id?: string;
66
122
  }): Promise<number>;
67
123
  /**
68
- * Get memory statistics for a session
124
+ * Memory statistics
69
125
  */
70
126
  stats(sessionId: string): Promise<{
71
127
  total: number;
72
128
  byRole: Record<string, number>;
73
129
  oldest: Date | null;
74
130
  newest: Date | null;
131
+ withEmbeddings: number;
132
+ graphNodes?: number;
133
+ graphEdges?: number;
75
134
  }>;
76
- /**
77
- * Close the database connection
78
- */
79
135
  close(): Promise<void>;
80
136
  }
81
137
  export default Engram;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,IAAI,CAAC;IACd,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,GAAE,YAAiB;YAKvB,IAAI;IAuClB;;OAEG;IACG,QAAQ,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAM,GAAG,WAAW,GAAG,QAAiB,EAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,WAAW,CAAC;IAuCvB;;;;;OAKG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,EAClB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,WAAW,EAAE,CAAC;IAiDzB;;OAEG;IACG,OAAO,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC;IAIzB;;OAEG;IACG,MAAM,CACV,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,IAAI,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GACvC,OAAO,CAAC,MAAM,CAAC;IAuBlB;;OAEG;IACG,KAAK,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC/B,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;KACrB,CAAC;IA+BF;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3,22 +3,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Engram = void 0;
4
4
  const crypto_1 = require("crypto");
5
5
  /**
6
- * Engram - Persistent memory for AI assistants
6
+ * Engram - Persistent semantic memory for AI agents
7
7
  *
8
- * A lightweight, SQLite-backed memory system that gives your AI assistants
9
- * the ability to remember conversations across sessions.
8
+ * v0.3 adds graph memory entity relationships extracted from memories
9
+ * using a local LLM, enabling richer contextual recall.
10
10
  *
11
11
  * @example
12
12
  * ```typescript
13
13
  * import { Engram } from '@cartisien/engram';
14
14
  *
15
- * const memory = new Engram({ dbPath: './memory.db' });
15
+ * const memory = new Engram({ dbPath: './memory.db', graphMemory: true });
16
16
  *
17
- * // Store a memory
18
- * await memory.remember('user_123', 'Jeff loves Triumph motorcycles', 'user');
19
- *
20
- * // Retrieve relevant memories
21
- * const context = await memory.recall('user_123', 'What does Jeff like?', 3);
17
+ * await memory.remember('session_1', 'Jeff is building GovScout in React 19', 'user');
18
+ * const context = await memory.recall('session_1', 'what is Jeff building?', 5);
19
+ * const graph = await memory.graph('session_1', 'GovScout');
20
+ * // { entity: 'GovScout', relationships: [{ relation: 'built_with', target: 'React 19' }], ... }
22
21
  * ```
23
22
  */
24
23
  class Engram {
@@ -26,9 +25,19 @@ class Engram {
26
25
  maxContextLength;
27
26
  dbPath;
28
27
  initialized = false;
28
+ embeddingUrl;
29
+ embeddingModel;
30
+ semanticSearch;
31
+ graphMemory;
32
+ graphModel;
29
33
  constructor(config = {}) {
30
34
  this.dbPath = config.dbPath || ':memory:';
31
35
  this.maxContextLength = config.maxContextLength || 4000;
36
+ this.embeddingUrl = config.embeddingUrl || 'http://192.168.68.73:11434';
37
+ this.embeddingModel = config.embeddingModel || 'nomic-embed-text';
38
+ this.semanticSearch = config.semanticSearch !== false;
39
+ this.graphMemory = config.graphMemory === true;
40
+ this.graphModel = config.graphModel || 'qwen2.5:32b';
32
41
  }
33
42
  async init() {
34
43
  if (this.initialized)
@@ -39,7 +48,7 @@ class Engram {
39
48
  filename: this.dbPath,
40
49
  driver: sqlite3.Database
41
50
  });
42
- // Create memories table
51
+ // Memories table
43
52
  await this.db.exec(`
44
53
  CREATE TABLE IF NOT EXISTS memories (
45
54
  id TEXT PRIMARY KEY,
@@ -48,21 +57,146 @@ class Engram {
48
57
  role TEXT CHECK(role IN ('user', 'assistant', 'system')),
49
58
  timestamp INTEGER NOT NULL,
50
59
  metadata TEXT,
51
- content_hash TEXT NOT NULL
60
+ content_hash TEXT NOT NULL,
61
+ embedding TEXT
52
62
  );
53
63
  `);
54
- // Create index for fast session lookups
64
+ // Add embedding column if upgrading from v0.1
65
+ try {
66
+ await this.db.exec(`ALTER TABLE memories ADD COLUMN embedding TEXT`);
67
+ }
68
+ catch { /* already exists */ }
69
+ // v0.3: Graph tables
55
70
  await this.db.exec(`
56
- CREATE INDEX IF NOT EXISTS idx_session_timestamp
57
- ON memories(session_id, timestamp DESC);
71
+ CREATE TABLE IF NOT EXISTS graph_nodes (
72
+ id TEXT PRIMARY KEY,
73
+ session_id TEXT NOT NULL,
74
+ entity TEXT NOT NULL,
75
+ type TEXT,
76
+ created_at INTEGER NOT NULL
77
+ );
78
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_node_entity
79
+ ON graph_nodes(session_id, entity);
58
80
  `);
59
- // Create index for content search
60
81
  await this.db.exec(`
61
- CREATE INDEX IF NOT EXISTS idx_content
62
- ON memories(content);
82
+ CREATE TABLE IF NOT EXISTS graph_edges (
83
+ id TEXT PRIMARY KEY,
84
+ session_id TEXT NOT NULL,
85
+ from_entity TEXT NOT NULL,
86
+ relation TEXT NOT NULL,
87
+ to_entity TEXT NOT NULL,
88
+ confidence REAL DEFAULT 1.0,
89
+ memory_id TEXT,
90
+ created_at INTEGER NOT NULL
91
+ );
92
+ CREATE INDEX IF NOT EXISTS idx_edge_from
93
+ ON graph_edges(session_id, from_entity);
94
+ CREATE INDEX IF NOT EXISTS idx_edge_to
95
+ ON graph_edges(session_id, to_entity);
96
+ `);
97
+ await this.db.exec(`
98
+ CREATE INDEX IF NOT EXISTS idx_session_timestamp
99
+ ON memories(session_id, timestamp DESC);
63
100
  `);
64
101
  this.initialized = true;
65
102
  }
103
+ /**
104
+ * Fetch embedding vector from Ollama
105
+ */
106
+ async embed(text) {
107
+ try {
108
+ const response = await fetch(`${this.embeddingUrl}/api/embeddings`, {
109
+ method: 'POST',
110
+ headers: { 'Content-Type': 'application/json' },
111
+ body: JSON.stringify({ model: this.embeddingModel, prompt: text }),
112
+ signal: AbortSignal.timeout(5000)
113
+ });
114
+ if (!response.ok)
115
+ return null;
116
+ const data = await response.json();
117
+ return data.embedding ?? null;
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * Extract entity-relationship triples from text using a local LLM
125
+ */
126
+ async extractGraph(text) {
127
+ const prompt = `Extract entity-relationship triples from this text. Return ONLY a JSON array of objects with keys: "from", "relation", "to". Be concise. Max 5 triples. If nothing to extract, return [].
128
+
129
+ Text: "${text}"
130
+
131
+ JSON array:`;
132
+ try {
133
+ const response = await fetch(`${this.embeddingUrl}/api/generate`, {
134
+ method: 'POST',
135
+ headers: { 'Content-Type': 'application/json' },
136
+ body: JSON.stringify({
137
+ model: this.graphModel,
138
+ prompt,
139
+ stream: false,
140
+ options: { temperature: 0, num_predict: 200 }
141
+ }),
142
+ signal: AbortSignal.timeout(15000)
143
+ });
144
+ if (!response.ok)
145
+ return [];
146
+ const data = await response.json();
147
+ const raw = data.response.trim();
148
+ // Extract JSON array from response
149
+ const match = raw.match(/\[[\s\S]*\]/);
150
+ if (!match)
151
+ return [];
152
+ const triples = JSON.parse(match[0]);
153
+ return triples
154
+ .filter(t => t.from && t.relation && t.to)
155
+ .map(t => ({
156
+ from: t.from.toLowerCase().trim(),
157
+ relation: t.relation.toLowerCase().trim(),
158
+ to: t.to.toLowerCase().trim(),
159
+ confidence: 0.9
160
+ }));
161
+ }
162
+ catch {
163
+ return [];
164
+ }
165
+ }
166
+ /**
167
+ * Upsert a graph node
168
+ */
169
+ async upsertNode(sessionId, entity, type) {
170
+ const id = (0, crypto_1.createHash)('sha256').update(`${sessionId}:${entity}`).digest('hex').slice(0, 16);
171
+ await this.db.run(`INSERT OR IGNORE INTO graph_nodes (id, session_id, entity, type, created_at)
172
+ VALUES (?, ?, ?, ?, ?)`, [id, sessionId, entity, type || null, Date.now()]);
173
+ }
174
+ /**
175
+ * Store a graph edge
176
+ */
177
+ async storeEdge(sessionId, edge, memoryId) {
178
+ const id = (0, crypto_1.createHash)('sha256')
179
+ .update(`${sessionId}:${edge.from}:${edge.relation}:${edge.to}`)
180
+ .digest('hex').slice(0, 16);
181
+ await this.upsertNode(sessionId, edge.from);
182
+ await this.upsertNode(sessionId, edge.to);
183
+ await this.db.run(`INSERT OR REPLACE INTO graph_edges
184
+ (id, session_id, from_entity, relation, to_entity, confidence, memory_id, created_at)
185
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, sessionId, edge.from, edge.relation, edge.to, edge.confidence ?? 1.0, memoryId, Date.now()]);
186
+ }
187
+ /**
188
+ * Cosine similarity between two vectors
189
+ */
190
+ cosineSimilarity(a, b) {
191
+ let dot = 0, magA = 0, magB = 0;
192
+ for (let i = 0; i < a.length; i++) {
193
+ dot += a[i] * b[i];
194
+ magA += a[i] * a[i];
195
+ magB += b[i] * b[i];
196
+ }
197
+ const denom = Math.sqrt(magA) * Math.sqrt(magB);
198
+ return denom === 0 ? 0 : dot / denom;
199
+ }
66
200
  /**
67
201
  * Store a memory entry
68
202
  */
@@ -70,44 +204,40 @@ class Engram {
70
204
  await this.init();
71
205
  const id = (0, crypto_1.createHash)('sha256')
72
206
  .update(`${sessionId}:${content}:${Date.now()}`)
73
- .digest('hex')
74
- .slice(0, 16);
75
- const contentHash = (0, crypto_1.createHash)('sha256')
76
- .update(content)
77
- .digest('hex')
78
- .slice(0, 16);
207
+ .digest('hex').slice(0, 16);
208
+ const contentHash = (0, crypto_1.createHash)('sha256').update(content).digest('hex').slice(0, 16);
209
+ const truncated = content.slice(0, this.maxContextLength);
210
+ // Fetch embedding
211
+ let embeddingJson = null;
212
+ if (this.semanticSearch) {
213
+ const vector = await this.embed(truncated);
214
+ if (vector)
215
+ embeddingJson = JSON.stringify(vector);
216
+ }
79
217
  const entry = {
80
- id,
81
- sessionId,
82
- content: content.slice(0, this.maxContextLength),
83
- role,
84
- timestamp: new Date(),
85
- metadata
218
+ id, sessionId, content: truncated, role,
219
+ timestamp: new Date(), metadata
86
220
  };
87
- await this.db.run(`INSERT INTO memories (id, session_id, content, role, timestamp, metadata, content_hash)
88
- VALUES (?, ?, ?, ?, ?, ?, ?)`, [
89
- entry.id,
90
- entry.sessionId,
91
- entry.content,
92
- entry.role,
93
- entry.timestamp.getTime(),
94
- metadata ? JSON.stringify(metadata) : null,
95
- contentHash
96
- ]);
221
+ await this.db.run(`INSERT INTO memories (id, session_id, content, role, timestamp, metadata, content_hash, embedding)
222
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`, [id, sessionId, truncated, role, entry.timestamp.getTime(),
223
+ metadata ? JSON.stringify(metadata) : null, contentHash, embeddingJson]);
224
+ // v0.3: Extract graph relationships
225
+ if (this.graphMemory) {
226
+ const edges = await this.extractGraph(truncated);
227
+ for (const edge of edges) {
228
+ await this.storeEdge(sessionId, edge, id);
229
+ }
230
+ }
97
231
  return entry;
98
232
  }
99
233
  /**
100
- * Recall memories for a session
101
- *
102
- * Simple keyword-based retrieval for v0.1.
103
- * Semantic search coming in v0.2.
234
+ * Recall memories with optional graph traversal
104
235
  */
105
236
  async recall(sessionId, query, limit = 10, options = {}) {
106
237
  await this.init();
107
238
  let sql = `
108
- SELECT id, session_id, content, role, timestamp, metadata
109
- FROM memories
110
- WHERE session_id = ?
239
+ SELECT id, session_id, content, role, timestamp, metadata, embedding
240
+ FROM memories WHERE session_id = ?
111
241
  `;
112
242
  const params = [sessionId];
113
243
  if (options.role) {
@@ -122,7 +252,43 @@ class Engram {
122
252
  sql += ` AND timestamp <= ?`;
123
253
  params.push(options.before.getTime());
124
254
  }
125
- // Simple keyword matching if query provided
255
+ // Semantic search
256
+ if (query && query.trim() && this.semanticSearch) {
257
+ const queryVector = await this.embed(query);
258
+ if (queryVector) {
259
+ sql += ` ORDER BY timestamp DESC`;
260
+ const rows = await this.db.all(sql, params);
261
+ const scored = rows
262
+ .map((row) => {
263
+ let similarity = 0;
264
+ if (row.embedding) {
265
+ try {
266
+ const vec = JSON.parse(row.embedding);
267
+ similarity = this.cosineSimilarity(queryVector, vec);
268
+ }
269
+ catch { /* skip */ }
270
+ }
271
+ return { row, similarity };
272
+ })
273
+ .sort((a, b) => b.similarity - a.similarity)
274
+ .slice(0, limit);
275
+ const results = scored.map(({ row, similarity }) => ({
276
+ id: row.id,
277
+ sessionId: row.session_id,
278
+ content: row.content,
279
+ role: row.role,
280
+ timestamp: new Date(row.timestamp),
281
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
282
+ similarity
283
+ }));
284
+ // v0.3: Augment with graph-connected memories
285
+ if (this.graphMemory && options.includeGraph !== false) {
286
+ return this.augmentWithGraph(sessionId, results, limit);
287
+ }
288
+ return results;
289
+ }
290
+ }
291
+ // Keyword fallback
126
292
  if (query && query.trim()) {
127
293
  const keywords = query.toLowerCase().split(/\s+/).filter(k => k.length > 2);
128
294
  if (keywords.length > 0) {
@@ -143,13 +309,97 @@ class Engram {
143
309
  }));
144
310
  }
145
311
  /**
146
- * Get recent conversation history for a session
312
+ * Augment recall results with graph-connected memories
313
+ */
314
+ async augmentWithGraph(sessionId, results, limit) {
315
+ // Collect memory IDs that appear in graph edges
316
+ const seenIds = new Set(results.map(r => r.id));
317
+ const graphMemoryIds = new Set();
318
+ for (const result of results.slice(0, 3)) { // Only expand top 3
319
+ const edges = await this.db.all(`SELECT memory_id FROM graph_edges WHERE session_id = ? AND memory_id IS NOT NULL
320
+ AND (from_entity IN (
321
+ SELECT from_entity FROM graph_edges WHERE memory_id = ?
322
+ UNION SELECT to_entity FROM graph_edges WHERE memory_id = ?
323
+ ))
324
+ LIMIT 5`, [sessionId, result.id, result.id]);
325
+ for (const edge of edges) {
326
+ if (edge.memory_id && !seenIds.has(edge.memory_id)) {
327
+ graphMemoryIds.add(edge.memory_id);
328
+ }
329
+ }
330
+ }
331
+ if (graphMemoryIds.size === 0)
332
+ return results;
333
+ // Fetch connected memories
334
+ const placeholders = Array.from(graphMemoryIds).map(() => '?').join(',');
335
+ const connectedRows = await this.db.all(`SELECT id, session_id, content, role, timestamp, metadata FROM memories
336
+ WHERE id IN (${placeholders})`, Array.from(graphMemoryIds));
337
+ const connected = connectedRows.map((row) => ({
338
+ id: row.id,
339
+ sessionId: row.session_id,
340
+ content: row.content,
341
+ role: row.role,
342
+ timestamp: new Date(row.timestamp),
343
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
344
+ similarity: 0 // Graph-connected, not vector-matched
345
+ }));
346
+ return [...results, ...connected].slice(0, limit);
347
+ }
348
+ /**
349
+ * v0.3: Query the knowledge graph for an entity
350
+ */
351
+ async graph(sessionId, entity) {
352
+ await this.init();
353
+ const ent = entity.toLowerCase().trim();
354
+ // Outgoing edges
355
+ const outgoing = await this.db.all(`SELECT relation, to_entity, confidence, memory_id FROM graph_edges
356
+ WHERE session_id = ? AND from_entity = ?`, [sessionId, ent]);
357
+ // Incoming edges
358
+ const incoming = await this.db.all(`SELECT relation, from_entity, confidence, memory_id FROM graph_edges
359
+ WHERE session_id = ? AND to_entity = ?`, [sessionId, ent]);
360
+ const relationships = [
361
+ ...outgoing.map((e) => ({
362
+ type: 'outgoing',
363
+ relation: e.relation,
364
+ target: e.to_entity,
365
+ confidence: e.confidence
366
+ })),
367
+ ...incoming.map((e) => ({
368
+ type: 'incoming',
369
+ relation: e.relation,
370
+ target: e.from_entity,
371
+ confidence: e.confidence
372
+ }))
373
+ ];
374
+ // Get source memories
375
+ const memoryIds = [
376
+ ...outgoing.map((e) => e.memory_id),
377
+ ...incoming.map((e) => e.memory_id)
378
+ ].filter(Boolean);
379
+ let relatedMemories = [];
380
+ if (memoryIds.length > 0) {
381
+ const placeholders = memoryIds.map(() => '?').join(',');
382
+ const rows = await this.db.all(`SELECT id, session_id, content, role, timestamp, metadata
383
+ FROM memories WHERE id IN (${placeholders})`, memoryIds);
384
+ relatedMemories = rows.map((row) => ({
385
+ id: row.id,
386
+ sessionId: row.session_id,
387
+ content: row.content,
388
+ role: row.role,
389
+ timestamp: new Date(row.timestamp),
390
+ metadata: row.metadata ? JSON.parse(row.metadata) : undefined
391
+ }));
392
+ }
393
+ return { entity: ent, relationships, relatedMemories };
394
+ }
395
+ /**
396
+ * Get recent conversation history
147
397
  */
148
398
  async history(sessionId, limit = 20) {
149
399
  return this.recall(sessionId, undefined, limit, {});
150
400
  }
151
401
  /**
152
- * Forget (delete) memories
402
+ * Delete memories
153
403
  */
154
404
  async forget(sessionId, options) {
155
405
  await this.init();
@@ -167,28 +417,31 @@ class Engram {
167
417
  return result.changes || 0;
168
418
  }
169
419
  /**
170
- * Get memory statistics for a session
420
+ * Memory statistics
171
421
  */
172
422
  async stats(sessionId) {
173
423
  await this.init();
174
424
  const totalRow = await this.db.get('SELECT COUNT(*) as count FROM memories WHERE session_id = ?', [sessionId]);
175
- const total = totalRow?.count || 0;
176
425
  const roleRows = await this.db.all('SELECT role, COUNT(*) as count FROM memories WHERE session_id = ? GROUP BY role', [sessionId]);
177
426
  const byRole = {};
178
- roleRows.forEach((row) => {
179
- byRole[row.role] = row.count;
180
- });
427
+ roleRows.forEach((row) => { byRole[row.role] = row.count; });
181
428
  const range = await this.db.get('SELECT MIN(timestamp) as oldest, MAX(timestamp) as newest FROM memories WHERE session_id = ?', [sessionId]);
182
- return {
183
- total,
429
+ const embRow = await this.db.get('SELECT COUNT(*) as count FROM memories WHERE session_id = ? AND embedding IS NOT NULL', [sessionId]);
430
+ const stats = {
431
+ total: totalRow?.count || 0,
184
432
  byRole,
185
433
  oldest: range?.oldest ? new Date(range.oldest) : null,
186
- newest: range?.newest ? new Date(range.newest) : null
434
+ newest: range?.newest ? new Date(range.newest) : null,
435
+ withEmbeddings: embRow?.count || 0
187
436
  };
437
+ if (this.graphMemory) {
438
+ const nodeRow = await this.db.get('SELECT COUNT(*) as count FROM graph_nodes WHERE session_id = ?', [sessionId]);
439
+ const edgeRow = await this.db.get('SELECT COUNT(*) as count FROM graph_edges WHERE session_id = ?', [sessionId]);
440
+ stats.graphNodes = nodeRow?.count || 0;
441
+ stats.graphEdges = edgeRow?.count || 0;
442
+ }
443
+ return stats;
188
444
  }
189
- /**
190
- * Close the database connection
191
- */
192
445
  async close() {
193
446
  if (this.db) {
194
447
  await this.db.close();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cartisien/engram",
3
- "version": "0.1.0",
3
+ "version": "0.3.0",
4
4
  "description": "Persistent memory for AI assistants. SQLite-backed conversational memory with semantic search.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -26,8 +26,9 @@
26
26
  "sqlite3": "^5.1.7"
27
27
  },
28
28
  "devDependencies": {
29
- "@types/sqlite3": "^3.1.11",
30
29
  "@types/node": "^20.11.0",
30
+ "@types/sqlite3": "^3.1.11",
31
+ "ts-node": "^10.9.2",
31
32
  "typescript": "^5.3.3"
32
33
  },
33
34
  "files": [
@@ -37,7 +38,7 @@
37
38
  ],
38
39
  "repository": {
39
40
  "type": "git",
40
- "url": "https://github.com/cartisien/engram.git"
41
+ "url": "git+https://github.com/cartisien/engram.git"
41
42
  },
42
43
  "engines": {
43
44
  "node": ">=18.0.0"