mindlore 0.6.7 → 0.6.8
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 +259 -259
- package/SCHEMA.md +292 -292
- package/dist/scripts/cc-memory-bulk-sync.d.ts.map +1 -1
- package/dist/scripts/cc-memory-bulk-sync.js +47 -42
- package/dist/scripts/cc-memory-bulk-sync.js.map +1 -1
- package/dist/scripts/cc-session-sync.d.ts.map +1 -1
- package/dist/scripts/cc-session-sync.js +58 -48
- package/dist/scripts/cc-session-sync.js.map +1 -1
- package/dist/scripts/init.js +8 -8
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/all-migrations.d.ts.map +1 -1
- package/dist/scripts/lib/all-migrations.js +4 -1
- package/dist/scripts/lib/all-migrations.js.map +1 -1
- package/dist/scripts/lib/consolidation.d.ts +4 -3
- package/dist/scripts/lib/consolidation.d.ts.map +1 -1
- package/dist/scripts/lib/consolidation.js +10 -10
- package/dist/scripts/lib/consolidation.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +1 -7
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +2 -9
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/db-helpers.d.ts +0 -15
- package/dist/scripts/lib/db-helpers.d.ts.map +1 -1
- package/dist/scripts/lib/db-helpers.js +1 -51
- package/dist/scripts/lib/db-helpers.js.map +1 -1
- package/dist/scripts/lib/decay.d.ts.map +1 -1
- package/dist/scripts/lib/decay.js +9 -9
- package/dist/scripts/lib/decay.js.map +1 -1
- package/dist/scripts/lib/episodes.js +23 -23
- package/dist/scripts/lib/migrations-v061.js +21 -21
- package/dist/scripts/lib/migrations-v062.js +11 -11
- package/dist/scripts/lib/migrations-v063.js +14 -14
- package/dist/scripts/lib/migrations-v067.js +11 -11
- package/dist/scripts/lib/migrations-v068.d.ts +3 -0
- package/dist/scripts/lib/migrations-v068.d.ts.map +1 -0
- package/dist/scripts/lib/migrations-v068.js +37 -0
- package/dist/scripts/lib/migrations-v068.js.map +1 -0
- package/dist/scripts/lib/migrations.d.ts.map +1 -1
- package/dist/scripts/lib/migrations.js +0 -15
- package/dist/scripts/lib/migrations.js.map +1 -1
- package/dist/scripts/lib/schema-version.js +6 -6
- package/dist/scripts/lib/search-cache.js +11 -11
- package/dist/scripts/lib/session-payload.d.ts.map +1 -1
- package/dist/scripts/lib/session-payload.js +7 -7
- package/dist/scripts/lib/session-payload.js.map +1 -1
- package/dist/scripts/lib/triage.js +3 -3
- package/dist/scripts/mindlore-backup.js +9 -9
- package/dist/scripts/mindlore-fts5-index.d.ts +1 -2
- package/dist/scripts/mindlore-fts5-index.d.ts.map +1 -1
- package/dist/scripts/mindlore-fts5-index.js +12 -64
- package/dist/scripts/mindlore-fts5-index.js.map +1 -1
- package/dist/scripts/mindlore-health-check.d.ts.map +1 -1
- package/dist/scripts/mindlore-health-check.js +0 -11
- package/dist/scripts/mindlore-health-check.js.map +1 -1
- package/dist/tests/cc-memory-bulk-sync.test.js +23 -0
- package/dist/tests/cc-memory-bulk-sync.test.js.map +1 -1
- package/dist/tests/cc-session-sync.test.js +25 -0
- package/dist/tests/cc-session-sync.test.js.map +1 -1
- package/dist/tests/compaction-snapshot.test.js +2 -2
- package/dist/tests/consolidation.test.js +5 -5
- package/dist/tests/consolidation.test.js.map +1 -1
- package/dist/tests/decay.test.js +9 -9
- package/dist/tests/diary.test.js +4 -4
- package/dist/tests/episode-kind-constant.test.d.ts +2 -0
- package/dist/tests/episode-kind-constant.test.d.ts.map +1 -0
- package/dist/tests/episode-kind-constant.test.js +28 -0
- package/dist/tests/episode-kind-constant.test.js.map +1 -0
- package/dist/tests/episodes-inject.test.js +9 -9
- package/dist/tests/fts5.test.js +66 -125
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/globalSetup.d.ts +2 -0
- package/dist/tests/globalSetup.d.ts.map +1 -0
- package/dist/tests/globalSetup.js +36 -0
- package/dist/tests/globalSetup.js.map +1 -0
- package/dist/tests/helpers/db.d.ts +13 -5
- package/dist/tests/helpers/db.d.ts.map +1 -1
- package/dist/tests/helpers/db.js +60 -33
- package/dist/tests/helpers/db.js.map +1 -1
- package/dist/tests/lesson-graduation.test.js +11 -11
- package/dist/tests/lesson-graduation.test.js.map +1 -1
- package/dist/tests/migrations-v053.test.js +16 -16
- package/dist/tests/migrations-v061.test.js +10 -10
- package/dist/tests/migrations-v063.test.js +2 -2
- package/dist/tests/migrations-v068.test.d.ts +2 -0
- package/dist/tests/migrations-v068.test.d.ts.map +1 -0
- package/dist/tests/migrations-v068.test.js +53 -0
- package/dist/tests/migrations-v068.test.js.map +1 -0
- package/dist/tests/nomination-counts.test.d.ts +2 -0
- package/dist/tests/nomination-counts.test.d.ts.map +1 -0
- package/dist/tests/nomination-counts.test.js +51 -0
- package/dist/tests/nomination-counts.test.js.map +1 -0
- package/dist/tests/recall-telemetry.test.js +8 -8
- package/dist/tests/schema-version.test.js +3 -7
- package/dist/tests/schema-version.test.js.map +1 -1
- package/dist/tests/search-hook.test.js +2 -2
- package/dist/tests/sec-regression.test.js +0 -50
- package/dist/tests/sec-regression.test.js.map +1 -1
- package/dist/tests/session-end-cleanup.test.js +3 -20
- package/dist/tests/session-end-cleanup.test.js.map +1 -1
- package/dist/tests/session-focus.test.js +7 -30
- package/dist/tests/session-focus.test.js.map +1 -1
- package/dist/tests/session-payload.test.js +1 -1
- package/dist/tests/session-summary.test.js +1 -1
- package/hooks/lib/constants.cjs +15 -0
- package/hooks/lib/mindlore-common.cjs +974 -1042
- package/hooks/mindlore-cwd-changed.cjs +57 -57
- package/hooks/mindlore-decision-detector.cjs +54 -54
- package/hooks/mindlore-dont-repeat.cjs +222 -222
- package/hooks/mindlore-fts5-sync.cjs +97 -88
- package/hooks/mindlore-index.cjs +229 -229
- package/hooks/mindlore-model-router.cjs +54 -54
- package/hooks/mindlore-post-compact.cjs +69 -69
- package/hooks/mindlore-post-read.cjs +106 -106
- package/hooks/mindlore-pre-compact.cjs +154 -154
- package/hooks/mindlore-read-guard.cjs +105 -105
- package/hooks/mindlore-research-guard.cjs +176 -176
- package/hooks/mindlore-search.cjs +200 -200
- package/hooks/mindlore-session-end.cjs +509 -526
- package/hooks/mindlore-session-focus.cjs +256 -259
- package/package.json +75 -78
- package/plugin.json +1 -1
- package/skills/mindlore-diary/SKILL.md +85 -85
- package/skills/mindlore-evolve/SKILL.md +126 -126
- package/skills/mindlore-explore/SKILL.md +109 -109
- package/skills/mindlore-ingest/SKILL.md +195 -195
- package/skills/mindlore-maintain/SKILL.md +125 -125
- package/skills/mindlore-query/SKILL.md +151 -151
- package/skills/mindlore-reflect/SKILL.md +141 -141
- package/skills/mindlore-stats/SKILL.md +106 -106
- package/templates/INDEX.md +14 -14
- package/templates/SCHEMA.md +292 -292
- package/templates/config.json +1 -1
- package/templates/extraction/article.md +15 -15
- package/templates/extraction/changelog.md +15 -15
- package/templates/extraction/default.md +15 -15
- package/templates/extraction/docs.md +15 -15
- package/templates/extraction/github-repo.md +17 -17
- package/dist/scripts/lib/daemon.d.ts +0 -16
- package/dist/scripts/lib/daemon.d.ts.map +0 -1
- package/dist/scripts/lib/daemon.js +0 -133
- package/dist/scripts/lib/daemon.js.map +0 -1
- package/dist/scripts/lib/embedding.d.ts +0 -5
- package/dist/scripts/lib/embedding.d.ts.map +0 -1
- package/dist/scripts/lib/embedding.js +0 -44
- package/dist/scripts/lib/embedding.js.map +0 -1
- package/dist/scripts/mindlore-daemon.d.ts +0 -2
- package/dist/scripts/mindlore-daemon.d.ts.map +0 -1
- package/dist/scripts/mindlore-daemon.js +0 -117
- package/dist/scripts/mindlore-daemon.js.map +0 -1
- package/dist/tests/daemon-integration.test.d.ts +0 -2
- package/dist/tests/daemon-integration.test.d.ts.map +0 -1
- package/dist/tests/daemon-integration.test.js +0 -37
- package/dist/tests/daemon-integration.test.js.map +0 -1
- package/dist/tests/daemon.test.d.ts +0 -2
- package/dist/tests/daemon.test.d.ts.map +0 -1
- package/dist/tests/daemon.test.js +0 -187
- package/dist/tests/daemon.test.js.map +0 -1
- package/dist/tests/embedding-hf-integration.test.d.ts +0 -2
- package/dist/tests/embedding-hf-integration.test.d.ts.map +0 -1
- package/dist/tests/embedding-hf-integration.test.js +0 -52
- package/dist/tests/embedding-hf-integration.test.js.map +0 -1
- package/dist/tests/embedding.test.d.ts +0 -6
- package/dist/tests/embedding.test.d.ts.map +0 -1
- package/dist/tests/embedding.test.js +0 -71
- package/dist/tests/embedding.test.js.map +0 -1
- package/dist/tests/sqlite-vec-v12.test.d.ts +0 -2
- package/dist/tests/sqlite-vec-v12.test.d.ts.map +0 -1
- package/dist/tests/sqlite-vec-v12.test.js +0 -72
- package/dist/tests/sqlite-vec-v12.test.js.map +0 -1
|
@@ -1,187 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const net_1 = __importDefault(require("net"));
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const os_1 = __importDefault(require("os"));
|
|
10
|
-
describe('daemon constants', () => {
|
|
11
|
-
const constants = require('../dist/scripts/lib/constants.js');
|
|
12
|
-
it('should define DAEMON_PORT_FILE inside mindlore dir', () => {
|
|
13
|
-
expect(constants.DAEMON_PORT_FILE).toContain('mindlore-daemon.port');
|
|
14
|
-
});
|
|
15
|
-
it('should define DAEMON_PID_FILE inside mindlore dir', () => {
|
|
16
|
-
expect(constants.DAEMON_PID_FILE).toContain('mindlore-daemon.pid');
|
|
17
|
-
});
|
|
18
|
-
it('should define DAEMON_TIMEOUT_MS as 300', () => {
|
|
19
|
-
expect(constants.DAEMON_TIMEOUT_MS).toBe(300);
|
|
20
|
-
});
|
|
21
|
-
it('should define DAEMON_HOST as 127.0.0.1', () => {
|
|
22
|
-
expect(constants.DAEMON_HOST).toBe('127.0.0.1');
|
|
23
|
-
});
|
|
24
|
-
});
|
|
25
|
-
describe('daemon server', () => {
|
|
26
|
-
let createDaemonServer;
|
|
27
|
-
beforeAll(async () => {
|
|
28
|
-
const mod = await import('../scripts/lib/daemon.js');
|
|
29
|
-
createDaemonServer = mod.createDaemonServer;
|
|
30
|
-
});
|
|
31
|
-
it('should start and respond to ping', async () => {
|
|
32
|
-
const server = createDaemonServer({ skipModelLoad: true });
|
|
33
|
-
await server.start();
|
|
34
|
-
const port = server.getPort();
|
|
35
|
-
expect(port).toBeGreaterThan(0);
|
|
36
|
-
const response = await new Promise((resolve) => {
|
|
37
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
38
|
-
client.write(JSON.stringify({ type: 'ping' }) + '\n');
|
|
39
|
-
});
|
|
40
|
-
client.on('data', (data) => {
|
|
41
|
-
resolve(data.toString().trim());
|
|
42
|
-
client.end();
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
const parsed = JSON.parse(response);
|
|
46
|
-
expect(parsed.type).toBe('pong');
|
|
47
|
-
await server.stop();
|
|
48
|
-
}, 10000);
|
|
49
|
-
it('should respond to embed request with mock embedding', async () => {
|
|
50
|
-
const mockEmbed = new Array(384).fill(0.1);
|
|
51
|
-
const server = createDaemonServer({ skipModelLoad: true, mockEmbedding: mockEmbed });
|
|
52
|
-
await server.start();
|
|
53
|
-
const port = server.getPort();
|
|
54
|
-
const response = await new Promise((resolve) => {
|
|
55
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
56
|
-
client.write(JSON.stringify({ type: 'embed', text: 'test query' }) + '\n');
|
|
57
|
-
});
|
|
58
|
-
client.on('data', (data) => {
|
|
59
|
-
resolve(data.toString().trim());
|
|
60
|
-
client.end();
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
const parsed = JSON.parse(response);
|
|
64
|
-
expect(parsed.type).toBe('embedding');
|
|
65
|
-
expect(parsed.embedding).toHaveLength(384);
|
|
66
|
-
await server.stop();
|
|
67
|
-
}, 10000);
|
|
68
|
-
it('should write PID file on start and remove on stop', async () => {
|
|
69
|
-
const pidFile = path_1.default.join(os_1.default.tmpdir(), `mindlore-test-pid-${Date.now()}`);
|
|
70
|
-
const portFile = path_1.default.join(os_1.default.tmpdir(), `mindlore-test-port-${Date.now()}`);
|
|
71
|
-
const server = createDaemonServer({ skipModelLoad: true, pidFile, portFile });
|
|
72
|
-
await server.start();
|
|
73
|
-
expect(fs_1.default.existsSync(pidFile)).toBe(true);
|
|
74
|
-
const pid = parseInt(fs_1.default.readFileSync(pidFile, 'utf8').trim());
|
|
75
|
-
expect(pid).toBe(process.pid);
|
|
76
|
-
expect(fs_1.default.existsSync(portFile)).toBe(true);
|
|
77
|
-
const writtenPort = parseInt(fs_1.default.readFileSync(portFile, 'utf8').trim());
|
|
78
|
-
expect(writtenPort).toBe(server.getPort());
|
|
79
|
-
await server.stop();
|
|
80
|
-
expect(fs_1.default.existsSync(pidFile)).toBe(false);
|
|
81
|
-
expect(fs_1.default.existsSync(portFile)).toBe(false);
|
|
82
|
-
}, 10000);
|
|
83
|
-
it('should report running status', async () => {
|
|
84
|
-
const server = createDaemonServer({ skipModelLoad: true });
|
|
85
|
-
expect(server.isRunning()).toBe(false);
|
|
86
|
-
await server.start();
|
|
87
|
-
expect(server.isRunning()).toBe(true);
|
|
88
|
-
await server.stop();
|
|
89
|
-
expect(server.isRunning()).toBe(false);
|
|
90
|
-
}, 10000);
|
|
91
|
-
});
|
|
92
|
-
describe('daemon lifecycle edge cases', () => {
|
|
93
|
-
let createDaemonServer;
|
|
94
|
-
beforeAll(async () => {
|
|
95
|
-
const mod = await import('../scripts/lib/daemon.js');
|
|
96
|
-
createDaemonServer = mod.createDaemonServer;
|
|
97
|
-
});
|
|
98
|
-
it('should handle concurrent connections', async () => {
|
|
99
|
-
const server = createDaemonServer({
|
|
100
|
-
skipModelLoad: true,
|
|
101
|
-
mockEmbedding: new Array(384).fill(0.1),
|
|
102
|
-
});
|
|
103
|
-
await server.start();
|
|
104
|
-
const port = server.getPort();
|
|
105
|
-
const promises = Array.from({ length: 3 }, () => new Promise((resolve) => {
|
|
106
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
107
|
-
client.write(JSON.stringify({ type: 'ping' }) + '\n');
|
|
108
|
-
});
|
|
109
|
-
client.on('data', (data) => {
|
|
110
|
-
resolve(data.toString().trim());
|
|
111
|
-
client.end();
|
|
112
|
-
});
|
|
113
|
-
}));
|
|
114
|
-
const results = await Promise.all(promises);
|
|
115
|
-
for (const r of results) {
|
|
116
|
-
expect(JSON.parse(r).type).toBe('pong');
|
|
117
|
-
}
|
|
118
|
-
await server.stop();
|
|
119
|
-
}, 10000);
|
|
120
|
-
it('should handle invalid JSON gracefully', async () => {
|
|
121
|
-
const server = createDaemonServer({ skipModelLoad: true });
|
|
122
|
-
await server.start();
|
|
123
|
-
const port = server.getPort();
|
|
124
|
-
const response = await new Promise((resolve) => {
|
|
125
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
126
|
-
client.write('not valid json\n');
|
|
127
|
-
});
|
|
128
|
-
client.on('data', (data) => {
|
|
129
|
-
resolve(data.toString().trim());
|
|
130
|
-
client.end();
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
const parsed = JSON.parse(response);
|
|
134
|
-
expect(parsed.type).toBe('error');
|
|
135
|
-
expect(parsed.error).toContain('Invalid JSON');
|
|
136
|
-
await server.stop();
|
|
137
|
-
}, 10000);
|
|
138
|
-
it('should return error for embed without text', async () => {
|
|
139
|
-
const server = createDaemonServer({ skipModelLoad: true });
|
|
140
|
-
await server.start();
|
|
141
|
-
const port = server.getPort();
|
|
142
|
-
const response = await new Promise((resolve) => {
|
|
143
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
144
|
-
client.write(JSON.stringify({ type: 'embed' }) + '\n');
|
|
145
|
-
});
|
|
146
|
-
client.on('data', (data) => {
|
|
147
|
-
resolve(data.toString().trim());
|
|
148
|
-
client.end();
|
|
149
|
-
});
|
|
150
|
-
});
|
|
151
|
-
const parsed = JSON.parse(response);
|
|
152
|
-
expect(parsed.type).toBe('error');
|
|
153
|
-
expect(parsed.error).toContain('No text');
|
|
154
|
-
await server.stop();
|
|
155
|
-
}, 10000);
|
|
156
|
-
it('should handle stop command', async () => {
|
|
157
|
-
const server = createDaemonServer({ skipModelLoad: true });
|
|
158
|
-
await server.start();
|
|
159
|
-
expect(server.isRunning()).toBe(true);
|
|
160
|
-
const port = server.getPort();
|
|
161
|
-
const response = await new Promise((resolve) => {
|
|
162
|
-
const client = net_1.default.createConnection(port, '127.0.0.1', () => {
|
|
163
|
-
client.write(JSON.stringify({ type: 'stop' }) + '\n');
|
|
164
|
-
});
|
|
165
|
-
client.on('data', (data) => {
|
|
166
|
-
resolve(data.toString().trim());
|
|
167
|
-
client.end();
|
|
168
|
-
});
|
|
169
|
-
});
|
|
170
|
-
expect(JSON.parse(response).type).toBe('stopped');
|
|
171
|
-
// Wait for graceful shutdown
|
|
172
|
-
await new Promise(r => setTimeout(r, 200));
|
|
173
|
-
expect(server.isRunning()).toBe(false);
|
|
174
|
-
}, 10000);
|
|
175
|
-
});
|
|
176
|
-
describe('daemon CLI registration', () => {
|
|
177
|
-
it('should be registered as CLI subcommand in init.ts', () => {
|
|
178
|
-
const initSource = fs_1.default.readFileSync(path_1.default.join(__dirname, '..', 'scripts', 'init.ts'), 'utf8');
|
|
179
|
-
expect(initSource).toContain("daemon:");
|
|
180
|
-
expect(initSource).toContain('mindlore-daemon');
|
|
181
|
-
});
|
|
182
|
-
it('mindlore-daemon.ts script should exist', () => {
|
|
183
|
-
const scriptPath = path_1.default.join(__dirname, '..', 'scripts', 'mindlore-daemon.ts');
|
|
184
|
-
expect(fs_1.default.existsSync(scriptPath)).toBe(true);
|
|
185
|
-
});
|
|
186
|
-
});
|
|
187
|
-
//# sourceMappingURL=daemon.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.test.js","sourceRoot":"","sources":["../../tests/daemon.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-hf-integration.test.d.ts","sourceRoot":"","sources":["../../tests/embedding-hf-integration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
/**
|
|
4
|
-
* Integration smoke test — only runs when @huggingface/transformers installed.
|
|
5
|
-
* Skips automatically if package missing (dev environment guard).
|
|
6
|
-
*/
|
|
7
|
-
let pkgAvailable = false;
|
|
8
|
-
const skipHF = process.env.CI === 'true' || parseInt(process.versions.node, 10) >= 24;
|
|
9
|
-
try {
|
|
10
|
-
require.resolve('@huggingface/transformers');
|
|
11
|
-
pkgAvailable = true;
|
|
12
|
-
}
|
|
13
|
-
catch { /* skip */ }
|
|
14
|
-
// Skip in CI and Node 24+ — onnxruntime-node Float32Array realm mismatch in Jest sandbox
|
|
15
|
-
(pkgAvailable && !skipHF ? describe : describe.skip)('HF Transformers smoke', () => {
|
|
16
|
-
test('Xenova/multilingual-e5-small loads from HF package', async () => {
|
|
17
|
-
const { pipeline } = await import('@huggingface/transformers');
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion, @typescript-eslint/no-explicit-any -- ESM pipeline type unresolvable in CJS Jest
|
|
19
|
-
const embedder = await pipeline('feature-extraction', 'Xenova/multilingual-e5-small', { dtype: 'q8' });
|
|
20
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion, @typescript-eslint/no-explicit-any -- callable pipeline signature
|
|
21
|
-
const result = await embedder(['passage: hello'], { pooling: 'mean', normalize: true });
|
|
22
|
-
const list = result.tolist();
|
|
23
|
-
expect(list[0]).toHaveLength(384);
|
|
24
|
-
}, 60_000);
|
|
25
|
-
test('alternative ID intfloat/multilingual-e5-small loads', async () => {
|
|
26
|
-
const { pipeline } = await import('@huggingface/transformers');
|
|
27
|
-
const embedder = await pipeline('feature-extraction', 'intfloat/multilingual-e5-small');
|
|
28
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion, @typescript-eslint/no-explicit-any -- callable pipeline signature
|
|
29
|
-
const result = await embedder(['passage: hello'], { pooling: 'mean', normalize: true });
|
|
30
|
-
expect(result.tolist()[0]).toHaveLength(384);
|
|
31
|
-
}, 60_000);
|
|
32
|
-
});
|
|
33
|
-
let embeddingAvailable = false;
|
|
34
|
-
try {
|
|
35
|
-
require('@huggingface/transformers');
|
|
36
|
-
embeddingAvailable = true;
|
|
37
|
-
}
|
|
38
|
-
catch { /* ESM-only module — Jest CJS mode cannot load it */ }
|
|
39
|
-
(embeddingAvailable && !skipHF ? describe : describe.skip)('embedding drift check', () => {
|
|
40
|
-
test('cosine >=0.99 vs reference v2 embedding', async () => {
|
|
41
|
-
const refPath = require('path').join(__dirname, 'fixtures/embedding-v2-reference.json');
|
|
42
|
-
expect(require('fs').existsSync(refPath)).toBe(true);
|
|
43
|
-
const ref = JSON.parse(require('fs').readFileSync(refPath, 'utf8'));
|
|
44
|
-
const { generateEmbedding } = await import('../scripts/lib/embedding.js');
|
|
45
|
-
const fresh = await generateEmbedding('passage: mindlore test');
|
|
46
|
-
let dot = 0;
|
|
47
|
-
for (let i = 0; i < ref.length; i++)
|
|
48
|
-
dot += (ref[i] ?? 0) * (fresh[i] ?? 0);
|
|
49
|
-
expect(dot).toBeGreaterThanOrEqual(0.99);
|
|
50
|
-
}, 60_000);
|
|
51
|
-
});
|
|
52
|
-
//# sourceMappingURL=embedding-hf-integration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding-hf-integration.test.js","sourceRoot":"","sources":["../../tests/embedding-hf-integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.test.d.ts","sourceRoot":"","sources":["../../tests/embedding.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Embedding module unit tests — mock @huggingface/transformers.
|
|
4
|
-
* Real model integration test → Task 14 standalone script.
|
|
5
|
-
*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
// Mock the dynamic import before any imports
|
|
8
|
-
jest.mock('@huggingface/transformers', () => {
|
|
9
|
-
// Return a fake 384-dim embedding based on text hash for deterministic results
|
|
10
|
-
function fakeEmbed(texts) {
|
|
11
|
-
const embeddings = texts.map(text => {
|
|
12
|
-
// Simple deterministic pseudo-embedding from text
|
|
13
|
-
const vec = new Array(384).fill(0).map((_, i) => {
|
|
14
|
-
let h = 0;
|
|
15
|
-
for (let c = 0; c < text.length; c++) {
|
|
16
|
-
h = ((h << 5) - h + text.charCodeAt(c) + i) | 0;
|
|
17
|
-
}
|
|
18
|
-
return (h % 1000) / 1000;
|
|
19
|
-
});
|
|
20
|
-
// Normalize
|
|
21
|
-
const norm = Math.sqrt(vec.reduce((s, v) => s + v * v, 0));
|
|
22
|
-
return norm > 0 ? vec.map(v => v / norm) : vec;
|
|
23
|
-
});
|
|
24
|
-
return { tolist: () => embeddings };
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
__esModule: true,
|
|
28
|
-
pipeline: jest.fn().mockResolvedValue(jest.fn().mockImplementation((texts, _opts) => {
|
|
29
|
-
return Promise.resolve(fakeEmbed(texts));
|
|
30
|
-
})),
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
const embedding_js_1 = require("../scripts/lib/embedding.js");
|
|
34
|
-
describe('Embedding Module', () => {
|
|
35
|
-
test('EMBEDDING_DIM should be 384', () => {
|
|
36
|
-
expect(embedding_js_1.EMBEDDING_DIM).toBe(384);
|
|
37
|
-
});
|
|
38
|
-
test('EMBEDDING_MODEL should be multilingual-e5-small', () => {
|
|
39
|
-
expect(embedding_js_1.EMBEDDING_MODEL).toBe('Xenova/multilingual-e5-small');
|
|
40
|
-
});
|
|
41
|
-
test('should generate a 384-dim embedding', async () => {
|
|
42
|
-
const embedding = await (0, embedding_js_1.generateEmbedding)('TypeScript is a programming language');
|
|
43
|
-
expect(embedding).toHaveLength(384);
|
|
44
|
-
expect(typeof embedding[0]).toBe('number');
|
|
45
|
-
// Embeddings should be normalized (L2 norm ≈ 1.0)
|
|
46
|
-
const norm = Math.sqrt(embedding.reduce((sum, v) => sum + v * v, 0));
|
|
47
|
-
expect(norm).toBeCloseTo(1.0, 1);
|
|
48
|
-
});
|
|
49
|
-
test('should batch embed multiple texts', async () => {
|
|
50
|
-
const texts = ['Hello world', 'Merhaba dünya'];
|
|
51
|
-
const embeddings = await (0, embedding_js_1.batchEmbed)(texts);
|
|
52
|
-
expect(embeddings).toHaveLength(2);
|
|
53
|
-
expect(embeddings[0]).toHaveLength(384);
|
|
54
|
-
expect(embeddings[1]).toHaveLength(384);
|
|
55
|
-
});
|
|
56
|
-
test('should produce different embeddings for different texts', async () => {
|
|
57
|
-
const e1 = await (0, embedding_js_1.generateEmbedding)('authentication security');
|
|
58
|
-
const e2 = await (0, embedding_js_1.generateEmbedding)('database performance');
|
|
59
|
-
// Different texts should produce different embeddings
|
|
60
|
-
const same = e1.every((v, i) => v === (e2[i] ?? 0));
|
|
61
|
-
expect(same).toBe(false);
|
|
62
|
-
});
|
|
63
|
-
test('should add passage: prefix when not present', async () => {
|
|
64
|
-
const e1 = await (0, embedding_js_1.generateEmbedding)('test text');
|
|
65
|
-
const e2 = await (0, embedding_js_1.generateEmbedding)('passage: test text');
|
|
66
|
-
// Both should produce valid embeddings
|
|
67
|
-
expect(e1).toHaveLength(384);
|
|
68
|
-
expect(e2).toHaveLength(384);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=embedding.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"embedding.test.js","sourceRoot":"","sources":["../../tests/embedding.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-vec-v12.test.d.ts","sourceRoot":"","sources":["../../tests/sqlite-vec-v12.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
40
|
-
const sqliteVec = __importStar(require("sqlite-vec"));
|
|
41
|
-
const path_1 = __importDefault(require("path"));
|
|
42
|
-
const os_1 = __importDefault(require("os"));
|
|
43
|
-
const fs_1 = __importDefault(require("fs"));
|
|
44
|
-
describe('sqlite-vec on better-sqlite3 v12', () => {
|
|
45
|
-
let dbPath;
|
|
46
|
-
let db;
|
|
47
|
-
beforeEach(() => {
|
|
48
|
-
dbPath = path_1.default.join(fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'vec-v12-')), 'test.db');
|
|
49
|
-
db = new better_sqlite3_1.default(dbPath);
|
|
50
|
-
sqliteVec.load(db);
|
|
51
|
-
});
|
|
52
|
-
afterEach(() => {
|
|
53
|
-
db.close();
|
|
54
|
-
fs_1.default.rmSync(path_1.default.dirname(dbPath), { recursive: true, force: true });
|
|
55
|
-
});
|
|
56
|
-
test('vec0 virtual table create + insert + cosine query', () => {
|
|
57
|
-
db.exec('CREATE VIRTUAL TABLE vec_items USING vec0(embedding float[3])');
|
|
58
|
-
const insert = db.prepare('INSERT INTO vec_items(embedding) VALUES (?)');
|
|
59
|
-
insert.run(Buffer.from(new Float32Array([1, 0, 0]).buffer));
|
|
60
|
-
insert.run(Buffer.from(new Float32Array([0, 1, 0]).buffer));
|
|
61
|
-
const rows = db.prepare('SELECT rowid, distance FROM vec_items WHERE embedding MATCH ? ORDER BY distance LIMIT 2').all(Buffer.from(new Float32Array([1, 0, 0]).buffer));
|
|
62
|
-
expect(rows.length).toBe(2);
|
|
63
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- sqlite row shape guaranteed by vec0 schema
|
|
64
|
-
const first = rows[0];
|
|
65
|
-
expect(first.rowid).toBe(1);
|
|
66
|
-
expect(first.distance).toBeCloseTo(0);
|
|
67
|
-
});
|
|
68
|
-
test('better-sqlite3 prepare + run works', () => {
|
|
69
|
-
expect(() => db.prepare('SELECT 1').get()).not.toThrow();
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=sqlite-vec-v12.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-vec-v12.test.js","sourceRoot":"","sources":["../../tests/sqlite-vec-v12.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,oEAAsC;AACtC,sDAAwC;AACxC,gDAAwB;AACxB,4CAAoB;AACpB,4CAAoB;AAIpB,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,IAAI,MAAc,CAAC;IACnB,IAAI,EAAqB,CAAC;IAE1B,UAAU,CAAC,GAAG,EAAE;QACd,MAAM,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,WAAW,CAAC,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAClF,EAAE,GAAG,IAAI,wBAAQ,CAAC,MAAM,CAAC,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,YAAE,CAAC,MAAM,CAAC,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,EAAE,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC5D,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CACrB,yFAAyF,CAC1F,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,qHAAqH;QACrH,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|