@timmeck/brain-core 2.0.1 → 2.0.2
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/dist/db/__tests__/connection.test.d.ts +1 -0
- package/dist/db/__tests__/connection.test.js +135 -0
- package/dist/db/__tests__/connection.test.js.map +1 -0
- package/dist/memory/__tests__/base-memory-engine.test.d.ts +1 -0
- package/dist/memory/__tests__/base-memory-engine.test.js +233 -0
- package/dist/memory/__tests__/base-memory-engine.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from 'vitest';
|
|
2
|
+
import fs from 'node:fs';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import os from 'node:os';
|
|
5
|
+
vi.mock('../../utils/logger.js', () => ({
|
|
6
|
+
getLogger: () => ({
|
|
7
|
+
info: vi.fn(),
|
|
8
|
+
warn: vi.fn(),
|
|
9
|
+
error: vi.fn(),
|
|
10
|
+
debug: vi.fn(),
|
|
11
|
+
}),
|
|
12
|
+
}));
|
|
13
|
+
import { createConnection } from '../connection.js';
|
|
14
|
+
describe('createConnection', () => {
|
|
15
|
+
const tmpDbs = [];
|
|
16
|
+
/** Helper: generate a unique temp DB path. */
|
|
17
|
+
function tmpDbPath(suffix = '') {
|
|
18
|
+
const p = path.join(os.tmpdir(), `brain-core-test-${Date.now()}-${Math.random().toString(36).slice(2)}${suffix}.db`);
|
|
19
|
+
tmpDbs.push(p);
|
|
20
|
+
return p;
|
|
21
|
+
}
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
// Clean up any temp DB files we created
|
|
24
|
+
for (const p of tmpDbs) {
|
|
25
|
+
try {
|
|
26
|
+
fs.unlinkSync(p);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// ignore if already deleted
|
|
30
|
+
}
|
|
31
|
+
// WAL / SHM sidecars
|
|
32
|
+
for (const ext of ['-wal', '-shm']) {
|
|
33
|
+
try {
|
|
34
|
+
fs.unlinkSync(p + ext);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// ignore
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
tmpDbs.length = 0;
|
|
42
|
+
});
|
|
43
|
+
it('returns a usable Database instance', () => {
|
|
44
|
+
const dbPath = tmpDbPath();
|
|
45
|
+
const db = createConnection(dbPath);
|
|
46
|
+
expect(db).toBeDefined();
|
|
47
|
+
// Verify we can execute a simple query
|
|
48
|
+
const row = db.prepare('SELECT 1 AS val').get();
|
|
49
|
+
expect(row.val).toBe(1);
|
|
50
|
+
db.close();
|
|
51
|
+
});
|
|
52
|
+
it('creates the parent directory if it does not exist', () => {
|
|
53
|
+
const nested = path.join(os.tmpdir(), `brain-core-test-nested-${Date.now()}`, 'sub', 'dir', 'test.db');
|
|
54
|
+
tmpDbs.push(nested);
|
|
55
|
+
const db = createConnection(nested);
|
|
56
|
+
expect(fs.existsSync(path.dirname(nested))).toBe(true);
|
|
57
|
+
db.close();
|
|
58
|
+
// cleanup the nested dir
|
|
59
|
+
fs.rmSync(path.join(os.tmpdir(), path.basename(path.dirname(path.dirname(path.dirname(nested))))), {
|
|
60
|
+
recursive: true,
|
|
61
|
+
force: true,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
it('sets journal_mode to WAL', () => {
|
|
65
|
+
const dbPath = tmpDbPath();
|
|
66
|
+
const db = createConnection(dbPath);
|
|
67
|
+
const result = db.pragma('journal_mode');
|
|
68
|
+
expect(result[0].journal_mode.toLowerCase()).toBe('wal');
|
|
69
|
+
db.close();
|
|
70
|
+
});
|
|
71
|
+
it('sets synchronous to NORMAL (1)', () => {
|
|
72
|
+
const dbPath = tmpDbPath();
|
|
73
|
+
const db = createConnection(dbPath);
|
|
74
|
+
const result = db.pragma('synchronous');
|
|
75
|
+
// NORMAL = 1
|
|
76
|
+
expect(result[0].synchronous).toBe(1);
|
|
77
|
+
db.close();
|
|
78
|
+
});
|
|
79
|
+
it('sets cache_size to 10000', () => {
|
|
80
|
+
const dbPath = tmpDbPath();
|
|
81
|
+
const db = createConnection(dbPath);
|
|
82
|
+
const result = db.pragma('cache_size');
|
|
83
|
+
// Negative means KB, positive means pages; the source sets 10000 (pages)
|
|
84
|
+
expect(result[0].cache_size).toBe(10000);
|
|
85
|
+
db.close();
|
|
86
|
+
});
|
|
87
|
+
it('enables foreign_keys', () => {
|
|
88
|
+
const dbPath = tmpDbPath();
|
|
89
|
+
const db = createConnection(dbPath);
|
|
90
|
+
const result = db.pragma('foreign_keys');
|
|
91
|
+
expect(result[0].foreign_keys).toBe(1);
|
|
92
|
+
db.close();
|
|
93
|
+
});
|
|
94
|
+
it('works with an in-memory database path (:memory:)', () => {
|
|
95
|
+
// :memory: has dirname "." which already exists, so no mkdir needed
|
|
96
|
+
const db = createConnection(':memory:');
|
|
97
|
+
const row = db.prepare('SELECT 42 AS answer').get();
|
|
98
|
+
expect(row.answer).toBe(42);
|
|
99
|
+
db.close();
|
|
100
|
+
});
|
|
101
|
+
it('supports creating tables and inserting data', () => {
|
|
102
|
+
const dbPath = tmpDbPath();
|
|
103
|
+
const db = createConnection(dbPath);
|
|
104
|
+
db.exec('CREATE TABLE test (id INTEGER PRIMARY KEY, name TEXT)');
|
|
105
|
+
db.prepare('INSERT INTO test (name) VALUES (?)').run('hello');
|
|
106
|
+
const row = db.prepare('SELECT name FROM test WHERE id = 1').get();
|
|
107
|
+
expect(row.name).toBe('hello');
|
|
108
|
+
db.close();
|
|
109
|
+
});
|
|
110
|
+
it('enforces foreign key constraints', () => {
|
|
111
|
+
const dbPath = tmpDbPath();
|
|
112
|
+
const db = createConnection(dbPath);
|
|
113
|
+
db.exec(`
|
|
114
|
+
CREATE TABLE parent (id INTEGER PRIMARY KEY);
|
|
115
|
+
CREATE TABLE child (id INTEGER PRIMARY KEY, parent_id INTEGER REFERENCES parent(id));
|
|
116
|
+
`);
|
|
117
|
+
// Inserting a child with a non-existent parent should fail
|
|
118
|
+
expect(() => {
|
|
119
|
+
db.prepare('INSERT INTO child (parent_id) VALUES (?)').run(999);
|
|
120
|
+
}).toThrow();
|
|
121
|
+
db.close();
|
|
122
|
+
});
|
|
123
|
+
it('can open the same file path twice without error', () => {
|
|
124
|
+
const dbPath = tmpDbPath();
|
|
125
|
+
const db1 = createConnection(dbPath);
|
|
126
|
+
const db2 = createConnection(dbPath);
|
|
127
|
+
db1.exec('CREATE TABLE shared (id INTEGER PRIMARY KEY)');
|
|
128
|
+
db1.prepare('INSERT INTO shared (id) VALUES (1)').run();
|
|
129
|
+
const row = db2.prepare('SELECT id FROM shared WHERE id = 1').get();
|
|
130
|
+
expect(row.id).toBe(1);
|
|
131
|
+
db1.close();
|
|
132
|
+
db2.close();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
//# sourceMappingURL=connection.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../../src/db/__tests__/connection.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
vi.mock('../../utils/logger.js', () => ({
|
|
3
|
+
getLogger: () => ({
|
|
4
|
+
info: vi.fn(),
|
|
5
|
+
warn: vi.fn(),
|
|
6
|
+
error: vi.fn(),
|
|
7
|
+
debug: vi.fn(),
|
|
8
|
+
}),
|
|
9
|
+
}));
|
|
10
|
+
vi.mock('../../embeddings/engine.js', async (importOriginal) => {
|
|
11
|
+
const actual = await importOriginal();
|
|
12
|
+
return {
|
|
13
|
+
...actual,
|
|
14
|
+
BaseEmbeddingEngine: actual.BaseEmbeddingEngine,
|
|
15
|
+
};
|
|
16
|
+
});
|
|
17
|
+
import { BaseMemoryEngine } from '../base-memory-engine.js';
|
|
18
|
+
import { BaseEmbeddingEngine } from '../../embeddings/engine.js';
|
|
19
|
+
/* ------------------------------------------------------------------ */
|
|
20
|
+
/* Helpers */
|
|
21
|
+
/* ------------------------------------------------------------------ */
|
|
22
|
+
const DEFAULT_CONFIG = {
|
|
23
|
+
intervalMs: 1000,
|
|
24
|
+
expiryCheckEnabled: true,
|
|
25
|
+
consolidationEnabled: true,
|
|
26
|
+
importanceDecayDays: 30,
|
|
27
|
+
};
|
|
28
|
+
/** Build a minimal MemoryRecord with overrides. */
|
|
29
|
+
function makeMemory(overrides = {}) {
|
|
30
|
+
return {
|
|
31
|
+
id: 1,
|
|
32
|
+
project_id: null,
|
|
33
|
+
session_id: null,
|
|
34
|
+
category: 'fact',
|
|
35
|
+
key: null,
|
|
36
|
+
content: 'test memory',
|
|
37
|
+
importance: 5,
|
|
38
|
+
source: 'explicit',
|
|
39
|
+
tags: null,
|
|
40
|
+
expires_at: null,
|
|
41
|
+
superseded_by: null,
|
|
42
|
+
active: 1,
|
|
43
|
+
created_at: new Date().toISOString(),
|
|
44
|
+
updated_at: new Date().toISOString(),
|
|
45
|
+
embedding: null,
|
|
46
|
+
...overrides,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Concrete subclass of the abstract BaseMemoryEngine for testing.
|
|
51
|
+
* Allows tests to control what getActiveMemoriesWithEmbeddings() and textSearch() return.
|
|
52
|
+
*/
|
|
53
|
+
class TestMemoryEngine extends BaseMemoryEngine {
|
|
54
|
+
cycleCount = 0;
|
|
55
|
+
memoriesWithEmbeddings = [];
|
|
56
|
+
textSearchResults = [];
|
|
57
|
+
textSearchCalls = [];
|
|
58
|
+
runCycle() {
|
|
59
|
+
this.cycleCount++;
|
|
60
|
+
}
|
|
61
|
+
getActiveMemoriesWithEmbeddings() {
|
|
62
|
+
return this.memoriesWithEmbeddings;
|
|
63
|
+
}
|
|
64
|
+
textSearch(query, limit) {
|
|
65
|
+
this.textSearchCalls.push({ query, limit });
|
|
66
|
+
return this.textSearchResults.slice(0, limit);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/* ------------------------------------------------------------------ */
|
|
70
|
+
/* Tests */
|
|
71
|
+
/* ------------------------------------------------------------------ */
|
|
72
|
+
describe('BaseMemoryEngine', () => {
|
|
73
|
+
beforeEach(() => {
|
|
74
|
+
vi.useFakeTimers();
|
|
75
|
+
});
|
|
76
|
+
afterEach(() => {
|
|
77
|
+
vi.useRealTimers();
|
|
78
|
+
});
|
|
79
|
+
/* ---------- Timer lifecycle ---------- */
|
|
80
|
+
it('start() runs cycles at the configured interval', () => {
|
|
81
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
82
|
+
engine.start();
|
|
83
|
+
expect(engine.cycleCount).toBe(0);
|
|
84
|
+
vi.advanceTimersByTime(1000);
|
|
85
|
+
expect(engine.cycleCount).toBe(1);
|
|
86
|
+
vi.advanceTimersByTime(2000);
|
|
87
|
+
expect(engine.cycleCount).toBe(3);
|
|
88
|
+
engine.stop();
|
|
89
|
+
});
|
|
90
|
+
it('stop() halts the timer so no further cycles run', () => {
|
|
91
|
+
const engine = new TestMemoryEngine({ ...DEFAULT_CONFIG, intervalMs: 500 });
|
|
92
|
+
engine.start();
|
|
93
|
+
vi.advanceTimersByTime(500);
|
|
94
|
+
expect(engine.cycleCount).toBe(1);
|
|
95
|
+
engine.stop();
|
|
96
|
+
vi.advanceTimersByTime(5000);
|
|
97
|
+
expect(engine.cycleCount).toBe(1);
|
|
98
|
+
});
|
|
99
|
+
it('stop() is safe to call multiple times', () => {
|
|
100
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
101
|
+
engine.start();
|
|
102
|
+
engine.stop();
|
|
103
|
+
expect(() => engine.stop()).not.toThrow();
|
|
104
|
+
});
|
|
105
|
+
it('stop() is safe to call without start()', () => {
|
|
106
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
107
|
+
expect(() => engine.stop()).not.toThrow();
|
|
108
|
+
});
|
|
109
|
+
it('errors in runCycle are caught and do not crash the timer', () => {
|
|
110
|
+
class FailingEngine extends BaseMemoryEngine {
|
|
111
|
+
getActiveMemoriesWithEmbeddings() {
|
|
112
|
+
return [];
|
|
113
|
+
}
|
|
114
|
+
textSearch() {
|
|
115
|
+
return [];
|
|
116
|
+
}
|
|
117
|
+
runCycle() {
|
|
118
|
+
throw new Error('cycle explosion');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const engine = new FailingEngine(DEFAULT_CONFIG);
|
|
122
|
+
engine.start();
|
|
123
|
+
// Should not throw despite runCycle throwing
|
|
124
|
+
expect(() => vi.advanceTimersByTime(1000)).not.toThrow();
|
|
125
|
+
engine.stop();
|
|
126
|
+
});
|
|
127
|
+
/* ---------- setEmbeddingEngine ---------- */
|
|
128
|
+
it('setEmbeddingEngine attaches an embedding engine', () => {
|
|
129
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
130
|
+
const embeddingEngine = new BaseEmbeddingEngine({ enabled: true });
|
|
131
|
+
engine.setEmbeddingEngine(embeddingEngine);
|
|
132
|
+
// Verify it was set (access via semanticRecall behavior below)
|
|
133
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
134
|
+
expect(engine.embeddingEngine).toBe(embeddingEngine);
|
|
135
|
+
});
|
|
136
|
+
/* ---------- semanticRecall ---------- */
|
|
137
|
+
it('semanticRecall falls back to textSearch when no embedding engine is set', async () => {
|
|
138
|
+
vi.useRealTimers();
|
|
139
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
140
|
+
const expected = [makeMemory({ id: 1, content: 'hello' })];
|
|
141
|
+
engine.textSearchResults = expected;
|
|
142
|
+
const results = await engine.semanticRecall('hello', 5);
|
|
143
|
+
expect(results).toEqual(expected);
|
|
144
|
+
expect(engine.textSearchCalls).toEqual([{ query: 'hello', limit: 5 }]);
|
|
145
|
+
});
|
|
146
|
+
it('semanticRecall falls back to textSearch when embedding engine is not ready', async () => {
|
|
147
|
+
vi.useRealTimers();
|
|
148
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
149
|
+
const embeddingEngine = new BaseEmbeddingEngine({ enabled: true });
|
|
150
|
+
// isReady() returns false because we never initialized
|
|
151
|
+
engine.setEmbeddingEngine(embeddingEngine);
|
|
152
|
+
const expected = [makeMemory({ id: 2, content: 'fallback' })];
|
|
153
|
+
engine.textSearchResults = expected;
|
|
154
|
+
const results = await engine.semanticRecall('query');
|
|
155
|
+
expect(results).toEqual(expected);
|
|
156
|
+
expect(engine.textSearchCalls.length).toBe(1);
|
|
157
|
+
});
|
|
158
|
+
it('semanticRecall uses embeddings and sorts by similarity when engine is ready', async () => {
|
|
159
|
+
vi.useRealTimers();
|
|
160
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
161
|
+
// Create a mock embedding engine that is "ready"
|
|
162
|
+
const mockEmbeddingEngine = {
|
|
163
|
+
isReady: () => true,
|
|
164
|
+
embed: vi.fn(),
|
|
165
|
+
};
|
|
166
|
+
// Query vector: [1, 0]
|
|
167
|
+
const queryVec = new Float32Array([1, 0]);
|
|
168
|
+
mockEmbeddingEngine.embed.mockResolvedValue(queryVec);
|
|
169
|
+
engine.setEmbeddingEngine(mockEmbeddingEngine);
|
|
170
|
+
// Memory A embedding: [0, 1] -> similarity = 0
|
|
171
|
+
// Memory B embedding: [0.6, 0.8] -> similarity = 0.6
|
|
172
|
+
// Memory C embedding: [1, 0] -> similarity = 1.0
|
|
173
|
+
const memA = makeMemory({
|
|
174
|
+
id: 1,
|
|
175
|
+
content: 'orthogonal',
|
|
176
|
+
embedding: BaseEmbeddingEngine.serialize(new Float32Array([0, 1])),
|
|
177
|
+
});
|
|
178
|
+
const memB = makeMemory({
|
|
179
|
+
id: 2,
|
|
180
|
+
content: 'partial',
|
|
181
|
+
embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.6, 0.8])),
|
|
182
|
+
});
|
|
183
|
+
const memC = makeMemory({
|
|
184
|
+
id: 3,
|
|
185
|
+
content: 'identical',
|
|
186
|
+
embedding: BaseEmbeddingEngine.serialize(new Float32Array([1, 0])),
|
|
187
|
+
});
|
|
188
|
+
engine.memoriesWithEmbeddings = [memA, memB, memC];
|
|
189
|
+
const results = await engine.semanticRecall('test query', 10);
|
|
190
|
+
// Should be sorted by similarity descending: C, B, A
|
|
191
|
+
expect(results.map(r => r.id)).toEqual([3, 2, 1]);
|
|
192
|
+
// textSearch should NOT have been called
|
|
193
|
+
expect(engine.textSearchCalls.length).toBe(0);
|
|
194
|
+
});
|
|
195
|
+
it('semanticRecall respects the limit parameter', async () => {
|
|
196
|
+
vi.useRealTimers();
|
|
197
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
198
|
+
const mockEmbeddingEngine = {
|
|
199
|
+
isReady: () => true,
|
|
200
|
+
embed: vi.fn().mockResolvedValue(new Float32Array([1, 0])),
|
|
201
|
+
};
|
|
202
|
+
engine.setEmbeddingEngine(mockEmbeddingEngine);
|
|
203
|
+
engine.memoriesWithEmbeddings = [
|
|
204
|
+
makeMemory({ id: 1, embedding: BaseEmbeddingEngine.serialize(new Float32Array([1, 0])) }),
|
|
205
|
+
makeMemory({ id: 2, embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.9, 0.1])) }),
|
|
206
|
+
makeMemory({ id: 3, embedding: BaseEmbeddingEngine.serialize(new Float32Array([0.5, 0.5])) }),
|
|
207
|
+
];
|
|
208
|
+
const results = await engine.semanticRecall('query', 2);
|
|
209
|
+
expect(results.length).toBe(2);
|
|
210
|
+
});
|
|
211
|
+
it('semanticRecall falls back to textSearch when embed() throws', async () => {
|
|
212
|
+
vi.useRealTimers();
|
|
213
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
214
|
+
const mockEmbeddingEngine = {
|
|
215
|
+
isReady: () => true,
|
|
216
|
+
embed: vi.fn().mockRejectedValue(new Error('embedding failed')),
|
|
217
|
+
};
|
|
218
|
+
engine.setEmbeddingEngine(mockEmbeddingEngine);
|
|
219
|
+
const expected = [makeMemory({ id: 10, content: 'text fallback' })];
|
|
220
|
+
engine.textSearchResults = expected;
|
|
221
|
+
const results = await engine.semanticRecall('broken query', 5);
|
|
222
|
+
expect(results).toEqual(expected);
|
|
223
|
+
expect(engine.textSearchCalls).toEqual([{ query: 'broken query', limit: 5 }]);
|
|
224
|
+
});
|
|
225
|
+
it('semanticRecall uses default limit of 10', async () => {
|
|
226
|
+
vi.useRealTimers();
|
|
227
|
+
const engine = new TestMemoryEngine(DEFAULT_CONFIG);
|
|
228
|
+
engine.textSearchResults = [];
|
|
229
|
+
await engine.semanticRecall('query');
|
|
230
|
+
expect(engine.textSearchCalls).toEqual([{ query: 'query', limit: 10 }]);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
//# sourceMappingURL=base-memory-engine.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base-memory-engine.test.js","sourceRoot":"","sources":["../../../src/memory/__tests__/base-memory-engine.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED