@aman_asmuei/amem 0.2.0 → 0.4.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 +206 -453
- package/dist/database.d.ts +54 -0
- package/dist/database.js +278 -4
- package/dist/database.js.map +1 -1
- package/dist/index.js +95 -9
- package/dist/index.js.map +1 -1
- package/dist/memory.d.ts +27 -0
- package/dist/memory.js +98 -1
- package/dist/memory.js.map +1 -1
- package/dist/schemas.d.ts +386 -28
- package/dist/schemas.js +106 -0
- package/dist/schemas.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +856 -7
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
package/dist/database.d.ts
CHANGED
|
@@ -6,11 +6,49 @@ export interface MemoryInput {
|
|
|
6
6
|
confidence: number;
|
|
7
7
|
source: string;
|
|
8
8
|
embedding: Float32Array | null;
|
|
9
|
+
scope: string;
|
|
9
10
|
}
|
|
10
11
|
export interface MemoryStats {
|
|
11
12
|
total: number;
|
|
12
13
|
byType: Record<string, number>;
|
|
13
14
|
}
|
|
15
|
+
export interface LogEntry {
|
|
16
|
+
id: string;
|
|
17
|
+
sessionId: string;
|
|
18
|
+
role: "user" | "assistant" | "system";
|
|
19
|
+
content: string;
|
|
20
|
+
timestamp: number;
|
|
21
|
+
project: string;
|
|
22
|
+
metadata: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
export interface LogEntryInput {
|
|
25
|
+
sessionId: string;
|
|
26
|
+
role: "user" | "assistant" | "system";
|
|
27
|
+
content: string;
|
|
28
|
+
project: string;
|
|
29
|
+
metadata?: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
export interface MemoryVersion {
|
|
32
|
+
versionId: string;
|
|
33
|
+
memoryId: string;
|
|
34
|
+
content: string;
|
|
35
|
+
confidence: number;
|
|
36
|
+
editedAt: number;
|
|
37
|
+
reason: string;
|
|
38
|
+
}
|
|
39
|
+
export interface MemoryRelation {
|
|
40
|
+
id: string;
|
|
41
|
+
fromId: string;
|
|
42
|
+
toId: string;
|
|
43
|
+
relationshipType: string;
|
|
44
|
+
strength: number;
|
|
45
|
+
createdAt: number;
|
|
46
|
+
}
|
|
47
|
+
export interface PatchInput {
|
|
48
|
+
field: "content" | "confidence" | "tags" | "type";
|
|
49
|
+
value: string | number | string[];
|
|
50
|
+
reason: string;
|
|
51
|
+
}
|
|
14
52
|
export interface AmemDatabase {
|
|
15
53
|
insertMemory(input: MemoryInput): string;
|
|
16
54
|
getById(id: string): Memory | null;
|
|
@@ -23,7 +61,23 @@ export interface AmemDatabase {
|
|
|
23
61
|
touchAccess(id: string): void;
|
|
24
62
|
deleteMemory(id: string): void;
|
|
25
63
|
getStats(): MemoryStats;
|
|
64
|
+
searchByScope(scope: string): Memory[];
|
|
65
|
+
getAllForProject(project: string): Memory[];
|
|
26
66
|
listTables(): string[];
|
|
27
67
|
close(): void;
|
|
68
|
+
appendLog(entry: LogEntryInput): string;
|
|
69
|
+
getLogBySession(sessionId: string): LogEntry[];
|
|
70
|
+
searchLog(query: string, limit?: number): LogEntry[];
|
|
71
|
+
getRecentLog(limit: number, project?: string): LogEntry[];
|
|
72
|
+
snapshotVersion(memoryId: string, reason: string): void;
|
|
73
|
+
getVersionHistory(memoryId: string): MemoryVersion[];
|
|
74
|
+
patchMemory(id: string, patch: PatchInput): boolean;
|
|
75
|
+
addRelation(fromId: string, toId: string, type: string, strength?: number): string;
|
|
76
|
+
getRelations(memoryId: string): MemoryRelation[];
|
|
77
|
+
removeRelation(relationId: string): void;
|
|
78
|
+
getRelatedMemories(memoryId: string): Memory[];
|
|
79
|
+
getMemoriesByDateRange(from: number, to: number): Memory[];
|
|
80
|
+
getMemoriesSince(timestamp: number): Memory[];
|
|
81
|
+
fullTextSearch(query: string, limit?: number): Memory[];
|
|
28
82
|
}
|
|
29
83
|
export declare function createDatabase(dbPath: string): AmemDatabase;
|
package/dist/database.js
CHANGED
|
@@ -14,6 +14,7 @@ function rowToMemory(row) {
|
|
|
14
14
|
embedding: row.embedding
|
|
15
15
|
? new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4)
|
|
16
16
|
: null,
|
|
17
|
+
scope: row.scope,
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
20
|
export function createDatabase(dbPath) {
|
|
@@ -30,17 +31,83 @@ export function createDatabase(dbPath) {
|
|
|
30
31
|
created_at INTEGER NOT NULL,
|
|
31
32
|
last_accessed INTEGER NOT NULL,
|
|
32
33
|
source TEXT NOT NULL,
|
|
33
|
-
embedding BLOB
|
|
34
|
+
embedding BLOB,
|
|
35
|
+
scope TEXT NOT NULL DEFAULT 'global'
|
|
34
36
|
);
|
|
35
37
|
|
|
36
38
|
CREATE INDEX IF NOT EXISTS idx_memories_type ON memories(type);
|
|
37
39
|
CREATE INDEX IF NOT EXISTS idx_memories_created_at ON memories(created_at);
|
|
38
40
|
CREATE INDEX IF NOT EXISTS idx_memories_confidence ON memories(confidence);
|
|
41
|
+
|
|
42
|
+
-- Lossless raw conversation log (append-only)
|
|
43
|
+
CREATE TABLE IF NOT EXISTS conversation_log (
|
|
44
|
+
id TEXT PRIMARY KEY,
|
|
45
|
+
session_id TEXT NOT NULL,
|
|
46
|
+
role TEXT NOT NULL CHECK(role IN ('user','assistant','system')),
|
|
47
|
+
content TEXT NOT NULL,
|
|
48
|
+
timestamp INTEGER NOT NULL,
|
|
49
|
+
project TEXT NOT NULL DEFAULT 'global',
|
|
50
|
+
metadata TEXT NOT NULL DEFAULT '{}'
|
|
51
|
+
);
|
|
52
|
+
CREATE INDEX IF NOT EXISTS idx_log_session ON conversation_log(session_id);
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_log_timestamp ON conversation_log(timestamp);
|
|
54
|
+
CREATE INDEX IF NOT EXISTS idx_log_project ON conversation_log(project);
|
|
55
|
+
|
|
56
|
+
-- FTS for full-text search on memories
|
|
57
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memories_fts USING fts5(
|
|
58
|
+
id UNINDEXED,
|
|
59
|
+
content,
|
|
60
|
+
tags,
|
|
61
|
+
content='memories',
|
|
62
|
+
content_rowid='rowid'
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
-- FTS for full-text search on conversation log
|
|
66
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS log_fts USING fts5(
|
|
67
|
+
id UNINDEXED,
|
|
68
|
+
content,
|
|
69
|
+
content='conversation_log',
|
|
70
|
+
content_rowid='rowid'
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
-- Memory version history
|
|
74
|
+
CREATE TABLE IF NOT EXISTS memory_versions (
|
|
75
|
+
version_id TEXT PRIMARY KEY,
|
|
76
|
+
memory_id TEXT NOT NULL,
|
|
77
|
+
content TEXT NOT NULL,
|
|
78
|
+
confidence REAL NOT NULL,
|
|
79
|
+
edited_at INTEGER NOT NULL,
|
|
80
|
+
reason TEXT NOT NULL DEFAULT 'manual edit',
|
|
81
|
+
FOREIGN KEY(memory_id) REFERENCES memories(id) ON DELETE CASCADE
|
|
82
|
+
);
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_versions_memory_id ON memory_versions(memory_id);
|
|
84
|
+
|
|
85
|
+
-- Knowledge graph: relations between memories
|
|
86
|
+
CREATE TABLE IF NOT EXISTS memory_relations (
|
|
87
|
+
id TEXT PRIMARY KEY,
|
|
88
|
+
from_id TEXT NOT NULL,
|
|
89
|
+
to_id TEXT NOT NULL,
|
|
90
|
+
relationship_type TEXT NOT NULL,
|
|
91
|
+
strength REAL NOT NULL DEFAULT 0.8,
|
|
92
|
+
created_at INTEGER NOT NULL,
|
|
93
|
+
FOREIGN KEY(from_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
94
|
+
FOREIGN KEY(to_id) REFERENCES memories(id) ON DELETE CASCADE,
|
|
95
|
+
UNIQUE(from_id, to_id, relationship_type)
|
|
96
|
+
);
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_relations_from ON memory_relations(from_id);
|
|
98
|
+
CREATE INDEX IF NOT EXISTS idx_relations_to ON memory_relations(to_id);
|
|
39
99
|
`);
|
|
100
|
+
// Migration: add scope column if not present
|
|
101
|
+
const columns = db.pragma('table_info(memories)');
|
|
102
|
+
const hasScope = columns.some(c => c.name === 'scope');
|
|
103
|
+
if (!hasScope) {
|
|
104
|
+
db.exec(`ALTER TABLE memories ADD COLUMN scope TEXT NOT NULL DEFAULT 'global'`);
|
|
105
|
+
}
|
|
106
|
+
db.exec(`CREATE INDEX IF NOT EXISTS idx_memories_scope ON memories(scope)`);
|
|
40
107
|
const stmts = {
|
|
41
108
|
insert: db.prepare(`
|
|
42
|
-
INSERT INTO memories (id, content, type, tags, confidence, access_count, created_at, last_accessed, source, embedding)
|
|
43
|
-
VALUES (?, ?, ?, ?, ?, 0, ?, ?, ?, ?)
|
|
109
|
+
INSERT INTO memories (id, content, type, tags, confidence, access_count, created_at, last_accessed, source, embedding, scope)
|
|
110
|
+
VALUES (?, ?, ?, ?, ?, 0, ?, ?, ?, ?, ?)
|
|
44
111
|
`),
|
|
45
112
|
getById: db.prepare(`SELECT * FROM memories WHERE id = ?`),
|
|
46
113
|
searchByType: db.prepare(`SELECT * FROM memories WHERE type = ? ORDER BY last_accessed DESC`),
|
|
@@ -58,7 +125,52 @@ export function createDatabase(dbPath) {
|
|
|
58
125
|
countAll: db.prepare(`SELECT COUNT(*) as count FROM memories`),
|
|
59
126
|
countByType: db.prepare(`SELECT type, COUNT(*) as count FROM memories GROUP BY type`),
|
|
60
127
|
listTables: db.prepare(`SELECT name FROM sqlite_master WHERE type = 'table' ORDER BY name`),
|
|
128
|
+
searchByScope: db.prepare(`SELECT * FROM memories WHERE scope = ? ORDER BY last_accessed DESC`),
|
|
129
|
+
getAllForProject: db.prepare(`SELECT * FROM memories WHERE scope = 'global' OR scope = ? ORDER BY last_accessed DESC`),
|
|
130
|
+
updateContent: db.prepare(`UPDATE memories SET content = ?, last_accessed = ? WHERE id = ?`),
|
|
131
|
+
updateType: db.prepare(`UPDATE memories SET type = ?, last_accessed = ? WHERE id = ?`),
|
|
132
|
+
updateTags: db.prepare(`UPDATE memories SET tags = ?, last_accessed = ? WHERE id = ?`),
|
|
133
|
+
getByDateRange: db.prepare(`SELECT * FROM memories WHERE created_at BETWEEN ? AND ? ORDER BY created_at DESC`),
|
|
134
|
+
getSince: db.prepare(`SELECT * FROM memories WHERE created_at >= ? ORDER BY created_at DESC`),
|
|
135
|
+
// Log
|
|
136
|
+
insertLog: db.prepare(`
|
|
137
|
+
INSERT INTO conversation_log (id, session_id, role, content, timestamp, project, metadata)
|
|
138
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
139
|
+
`),
|
|
140
|
+
getLogBySession: db.prepare(`SELECT * FROM conversation_log WHERE session_id = ? ORDER BY timestamp ASC`),
|
|
141
|
+
getRecentLog: db.prepare(`SELECT * FROM conversation_log ORDER BY timestamp DESC LIMIT ?`),
|
|
142
|
+
getRecentLogByProject: db.prepare(`SELECT * FROM conversation_log WHERE project = ? ORDER BY timestamp DESC LIMIT ?`),
|
|
143
|
+
// Versions
|
|
144
|
+
insertVersion: db.prepare(`
|
|
145
|
+
INSERT INTO memory_versions (version_id, memory_id, content, confidence, edited_at, reason)
|
|
146
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
147
|
+
`),
|
|
148
|
+
getVersions: db.prepare(`SELECT * FROM memory_versions WHERE memory_id = ? ORDER BY edited_at DESC`),
|
|
149
|
+
// Relations
|
|
150
|
+
insertRelation: db.prepare(`
|
|
151
|
+
INSERT OR REPLACE INTO memory_relations (id, from_id, to_id, relationship_type, strength, created_at)
|
|
152
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
153
|
+
`),
|
|
154
|
+
getRelationsFrom: db.prepare(`SELECT * FROM memory_relations WHERE from_id = ?`),
|
|
155
|
+
getRelationsTo: db.prepare(`SELECT * FROM memory_relations WHERE to_id = ?`),
|
|
156
|
+
deleteRelation: db.prepare(`DELETE FROM memory_relations WHERE id = ?`),
|
|
61
157
|
};
|
|
158
|
+
// Keep FTS index in sync via triggers
|
|
159
|
+
db.exec(`
|
|
160
|
+
CREATE TRIGGER IF NOT EXISTS memories_ai AFTER INSERT ON memories BEGIN
|
|
161
|
+
INSERT INTO memories_fts(id, content, tags) VALUES (new.id, new.content, new.tags);
|
|
162
|
+
END;
|
|
163
|
+
CREATE TRIGGER IF NOT EXISTS memories_ad AFTER DELETE ON memories BEGIN
|
|
164
|
+
INSERT INTO memories_fts(memories_fts, id, content, tags) VALUES ('delete', old.id, old.content, old.tags);
|
|
165
|
+
END;
|
|
166
|
+
CREATE TRIGGER IF NOT EXISTS memories_au AFTER UPDATE ON memories BEGIN
|
|
167
|
+
INSERT INTO memories_fts(memories_fts, id, content, tags) VALUES ('delete', old.id, old.content, old.tags);
|
|
168
|
+
INSERT INTO memories_fts(id, content, tags) VALUES (new.id, new.content, new.tags);
|
|
169
|
+
END;
|
|
170
|
+
CREATE TRIGGER IF NOT EXISTS log_ai AFTER INSERT ON conversation_log BEGIN
|
|
171
|
+
INSERT INTO log_fts(id, content) VALUES (new.id, new.content);
|
|
172
|
+
END;
|
|
173
|
+
`);
|
|
62
174
|
return {
|
|
63
175
|
insertMemory(input) {
|
|
64
176
|
const id = randomUUID();
|
|
@@ -66,7 +178,7 @@ export function createDatabase(dbPath) {
|
|
|
66
178
|
const embeddingBuffer = input.embedding
|
|
67
179
|
? Buffer.from(input.embedding.buffer, input.embedding.byteOffset, input.embedding.byteLength)
|
|
68
180
|
: null;
|
|
69
|
-
stmts.insert.run(id, input.content, input.type, JSON.stringify(input.tags), input.confidence, now, now, input.source, embeddingBuffer);
|
|
181
|
+
stmts.insert.run(id, input.content, input.type, JSON.stringify(input.tags), input.confidence, now, now, input.source, embeddingBuffer, input.scope);
|
|
70
182
|
return id;
|
|
71
183
|
},
|
|
72
184
|
getById(id) {
|
|
@@ -112,6 +224,14 @@ export function createDatabase(dbPath) {
|
|
|
112
224
|
}
|
|
113
225
|
return { total, byType };
|
|
114
226
|
},
|
|
227
|
+
searchByScope(scope) {
|
|
228
|
+
const rows = stmts.searchByScope.all(scope);
|
|
229
|
+
return rows.map(rowToMemory);
|
|
230
|
+
},
|
|
231
|
+
getAllForProject(project) {
|
|
232
|
+
const rows = stmts.getAllForProject.all(project);
|
|
233
|
+
return rows.map(rowToMemory);
|
|
234
|
+
},
|
|
115
235
|
listTables() {
|
|
116
236
|
const rows = stmts.listTables.all();
|
|
117
237
|
return rows.map((r) => r.name);
|
|
@@ -119,6 +239,160 @@ export function createDatabase(dbPath) {
|
|
|
119
239
|
close() {
|
|
120
240
|
db.close();
|
|
121
241
|
},
|
|
242
|
+
// ── Raw log ──────────────────────────────────────────────
|
|
243
|
+
appendLog(entry) {
|
|
244
|
+
const id = randomUUID();
|
|
245
|
+
stmts.insertLog.run(id, entry.sessionId, entry.role, entry.content, Date.now(), entry.project, JSON.stringify(entry.metadata ?? {}));
|
|
246
|
+
return id;
|
|
247
|
+
},
|
|
248
|
+
getLogBySession(sessionId) {
|
|
249
|
+
const rows = stmts.getLogBySession.all(sessionId);
|
|
250
|
+
return rows.map(r => ({
|
|
251
|
+
id: r.id,
|
|
252
|
+
sessionId: r.session_id,
|
|
253
|
+
role: r.role,
|
|
254
|
+
content: r.content,
|
|
255
|
+
timestamp: r.timestamp,
|
|
256
|
+
project: r.project,
|
|
257
|
+
metadata: JSON.parse(r.metadata),
|
|
258
|
+
}));
|
|
259
|
+
},
|
|
260
|
+
searchLog(query, limit = 20) {
|
|
261
|
+
const stmt = db.prepare(`
|
|
262
|
+
SELECT conversation_log.* FROM log_fts
|
|
263
|
+
JOIN conversation_log ON conversation_log.id = log_fts.id
|
|
264
|
+
WHERE log_fts.content MATCH ?
|
|
265
|
+
ORDER BY rank
|
|
266
|
+
LIMIT ?
|
|
267
|
+
`);
|
|
268
|
+
const rows = stmt.all(query, limit);
|
|
269
|
+
return rows.map(r => ({
|
|
270
|
+
id: r.id,
|
|
271
|
+
sessionId: r.session_id,
|
|
272
|
+
role: r.role,
|
|
273
|
+
content: r.content,
|
|
274
|
+
timestamp: r.timestamp,
|
|
275
|
+
project: r.project,
|
|
276
|
+
metadata: JSON.parse(r.metadata),
|
|
277
|
+
}));
|
|
278
|
+
},
|
|
279
|
+
getRecentLog(limit, project) {
|
|
280
|
+
const rows = (project
|
|
281
|
+
? stmts.getRecentLogByProject.all(project, limit)
|
|
282
|
+
: stmts.getRecentLog.all(limit));
|
|
283
|
+
return rows.map(r => ({
|
|
284
|
+
id: r.id,
|
|
285
|
+
sessionId: r.session_id,
|
|
286
|
+
role: r.role,
|
|
287
|
+
content: r.content,
|
|
288
|
+
timestamp: r.timestamp,
|
|
289
|
+
project: r.project,
|
|
290
|
+
metadata: JSON.parse(r.metadata),
|
|
291
|
+
}));
|
|
292
|
+
},
|
|
293
|
+
// ── Versioning ──────────────────────────────────────────
|
|
294
|
+
snapshotVersion(memoryId, reason) {
|
|
295
|
+
const mem = this.getById(memoryId);
|
|
296
|
+
if (!mem)
|
|
297
|
+
return;
|
|
298
|
+
stmts.insertVersion.run(randomUUID(), mem.id, mem.content, mem.confidence, Date.now(), reason);
|
|
299
|
+
},
|
|
300
|
+
getVersionHistory(memoryId) {
|
|
301
|
+
const rows = stmts.getVersions.all(memoryId);
|
|
302
|
+
return rows.map(r => ({
|
|
303
|
+
versionId: r.version_id,
|
|
304
|
+
memoryId: r.memory_id,
|
|
305
|
+
content: r.content,
|
|
306
|
+
confidence: r.confidence,
|
|
307
|
+
editedAt: r.edited_at,
|
|
308
|
+
reason: r.reason,
|
|
309
|
+
}));
|
|
310
|
+
},
|
|
311
|
+
patchMemory(id, patch) {
|
|
312
|
+
const mem = this.getById(id);
|
|
313
|
+
if (!mem)
|
|
314
|
+
return false;
|
|
315
|
+
// Snapshot before patching
|
|
316
|
+
this.snapshotVersion(id, `before patch: ${patch.reason}`);
|
|
317
|
+
const now = Date.now();
|
|
318
|
+
switch (patch.field) {
|
|
319
|
+
case "content":
|
|
320
|
+
stmts.updateContent.run(patch.value, now, id);
|
|
321
|
+
break;
|
|
322
|
+
case "confidence":
|
|
323
|
+
stmts.updateConfidence.run(patch.value, now, id);
|
|
324
|
+
break;
|
|
325
|
+
case "tags":
|
|
326
|
+
stmts.updateTags.run(JSON.stringify(patch.value), now, id);
|
|
327
|
+
break;
|
|
328
|
+
case "type":
|
|
329
|
+
stmts.updateType.run(patch.value, now, id);
|
|
330
|
+
break;
|
|
331
|
+
default:
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
return true;
|
|
335
|
+
},
|
|
336
|
+
// ── Relations ────────────────────────────────────────────
|
|
337
|
+
addRelation(fromId, toId, type, strength = 0.8) {
|
|
338
|
+
const id = randomUUID();
|
|
339
|
+
stmts.insertRelation.run(id, fromId, toId, type, strength, Date.now());
|
|
340
|
+
return id;
|
|
341
|
+
},
|
|
342
|
+
getRelations(memoryId) {
|
|
343
|
+
const from = stmts.getRelationsFrom.all(memoryId);
|
|
344
|
+
const to = stmts.getRelationsTo.all(memoryId);
|
|
345
|
+
return [...from, ...to].map(r => ({
|
|
346
|
+
id: r.id,
|
|
347
|
+
fromId: r.from_id,
|
|
348
|
+
toId: r.to_id,
|
|
349
|
+
relationshipType: r.relationship_type,
|
|
350
|
+
strength: r.strength,
|
|
351
|
+
createdAt: r.created_at,
|
|
352
|
+
}));
|
|
353
|
+
},
|
|
354
|
+
removeRelation(relationId) {
|
|
355
|
+
stmts.deleteRelation.run(relationId);
|
|
356
|
+
},
|
|
357
|
+
getRelatedMemories(memoryId) {
|
|
358
|
+
const relations = this.getRelations(memoryId);
|
|
359
|
+
const ids = relations.map(r => r.fromId === memoryId ? r.toId : r.fromId);
|
|
360
|
+
return ids
|
|
361
|
+
.map(id => this.getById(id))
|
|
362
|
+
.filter((m) => m !== null);
|
|
363
|
+
},
|
|
364
|
+
// ── Temporal queries ─────────────────────────────────────
|
|
365
|
+
getMemoriesByDateRange(from, to) {
|
|
366
|
+
const rows = stmts.getByDateRange.all(from, to);
|
|
367
|
+
return rows.map(rowToMemory);
|
|
368
|
+
},
|
|
369
|
+
getMemoriesSince(timestamp) {
|
|
370
|
+
const rows = stmts.getSince.all(timestamp);
|
|
371
|
+
return rows.map(rowToMemory);
|
|
372
|
+
},
|
|
373
|
+
// ── Full-text search ─────────────────────────────────────
|
|
374
|
+
fullTextSearch(query, limit = 20) {
|
|
375
|
+
try {
|
|
376
|
+
const stmt = db.prepare(`
|
|
377
|
+
SELECT memories.* FROM memories_fts
|
|
378
|
+
JOIN memories ON memories.id = memories_fts.id
|
|
379
|
+
WHERE memories_fts MATCH ?
|
|
380
|
+
ORDER BY rank
|
|
381
|
+
LIMIT ?
|
|
382
|
+
`);
|
|
383
|
+
const rows = stmt.all(query, limit);
|
|
384
|
+
return rows.map(rowToMemory);
|
|
385
|
+
}
|
|
386
|
+
catch {
|
|
387
|
+
// FTS may fail on complex queries — fall back to LIKE
|
|
388
|
+
const stmt = db.prepare(`
|
|
389
|
+
SELECT * FROM memories WHERE content LIKE ? OR tags LIKE ? ORDER BY last_accessed DESC LIMIT ?
|
|
390
|
+
`);
|
|
391
|
+
const pattern = `%${query}%`;
|
|
392
|
+
const rows = stmt.all(pattern, pattern, limit);
|
|
393
|
+
return rows.map(rowToMemory);
|
|
394
|
+
}
|
|
395
|
+
},
|
|
122
396
|
};
|
|
123
397
|
}
|
|
124
398
|
//# sourceMappingURL=database.js.map
|
package/dist/database.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -10,12 +10,28 @@ import fs from "node:fs";
|
|
|
10
10
|
const AMEM_DIR = process.env.AMEM_DIR || path.join(os.homedir(), ".amem");
|
|
11
11
|
const DB_PATH = process.env.AMEM_DB || path.join(AMEM_DIR, "memory.db");
|
|
12
12
|
fs.mkdirSync(path.dirname(DB_PATH), { recursive: true });
|
|
13
|
+
function detectProject() {
|
|
14
|
+
if (process.env.AMEM_PROJECT)
|
|
15
|
+
return `project:${process.env.AMEM_PROJECT}`;
|
|
16
|
+
try {
|
|
17
|
+
let dir = process.cwd();
|
|
18
|
+
while (dir !== path.dirname(dir)) {
|
|
19
|
+
if (fs.existsSync(path.join(dir, ".git"))) {
|
|
20
|
+
return `project:${path.basename(dir)}`;
|
|
21
|
+
}
|
|
22
|
+
dir = path.dirname(dir);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
catch { }
|
|
26
|
+
return "global";
|
|
27
|
+
}
|
|
13
28
|
const db = createDatabase(DB_PATH);
|
|
29
|
+
const currentProject = detectProject();
|
|
14
30
|
const server = new McpServer({
|
|
15
31
|
name: "amem-mcp-server",
|
|
16
|
-
version: "0.
|
|
32
|
+
version: "0.4.0",
|
|
17
33
|
});
|
|
18
|
-
registerTools(server, db);
|
|
34
|
+
registerTools(server, db, currentProject);
|
|
19
35
|
// Register MCP prompts — these teach AI clients how to use Amem effectively
|
|
20
36
|
server.registerPrompt("extraction-guide", {
|
|
21
37
|
description: "Guidelines for what to extract from conversations into Amem memory",
|
|
@@ -58,7 +74,26 @@ Call memory_extract with an array of memories. Each memory should be:
|
|
|
58
74
|
- Ephemeral task details ("currently debugging X")
|
|
59
75
|
- Things obvious from the code itself
|
|
60
76
|
- Sensitive data (API keys, passwords)
|
|
61
|
-
- Exact file contents (just reference the path)
|
|
77
|
+
- Exact file contents (just reference the path)
|
|
78
|
+
|
|
79
|
+
## Patching vs. Storing
|
|
80
|
+
|
|
81
|
+
- Memory mostly right but has a wrong detail → **memory_patch** (surgical, auto-versioned)
|
|
82
|
+
- Memory completely wrong → memory_forget then memory_store
|
|
83
|
+
- Always check with memory_search or memory_recall before creating a duplicate
|
|
84
|
+
|
|
85
|
+
## Building the Knowledge Graph
|
|
86
|
+
|
|
87
|
+
After storing decisions, link connected memories with memory_relate:
|
|
88
|
+
- Decision "supports" Pattern (why code is written a certain way)
|
|
89
|
+
- Correction "caused_by" Decision (why something is off-limits)
|
|
90
|
+
- Topology "depends_on" Topology (how modules relate)
|
|
91
|
+
|
|
92
|
+
## Lossless Log
|
|
93
|
+
|
|
94
|
+
For raw exchanges not yet ready to distill:
|
|
95
|
+
- Use memory_log to preserve turns verbatim (append-only, nothing lost)
|
|
96
|
+
- Search later with memory_log_recall and promote to proper memories`,
|
|
62
97
|
},
|
|
63
98
|
}],
|
|
64
99
|
}));
|
|
@@ -71,12 +106,26 @@ server.registerPrompt("session-start", {
|
|
|
71
106
|
type: "text",
|
|
72
107
|
text: `You have access to Amem memory. At the start of this conversation:
|
|
73
108
|
|
|
74
|
-
1. Call
|
|
75
|
-
2.
|
|
76
|
-
3.
|
|
77
|
-
4.
|
|
109
|
+
1. Call memory_inject with the likely topic — this surfaces corrections (hard constraints) and decisions first
|
|
110
|
+
2. Call memory_context for broader preferences, patterns, and topology
|
|
111
|
+
3. Apply corrections as absolute constraints — they override everything else
|
|
112
|
+
4. Reference memories naturally: "I remember you prefer X" not "According to my memory database..."
|
|
113
|
+
5. If continuing previous work, call memory_log_recall with the session ID or a keyword to replay raw history
|
|
78
114
|
|
|
79
|
-
|
|
115
|
+
## Tool Quick Reference
|
|
116
|
+
|
|
117
|
+
| Goal | Tool |
|
|
118
|
+
|------|------|
|
|
119
|
+
| Load context for a task | memory_inject, memory_context |
|
|
120
|
+
| Find something specific | memory_recall (semantic), memory_search (exact) |
|
|
121
|
+
| Store a new memory | memory_store or memory_extract (batch) |
|
|
122
|
+
| Fix an existing memory | memory_patch (surgical, versioned) |
|
|
123
|
+
| See what changed | memory_since "7d" |
|
|
124
|
+
| Preserve raw conversation | memory_log |
|
|
125
|
+
| Replay a past session | memory_log_recall |
|
|
126
|
+
| Link related memories | memory_relate |
|
|
127
|
+
| View edit history | memory_versions |
|
|
128
|
+
| Clean up the database | memory_consolidate |`,
|
|
80
129
|
},
|
|
81
130
|
}],
|
|
82
131
|
}));
|
|
@@ -137,6 +186,43 @@ server.registerResource("summary", "amem://summary", { mimeType: "text/plain", d
|
|
|
137
186
|
contents: [{ uri: "amem://summary", mimeType: "text/plain", text }],
|
|
138
187
|
};
|
|
139
188
|
});
|
|
189
|
+
server.registerResource("log-recent", "amem://log/recent", { mimeType: "text/plain", description: "Recent raw conversation log entries — lossless, append-only history" }, () => {
|
|
190
|
+
const entries = db.getRecentLog(50, currentProject);
|
|
191
|
+
if (entries.length === 0) {
|
|
192
|
+
return { contents: [{ uri: "amem://log/recent", mimeType: "text/plain", text: "No log entries yet. Use memory_log to preserve conversation turns." }] };
|
|
193
|
+
}
|
|
194
|
+
const lines = [`# Recent Conversation Log (${entries.length} entries)\n`];
|
|
195
|
+
for (const e of entries) {
|
|
196
|
+
const ts = new Date(e.timestamp).toISOString().slice(0, 16).replace("T", " ");
|
|
197
|
+
lines.push(`[${ts}] ${e.role.toUpperCase()} (session: ${e.sessionId.slice(0, 8)})`);
|
|
198
|
+
lines.push(e.content.length > 200 ? e.content.slice(0, 200) + "…" : e.content);
|
|
199
|
+
lines.push("");
|
|
200
|
+
}
|
|
201
|
+
return { contents: [{ uri: "amem://log/recent", mimeType: "text/plain", text: lines.join("\n") }] };
|
|
202
|
+
});
|
|
203
|
+
server.registerResource("graph-overview", "amem://graph", { mimeType: "text/plain", description: "Knowledge graph overview — all explicit memory relationships" }, () => {
|
|
204
|
+
const all = db.getAll();
|
|
205
|
+
const lines = [`# Knowledge Graph (${all.length} nodes)\n`];
|
|
206
|
+
let edgeCount = 0;
|
|
207
|
+
for (const mem of all) {
|
|
208
|
+
const relations = db.getRelations(mem.id);
|
|
209
|
+
const outgoing = relations.filter(r => r.fromId === mem.id);
|
|
210
|
+
if (outgoing.length > 0) {
|
|
211
|
+
lines.push(`[${mem.id.slice(0, 8)}] "${mem.content.slice(0, 60)}"`);
|
|
212
|
+
for (const r of outgoing) {
|
|
213
|
+
const target = db.getById(r.toId);
|
|
214
|
+
lines.push(` → [${r.relationshipType}] "${target?.content.slice(0, 50) ?? r.toId.slice(0, 8)}"`);
|
|
215
|
+
edgeCount++;
|
|
216
|
+
}
|
|
217
|
+
lines.push("");
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
if (edgeCount === 0) {
|
|
221
|
+
return { contents: [{ uri: "amem://graph", mimeType: "text/plain", text: "No memory relations yet. Use memory_relate to build the knowledge graph." }] };
|
|
222
|
+
}
|
|
223
|
+
lines.unshift(`${edgeCount} edges\n`);
|
|
224
|
+
return { contents: [{ uri: "amem://graph", mimeType: "text/plain", text: lines.join("\n") }] };
|
|
225
|
+
});
|
|
140
226
|
process.on("SIGINT", () => {
|
|
141
227
|
db.close();
|
|
142
228
|
process.exit(0);
|
|
@@ -147,5 +233,5 @@ process.on("SIGTERM", () => {
|
|
|
147
233
|
});
|
|
148
234
|
const transport = new StdioServerTransport();
|
|
149
235
|
await server.connect(transport);
|
|
150
|
-
console.error(
|
|
236
|
+
console.error(`Amem running. DB: ${DB_PATH} | Project: ${currentProject}`);
|
|
151
237
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAExE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAEzD,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/memory.d.ts
CHANGED
|
@@ -20,6 +20,7 @@ export interface Memory {
|
|
|
20
20
|
lastAccessed: number;
|
|
21
21
|
source: string;
|
|
22
22
|
embedding: Float32Array | null;
|
|
23
|
+
scope: string;
|
|
23
24
|
}
|
|
24
25
|
export interface ScoreInput {
|
|
25
26
|
relevance: number;
|
|
@@ -41,8 +42,34 @@ export interface RecallOptions {
|
|
|
41
42
|
type?: MemoryTypeValue;
|
|
42
43
|
tag?: string;
|
|
43
44
|
minConfidence?: number;
|
|
45
|
+
scope?: string;
|
|
44
46
|
}
|
|
45
47
|
export interface RecalledMemory extends Memory {
|
|
46
48
|
score: number;
|
|
47
49
|
}
|
|
48
50
|
export declare function recallMemories(db: AmemDatabase, options: RecallOptions): RecalledMemory[];
|
|
51
|
+
export interface ConsolidationOptions {
|
|
52
|
+
maxStaleDays: number;
|
|
53
|
+
minConfidence: number;
|
|
54
|
+
minAccessCount: number;
|
|
55
|
+
dryRun: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface ConsolidationAction {
|
|
58
|
+
action: "merged" | "pruned" | "promoted";
|
|
59
|
+
memoryIds: string[];
|
|
60
|
+
description: string;
|
|
61
|
+
}
|
|
62
|
+
export interface ConsolidationReport {
|
|
63
|
+
merged: number;
|
|
64
|
+
pruned: number;
|
|
65
|
+
promoted: number;
|
|
66
|
+
actions: ConsolidationAction[];
|
|
67
|
+
healthScore: number;
|
|
68
|
+
before: {
|
|
69
|
+
total: number;
|
|
70
|
+
};
|
|
71
|
+
after: {
|
|
72
|
+
total: number;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
export declare function consolidateMemories(db: AmemDatabase, cosineSim: (a: Float32Array, b: Float32Array) => number, options: ConsolidationOptions): ConsolidationReport;
|