@mmnto/totem 1.4.1 → 1.4.3

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 (67) hide show
  1. package/dist/ast-query.d.ts +2 -1
  2. package/dist/ast-query.d.ts.map +1 -1
  3. package/dist/ast-query.js +6 -15
  4. package/dist/ast-query.js.map +1 -1
  5. package/dist/ast-query.test.js +31 -1
  6. package/dist/ast-query.test.js.map +1 -1
  7. package/dist/chunkers/chunker-utils.d.ts +4 -0
  8. package/dist/chunkers/chunker-utils.d.ts.map +1 -0
  9. package/dist/chunkers/chunker-utils.js +13 -0
  10. package/dist/chunkers/chunker-utils.js.map +1 -0
  11. package/dist/chunkers/markdown-chunker.d.ts.map +1 -1
  12. package/dist/chunkers/markdown-chunker.js +1 -11
  13. package/dist/chunkers/markdown-chunker.js.map +1 -1
  14. package/dist/chunkers/session-log-chunker.d.ts.map +1 -1
  15. package/dist/chunkers/session-log-chunker.js +1 -12
  16. package/dist/chunkers/session-log-chunker.js.map +1 -1
  17. package/dist/chunkers/session-log-chunker.test.d.ts +2 -0
  18. package/dist/chunkers/session-log-chunker.test.d.ts.map +1 -0
  19. package/dist/chunkers/session-log-chunker.test.js +235 -0
  20. package/dist/chunkers/session-log-chunker.test.js.map +1 -0
  21. package/dist/compile-lesson.d.ts +52 -0
  22. package/dist/compile-lesson.d.ts.map +1 -0
  23. package/dist/compile-lesson.js +144 -0
  24. package/dist/compile-lesson.js.map +1 -0
  25. package/dist/compile-lesson.test.d.ts +2 -0
  26. package/dist/compile-lesson.test.d.ts.map +1 -0
  27. package/dist/compile-lesson.test.js +244 -0
  28. package/dist/compile-lesson.test.js.map +1 -0
  29. package/dist/embedders/gemini-embedder.test.d.ts +2 -0
  30. package/dist/embedders/gemini-embedder.test.d.ts.map +1 -0
  31. package/dist/embedders/gemini-embedder.test.js +158 -0
  32. package/dist/embedders/gemini-embedder.test.js.map +1 -0
  33. package/dist/embedders/ollama-embedder.d.ts +2 -1
  34. package/dist/embedders/ollama-embedder.d.ts.map +1 -1
  35. package/dist/embedders/ollama-embedder.js +11 -3
  36. package/dist/embedders/ollama-embedder.js.map +1 -1
  37. package/dist/embedders/ollama-embedder.test.d.ts +2 -0
  38. package/dist/embedders/ollama-embedder.test.d.ts.map +1 -0
  39. package/dist/embedders/ollama-embedder.test.js +211 -0
  40. package/dist/embedders/ollama-embedder.test.js.map +1 -0
  41. package/dist/errors.d.ts +1 -1
  42. package/dist/errors.d.ts.map +1 -1
  43. package/dist/errors.js.map +1 -1
  44. package/dist/index.d.ts +2 -0
  45. package/dist/index.d.ts.map +1 -1
  46. package/dist/index.js +1 -0
  47. package/dist/index.js.map +1 -1
  48. package/dist/lock.d.ts.map +1 -1
  49. package/dist/lock.js +3 -1
  50. package/dist/lock.js.map +1 -1
  51. package/dist/rule-engine.js +4 -5
  52. package/dist/rule-engine.js.map +1 -1
  53. package/dist/rule-engine.test.js +46 -0
  54. package/dist/rule-engine.test.js.map +1 -1
  55. package/dist/rule-metrics.test.d.ts +2 -0
  56. package/dist/rule-metrics.test.d.ts.map +1 -0
  57. package/dist/rule-metrics.test.js +205 -0
  58. package/dist/rule-metrics.test.js.map +1 -0
  59. package/dist/store/lance-search.test.d.ts +2 -0
  60. package/dist/store/lance-search.test.d.ts.map +1 -0
  61. package/dist/store/lance-search.test.js +249 -0
  62. package/dist/store/lance-search.test.js.map +1 -0
  63. package/dist/suspicious-lesson.test.d.ts +2 -0
  64. package/dist/suspicious-lesson.test.d.ts.map +1 -0
  65. package/dist/suspicious-lesson.test.js +184 -0
  66. package/dist/suspicious-lesson.test.js.map +1 -0
  67. package/package.json +1 -1
