@claude-flow/memory 3.0.0-alpha.20 → 3.0.0-alpha.22
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 +858 -858
- package/dist/agentdb-backend.d.ts +19 -0
- package/dist/agentdb-backend.d.ts.map +1 -1
- package/dist/agentdb-backend.js +50 -29
- package/dist/agentdb-backend.js.map +1 -1
- package/dist/agentdb-retrieval-guard.d.ts +76 -0
- package/dist/agentdb-retrieval-guard.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.js +77 -0
- package/dist/agentdb-retrieval-guard.js.map +1 -0
- package/dist/agentdb-retrieval-guard.test.d.ts +12 -0
- package/dist/agentdb-retrieval-guard.test.d.ts.map +1 -0
- package/dist/agentdb-retrieval-guard.test.js +129 -0
- package/dist/agentdb-retrieval-guard.test.js.map +1 -0
- package/dist/auto-memory-bridge.test.js +46 -46
- package/dist/controller-registry.d.ts +38 -3
- package/dist/controller-registry.d.ts.map +1 -1
- package/dist/controller-registry.js +85 -46
- package/dist/controller-registry.js.map +1 -1
- package/dist/controller-registry.test.js +14 -0
- package/dist/controller-registry.test.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/migration.d.ts +19 -4
- package/dist/migration.d.ts.map +1 -1
- package/dist/migration.js +99 -24
- package/dist/migration.js.map +1 -1
- package/dist/migration.test.d.ts +11 -0
- package/dist/migration.test.d.ts.map +1 -0
- package/dist/migration.test.js +141 -0
- package/dist/migration.test.js.map +1 -0
- package/dist/smart-retrieval.test.js +3 -0
- package/dist/smart-retrieval.test.js.map +1 -1
- package/dist/sqlite-backend.js +79 -79
- package/dist/sqljs-backend.js +36 -36
- package/dist/tiered-memory.d.ts +171 -0
- package/dist/tiered-memory.d.ts.map +1 -0
- package/dist/tiered-memory.js +350 -0
- package/dist/tiered-memory.js.map +1 -0
- package/dist/tiered-memory.test.d.ts +9 -0
- package/dist/tiered-memory.test.d.ts.map +1 -0
- package/dist/tiered-memory.test.js +220 -0
- package/dist/tiered-memory.test.js.map +1 -0
- package/dist/types.d.ts +17 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +49 -48
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.test.d.ts","sourceRoot":"","sources":["../src/migration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for MemoryMigrator batch embedding (perf fix).
|
|
3
|
+
*
|
|
4
|
+
* Previously the migrator awaited one embedding per entry inside the batch
|
|
5
|
+
* loop — N sequential inferences per batch. Now it prefers a true batch
|
|
6
|
+
* embedding generator (one call per batch) and otherwise embeds with
|
|
7
|
+
* bounded concurrency. Per-entry error semantics are preserved: one bad
|
|
8
|
+
* entry never fails the batch.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
11
|
+
import { mkdtempSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { MemoryMigrator } from './migration.js';
|
|
15
|
+
function writeSourceFile(entries) {
|
|
16
|
+
const dir = mkdtempSync(join(tmpdir(), 'migration-test-'));
|
|
17
|
+
const file = join(dir, 'source.json');
|
|
18
|
+
writeFileSync(file, JSON.stringify(entries));
|
|
19
|
+
return file;
|
|
20
|
+
}
|
|
21
|
+
function makeTarget() {
|
|
22
|
+
const stored = [];
|
|
23
|
+
const target = {
|
|
24
|
+
store: async (entry) => {
|
|
25
|
+
stored.push(entry);
|
|
26
|
+
return entry;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
return { stored, target };
|
|
30
|
+
}
|
|
31
|
+
const embeddingOf = (content) => new Float32Array([content.length, 1, 2]);
|
|
32
|
+
describe('MemoryMigrator — batch embedding', () => {
|
|
33
|
+
it('uses the batch embedding generator ONCE per batch (not per entry)', async () => {
|
|
34
|
+
const entries = Array.from({ length: 25 }, (_, i) => ({ key: `k${i}`, value: `value ${i}` }));
|
|
35
|
+
const sourcePath = writeSourceFile(entries);
|
|
36
|
+
const { stored, target } = makeTarget();
|
|
37
|
+
const batchCalls = [];
|
|
38
|
+
const batchGenerator = async (contents) => {
|
|
39
|
+
batchCalls.push(contents);
|
|
40
|
+
return contents.map(embeddingOf);
|
|
41
|
+
};
|
|
42
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, batchSize: 10 }, undefined, batchGenerator);
|
|
43
|
+
const result = await migrator.migrate();
|
|
44
|
+
expect(result.success).toBe(true);
|
|
45
|
+
expect(result.progress.migrated).toBe(25);
|
|
46
|
+
// 25 entries / batchSize 10 → 3 batch calls, NOT 25 single calls
|
|
47
|
+
expect(batchCalls).toHaveLength(3);
|
|
48
|
+
expect(batchCalls.map((c) => c.length)).toEqual([10, 10, 5]);
|
|
49
|
+
expect(stored.every((e) => e.embedding instanceof Float32Array)).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('falls back to bounded concurrency over the single-text generator', async () => {
|
|
52
|
+
const entries = Array.from({ length: 20 }, (_, i) => ({ key: `k${i}`, value: `value ${i}` }));
|
|
53
|
+
const sourcePath = writeSourceFile(entries);
|
|
54
|
+
const { stored, target } = makeTarget();
|
|
55
|
+
let inFlight = 0;
|
|
56
|
+
let maxInFlight = 0;
|
|
57
|
+
const generator = async (content) => {
|
|
58
|
+
inFlight++;
|
|
59
|
+
maxInFlight = Math.max(maxInFlight, inFlight);
|
|
60
|
+
await new Promise((r) => setTimeout(r, 2));
|
|
61
|
+
inFlight--;
|
|
62
|
+
return embeddingOf(content);
|
|
63
|
+
};
|
|
64
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, batchSize: 20, embeddingConcurrency: 4 }, generator);
|
|
65
|
+
const result = await migrator.migrate();
|
|
66
|
+
expect(result.progress.migrated).toBe(20);
|
|
67
|
+
expect(maxInFlight).toBeGreaterThan(1); // actually concurrent
|
|
68
|
+
expect(maxInFlight).toBeLessThanOrEqual(4); // but bounded — never unbounded
|
|
69
|
+
expect(stored.every((e) => e.embedding instanceof Float32Array)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it('one failing embedding does not fail the batch — entry stored without vector', async () => {
|
|
72
|
+
const entries = [
|
|
73
|
+
{ key: 'good-1', value: 'alpha' },
|
|
74
|
+
{ key: 'bad', value: 'POISON' },
|
|
75
|
+
{ key: 'good-2', value: 'gamma' },
|
|
76
|
+
];
|
|
77
|
+
const sourcePath = writeSourceFile(entries);
|
|
78
|
+
const { stored, target } = makeTarget();
|
|
79
|
+
const generator = async (content) => {
|
|
80
|
+
if (content === 'POISON')
|
|
81
|
+
throw new Error('embedder choked');
|
|
82
|
+
return embeddingOf(content);
|
|
83
|
+
};
|
|
84
|
+
const warnings = [];
|
|
85
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, batchSize: 10 }, generator);
|
|
86
|
+
migrator.on('migration:warning', (w) => warnings.push(w.message));
|
|
87
|
+
const result = await migrator.migrate();
|
|
88
|
+
expect(result.progress.migrated).toBe(3); // all three stored
|
|
89
|
+
expect(result.progress.failed).toBe(0);
|
|
90
|
+
const bad = stored.find((e) => e.key === 'bad');
|
|
91
|
+
expect(bad).toBeDefined();
|
|
92
|
+
expect(bad.embedding).toBeUndefined();
|
|
93
|
+
expect(warnings.some((m) => m.includes('bad'))).toBe(true);
|
|
94
|
+
// Good entries still got vectors
|
|
95
|
+
expect(stored.find((e) => e.key === 'good-1').embedding).toBeInstanceOf(Float32Array);
|
|
96
|
+
});
|
|
97
|
+
it('falls back to single-text embedding when the batch call fails', async () => {
|
|
98
|
+
const entries = [
|
|
99
|
+
{ key: 'a', value: 'one' },
|
|
100
|
+
{ key: 'b', value: 'two' },
|
|
101
|
+
];
|
|
102
|
+
const sourcePath = writeSourceFile(entries);
|
|
103
|
+
const { stored, target } = makeTarget();
|
|
104
|
+
const batchGenerator = vi.fn(async () => {
|
|
105
|
+
throw new Error('batch backend down');
|
|
106
|
+
});
|
|
107
|
+
const singleGenerator = vi.fn(async (content) => embeddingOf(content));
|
|
108
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, batchSize: 10 }, singleGenerator, batchGenerator);
|
|
109
|
+
const result = await migrator.migrate();
|
|
110
|
+
expect(result.progress.migrated).toBe(2);
|
|
111
|
+
expect(batchGenerator).toHaveBeenCalledTimes(1);
|
|
112
|
+
expect(singleGenerator).toHaveBeenCalledTimes(2);
|
|
113
|
+
expect(stored.every((e) => e.embedding instanceof Float32Array)).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('preserves validation-skip semantics (invalid entries never reach the embedder)', async () => {
|
|
116
|
+
const entries = [
|
|
117
|
+
{ key: 'ok', value: 'fine' },
|
|
118
|
+
{ value: 'missing key' },
|
|
119
|
+
];
|
|
120
|
+
const sourcePath = writeSourceFile(entries);
|
|
121
|
+
const { target } = makeTarget();
|
|
122
|
+
const batchGenerator = vi.fn(async (contents) => contents.map(embeddingOf));
|
|
123
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, batchSize: 10 }, undefined, batchGenerator);
|
|
124
|
+
const result = await migrator.migrate();
|
|
125
|
+
expect(result.progress.migrated).toBe(1);
|
|
126
|
+
expect(result.progress.skipped).toBe(1);
|
|
127
|
+
expect(batchGenerator).toHaveBeenCalledTimes(1);
|
|
128
|
+
expect(batchGenerator.mock.calls[0][0]).toEqual(['fine']);
|
|
129
|
+
});
|
|
130
|
+
it('skips embedding entirely when generateEmbeddings=false', async () => {
|
|
131
|
+
const sourcePath = writeSourceFile([{ key: 'k', value: 'v' }]);
|
|
132
|
+
const { stored, target } = makeTarget();
|
|
133
|
+
const batchGenerator = vi.fn(async (contents) => contents.map(embeddingOf));
|
|
134
|
+
const migrator = new MemoryMigrator(target, { source: 'json', sourcePath, generateEmbeddings: false }, undefined, batchGenerator);
|
|
135
|
+
const result = await migrator.migrate();
|
|
136
|
+
expect(result.progress.migrated).toBe(1);
|
|
137
|
+
expect(batchGenerator).not.toHaveBeenCalled();
|
|
138
|
+
expect(stored[0].embedding).toBeUndefined();
|
|
139
|
+
});
|
|
140
|
+
});
|
|
141
|
+
//# sourceMappingURL=migration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migration.test.js","sourceRoot":"","sources":["../src/migration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,9 @@ describe('smartSearch — multi-query fan-out', () => {
|
|
|
59
59
|
expect(results.map((r) => r.id)).toEqual(expect.arrayContaining(['a', 'b']));
|
|
60
60
|
});
|
|
61
61
|
it('falls back to a single raw call when multiQuery=false', async () => {
|
|
62
|
+
// NOTE: no vi.fn<T> generic — the hoisted vitest (1.x) types Mock as
|
|
63
|
+
// Mock<Args extends any[], Returns>, so the vitest-4 single-generic
|
|
64
|
+
// form fails `tsc`. The inferred signature is identical.
|
|
62
65
|
const search = vi.fn(async () => ({
|
|
63
66
|
results: [makeCandidate({ id: 'x', content: 'only one' })],
|
|
64
67
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smart-retrieval.test.js","sourceRoot":"","sources":["../src/smart-retrieval.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"smart-retrieval.test.js","sourceRoot":"","sources":["../src/smart-retrieval.test.ts"],"names":[],"mappings":"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"}
|
package/dist/sqlite-backend.js
CHANGED
|
@@ -102,19 +102,19 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
102
102
|
async store(entry) {
|
|
103
103
|
this.ensureInitialized();
|
|
104
104
|
const startTime = performance.now();
|
|
105
|
-
const stmt = this.db.prepare(`
|
|
106
|
-
INSERT OR REPLACE INTO memory_entries (
|
|
107
|
-
id, key, content, type, namespace, tags, metadata,
|
|
108
|
-
owner_id, access_level, created_at, updated_at, expires_at,
|
|
109
|
-
version, "references", access_count, last_accessed_at
|
|
110
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
105
|
+
const stmt = this.db.prepare(`
|
|
106
|
+
INSERT OR REPLACE INTO memory_entries (
|
|
107
|
+
id, key, content, type, namespace, tags, metadata,
|
|
108
|
+
owner_id, access_level, created_at, updated_at, expires_at,
|
|
109
|
+
version, "references", access_count, last_accessed_at
|
|
110
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
111
111
|
`);
|
|
112
112
|
stmt.run(entry.id, entry.key, entry.content, entry.type, entry.namespace, JSON.stringify(entry.tags), JSON.stringify(entry.metadata), entry.ownerId || null, entry.accessLevel, entry.createdAt, entry.updatedAt, entry.expiresAt || null, entry.version, JSON.stringify(entry.references), entry.accessCount, entry.lastAccessedAt);
|
|
113
113
|
// Store embedding separately (as BLOB)
|
|
114
114
|
if (entry.embedding) {
|
|
115
|
-
const embeddingStmt = this.db.prepare(`
|
|
116
|
-
INSERT OR REPLACE INTO memory_embeddings (entry_id, embedding)
|
|
117
|
-
VALUES (?, ?)
|
|
115
|
+
const embeddingStmt = this.db.prepare(`
|
|
116
|
+
INSERT OR REPLACE INTO memory_embeddings (entry_id, embedding)
|
|
117
|
+
VALUES (?, ?)
|
|
118
118
|
`);
|
|
119
119
|
embeddingStmt.run(entry.id, Buffer.from(entry.embedding.buffer));
|
|
120
120
|
}
|
|
@@ -146,9 +146,9 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
146
146
|
*/
|
|
147
147
|
async getByKey(namespace, key) {
|
|
148
148
|
this.ensureInitialized();
|
|
149
|
-
const stmt = this.db.prepare(`
|
|
150
|
-
SELECT * FROM memory_entries
|
|
151
|
-
WHERE namespace = ? AND key = ?
|
|
149
|
+
const stmt = this.db.prepare(`
|
|
150
|
+
SELECT * FROM memory_entries
|
|
151
|
+
WHERE namespace = ? AND key = ?
|
|
152
152
|
`);
|
|
153
153
|
const row = stmt.get(namespace, key);
|
|
154
154
|
if (!row)
|
|
@@ -215,13 +215,13 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
215
215
|
return [];
|
|
216
216
|
if (this.ftsAvailable) {
|
|
217
217
|
try {
|
|
218
|
-
const stmt = this.db.prepare(`
|
|
219
|
-
SELECT e.*, fts.rank as fts_rank
|
|
220
|
-
FROM memory_fts AS fts
|
|
221
|
-
JOIN memory_entries AS e ON e.id = fts.id
|
|
222
|
-
WHERE memory_fts MATCH ?
|
|
223
|
-
ORDER BY fts.rank
|
|
224
|
-
LIMIT ?
|
|
218
|
+
const stmt = this.db.prepare(`
|
|
219
|
+
SELECT e.*, fts.rank as fts_rank
|
|
220
|
+
FROM memory_fts AS fts
|
|
221
|
+
JOIN memory_entries AS e ON e.id = fts.id
|
|
222
|
+
WHERE memory_fts MATCH ?
|
|
223
|
+
ORDER BY fts.rank
|
|
224
|
+
LIMIT ?
|
|
225
225
|
`);
|
|
226
226
|
const rows = stmt.all(escapeFtsQuery(query), limit);
|
|
227
227
|
return rows.map((row) => {
|
|
@@ -309,9 +309,9 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
309
309
|
}
|
|
310
310
|
// Use parameterized query with JSON functions
|
|
311
311
|
const tagPlaceholders = query.tags.map(() => '?').join(', ');
|
|
312
|
-
sql += ` AND EXISTS (
|
|
313
|
-
SELECT 1 FROM json_each(tags) AS t
|
|
314
|
-
WHERE t.value IN (${tagPlaceholders})
|
|
312
|
+
sql += ` AND EXISTS (
|
|
313
|
+
SELECT 1 FROM json_each(tags) AS t
|
|
314
|
+
WHERE t.value IN (${tagPlaceholders})
|
|
315
315
|
)`;
|
|
316
316
|
params.push(...query.tags);
|
|
317
317
|
}
|
|
@@ -407,9 +407,9 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
407
407
|
const deleteEntries = this.db.prepare('DELETE FROM memory_entries WHERE namespace = ?');
|
|
408
408
|
const result = deleteEntries.run(namespace);
|
|
409
409
|
// Clean up orphaned embeddings
|
|
410
|
-
this.db.prepare(`
|
|
411
|
-
DELETE FROM memory_embeddings
|
|
412
|
-
WHERE entry_id NOT IN (SELECT id FROM memory_entries)
|
|
410
|
+
this.db.prepare(`
|
|
411
|
+
DELETE FROM memory_embeddings
|
|
412
|
+
WHERE entry_id NOT IN (SELECT id FROM memory_entries)
|
|
413
413
|
`).run();
|
|
414
414
|
return result.changes;
|
|
415
415
|
}
|
|
@@ -419,10 +419,10 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
419
419
|
async getStats() {
|
|
420
420
|
this.ensureInitialized();
|
|
421
421
|
// Count by namespace
|
|
422
|
-
const namespaceStmt = this.db.prepare(`
|
|
423
|
-
SELECT namespace, COUNT(*) as count
|
|
424
|
-
FROM memory_entries
|
|
425
|
-
GROUP BY namespace
|
|
422
|
+
const namespaceStmt = this.db.prepare(`
|
|
423
|
+
SELECT namespace, COUNT(*) as count
|
|
424
|
+
FROM memory_entries
|
|
425
|
+
GROUP BY namespace
|
|
426
426
|
`);
|
|
427
427
|
const namespaceRows = namespaceStmt.all();
|
|
428
428
|
const entriesByNamespace = {};
|
|
@@ -430,10 +430,10 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
430
430
|
entriesByNamespace[row.namespace] = row.count;
|
|
431
431
|
}
|
|
432
432
|
// Count by type
|
|
433
|
-
const typeStmt = this.db.prepare(`
|
|
434
|
-
SELECT type, COUNT(*) as count
|
|
435
|
-
FROM memory_entries
|
|
436
|
-
GROUP BY type
|
|
433
|
+
const typeStmt = this.db.prepare(`
|
|
434
|
+
SELECT type, COUNT(*) as count
|
|
435
|
+
FROM memory_entries
|
|
436
|
+
GROUP BY type
|
|
437
437
|
`);
|
|
438
438
|
const typeRows = typeStmt.all();
|
|
439
439
|
const entriesByType = {
|
|
@@ -540,49 +540,49 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
540
540
|
if (!this.db)
|
|
541
541
|
return;
|
|
542
542
|
// Main entries table
|
|
543
|
-
this.db.exec(`
|
|
544
|
-
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
545
|
-
id TEXT PRIMARY KEY,
|
|
546
|
-
key TEXT NOT NULL,
|
|
547
|
-
content TEXT NOT NULL,
|
|
548
|
-
type TEXT NOT NULL,
|
|
549
|
-
namespace TEXT NOT NULL,
|
|
550
|
-
tags TEXT NOT NULL,
|
|
551
|
-
metadata TEXT NOT NULL,
|
|
552
|
-
owner_id TEXT,
|
|
553
|
-
access_level TEXT NOT NULL,
|
|
554
|
-
created_at INTEGER NOT NULL,
|
|
555
|
-
updated_at INTEGER NOT NULL,
|
|
556
|
-
expires_at INTEGER,
|
|
557
|
-
version INTEGER NOT NULL,
|
|
558
|
-
"references" TEXT NOT NULL,
|
|
559
|
-
access_count INTEGER NOT NULL,
|
|
560
|
-
last_accessed_at INTEGER NOT NULL
|
|
561
|
-
);
|
|
562
|
-
|
|
563
|
-
CREATE INDEX IF NOT EXISTS idx_namespace ON memory_entries(namespace);
|
|
564
|
-
CREATE INDEX IF NOT EXISTS idx_key ON memory_entries(key);
|
|
565
|
-
CREATE INDEX IF NOT EXISTS idx_namespace_key ON memory_entries(namespace, key);
|
|
566
|
-
CREATE INDEX IF NOT EXISTS idx_type ON memory_entries(type);
|
|
567
|
-
CREATE INDEX IF NOT EXISTS idx_owner_id ON memory_entries(owner_id);
|
|
568
|
-
CREATE INDEX IF NOT EXISTS idx_created_at ON memory_entries(created_at);
|
|
569
|
-
CREATE INDEX IF NOT EXISTS idx_updated_at ON memory_entries(updated_at);
|
|
570
|
-
CREATE INDEX IF NOT EXISTS idx_expires_at ON memory_entries(expires_at);
|
|
571
|
-
|
|
572
|
-
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
573
|
-
entry_id TEXT PRIMARY KEY,
|
|
574
|
-
embedding BLOB,
|
|
575
|
-
FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE
|
|
576
|
-
);
|
|
543
|
+
this.db.exec(`
|
|
544
|
+
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
545
|
+
id TEXT PRIMARY KEY,
|
|
546
|
+
key TEXT NOT NULL,
|
|
547
|
+
content TEXT NOT NULL,
|
|
548
|
+
type TEXT NOT NULL,
|
|
549
|
+
namespace TEXT NOT NULL,
|
|
550
|
+
tags TEXT NOT NULL,
|
|
551
|
+
metadata TEXT NOT NULL,
|
|
552
|
+
owner_id TEXT,
|
|
553
|
+
access_level TEXT NOT NULL,
|
|
554
|
+
created_at INTEGER NOT NULL,
|
|
555
|
+
updated_at INTEGER NOT NULL,
|
|
556
|
+
expires_at INTEGER,
|
|
557
|
+
version INTEGER NOT NULL,
|
|
558
|
+
"references" TEXT NOT NULL,
|
|
559
|
+
access_count INTEGER NOT NULL,
|
|
560
|
+
last_accessed_at INTEGER NOT NULL
|
|
561
|
+
);
|
|
562
|
+
|
|
563
|
+
CREATE INDEX IF NOT EXISTS idx_namespace ON memory_entries(namespace);
|
|
564
|
+
CREATE INDEX IF NOT EXISTS idx_key ON memory_entries(key);
|
|
565
|
+
CREATE INDEX IF NOT EXISTS idx_namespace_key ON memory_entries(namespace, key);
|
|
566
|
+
CREATE INDEX IF NOT EXISTS idx_type ON memory_entries(type);
|
|
567
|
+
CREATE INDEX IF NOT EXISTS idx_owner_id ON memory_entries(owner_id);
|
|
568
|
+
CREATE INDEX IF NOT EXISTS idx_created_at ON memory_entries(created_at);
|
|
569
|
+
CREATE INDEX IF NOT EXISTS idx_updated_at ON memory_entries(updated_at);
|
|
570
|
+
CREATE INDEX IF NOT EXISTS idx_expires_at ON memory_entries(expires_at);
|
|
571
|
+
|
|
572
|
+
CREATE TABLE IF NOT EXISTS memory_embeddings (
|
|
573
|
+
entry_id TEXT PRIMARY KEY,
|
|
574
|
+
embedding BLOB,
|
|
575
|
+
FOREIGN KEY (entry_id) REFERENCES memory_entries(id) ON DELETE CASCADE
|
|
576
|
+
);
|
|
577
577
|
`);
|
|
578
578
|
// ADR-125 Phase 5 — FTS5 virtual table for keyword search.
|
|
579
579
|
// FTS5 is built into better-sqlite3 since 11.x. Surrounding try/catch so
|
|
580
580
|
// older SQLite builds gracefully skip FTS without taking the whole backend
|
|
581
581
|
// offline; queries against `searchKeyword` will fall back to LIKE.
|
|
582
582
|
try {
|
|
583
|
-
this.db.exec(`
|
|
584
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
|
|
585
|
-
USING fts5(id UNINDEXED, content, tokenize='porter unicode61');
|
|
583
|
+
this.db.exec(`
|
|
584
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
|
|
585
|
+
USING fts5(id UNINDEXED, content, tokenize='porter unicode61');
|
|
586
586
|
`);
|
|
587
587
|
this.ftsAvailable = true;
|
|
588
588
|
}
|
|
@@ -622,18 +622,18 @@ export class SQLiteBackend extends EventEmitter {
|
|
|
622
622
|
* Synchronous store for use in transactions
|
|
623
623
|
*/
|
|
624
624
|
storeSync(entry) {
|
|
625
|
-
const stmt = this.db.prepare(`
|
|
626
|
-
INSERT OR REPLACE INTO memory_entries (
|
|
627
|
-
id, key, content, type, namespace, tags, metadata,
|
|
628
|
-
owner_id, access_level, created_at, updated_at, expires_at,
|
|
629
|
-
version, "references", access_count, last_accessed_at
|
|
630
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
625
|
+
const stmt = this.db.prepare(`
|
|
626
|
+
INSERT OR REPLACE INTO memory_entries (
|
|
627
|
+
id, key, content, type, namespace, tags, metadata,
|
|
628
|
+
owner_id, access_level, created_at, updated_at, expires_at,
|
|
629
|
+
version, "references", access_count, last_accessed_at
|
|
630
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
631
631
|
`);
|
|
632
632
|
stmt.run(entry.id, entry.key, entry.content, entry.type, entry.namespace, JSON.stringify(entry.tags), JSON.stringify(entry.metadata), entry.ownerId || null, entry.accessLevel, entry.createdAt, entry.updatedAt, entry.expiresAt || null, entry.version, JSON.stringify(entry.references), entry.accessCount, entry.lastAccessedAt);
|
|
633
633
|
if (entry.embedding) {
|
|
634
|
-
const embeddingStmt = this.db.prepare(`
|
|
635
|
-
INSERT OR REPLACE INTO memory_embeddings (entry_id, embedding)
|
|
636
|
-
VALUES (?, ?)
|
|
634
|
+
const embeddingStmt = this.db.prepare(`
|
|
635
|
+
INSERT OR REPLACE INTO memory_embeddings (entry_id, embedding)
|
|
636
|
+
VALUES (?, ?)
|
|
637
637
|
`);
|
|
638
638
|
embeddingStmt.run(entry.id, Buffer.from(entry.embedding.buffer));
|
|
639
639
|
}
|
package/dist/sqljs-backend.js
CHANGED
|
@@ -117,26 +117,26 @@ export class SqlJsBackend extends EventEmitter {
|
|
|
117
117
|
if (!this.db)
|
|
118
118
|
return;
|
|
119
119
|
// Main entries table
|
|
120
|
-
this.db.run(`
|
|
121
|
-
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
122
|
-
id TEXT PRIMARY KEY,
|
|
123
|
-
key TEXT NOT NULL,
|
|
124
|
-
content TEXT NOT NULL,
|
|
125
|
-
embedding BLOB,
|
|
126
|
-
type TEXT NOT NULL,
|
|
127
|
-
namespace TEXT NOT NULL,
|
|
128
|
-
tags TEXT NOT NULL,
|
|
129
|
-
metadata TEXT NOT NULL,
|
|
130
|
-
owner_id TEXT,
|
|
131
|
-
access_level TEXT NOT NULL,
|
|
132
|
-
created_at INTEGER NOT NULL,
|
|
133
|
-
updated_at INTEGER NOT NULL,
|
|
134
|
-
expires_at INTEGER,
|
|
135
|
-
version INTEGER NOT NULL DEFAULT 1,
|
|
136
|
-
"references" TEXT NOT NULL,
|
|
137
|
-
access_count INTEGER NOT NULL DEFAULT 0,
|
|
138
|
-
last_accessed_at INTEGER NOT NULL
|
|
139
|
-
)
|
|
120
|
+
this.db.run(`
|
|
121
|
+
CREATE TABLE IF NOT EXISTS memory_entries (
|
|
122
|
+
id TEXT PRIMARY KEY,
|
|
123
|
+
key TEXT NOT NULL,
|
|
124
|
+
content TEXT NOT NULL,
|
|
125
|
+
embedding BLOB,
|
|
126
|
+
type TEXT NOT NULL,
|
|
127
|
+
namespace TEXT NOT NULL,
|
|
128
|
+
tags TEXT NOT NULL,
|
|
129
|
+
metadata TEXT NOT NULL,
|
|
130
|
+
owner_id TEXT,
|
|
131
|
+
access_level TEXT NOT NULL,
|
|
132
|
+
created_at INTEGER NOT NULL,
|
|
133
|
+
updated_at INTEGER NOT NULL,
|
|
134
|
+
expires_at INTEGER,
|
|
135
|
+
version INTEGER NOT NULL DEFAULT 1,
|
|
136
|
+
"references" TEXT NOT NULL,
|
|
137
|
+
access_count INTEGER NOT NULL DEFAULT 0,
|
|
138
|
+
last_accessed_at INTEGER NOT NULL
|
|
139
|
+
)
|
|
140
140
|
`);
|
|
141
141
|
// Indexes for performance
|
|
142
142
|
this.db.run('CREATE INDEX IF NOT EXISTS idx_namespace ON memory_entries(namespace)');
|
|
@@ -147,9 +147,9 @@ export class SqlJsBackend extends EventEmitter {
|
|
|
147
147
|
this.db.run('CREATE UNIQUE INDEX IF NOT EXISTS idx_namespace_key ON memory_entries(namespace, key)');
|
|
148
148
|
// ADR-125 Phase 5 — FTS5 keyword index. sql.js ships FTS5 since 1.10.
|
|
149
149
|
try {
|
|
150
|
-
this.db.run(`
|
|
151
|
-
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
|
|
152
|
-
USING fts5(id UNINDEXED, content, tokenize='porter unicode61')
|
|
150
|
+
this.db.run(`
|
|
151
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts
|
|
152
|
+
USING fts5(id UNINDEXED, content, tokenize='porter unicode61')
|
|
153
153
|
`);
|
|
154
154
|
this.ftsAvailable = true;
|
|
155
155
|
}
|
|
@@ -166,12 +166,12 @@ export class SqlJsBackend extends EventEmitter {
|
|
|
166
166
|
async store(entry) {
|
|
167
167
|
this.ensureInitialized();
|
|
168
168
|
const startTime = performance.now();
|
|
169
|
-
const stmt = `
|
|
170
|
-
INSERT OR REPLACE INTO memory_entries (
|
|
171
|
-
id, key, content, embedding, type, namespace, tags, metadata,
|
|
172
|
-
owner_id, access_level, created_at, updated_at, expires_at,
|
|
173
|
-
version, "references", access_count, last_accessed_at
|
|
174
|
-
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
169
|
+
const stmt = `
|
|
170
|
+
INSERT OR REPLACE INTO memory_entries (
|
|
171
|
+
id, key, content, embedding, type, namespace, tags, metadata,
|
|
172
|
+
owner_id, access_level, created_at, updated_at, expires_at,
|
|
173
|
+
version, "references", access_count, last_accessed_at
|
|
174
|
+
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
175
175
|
`;
|
|
176
176
|
const embeddingBuffer = entry.embedding
|
|
177
177
|
? Buffer.from(entry.embedding.buffer)
|
|
@@ -301,13 +301,13 @@ export class SqlJsBackend extends EventEmitter {
|
|
|
301
301
|
return [];
|
|
302
302
|
if (this.ftsAvailable) {
|
|
303
303
|
try {
|
|
304
|
-
const stmt = this.db.prepare(`
|
|
305
|
-
SELECT e.*, fts.rank as fts_rank
|
|
306
|
-
FROM memory_fts AS fts
|
|
307
|
-
JOIN memory_entries AS e ON e.id = fts.id
|
|
308
|
-
WHERE memory_fts MATCH ?
|
|
309
|
-
ORDER BY fts.rank
|
|
310
|
-
LIMIT ?
|
|
304
|
+
const stmt = this.db.prepare(`
|
|
305
|
+
SELECT e.*, fts.rank as fts_rank
|
|
306
|
+
FROM memory_fts AS fts
|
|
307
|
+
JOIN memory_entries AS e ON e.id = fts.id
|
|
308
|
+
WHERE memory_fts MATCH ?
|
|
309
|
+
ORDER BY fts.rank
|
|
310
|
+
LIMIT ?
|
|
311
311
|
`);
|
|
312
312
|
stmt.bind([escapeFtsQuery(query), limit]);
|
|
313
313
|
const results = [];
|