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.
- package/CONTRIBUTING.md +65 -0
- package/Dockerfile +21 -0
- package/EVAL-FRAMEWORK.md +70 -0
- package/EVAL.md +127 -0
- package/LICENSE +17 -0
- package/README.md +309 -0
- package/ROADMAP.md +113 -0
- package/deploy/fly.toml +26 -0
- package/dist/auto-ingest.d.ts +3 -0
- package/dist/auto-ingest.d.ts.map +1 -0
- package/dist/auto-ingest.js +334 -0
- package/dist/auto-ingest.js.map +1 -0
- package/dist/brief.d.ts +45 -0
- package/dist/brief.d.ts.map +1 -0
- package/dist/brief.js +183 -0
- package/dist/brief.js.map +1 -0
- package/dist/claude-watcher.d.ts +3 -0
- package/dist/claude-watcher.d.ts.map +1 -0
- package/dist/claude-watcher.js +385 -0
- package/dist/claude-watcher.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +764 -0
- package/dist/cli.js.map +1 -0
- package/dist/embeddings.d.ts +42 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +145 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/eval.d.ts +2 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +281 -0
- package/dist/eval.js.map +1 -0
- package/dist/extract.d.ts +11 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +139 -0
- package/dist/extract.js.map +1 -0
- package/dist/hosted.d.ts +3 -0
- package/dist/hosted.d.ts.map +1 -0
- package/dist/hosted.js +144 -0
- package/dist/hosted.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +28 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +192 -0
- package/dist/ingest.js.map +1 -0
- package/dist/mcp.d.ts +3 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +349 -0
- package/dist/mcp.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +515 -0
- package/dist/server.js.map +1 -0
- package/dist/store.d.ts +87 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +548 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +204 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +77 -0
- package/dist/types.js.map +1 -0
- package/dist/vault.d.ts +116 -0
- package/dist/vault.d.ts.map +1 -0
- package/dist/vault.js +1234 -0
- package/dist/vault.js.map +1 -0
- package/package.json +61 -0
package/dist/store.js
ADDED
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import Database from 'better-sqlite3';
|
|
2
|
+
import { v4 as uuid } from 'uuid';
|
|
3
|
+
import * as sqliteVec from 'sqlite-vec';
|
|
4
|
+
// ============================================================
|
|
5
|
+
// SQLite Storage Layer for Engram
|
|
6
|
+
// ============================================================
|
|
7
|
+
export class MemoryStore {
|
|
8
|
+
db;
|
|
9
|
+
vecEnabled = false;
|
|
10
|
+
embeddingDimensions = 0;
|
|
11
|
+
constructor(dbPath, embeddingDimensions) {
|
|
12
|
+
this.db = new Database(dbPath);
|
|
13
|
+
this.db.pragma('journal_mode = WAL');
|
|
14
|
+
this.db.pragma('foreign_keys = ON');
|
|
15
|
+
// Load sqlite-vec extension
|
|
16
|
+
if (embeddingDimensions && embeddingDimensions > 0) {
|
|
17
|
+
try {
|
|
18
|
+
sqliteVec.load(this.db);
|
|
19
|
+
this.vecEnabled = true;
|
|
20
|
+
this.embeddingDimensions = embeddingDimensions;
|
|
21
|
+
}
|
|
22
|
+
catch (err) {
|
|
23
|
+
console.warn('sqlite-vec extension not available, falling back to non-vector search:', err.message);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
this.migrate();
|
|
27
|
+
}
|
|
28
|
+
// --------------------------------------------------------
|
|
29
|
+
// Schema Migration
|
|
30
|
+
// --------------------------------------------------------
|
|
31
|
+
migrate() {
|
|
32
|
+
this.db.exec(`
|
|
33
|
+
CREATE TABLE IF NOT EXISTS memories (
|
|
34
|
+
id TEXT PRIMARY KEY,
|
|
35
|
+
type TEXT NOT NULL CHECK(type IN ('episodic', 'semantic', 'procedural')),
|
|
36
|
+
content TEXT NOT NULL,
|
|
37
|
+
summary TEXT NOT NULL,
|
|
38
|
+
|
|
39
|
+
-- Provenance
|
|
40
|
+
source_type TEXT NOT NULL,
|
|
41
|
+
source_session_id TEXT,
|
|
42
|
+
source_agent_id TEXT,
|
|
43
|
+
source_evidence TEXT, -- JSON array of memory IDs
|
|
44
|
+
source_timestamp TEXT NOT NULL,
|
|
45
|
+
|
|
46
|
+
-- Temporal
|
|
47
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
48
|
+
last_accessed_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
49
|
+
last_modified_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
50
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
51
|
+
expires_at TEXT,
|
|
52
|
+
|
|
53
|
+
-- Weight & Trust
|
|
54
|
+
salience REAL NOT NULL DEFAULT 0.5,
|
|
55
|
+
confidence REAL NOT NULL DEFAULT 0.8,
|
|
56
|
+
stability REAL NOT NULL DEFAULT 1.0,
|
|
57
|
+
|
|
58
|
+
-- Semantic Anchors
|
|
59
|
+
entities TEXT NOT NULL DEFAULT '[]', -- JSON array
|
|
60
|
+
topics TEXT NOT NULL DEFAULT '[]', -- JSON array
|
|
61
|
+
|
|
62
|
+
-- Lifecycle
|
|
63
|
+
status TEXT NOT NULL DEFAULT 'active' CHECK(status IN ('active', 'pending', 'fulfilled', 'superseded', 'archived')),
|
|
64
|
+
|
|
65
|
+
-- Access Control
|
|
66
|
+
visibility TEXT NOT NULL DEFAULT 'owner_agents',
|
|
67
|
+
|
|
68
|
+
-- Embedding
|
|
69
|
+
embedding BLOB
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
CREATE TABLE IF NOT EXISTS edges (
|
|
73
|
+
id TEXT PRIMARY KEY,
|
|
74
|
+
source_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
75
|
+
target_id TEXT NOT NULL REFERENCES memories(id) ON DELETE CASCADE,
|
|
76
|
+
type TEXT NOT NULL,
|
|
77
|
+
strength REAL NOT NULL DEFAULT 0.5,
|
|
78
|
+
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
82
|
+
id TEXT PRIMARY KEY,
|
|
83
|
+
name TEXT NOT NULL,
|
|
84
|
+
type TEXT NOT NULL DEFAULT 'concept',
|
|
85
|
+
aliases TEXT NOT NULL DEFAULT '[]', -- JSON array
|
|
86
|
+
properties TEXT NOT NULL DEFAULT '{}', -- JSON object
|
|
87
|
+
first_seen TEXT NOT NULL DEFAULT (datetime('now')),
|
|
88
|
+
last_seen TEXT NOT NULL DEFAULT (datetime('now')),
|
|
89
|
+
memory_count INTEGER NOT NULL DEFAULT 0,
|
|
90
|
+
importance REAL NOT NULL DEFAULT 0.5
|
|
91
|
+
);
|
|
92
|
+
|
|
93
|
+
-- Indices for fast retrieval
|
|
94
|
+
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_memories_salience ON memories(salience DESC);
|
|
96
|
+
CREATE INDEX IF NOT EXISTS idx_memories_created ON memories(created_at DESC);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_memories_accessed ON memories(last_accessed_at DESC);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_memories_stability ON memories(stability);
|
|
99
|
+
CREATE INDEX IF NOT EXISTS idx_edges_source ON edges(source_id);
|
|
100
|
+
CREATE INDEX IF NOT EXISTS idx_edges_target ON edges(target_id);
|
|
101
|
+
CREATE INDEX IF NOT EXISTS idx_edges_type ON edges(type);
|
|
102
|
+
CREATE INDEX IF NOT EXISTS idx_entities_name ON entities(name);
|
|
103
|
+
`);
|
|
104
|
+
// Create vector virtual table if sqlite-vec is loaded
|
|
105
|
+
if (this.vecEnabled && this.embeddingDimensions > 0) {
|
|
106
|
+
this.db.exec(`
|
|
107
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS vec_memories USING vec0(
|
|
108
|
+
memory_id TEXT PRIMARY KEY,
|
|
109
|
+
embedding float[${this.embeddingDimensions}]
|
|
110
|
+
);
|
|
111
|
+
`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// --------------------------------------------------------
|
|
115
|
+
// Memory CRUD
|
|
116
|
+
// --------------------------------------------------------
|
|
117
|
+
createMemory(input) {
|
|
118
|
+
const now = new Date().toISOString();
|
|
119
|
+
const id = uuid();
|
|
120
|
+
const summary = input.summary ?? input.content.slice(0, 120) + (input.content.length > 120 ? '...' : '');
|
|
121
|
+
const memory = {
|
|
122
|
+
id,
|
|
123
|
+
type: input.type ?? 'episodic',
|
|
124
|
+
content: input.content,
|
|
125
|
+
summary,
|
|
126
|
+
source: {
|
|
127
|
+
type: input.source?.type ?? 'conversation',
|
|
128
|
+
sessionId: input.source?.sessionId,
|
|
129
|
+
agentId: input.source?.agentId,
|
|
130
|
+
evidence: input.source?.evidence,
|
|
131
|
+
timestamp: now,
|
|
132
|
+
},
|
|
133
|
+
createdAt: now,
|
|
134
|
+
lastAccessedAt: now,
|
|
135
|
+
lastModifiedAt: now,
|
|
136
|
+
accessCount: 0,
|
|
137
|
+
expiresAt: input.expiresAt,
|
|
138
|
+
salience: input.salience ?? 0.5,
|
|
139
|
+
confidence: input.confidence ?? 0.8,
|
|
140
|
+
stability: 1.0,
|
|
141
|
+
entities: input.entities ?? [],
|
|
142
|
+
topics: input.topics ?? [],
|
|
143
|
+
status: input.status ?? 'active',
|
|
144
|
+
visibility: input.visibility ?? 'owner_agents',
|
|
145
|
+
};
|
|
146
|
+
this.db.prepare(`
|
|
147
|
+
INSERT INTO memories (
|
|
148
|
+
id, type, content, summary,
|
|
149
|
+
source_type, source_session_id, source_agent_id, source_evidence, source_timestamp,
|
|
150
|
+
created_at, last_accessed_at, last_modified_at, access_count, expires_at,
|
|
151
|
+
salience, confidence, stability,
|
|
152
|
+
entities, topics, status, visibility
|
|
153
|
+
) VALUES (
|
|
154
|
+
?, ?, ?, ?,
|
|
155
|
+
?, ?, ?, ?, ?,
|
|
156
|
+
?, ?, ?, ?, ?,
|
|
157
|
+
?, ?, ?,
|
|
158
|
+
?, ?, ?, ?
|
|
159
|
+
)
|
|
160
|
+
`).run(memory.id, memory.type, memory.content, memory.summary, memory.source.type, memory.source.sessionId ?? null, memory.source.agentId ?? null, JSON.stringify(memory.source.evidence ?? []), memory.source.timestamp, memory.createdAt, memory.lastAccessedAt, memory.lastModifiedAt, memory.accessCount, memory.expiresAt ?? null, memory.salience, memory.confidence, memory.stability, JSON.stringify(memory.entities), JSON.stringify(memory.topics), memory.status, memory.visibility);
|
|
161
|
+
// Auto-discover/update entities
|
|
162
|
+
for (const entityName of memory.entities) {
|
|
163
|
+
this.upsertEntity(entityName, memory.type === 'episodic' ? 'unknown' : 'concept');
|
|
164
|
+
}
|
|
165
|
+
return memory;
|
|
166
|
+
}
|
|
167
|
+
getMemory(id) {
|
|
168
|
+
const row = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
|
|
169
|
+
if (!row)
|
|
170
|
+
return null;
|
|
171
|
+
// Update access stats
|
|
172
|
+
this.db.prepare(`
|
|
173
|
+
UPDATE memories
|
|
174
|
+
SET last_accessed_at = datetime('now'), access_count = access_count + 1, stability = MIN(stability * 1.05, 10.0)
|
|
175
|
+
WHERE id = ?
|
|
176
|
+
`).run(id);
|
|
177
|
+
return this.rowToMemory(row);
|
|
178
|
+
}
|
|
179
|
+
/** Read a memory without updating access stats (for graph traversal, activation spreading) */
|
|
180
|
+
getMemoryDirect(id) {
|
|
181
|
+
const row = this.db.prepare('SELECT * FROM memories WHERE id = ?').get(id);
|
|
182
|
+
if (!row)
|
|
183
|
+
return null;
|
|
184
|
+
return this.rowToMemory(row);
|
|
185
|
+
}
|
|
186
|
+
/** Get all memories by a list of IDs without updating access stats */
|
|
187
|
+
getMemoriesDirect(ids) {
|
|
188
|
+
if (ids.length === 0)
|
|
189
|
+
return [];
|
|
190
|
+
const placeholders = ids.map(() => '?').join(',');
|
|
191
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE id IN (${placeholders})`).all(...ids);
|
|
192
|
+
return rows.map(r => this.rowToMemory(r));
|
|
193
|
+
}
|
|
194
|
+
updateMemory(id, updates) {
|
|
195
|
+
const sets = [];
|
|
196
|
+
const values = [];
|
|
197
|
+
if (updates.content !== undefined) {
|
|
198
|
+
sets.push('content = ?');
|
|
199
|
+
values.push(updates.content);
|
|
200
|
+
}
|
|
201
|
+
if (updates.summary !== undefined) {
|
|
202
|
+
sets.push('summary = ?');
|
|
203
|
+
values.push(updates.summary);
|
|
204
|
+
}
|
|
205
|
+
if (updates.salience !== undefined) {
|
|
206
|
+
sets.push('salience = ?');
|
|
207
|
+
values.push(updates.salience);
|
|
208
|
+
}
|
|
209
|
+
if (updates.confidence !== undefined) {
|
|
210
|
+
sets.push('confidence = ?');
|
|
211
|
+
values.push(updates.confidence);
|
|
212
|
+
}
|
|
213
|
+
if (updates.entities !== undefined) {
|
|
214
|
+
sets.push('entities = ?');
|
|
215
|
+
values.push(JSON.stringify(updates.entities));
|
|
216
|
+
}
|
|
217
|
+
if (updates.topics !== undefined) {
|
|
218
|
+
sets.push('topics = ?');
|
|
219
|
+
values.push(JSON.stringify(updates.topics));
|
|
220
|
+
}
|
|
221
|
+
if (sets.length === 0)
|
|
222
|
+
return;
|
|
223
|
+
sets.push("last_modified_at = datetime('now')");
|
|
224
|
+
values.push(id);
|
|
225
|
+
this.db.prepare(`UPDATE memories SET ${sets.join(', ')} WHERE id = ?`).run(...values);
|
|
226
|
+
}
|
|
227
|
+
/** Update a memory's status (active, pending, fulfilled, superseded, archived) */
|
|
228
|
+
updateStatus(id, status) {
|
|
229
|
+
this.db.prepare(`UPDATE memories SET status = ?, last_modified_at = datetime('now') WHERE id = ?`).run(status, id);
|
|
230
|
+
}
|
|
231
|
+
deleteMemory(id) {
|
|
232
|
+
this.db.prepare('DELETE FROM memories WHERE id = ?').run(id);
|
|
233
|
+
}
|
|
234
|
+
// --------------------------------------------------------
|
|
235
|
+
// Retrieval
|
|
236
|
+
// --------------------------------------------------------
|
|
237
|
+
/** Get recent memories, ordered by creation time */
|
|
238
|
+
getRecent(limit = 20) {
|
|
239
|
+
const rows = this.db.prepare('SELECT * FROM memories ORDER BY created_at DESC LIMIT ?').all(limit);
|
|
240
|
+
return rows.map(r => this.rowToMemory(r));
|
|
241
|
+
}
|
|
242
|
+
/** Get memories by entity */
|
|
243
|
+
getByEntity(entityName, limit = 20) {
|
|
244
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE entities LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%"${entityName}"%`, limit);
|
|
245
|
+
return rows.map(r => this.rowToMemory(r));
|
|
246
|
+
}
|
|
247
|
+
/** Get memories by topic */
|
|
248
|
+
getByTopic(topic, limit = 20) {
|
|
249
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE topics LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%"${topic}"%`, limit);
|
|
250
|
+
return rows.map(r => this.rowToMemory(r));
|
|
251
|
+
}
|
|
252
|
+
/** Get memories by status */
|
|
253
|
+
getByStatus(status, limit = 20) {
|
|
254
|
+
const rows = this.db.prepare('SELECT * FROM memories WHERE status = ? ORDER BY salience DESC, created_at DESC LIMIT ?').all(status, limit);
|
|
255
|
+
return rows.map(r => this.rowToMemory(r));
|
|
256
|
+
}
|
|
257
|
+
/** Get memories by type */
|
|
258
|
+
getByType(type, limit = 20) {
|
|
259
|
+
const rows = this.db.prepare('SELECT * FROM memories WHERE type = ? ORDER BY salience DESC, created_at DESC LIMIT ?').all(type, limit);
|
|
260
|
+
return rows.map(r => this.rowToMemory(r));
|
|
261
|
+
}
|
|
262
|
+
/** Full-text search on content */
|
|
263
|
+
search(query, limit = 20) {
|
|
264
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE content LIKE ? ORDER BY salience DESC, created_at DESC LIMIT ?`).all(`%${query}%`, limit);
|
|
265
|
+
return rows.map(r => this.rowToMemory(r));
|
|
266
|
+
}
|
|
267
|
+
/** Get all memories (for consolidation) */
|
|
268
|
+
getEpisodicSince(since, limit = 500) {
|
|
269
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE type = 'episodic' AND created_at >= ? ORDER BY created_at ASC LIMIT ?`).all(since, limit);
|
|
270
|
+
return rows.map(r => this.rowToMemory(r));
|
|
271
|
+
}
|
|
272
|
+
/** Get memories below stability threshold (candidates for archival) */
|
|
273
|
+
getDecayedMemories(threshold = 0.05) {
|
|
274
|
+
const rows = this.db.prepare('SELECT * FROM memories WHERE stability < ? AND type != \'procedural\' ORDER BY stability ASC').all(threshold);
|
|
275
|
+
return rows.map(r => this.rowToMemory(r));
|
|
276
|
+
}
|
|
277
|
+
/** Count memories by type */
|
|
278
|
+
getStats() {
|
|
279
|
+
const counts = this.db.prepare(`
|
|
280
|
+
SELECT
|
|
281
|
+
COUNT(*) as total,
|
|
282
|
+
SUM(CASE WHEN type = 'episodic' THEN 1 ELSE 0 END) as episodic,
|
|
283
|
+
SUM(CASE WHEN type = 'semantic' THEN 1 ELSE 0 END) as semantic,
|
|
284
|
+
SUM(CASE WHEN type = 'procedural' THEN 1 ELSE 0 END) as procedural
|
|
285
|
+
FROM memories
|
|
286
|
+
`).get();
|
|
287
|
+
const entityCount = this.db.prepare('SELECT COUNT(*) as count FROM entities').get();
|
|
288
|
+
return { ...counts, entities: entityCount.count };
|
|
289
|
+
}
|
|
290
|
+
// --------------------------------------------------------
|
|
291
|
+
// Edges
|
|
292
|
+
// --------------------------------------------------------
|
|
293
|
+
createEdge(sourceId, targetId, type, strength = 0.5) {
|
|
294
|
+
const id = uuid();
|
|
295
|
+
const now = new Date().toISOString();
|
|
296
|
+
this.db.prepare(`
|
|
297
|
+
INSERT INTO edges (id, source_id, target_id, type, strength, created_at)
|
|
298
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
299
|
+
`).run(id, sourceId, targetId, type, strength, now);
|
|
300
|
+
return { id, sourceId, targetId, type: type, strength, createdAt: now };
|
|
301
|
+
}
|
|
302
|
+
getEdgesFrom(memoryId) {
|
|
303
|
+
const rows = this.db.prepare('SELECT * FROM edges WHERE source_id = ?').all(memoryId);
|
|
304
|
+
return rows.map(r => this.rowToEdge(r));
|
|
305
|
+
}
|
|
306
|
+
getEdgesTo(memoryId) {
|
|
307
|
+
const rows = this.db.prepare('SELECT * FROM edges WHERE target_id = ?').all(memoryId);
|
|
308
|
+
return rows.map(r => this.rowToEdge(r));
|
|
309
|
+
}
|
|
310
|
+
/** Get all edges connected to a memory (both directions) */
|
|
311
|
+
getEdgesBidirectional(memoryId) {
|
|
312
|
+
const rows = this.db.prepare('SELECT * FROM edges WHERE source_id = ? OR target_id = ?').all(memoryId, memoryId);
|
|
313
|
+
return rows.map(r => this.rowToEdge(r));
|
|
314
|
+
}
|
|
315
|
+
/** Batch: get all edges for a set of memory IDs (both directions) */
|
|
316
|
+
getEdgesForMemories(memoryIds) {
|
|
317
|
+
if (memoryIds.length === 0)
|
|
318
|
+
return [];
|
|
319
|
+
const placeholders = memoryIds.map(() => '?').join(',');
|
|
320
|
+
const rows = this.db.prepare(`SELECT * FROM edges WHERE source_id IN (${placeholders}) OR target_id IN (${placeholders})`).all(...memoryIds, ...memoryIds);
|
|
321
|
+
return rows.map(r => this.rowToEdge(r));
|
|
322
|
+
}
|
|
323
|
+
/** Get memories that share entities with the given memory */
|
|
324
|
+
getCoEntityMemories(memoryId, limit = 20) {
|
|
325
|
+
const source = this.getMemoryDirect(memoryId);
|
|
326
|
+
if (!source || source.entities.length === 0)
|
|
327
|
+
return [];
|
|
328
|
+
const results = new Map();
|
|
329
|
+
for (const entity of source.entities) {
|
|
330
|
+
const rows = this.db.prepare(`SELECT * FROM memories WHERE id != ? AND entities LIKE ? ORDER BY salience DESC LIMIT ?`).all(memoryId, `%"${entity}"%`, limit);
|
|
331
|
+
for (const row of rows) {
|
|
332
|
+
const mem = this.rowToMemory(row);
|
|
333
|
+
const existing = results.get(mem.id);
|
|
334
|
+
if (existing) {
|
|
335
|
+
existing.sharedEntities.push(entity);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
results.set(mem.id, { memory: mem, sharedEntities: [entity] });
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
return [...results.values()]
|
|
343
|
+
.sort((a, b) => b.sharedEntities.length - a.sharedEntities.length)
|
|
344
|
+
.slice(0, limit);
|
|
345
|
+
}
|
|
346
|
+
getNeighbors(memoryId, depth = 1) {
|
|
347
|
+
if (depth < 1)
|
|
348
|
+
return [];
|
|
349
|
+
const neighborIds = new Set();
|
|
350
|
+
const queue = [memoryId];
|
|
351
|
+
for (let d = 0; d < depth; d++) {
|
|
352
|
+
const nextQueue = [];
|
|
353
|
+
for (const id of queue) {
|
|
354
|
+
const edges = [...this.getEdgesFrom(id), ...this.getEdgesTo(id)];
|
|
355
|
+
for (const edge of edges) {
|
|
356
|
+
const neighborId = edge.sourceId === id ? edge.targetId : edge.sourceId;
|
|
357
|
+
if (!neighborIds.has(neighborId) && neighborId !== memoryId) {
|
|
358
|
+
neighborIds.add(neighborId);
|
|
359
|
+
nextQueue.push(neighborId);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
queue.length = 0;
|
|
364
|
+
queue.push(...nextQueue);
|
|
365
|
+
}
|
|
366
|
+
return [...neighborIds]
|
|
367
|
+
.map(id => this.getMemory(id))
|
|
368
|
+
.filter((m) => m !== null);
|
|
369
|
+
}
|
|
370
|
+
// --------------------------------------------------------
|
|
371
|
+
// Entities
|
|
372
|
+
// --------------------------------------------------------
|
|
373
|
+
upsertEntity(name, type = 'concept') {
|
|
374
|
+
const existing = this.db.prepare('SELECT * FROM entities WHERE name = ? OR aliases LIKE ?').get(name, `%"${name}"%`);
|
|
375
|
+
if (existing) {
|
|
376
|
+
this.db.prepare(`
|
|
377
|
+
UPDATE entities
|
|
378
|
+
SET last_seen = datetime('now'), memory_count = memory_count + 1
|
|
379
|
+
WHERE id = ?
|
|
380
|
+
`).run(existing.id);
|
|
381
|
+
return this.rowToEntity(existing);
|
|
382
|
+
}
|
|
383
|
+
const id = uuid();
|
|
384
|
+
const now = new Date().toISOString();
|
|
385
|
+
this.db.prepare(`
|
|
386
|
+
INSERT INTO entities (id, name, type, aliases, properties, first_seen, last_seen, memory_count, importance)
|
|
387
|
+
VALUES (?, ?, ?, '[]', '{}', ?, ?, 1, 0.5)
|
|
388
|
+
`).run(id, name, type, now, now);
|
|
389
|
+
return { id, name, type, aliases: [], properties: {}, firstSeen: now, lastSeen: now, memoryCount: 1, importance: 0.5 };
|
|
390
|
+
}
|
|
391
|
+
getEntity(name) {
|
|
392
|
+
const row = this.db.prepare('SELECT * FROM entities WHERE name = ? OR aliases LIKE ?').get(name, `%"${name}"%`);
|
|
393
|
+
return row ? this.rowToEntity(row) : null;
|
|
394
|
+
}
|
|
395
|
+
getAllEntities() {
|
|
396
|
+
const rows = this.db.prepare('SELECT * FROM entities ORDER BY importance DESC, memory_count DESC').all();
|
|
397
|
+
return rows.map(r => this.rowToEntity(r));
|
|
398
|
+
}
|
|
399
|
+
// --------------------------------------------------------
|
|
400
|
+
// Vector Search
|
|
401
|
+
// --------------------------------------------------------
|
|
402
|
+
/** Store an embedding for a memory */
|
|
403
|
+
storeEmbedding(memoryId, embedding) {
|
|
404
|
+
if (!this.vecEnabled)
|
|
405
|
+
return;
|
|
406
|
+
// Convert to Float32Array buffer for sqlite-vec
|
|
407
|
+
const buf = new Float32Array(embedding).buffer;
|
|
408
|
+
// vec0 virtual tables don't support INSERT OR REPLACE
|
|
409
|
+
// Delete first, then insert
|
|
410
|
+
this.db.prepare('DELETE FROM vec_memories WHERE memory_id = ?').run(memoryId);
|
|
411
|
+
this.db.prepare(`
|
|
412
|
+
INSERT INTO vec_memories (memory_id, embedding)
|
|
413
|
+
VALUES (?, ?)
|
|
414
|
+
`).run(memoryId, Buffer.from(buf));
|
|
415
|
+
}
|
|
416
|
+
/** Find nearest neighbors by embedding vector */
|
|
417
|
+
searchByVector(embedding, limit = 20) {
|
|
418
|
+
if (!this.vecEnabled)
|
|
419
|
+
return [];
|
|
420
|
+
const buf = new Float32Array(embedding).buffer;
|
|
421
|
+
const rows = this.db.prepare(`
|
|
422
|
+
SELECT memory_id, distance
|
|
423
|
+
FROM vec_memories
|
|
424
|
+
WHERE embedding MATCH ?
|
|
425
|
+
ORDER BY distance
|
|
426
|
+
LIMIT ?
|
|
427
|
+
`).all(Buffer.from(buf), limit);
|
|
428
|
+
return rows.map(r => ({ memoryId: r.memory_id, distance: r.distance }));
|
|
429
|
+
}
|
|
430
|
+
/** Check if vector search is available */
|
|
431
|
+
hasVectorSearch() {
|
|
432
|
+
return this.vecEnabled;
|
|
433
|
+
}
|
|
434
|
+
/** Get the stored embedding for a memory (for dedup checks) */
|
|
435
|
+
getEmbedding(memoryId) {
|
|
436
|
+
if (!this.vecEnabled)
|
|
437
|
+
return null;
|
|
438
|
+
try {
|
|
439
|
+
const row = this.db.prepare('SELECT embedding FROM vec_memories WHERE memory_id = ?').get(memoryId);
|
|
440
|
+
if (!row)
|
|
441
|
+
return null;
|
|
442
|
+
return Array.from(new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4));
|
|
443
|
+
}
|
|
444
|
+
catch {
|
|
445
|
+
return null;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
/** Find memories with very high semantic similarity (for dedup) */
|
|
449
|
+
findSimilar(embedding, threshold = 0.12, limit = 3) {
|
|
450
|
+
if (!this.vecEnabled)
|
|
451
|
+
return [];
|
|
452
|
+
const results = this.searchByVector(embedding, limit);
|
|
453
|
+
// distance is cosine distance; similarity = 1 - distance
|
|
454
|
+
return results
|
|
455
|
+
.filter(r => r.distance <= threshold)
|
|
456
|
+
.map(r => ({ ...r, similarity: 1 - r.distance }));
|
|
457
|
+
}
|
|
458
|
+
// --------------------------------------------------------
|
|
459
|
+
// Decay
|
|
460
|
+
// --------------------------------------------------------
|
|
461
|
+
/** Apply time-based decay to all memories */
|
|
462
|
+
applyDecay(halfLifeHours = 168) {
|
|
463
|
+
const now = Date.now();
|
|
464
|
+
let decayed = 0;
|
|
465
|
+
const memories = this.db.prepare('SELECT id, last_accessed_at, stability FROM memories').all();
|
|
466
|
+
const update = this.db.prepare('UPDATE memories SET stability = ? WHERE id = ?');
|
|
467
|
+
const transaction = this.db.transaction(() => {
|
|
468
|
+
for (const mem of memories) {
|
|
469
|
+
const lastAccessed = new Date(mem.last_accessed_at).getTime();
|
|
470
|
+
const hoursSince = (now - lastAccessed) / (1000 * 60 * 60);
|
|
471
|
+
const decayRate = Math.log(2) / halfLifeHours;
|
|
472
|
+
const newStability = mem.stability * Math.exp(-decayRate * hoursSince);
|
|
473
|
+
if (Math.abs(newStability - mem.stability) > 0.001) {
|
|
474
|
+
update.run(Math.max(newStability, 0.001), mem.id);
|
|
475
|
+
decayed++;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
});
|
|
479
|
+
transaction();
|
|
480
|
+
return decayed;
|
|
481
|
+
}
|
|
482
|
+
// --------------------------------------------------------
|
|
483
|
+
// Export / Import
|
|
484
|
+
// --------------------------------------------------------
|
|
485
|
+
exportAll() {
|
|
486
|
+
const memories = this.db.prepare('SELECT * FROM memories').all().map(r => this.rowToMemory(r));
|
|
487
|
+
const edges = this.db.prepare('SELECT * FROM edges').all().map(r => this.rowToEdge(r));
|
|
488
|
+
const entities = this.db.prepare('SELECT * FROM entities').all().map(r => this.rowToEntity(r));
|
|
489
|
+
return { memories, edges, entities };
|
|
490
|
+
}
|
|
491
|
+
// --------------------------------------------------------
|
|
492
|
+
// Internal helpers
|
|
493
|
+
// --------------------------------------------------------
|
|
494
|
+
rowToMemory(row) {
|
|
495
|
+
return {
|
|
496
|
+
id: row.id,
|
|
497
|
+
type: row.type,
|
|
498
|
+
content: row.content,
|
|
499
|
+
summary: row.summary,
|
|
500
|
+
source: {
|
|
501
|
+
type: row.source_type,
|
|
502
|
+
sessionId: row.source_session_id ?? undefined,
|
|
503
|
+
agentId: row.source_agent_id ?? undefined,
|
|
504
|
+
evidence: row.source_evidence ? JSON.parse(row.source_evidence) : undefined,
|
|
505
|
+
timestamp: row.source_timestamp,
|
|
506
|
+
},
|
|
507
|
+
createdAt: row.created_at,
|
|
508
|
+
lastAccessedAt: row.last_accessed_at,
|
|
509
|
+
lastModifiedAt: row.last_modified_at,
|
|
510
|
+
accessCount: row.access_count,
|
|
511
|
+
expiresAt: row.expires_at ?? undefined,
|
|
512
|
+
salience: row.salience,
|
|
513
|
+
confidence: row.confidence,
|
|
514
|
+
stability: row.stability,
|
|
515
|
+
entities: JSON.parse(row.entities),
|
|
516
|
+
topics: JSON.parse(row.topics),
|
|
517
|
+
status: row.status ?? 'active',
|
|
518
|
+
visibility: row.visibility,
|
|
519
|
+
};
|
|
520
|
+
}
|
|
521
|
+
rowToEdge(row) {
|
|
522
|
+
return {
|
|
523
|
+
id: row.id,
|
|
524
|
+
sourceId: row.source_id,
|
|
525
|
+
targetId: row.target_id,
|
|
526
|
+
type: row.type,
|
|
527
|
+
strength: row.strength,
|
|
528
|
+
createdAt: row.created_at,
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
rowToEntity(row) {
|
|
532
|
+
return {
|
|
533
|
+
id: row.id,
|
|
534
|
+
name: row.name,
|
|
535
|
+
type: row.type,
|
|
536
|
+
aliases: JSON.parse(row.aliases),
|
|
537
|
+
properties: JSON.parse(row.properties),
|
|
538
|
+
firstSeen: row.first_seen,
|
|
539
|
+
lastSeen: row.last_seen,
|
|
540
|
+
memoryCount: row.memory_count,
|
|
541
|
+
importance: row.importance,
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
close() {
|
|
545
|
+
this.db.close();
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|