@@ -0,0 +1,205 @@
1
+ import * as fs from 'node:fs';
2
+ import * as os from 'node:os';
3
+ import * as path from 'node:path';
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
+ import { loadRuleMetrics, recordSuppression, recordTrigger, saveRuleMetrics, } from './rule-metrics.js';
6
+ // ─── Helpers ────────────────────────────────────────────
7
+ let tmpDir;
8
+ beforeEach(() => {
9
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-rule-metrics-'));
10
+ });
11
+ afterEach(() => {
12
+ fs.rmSync(tmpDir, { recursive: true, force: true });
13
+ });
14
+ function emptyMetrics() {
15
+ return { version: 1, rules: {} };
16
+ }
17
+ // ─── loadRuleMetrics ────────────────────────────────────
18
+ describe('loadRuleMetrics', () => {
19
+ it('returns empty metrics when file does not exist', () => {
20
+ const metrics = loadRuleMetrics(tmpDir);
21
+ expect(metrics).toEqual({ version: 1, rules: {} });
22
+ });
23
+ it('loads valid metrics from disk', () => {
24
+ const data = {
25
+ version: 1,
26
+ rules: {
27
+ abc123: {
28
+ triggerCount: 5,
29
+ suppressCount: 2,
30
+ lastTriggeredAt: '2026-01-01T00:00:00.000Z',
31
+ lastSuppressedAt: '2026-01-02T00:00:00.000Z',
32
+ },
33
+ },
34
+ };
35
+ const dir = path.join(tmpDir, 'cache');
36
+ fs.mkdirSync(dir, { recursive: true });
37
+ fs.writeFileSync(path.join(dir, 'rule-metrics.json'), JSON.stringify(data));
38
+ const metrics = loadRuleMetrics(tmpDir);
39
+ expect(metrics).toEqual(data);
40
+ });
41
+ it('roundtrips through save and load', () => {
42
+ const data = {
43
+ version: 1,
44
+ rules: {
45
+ hash1: {
46
+ triggerCount: 3,
47
+ suppressCount: 1,
48
+ lastTriggeredAt: '2026-03-01T00:00:00.000Z',
49
+ lastSuppressedAt: null,
50
+ },
51
+ hash2: {
52
+ triggerCount: 0,
53
+ suppressCount: 0,
54
+ lastTriggeredAt: null,
55
+ lastSuppressedAt: null,
56
+ },
57
+ },
58
+ };
59
+ saveRuleMetrics(tmpDir, data);
60
+ const loaded = loadRuleMetrics(tmpDir);
61
+ expect(loaded).toEqual(data);
62
+ });
63
+ it('returns empty metrics and warns on corrupt JSON', () => {
64
+ const dir = path.join(tmpDir, 'cache');
65
+ fs.mkdirSync(dir, { recursive: true });
66
+ fs.writeFileSync(path.join(dir, 'rule-metrics.json'), '{{{invalid json');
67
+ const onWarn = vi.fn();
68
+ const metrics = loadRuleMetrics(tmpDir, onWarn);
69
+ expect(metrics).toEqual({ version: 1, rules: {} });
70
+ expect(onWarn).toHaveBeenCalledOnce();
71
+ expect(onWarn.mock.calls[0][0]).toContain('Could not load rule metrics');
72
+ });
73
+ it('returns empty metrics and warns on schema-invalid data', () => {
74
+ const dir = path.join(tmpDir, 'cache');
75
+ fs.mkdirSync(dir, { recursive: true });
76
+ // Valid JSON but wrong schema (version: 2 instead of 1)
77
+ fs.writeFileSync(path.join(dir, 'rule-metrics.json'), JSON.stringify({ version: 2, rules: {} }));
78
+ const onWarn = vi.fn();
79
+ const metrics = loadRuleMetrics(tmpDir, onWarn);
80
+ expect(metrics).toEqual({ version: 1, rules: {} });
81
+ expect(onWarn).toHaveBeenCalledOnce();
82
+ });
83
+ it('returns empty metrics silently when file is missing (no warn callback)', () => {
84
+ // No onWarn provided — should not throw
85
+ const metrics = loadRuleMetrics(path.join(tmpDir, 'nonexistent'));
86
+ expect(metrics).toEqual({ version: 1, rules: {} });
87
+ });
88
+ });
89
+ // ─── saveRuleMetrics ────────────────────────────────────
90
+ describe('saveRuleMetrics', () => {
91
+ it('creates the cache directory if missing', () => {
92
+ const data = emptyMetrics();
93
+ saveRuleMetrics(tmpDir, data);
94
+ const filePath = path.join(tmpDir, 'cache', 'rule-metrics.json');
95
+ expect(fs.existsSync(filePath)).toBe(true);
96
+ });
97
+ it('writes valid JSON with trailing newline', () => {
98
+ const data = {
99
+ version: 1,
100
+ rules: {
101
+ abc: {
102
+ triggerCount: 1,
103
+ suppressCount: 0,
104
+ lastTriggeredAt: '2026-01-01T00:00:00.000Z',
105
+ lastSuppressedAt: null,
106
+ },
107
+ },
108
+ };
109
+ saveRuleMetrics(tmpDir, data);
110
+ const filePath = path.join(tmpDir, 'cache', 'rule-metrics.json');
111
+ const raw = fs.readFileSync(filePath, 'utf-8');
112
+ expect(raw.endsWith('\n')).toBe(true);
113
+ expect(JSON.parse(raw)).toEqual(data);
114
+ });
115
+ it('overwrites existing file', () => {
116
+ const data1 = {
117
+ version: 1,
118
+ rules: {
119
+ a: { triggerCount: 1, suppressCount: 0, lastTriggeredAt: null, lastSuppressedAt: null },
120
+ },
121
+ };
122
+ const data2 = {
123
+ version: 1,
124
+ rules: {
125
+ b: { triggerCount: 2, suppressCount: 1, lastTriggeredAt: null, lastSuppressedAt: null },
126
+ },
127
+ };
128
+ saveRuleMetrics(tmpDir, data1);
129
+ saveRuleMetrics(tmpDir, data2);
130
+ const loaded = loadRuleMetrics(tmpDir);
131
+ expect(loaded).toEqual(data2);
132
+ expect(loaded.rules['a']).toBeUndefined();
133
+ });
134
+ });
135
+ // ─── recordTrigger ──────────────────────────────────────
136
+ describe('recordTrigger', () => {
137
+ it('creates a new entry and increments triggerCount', () => {
138
+ const metrics = emptyMetrics();
139
+ recordTrigger(metrics, 'hash1');
140
+ expect(metrics.rules['hash1']).toBeDefined();
141
+ expect(metrics.rules['hash1'].triggerCount).toBe(1);
142
+ expect(metrics.rules['hash1'].suppressCount).toBe(0);
143
+ expect(metrics.rules['hash1'].lastTriggeredAt).toBeTruthy();
144
+ expect(metrics.rules['hash1'].lastSuppressedAt).toBeNull();
145
+ });
146
+ it('increments existing entry', () => {
147
+ const metrics = emptyMetrics();
148
+ recordTrigger(metrics, 'hash1');
149
+ recordTrigger(metrics, 'hash1');
150
+ recordTrigger(metrics, 'hash1');
151
+ expect(metrics.rules['hash1'].triggerCount).toBe(3);
152
+ });
153
+ it('sets lastTriggeredAt to a valid ISO timestamp', () => {
154
+ const metrics = emptyMetrics();
155
+ const before = new Date().toISOString();
156
+ recordTrigger(metrics, 'hash1');
157
+ const after = new Date().toISOString();
158
+ const ts = metrics.rules['hash1'].lastTriggeredAt;
159
+ expect(ts >= before).toBe(true);
160
+ expect(ts <= after).toBe(true);
161
+ });
162
+ it('does not affect other hashes', () => {
163
+ const metrics = emptyMetrics();
164
+ recordTrigger(metrics, 'hash1');
165
+ recordTrigger(metrics, 'hash2');
166
+ expect(metrics.rules['hash1'].triggerCount).toBe(1);
167
+ expect(metrics.rules['hash2'].triggerCount).toBe(1);
168
+ });
169
+ });
170
+ // ─── recordSuppression ──────────────────────────────────
171
+ describe('recordSuppression', () => {
172
+ it('creates a new entry and increments suppressCount', () => {
173
+ const metrics = emptyMetrics();
174
+ recordSuppression(metrics, 'hash1');
175
+ expect(metrics.rules['hash1']).toBeDefined();
176
+ expect(metrics.rules['hash1'].suppressCount).toBe(1);
177
+ expect(metrics.rules['hash1'].triggerCount).toBe(0);
178
+ expect(metrics.rules['hash1'].lastSuppressedAt).toBeTruthy();
179
+ expect(metrics.rules['hash1'].lastTriggeredAt).toBeNull();
180
+ });
181
+ it('increments existing entry', () => {
182
+ const metrics = emptyMetrics();
183
+ recordSuppression(metrics, 'hash1');
184
+ recordSuppression(metrics, 'hash1');
185
+ expect(metrics.rules['hash1'].suppressCount).toBe(2);
186
+ });
187
+ it('sets lastSuppressedAt to a valid ISO timestamp', () => {
188
+ const metrics = emptyMetrics();
189
+ const before = new Date().toISOString();
190
+ recordSuppression(metrics, 'hash1');
191
+ const after = new Date().toISOString();
192
+ const ts = metrics.rules['hash1'].lastSuppressedAt;
193
+ expect(ts >= before).toBe(true);
194
+ expect(ts <= after).toBe(true);
195
+ });
196
+ it('works independently from recordTrigger on the same hash', () => {
197
+ const metrics = emptyMetrics();
198
+ recordTrigger(metrics, 'hash1');
199
+ recordTrigger(metrics, 'hash1');
200
+ recordSuppression(metrics, 'hash1');
201
+ expect(metrics.rules['hash1'].triggerCount).toBe(2);
202
+ expect(metrics.rules['hash1'].suppressCount).toBe(1);
203
+ });
204
+ });
205
+ //# sourceMappingURL=rule-metrics.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-metrics.test.js","sourceRoot":"","sources":["../src/rule-metrics.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lance-search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-search.test.d.ts","sourceRoot":"","sources":["../../src/store/lance-search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,249 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { runHybridSearch, runVectorSearch } from './lance-search.js';
3
+ // ─── Mock helpers ───────────────────────────────────────
4
+ /** Build a fake LanceDB row with fields that rowToSearchResult expects. */
5
+ function fakeRow(id, overrides = {}) {
6
+ return {
7
+ content: `content-${id}`,
8
+ contextPrefix: `prefix-${id}`,
9
+ filePath: `src/${id}.ts`,
10
+ type: 'code',
11
+ label: `label-${id}`,
12
+ metadata: '{}',
13
+ _distance: 0.1,
14
+ _rowid: id,
15
+ ...overrides,
16
+ };
17
+ }
18
+ /** Create a chainable query builder mock. Tracks the where clause. */
19
+ function mockQueryBuilder(rows) {
20
+ const captured = {};
21
+ const builder = {
22
+ limit: vi.fn().mockReturnThis(),
23
+ where: vi.fn((clause) => {
24
+ captured.where = clause;
25
+ return builder;
26
+ }),
27
+ withRowId: vi.fn().mockReturnThis(),
28
+ toArray: vi.fn(async () => rows),
29
+ _captured: captured,
30
+ };
31
+ return builder;
32
+ }
33
+ /** Create a mock LanceDB table. */
34
+ function mockTable(opts) {
35
+ const vectorBuilder = mockQueryBuilder(opts.vectorRows ?? []);
36
+ const ftsBuilder = mockQueryBuilder(opts.ftsRows ?? []);
37
+ if (opts.ftsError) {
38
+ ftsBuilder.toArray = vi.fn(async () => {
39
+ throw opts.ftsError;
40
+ });
41
+ }
42
+ return {
43
+ vectorSearch: vi.fn(() => vectorBuilder),
44
+ search: vi.fn(() => ftsBuilder),
45
+ _vectorBuilder: vectorBuilder,
46
+ _ftsBuilder: ftsBuilder,
47
+ };
48
+ }
49
+ /** Create a mock embedder returning a deterministic vector. */
50
+ function mockEmbedder(vec = [1, 0, 0]) {
51
+ return {
52
+ dimensions: vec.length,
53
+ embed: async (texts) => texts.map(() => vec),
54
+ };
55
+ }
56
+ // ─── runVectorSearch ────────────────────────────────────
57
+ describe('runVectorSearch', () => {
58
+ it('returns results mapped from LanceDB rows', async () => {
59
+ const table = mockTable({
60
+ vectorRows: [fakeRow('a', { _distance: 0.5 }), fakeRow('b', { _distance: 1.0 })],
61
+ });
62
+ const results = await runVectorSearch(table, mockEmbedder(), 'test query', undefined, 10);
63
+ expect(results).toHaveLength(2);
64
+ expect(results[0].content).toBe('content-a');
65
+ expect(results[0].score).toBeCloseTo(1 / (1 + 0.5));
66
+ expect(results[1].content).toBe('content-b');
67
+ expect(results[1].score).toBeCloseTo(1 / (1 + 1.0));
68
+ });
69
+ it('returns empty array when table has no matches', async () => {
70
+ const table = mockTable({ vectorRows: [] });
71
+ const results = await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5);
72
+ expect(results).toHaveLength(0);
73
+ });
74
+ it('passes type filter as a WHERE clause', async () => {
75
+ const table = mockTable({ vectorRows: [] });
76
+ await runVectorSearch(table, mockEmbedder(), 'query', 'spec', 5);
77
+ expect(table._vectorBuilder.where).toHaveBeenCalledOnce();
78
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
79
+ expect(clause).toContain("`type` = 'spec'");
80
+ });
81
+ it('passes boundary filter as a WHERE LIKE clause', async () => {
82
+ const table = mockTable({ vectorRows: [] });
83
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, 'src/utils');
84
+ expect(table._vectorBuilder.where).toHaveBeenCalledOnce();
85
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
86
+ expect(clause).toContain("`filePath` LIKE 'src/utils%'");
87
+ });
88
+ it('combines type and boundary filters with AND', async () => {
89
+ const table = mockTable({ vectorRows: [] });
90
+ await runVectorSearch(table, mockEmbedder(), 'query', 'code', 5, 'src/');
91
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
92
+ expect(clause).toContain("`type` = 'code'");
93
+ expect(clause).toContain("`filePath` LIKE 'src/%'");
94
+ expect(clause).toContain(' AND ');
95
+ });
96
+ it('handles multiple boundary prefixes with OR', async () => {
97
+ const table = mockTable({ vectorRows: [] });
98
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, [
99
+ 'src/a',
100
+ 'src/b',
101
+ ]);
102
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
103
+ expect(clause).toContain("`filePath` LIKE 'src/a%'");
104
+ expect(clause).toContain(' OR ');
105
+ expect(clause).toContain("`filePath` LIKE 'src/b%'");
106
+ });
107
+ it('does not call where when no filters are provided', async () => {
108
+ const table = mockTable({ vectorRows: [] });
109
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5);
110
+ expect(table._vectorBuilder.where).not.toHaveBeenCalled();
111
+ });
112
+ it('escapes SQL wildcards in boundary prefixes', async () => {
113
+ const table = mockTable({ vectorRows: [] });
114
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, 'src/50%_off');
115
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
116
+ // % and _ should be escaped
117
+ expect(clause).toContain('50\\%\\_off');
118
+ });
119
+ it('normalizes Windows backslashes in boundary prefixes', async () => {
120
+ const table = mockTable({ vectorRows: [] });
121
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, 'src\\utils\\foo');
122
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
123
+ expect(clause).toContain('src/utils/foo');
124
+ expect(clause).not.toContain('\\\\');
125
+ });
126
+ it('escapes single quotes in boundary prefixes', async () => {
127
+ const table = mockTable({ vectorRows: [] });
128
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, "it's/a/path");
129
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
130
+ expect(clause).toContain("it''s/a/path");
131
+ });
132
+ it('filters out empty boundary strings', async () => {
133
+ const table = mockTable({ vectorRows: [] });
134
+ await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5, ['', 'src/']);
135
+ const clause = table._vectorBuilder.where.mock.calls[0][0];
136
+ expect(clause).toContain("`filePath` LIKE 'src/%'");
137
+ expect(clause).not.toContain("LIKE '%'");
138
+ });
139
+ it('handles row with null _distance gracefully (score = 0)', async () => {
140
+ const table = mockTable({
141
+ vectorRows: [fakeRow('x', { _distance: null })],
142
+ });
143
+ const results = await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5);
144
+ expect(results[0].score).toBe(0);
145
+ });
146
+ it('parses metadata JSON from row', async () => {
147
+ const table = mockTable({
148
+ vectorRows: [fakeRow('m', { metadata: '{"key":"value"}' })],
149
+ });
150
+ const results = await runVectorSearch(table, mockEmbedder(), 'query', undefined, 5);
151
+ expect(results[0].metadata).toEqual({ key: 'value' });
152
+ });
153
+ });
154
+ // ─── runHybridSearch (exercises rrfMerge) ───────────────
155
+ describe('runHybridSearch', () => {
156
+ it('merges vector and FTS results via RRF', async () => {
157
+ // Item 'a' appears in both lists, 'b' only in vector, 'c' only in FTS
158
+ const vectorRows = [fakeRow('a'), fakeRow('b')];
159
+ const ftsRows = [fakeRow('a'), fakeRow('c')];
160
+ const table = mockTable({ vectorRows, ftsRows });
161
+ const onWarn = vi.fn();
162
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
163
+ // 'a' appears in both lists, so it should have the highest RRF score
164
+ expect(results.length).toBeGreaterThanOrEqual(3);
165
+ expect(results[0].content).toBe('content-a');
166
+ // 'a' score = 1/(60+1) + 1/(60+1) = 2/61
167
+ const expectedTopScore = 2 / 61;
168
+ expect(results[0].score).toBeCloseTo(expectedTopScore, 6);
169
+ // 'b' and 'c' each appear in one list at rank 2: score = 1/(60+2) = 1/62
170
+ const singleListScore = 1 / 62;
171
+ const secondItem = results[1];
172
+ expect(secondItem.score).toBeCloseTo(singleListScore, 6);
173
+ });
174
+ it('returns only vector results when FTS leg fails', async () => {
175
+ const vectorRows = [fakeRow('a'), fakeRow('b')];
176
+ const table = mockTable({
177
+ vectorRows,
178
+ ftsError: new Error('FTS index not found'),
179
+ });
180
+ const onWarn = vi.fn();
181
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
182
+ expect(results).toHaveLength(2);
183
+ expect(onWarn).toHaveBeenCalledOnce();
184
+ expect(onWarn.mock.calls[0][0]).toContain('FTS search failed');
185
+ });
186
+ it('returns empty array when both legs return empty', async () => {
187
+ const table = mockTable({ vectorRows: [], ftsRows: [] });
188
+ const onWarn = vi.fn();
189
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
190
+ expect(results).toHaveLength(0);
191
+ });
192
+ it('returns results when only FTS leg has results (vector empty)', async () => {
193
+ const table = mockTable({
194
+ vectorRows: [],
195
+ ftsRows: [fakeRow('x')],
196
+ });
197
+ const onWarn = vi.fn();
198
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
199
+ expect(results).toHaveLength(1);
200
+ expect(results[0].content).toBe('content-x');
201
+ });
202
+ it('respects the limit parameter (RRF truncation)', async () => {
203
+ // Put 5 items in each list
204
+ const vectorRows = Array.from({ length: 5 }, (_, i) => fakeRow(`v${i}`));
205
+ const ftsRows = Array.from({ length: 5 }, (_, i) => fakeRow(`f${i}`));
206
+ const table = mockTable({ vectorRows, ftsRows });
207
+ const onWarn = vi.fn();
208
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 3);
209
+ expect(results).toHaveLength(3);
210
+ });
211
+ it('ranks items appearing in both lists higher than single-list items', async () => {
212
+ // 'shared' appears in both at different ranks, 'solo' in vector only
213
+ const vectorRows = [fakeRow('solo'), fakeRow('shared')];
214
+ const ftsRows = [fakeRow('shared')];
215
+ const table = mockTable({ vectorRows, ftsRows });
216
+ const onWarn = vi.fn();
217
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
218
+ // 'shared' = 1/(60+2) + 1/(60+1) = 1/62 + 1/61
219
+ // 'solo' = 1/(60+1) = 1/61
220
+ // shared should rank higher
221
+ const sharedIdx = results.findIndex((r) => r.content === 'content-shared');
222
+ const soloIdx = results.findIndex((r) => r.content === 'content-solo');
223
+ expect(sharedIdx).toBeLessThan(soloIdx);
224
+ });
225
+ it('computes correct RRF scores with single-item lists', async () => {
226
+ const vectorRows = [fakeRow('only')];
227
+ const ftsRows = [fakeRow('only')];
228
+ const table = mockTable({ vectorRows, ftsRows });
229
+ const onWarn = vi.fn();
230
+ const results = await runHybridSearch(table, mockEmbedder(), onWarn, 'query', undefined, 10);
231
+ expect(results).toHaveLength(1);
232
+ // Both at rank 1: score = 2 * 1/(60+1) = 2/61
233
+ expect(results[0].score).toBeCloseTo(2 / 61, 6);
234
+ });
235
+ it('passes type filter through to both legs', async () => {
236
+ const table = mockTable({ vectorRows: [], ftsRows: [] });
237
+ const onWarn = vi.fn();
238
+ await runHybridSearch(table, mockEmbedder(), onWarn, 'query', 'spec', 5);
239
+ // Vector leg should get a where clause
240
+ expect(table._vectorBuilder.where).toHaveBeenCalled();
241
+ const vectorClause = table._vectorBuilder.where.mock.calls[0][0];
242
+ expect(vectorClause).toContain("`type` = 'spec'");
243
+ // FTS leg should also get a where clause
244
+ expect(table._ftsBuilder.where).toHaveBeenCalled();
245
+ const ftsClause = table._ftsBuilder.where.mock.calls[0][0];
246
+ expect(ftsClause).toContain("`type` = 'spec'");
247
+ });
248
+ });
249
+ //# sourceMappingURL=lance-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lance-search.test.js","sourceRoot":"","sources":["../../src/store/lance-search.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=suspicious-lesson.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suspicious-lesson.test.d.ts","sourceRoot":"","sources":["../src/suspicious-lesson.test.ts"],"names":[],"mappings":""}