@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.
Files changed (48) hide show
  1. package/README.md +858 -858
  2. package/dist/agentdb-backend.d.ts +19 -0
  3. package/dist/agentdb-backend.d.ts.map +1 -1
  4. package/dist/agentdb-backend.js +50 -29
  5. package/dist/agentdb-backend.js.map +1 -1
  6. package/dist/agentdb-retrieval-guard.d.ts +76 -0
  7. package/dist/agentdb-retrieval-guard.d.ts.map +1 -0
  8. package/dist/agentdb-retrieval-guard.js +77 -0
  9. package/dist/agentdb-retrieval-guard.js.map +1 -0
  10. package/dist/agentdb-retrieval-guard.test.d.ts +12 -0
  11. package/dist/agentdb-retrieval-guard.test.d.ts.map +1 -0
  12. package/dist/agentdb-retrieval-guard.test.js +129 -0
  13. package/dist/agentdb-retrieval-guard.test.js.map +1 -0
  14. package/dist/auto-memory-bridge.test.js +46 -46
  15. package/dist/controller-registry.d.ts +38 -3
  16. package/dist/controller-registry.d.ts.map +1 -1
  17. package/dist/controller-registry.js +85 -46
  18. package/dist/controller-registry.js.map +1 -1
  19. package/dist/controller-registry.test.js +14 -0
  20. package/dist/controller-registry.test.js.map +1 -1
  21. package/dist/index.d.ts +5 -1
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +3 -0
  24. package/dist/index.js.map +1 -1
  25. package/dist/migration.d.ts +19 -4
  26. package/dist/migration.d.ts.map +1 -1
  27. package/dist/migration.js +99 -24
  28. package/dist/migration.js.map +1 -1
  29. package/dist/migration.test.d.ts +11 -0
  30. package/dist/migration.test.d.ts.map +1 -0
  31. package/dist/migration.test.js +141 -0
  32. package/dist/migration.test.js.map +1 -0
  33. package/dist/smart-retrieval.test.js +3 -0
  34. package/dist/smart-retrieval.test.js.map +1 -1
  35. package/dist/sqlite-backend.js +79 -79
  36. package/dist/sqljs-backend.js +36 -36
  37. package/dist/tiered-memory.d.ts +171 -0
  38. package/dist/tiered-memory.d.ts.map +1 -0
  39. package/dist/tiered-memory.js +350 -0
  40. package/dist/tiered-memory.js.map +1 -0
  41. package/dist/tiered-memory.test.d.ts +9 -0
  42. package/dist/tiered-memory.test.d.ts.map +1 -0
  43. package/dist/tiered-memory.test.js +220 -0
  44. package/dist/tiered-memory.test.js.map +1 -0
  45. package/dist/types.d.ts +17 -0
  46. package/dist/types.d.ts.map +1 -1
  47. package/dist/types.js.map +1 -1
  48. 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":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAIhD,SAAS,eAAe,CAAC,OAA8C;IACrE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACtC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU;IACjB,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,KAAK,EAAE,KAAkB,EAAE,EAAE;YAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC;KAC2B,CAAC;IAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAElF,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,MAAM,UAAU,GAAe,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,KAAK,EAAE,QAAkB,EAAE,EAAE;YAClD,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EAC7C,SAAS,EACT,cAAc,CACf,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,iEAAiE;QACjE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC9F,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,SAAS,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YAC1C,QAAQ,EAAE,CAAC;YACX,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC9C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC3C,QAAQ,EAAE,CAAC;YACX,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,oBAAoB,EAAE,CAAC,EAAE,EACtE,SAAS,CACV,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,sBAAsB;QAC9D,MAAM,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,gCAAgC;QAC5E,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,OAAO,GAAG;YACd,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;YACjC,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE;YAC/B,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE;SAClC,CAAC;QACF,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,MAAM,SAAS,GAAG,KAAK,EAAE,OAAe,EAAE,EAAE;YAC1C,IAAI,OAAO,KAAK,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YAC7D,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;QAC9B,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EAC7C,SAAS,CACV,CAAC;QACF,QAAQ,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAsB,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QAEvF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;QAC7D,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAI,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3D,iCAAiC;QACjC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAE,CAAC,SAAS,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,OAAO,GAAG;YACd,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;YAC1B,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE;SAC3B,CAAC;QACF,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAExC,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;YACtC,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QACH,MAAM,eAAe,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,OAAe,EAAE,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;QAE/E,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EAC7C,eAAe,EACf,cAAc,CACf,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,eAAe,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,YAAY,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,MAAM,OAAO,GAAG;YACd,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE;YAC5B,EAAE,KAAK,EAAE,aAAa,EAAoC;SAC3D,CAAC;QACF,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QAEhC,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QACtF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,EAC7C,SAAS,EACT,cAAc,CACf,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,cAAc,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,QAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;QAEtF,MAAM,QAAQ,GAAG,IAAI,cAAc,CACjC,MAAM,EACN,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB,EAAE,KAAK,EAAE,EACzD,SAAS,EACT,cAAc,CACf,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;QAExC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EACL,WAAW,EACX,sBAAsB,GAGvB,MAAM,sBAAsB,CAAC;AAE9B,SAAS,aAAa,CAAC,OAAmE;IACxF,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,EAAE;QACf,SAAS,EAAE,MAAM;QACjB,KAAK,EAAE,GAAG;QACV,GAAG,OAAO;KACX,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,gCAAgC,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC3D,mCAAmC;QACnC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;QAC7B,MAAM,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAa,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAClB,0EAA0E;YAC1E,uEAAuE;YACvE,8DAA8D;YAC9D,IAAI,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;gBACpC,OAAO;oBACL,OAAO,EAAE;wBACP,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;wBAC/D,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;qBACjE;iBACF,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE;oBACP,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;oBAChE,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;iBAChE;aACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YACnD,KAAK,EAAE,YAAY;YACnB,KAAK,EAAE,CAAC;YACR,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACrE,qEAAqE;QACrE,oEAAoE;QACpE,yDAAyD;QACzD,MAAM,MAAM,GAAa,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAC1C,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;SAC3D,CAAC,CAAC,CAAC;QAEJ,MAAM,WAAW,CAAC,MAAM,EAAE;YACxB,KAAK,EAAE,UAAU;YACjB,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,KAAK;SACpB,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAEnC,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC;oBACZ,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,eAAe;oBACxB,KAAK,EAAE,GAAG;oBACV,SAAS,EAAE,GAAG,GAAG,GAAG,GAAG,MAAM,EAAE,aAAa;iBAC7C,CAAC;gBACF,aAAa,CAAC;oBACZ,EAAE,EAAE,OAAO;oBACX,OAAO,EAAE,eAAe;oBACxB,KAAK,EAAE,IAAI;oBACX,SAAS,EAAE,GAAG,GAAG,MAAM,EAAE,YAAY;iBACtC,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC5C,KAAK,EAAE,WAAW;YAClB,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,mBAAmB,EAAE,EAAE;YACvB,aAAa,EAAE,GAAG;YAClB,GAAG;SACJ,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBACxD,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;aACxD;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC5C,KAAK,EAAE,GAAG;YACV,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,gCAAgC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBAClF,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,sCAAsC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;gBACxF,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,uCAAuC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;aACzF;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC5C,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,KAAK;YACvB,YAAY,EAAE,IAAI;YAClB,SAAS,EAAE,GAAG,EAAE,4BAA4B;SAC7C,CAAC,CAAC;QAEH,0EAA0E;QAC1E,wCAAwC;QACxC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,WAAW;oBACpB,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;gBACF,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,WAAW;oBACpB,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;gBACF,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,UAAU;oBACnB,KAAK,EAAE,IAAI;oBACX,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;gBACF,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,WAAW;oBACpB,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC5C,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAC5D,oEAAoE;QACpE,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,qCAAqC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;gBACF,aAAa,CAAC;oBACZ,EAAE,EAAE,IAAI;oBACR,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,GAAG;oBACV,QAAQ,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;iBAC9B,CAAC;aACH;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC5C,KAAK,EAAE,GAAG;YACV,KAAK,EAAE,CAAC;YACR,UAAU,EAAE,KAAK;YACjB,YAAY,EAAE,KAAK;YACnB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC5E,MAAM,MAAM,GAAa,KAAK,IAAI,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE;gBACP,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;gBAC5C,aAAa,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;aAC5C;SACF,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YAC1C,KAAK,EAAE,aAAa;YACpB,KAAK,EAAE,CAAC;SACT,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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
  }
@@ -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 = [];