@mmnto/totem 1.3.15 → 1.3.17
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/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/rule-tester.d.ts.map +1 -1
- package/dist/rule-tester.js +39 -12
- package/dist/rule-tester.js.map +1 -1
- package/dist/semantic-dedup.d.ts +17 -0
- package/dist/semantic-dedup.d.ts.map +1 -0
- package/dist/semantic-dedup.js +72 -0
- package/dist/semantic-dedup.js.map +1 -0
- package/dist/store/lance-health.d.ts +14 -0
- package/dist/store/lance-health.d.ts.map +1 -0
- package/dist/store/lance-health.js +100 -0
- package/dist/store/lance-health.js.map +1 -0
- package/dist/store/lance-search.d.ts +13 -0
- package/dist/store/lance-search.d.ts.map +1 -0
- package/dist/store/lance-search.js +128 -0
- package/dist/store/lance-search.js.map +1 -0
- package/dist/store/lance-store.d.ts +0 -10
- package/dist/store/lance-store.d.ts.map +1 -1
- package/dist/store/lance-store.js +5 -216
- package/dist/store/lance-store.js.map +1 -1
- package/dist/suspicious-lesson.d.ts +35 -0
- package/dist/suspicious-lesson.d.ts.map +1 -0
- package/dist/suspicious-lesson.js +99 -0
- package/dist/suspicious-lesson.js.map +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -39,6 +39,9 @@ export { extractField, extractManualPattern } from './lesson-pattern.js';
|
|
|
39
39
|
export type { IngestionSanitizeOptions } from './sanitize.js';
|
|
40
40
|
export { BASE64_BLOB_RE, INSTRUCTIONAL_LEAKAGE_RE, maskSecrets, sanitize, sanitizeForIngestion, UNICODE_ESCAPE_RE, XML_TAG_LEAKAGE_RE, } from './sanitize.js';
|
|
41
41
|
export { wrapXml } from './xml-format.js';
|
|
42
|
+
export type { ExtractedLesson } from './suspicious-lesson.js';
|
|
43
|
+
export { collectCodeRanges, DEFENSIVE_KEYWORD_RE, DEFENSIVE_PROXIMITY_WINDOW, flagSuspiciousLessons, isInstructionalContext, MAX_SUSPICIOUS_HEADING_LENGTH, } from './suspicious-lesson.js';
|
|
44
|
+
export { cosineSimilarity, deduplicateLessons } from './semantic-dedup.js';
|
|
42
45
|
export type { CursorInstruction } from './cursor-adapter.js';
|
|
43
46
|
export { scanCursorInstructions } from './cursor-adapter.js';
|
|
44
47
|
export type { RuleMetric, RuleMetricsFile } from './rule-metrics.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -28,6 +28,9 @@ export { validateLessons } from './lesson-linter.js';
|
|
|
28
28
|
export { extractField, extractManualPattern } from './lesson-pattern.js';
|
|
29
29
|
export { BASE64_BLOB_RE, INSTRUCTIONAL_LEAKAGE_RE, maskSecrets, sanitize, sanitizeForIngestion, UNICODE_ESCAPE_RE, XML_TAG_LEAKAGE_RE, } from './sanitize.js';
|
|
30
30
|
export { wrapXml } from './xml-format.js';
|
|
31
|
+
export { collectCodeRanges, DEFENSIVE_KEYWORD_RE, DEFENSIVE_PROXIMITY_WINDOW, flagSuspiciousLessons, isInstructionalContext, MAX_SUSPICIOUS_HEADING_LENGTH, } from './suspicious-lesson.js';
|
|
32
|
+
// Semantic deduplication
|
|
33
|
+
export { cosineSimilarity, deduplicateLessons } from './semantic-dedup.js';
|
|
31
34
|
export { scanCursorInstructions } from './cursor-adapter.js';
|
|
32
35
|
export { loadRuleMetrics, recordSuppression, recordTrigger, saveRuleMetrics, } from './rule-metrics.js';
|
|
33
36
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-tester.d.ts","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rule-tester.d.ts","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,eAAe,CAAC;AAKhE,MAAM,WAAW,eAAe;IAC9B,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,sCAAsC;IACtC,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,iEAAiE;IACjE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AASD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAoBzF;AAaD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,GAAG,cAAc,CA0DrF;AAID,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE,CAchE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,CAmCjF"}
|
package/dist/rule-tester.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
+
import { matchAstGrepPattern } from './ast-grep-query.js';
|
|
3
4
|
import { applyRulesToAdditions, loadCompiledRules } from './compiler.js';
|
|
4
5
|
// ─── Fixture parsing ─────────────────────────────────
|
|
5
6
|
const FRONTMATTER_RE = /^---\s*\n([\s\S]*?)\n---/;
|
|
@@ -41,20 +42,46 @@ export function testRule(rule, fixture) {
|
|
|
41
42
|
falsePositives: [],
|
|
42
43
|
passed: true,
|
|
43
44
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
const isAstGrep = rule.engine === 'ast-grep' && rule.astGrepPattern;
|
|
46
|
+
if (isAstGrep) {
|
|
47
|
+
const ext = path.extname(fixture.filePath) || '.ts';
|
|
48
|
+
const pattern = rule.astGrepPattern;
|
|
49
|
+
// Test fail block — parse all fail lines as one snippet; expect at least one match
|
|
50
|
+
if (fixture.failLines.length > 0) {
|
|
51
|
+
const content = fixture.failLines.join('\n');
|
|
52
|
+
const allLineNums = fixture.failLines.map((_, i) => i + 1);
|
|
53
|
+
const onWarn = (msg) => result.missedFails.push(`[ast-grep warning] ${msg}`);
|
|
54
|
+
const matches = matchAstGrepPattern(content, ext, pattern, allLineNums, onWarn);
|
|
55
|
+
if (matches.length === 0) {
|
|
56
|
+
result.missedFails.push(fixture.failLines.join('\n'));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// Test pass block — parse all pass lines as one snippet; expect zero matches
|
|
60
|
+
if (fixture.passLines.length > 0) {
|
|
61
|
+
const content = fixture.passLines.join('\n');
|
|
62
|
+
const allLineNums = fixture.passLines.map((_, i) => i + 1);
|
|
63
|
+
const onWarn = (msg) => result.falsePositives.push(`[ast-grep warning] ${msg}`);
|
|
64
|
+
const matches = matchAstGrepPattern(content, ext, pattern, allLineNums, onWarn);
|
|
65
|
+
if (matches.length > 0) {
|
|
66
|
+
result.falsePositives.push(fixture.passLines.join('\n'));
|
|
67
|
+
}
|
|
50
68
|
}
|
|
51
69
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
70
|
+
else {
|
|
71
|
+
// Regex-engine rules — test line by line
|
|
72
|
+
for (const line of fixture.failLines) {
|
|
73
|
+
const additions = linesToAdditions([line], fixture.filePath);
|
|
74
|
+
const violations = applyRulesToAdditions([rule], additions);
|
|
75
|
+
if (violations.length === 0) {
|
|
76
|
+
result.missedFails.push(line);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
for (const line of fixture.passLines) {
|
|
80
|
+
const additions = linesToAdditions([line], fixture.filePath);
|
|
81
|
+
const violations = applyRulesToAdditions([rule], additions);
|
|
82
|
+
if (violations.length > 0) {
|
|
83
|
+
result.falsePositives.push(line);
|
|
84
|
+
}
|
|
58
85
|
}
|
|
59
86
|
}
|
|
60
87
|
result.passed = result.missedFails.length === 0 && result.falsePositives.length === 0;
|
package/dist/rule-tester.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-tester.js","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAoCzE,wDAAwD;AAExD,MAAM,cAAc,GAAG,0BAA0B,CAAC;AAClD,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAC9E,MAAM,eAAe,GAAG,qDAAqD,CAAC;AAE9E,6GAA6G;AAC7G,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,WAAmB;IAC/D,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;IACjE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;IAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe;IAE5D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,sCAAsC;IAE5G,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;IAChE,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;IAEhE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEhG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;AACnE,CAAC;AAED,wDAAwD;AAExD,SAAS,gBAAgB,CAAC,KAAe,EAAE,QAAgB;IACzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,UAAU,EAAE,CAAC,GAAG,CAAC;QACjB,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI;KAC5C,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAkB,EAAE,OAAwB;IACnE,MAAM,MAAM,GAAmB;QAC7B,QAAQ,EAAE,IAAI,CAAC,UAAU;QACzB,WAAW,EAAE,IAAI,CAAC,aAAa;QAC/B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,WAAW,EAAE,EAAE;QACf,cAAc,EAAE,EAAE;QAClB,MAAM,EAAE,IAAI;KACb,CAAC;IAEF
|
|
1
|
+
{"version":3,"file":"rule-tester.js","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Embedder } from './embedders/embedder.js';
|
|
2
|
+
import type { LanceStore } from './store/lance-store.js';
|
|
3
|
+
import type { ExtractedLesson } from './suspicious-lesson.js';
|
|
4
|
+
/** Cosine similarity between two vectors of equal length. */
|
|
5
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
6
|
+
/**
|
|
7
|
+
* Remove semantically duplicate lessons by checking against both the LanceDB
|
|
8
|
+
* index and already-accepted candidates in the current batch.
|
|
9
|
+
*
|
|
10
|
+
* Uses embedding cosine similarity with a configurable threshold (default 0.92).
|
|
11
|
+
* Returns only the lessons that are sufficiently novel.
|
|
12
|
+
*/
|
|
13
|
+
export declare function deduplicateLessons(candidates: ExtractedLesson[], store: LanceStore, embedder: Embedder, threshold?: number): Promise<{
|
|
14
|
+
kept: ExtractedLesson[];
|
|
15
|
+
dropped: ExtractedLesson[];
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=semantic-dedup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-dedup.d.ts","sourceRoot":"","sources":["../src/semantic-dedup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAExD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAI9D,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAkBjE;AAID;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,eAAe,EAAE,EAC7B,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,QAAQ,EAClB,SAAS,GAAE,MAAa,GACvB,OAAO,CAAC;IAAE,IAAI,EAAE,eAAe,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC,CAgDlE"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { TotemError } from './errors.js';
|
|
2
|
+
// ─── Cosine similarity ─────────────────────────────────
|
|
3
|
+
/** Cosine similarity between two vectors of equal length. */
|
|
4
|
+
export function cosineSimilarity(a, b) {
|
|
5
|
+
if (a.length !== b.length) {
|
|
6
|
+
throw new TotemError('PARSE_FAILED', 'Cannot compute cosine similarity for vectors of different lengths.', 'This is an internal error. The embedding dimensions may have changed between runs.');
|
|
7
|
+
}
|
|
8
|
+
let dot = 0;
|
|
9
|
+
let magA = 0;
|
|
10
|
+
let magB = 0;
|
|
11
|
+
for (let i = 0; i < a.length; i++) {
|
|
12
|
+
dot += a[i] * b[i];
|
|
13
|
+
magA += a[i] * a[i];
|
|
14
|
+
magB += b[i] * b[i];
|
|
15
|
+
}
|
|
16
|
+
const denom = Math.sqrt(magA) * Math.sqrt(magB);
|
|
17
|
+
return denom === 0 ? 0 : dot / denom;
|
|
18
|
+
}
|
|
19
|
+
// ─── Semantic deduplication ─────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Remove semantically duplicate lessons by checking against both the LanceDB
|
|
22
|
+
* index and already-accepted candidates in the current batch.
|
|
23
|
+
*
|
|
24
|
+
* Uses embedding cosine similarity with a configurable threshold (default 0.92).
|
|
25
|
+
* Returns only the lessons that are sufficiently novel.
|
|
26
|
+
*/
|
|
27
|
+
export async function deduplicateLessons(candidates, store, embedder, threshold = 0.92) {
|
|
28
|
+
if (candidates.length === 0)
|
|
29
|
+
return { kept: [], dropped: [] };
|
|
30
|
+
const kept = [];
|
|
31
|
+
const dropped = [];
|
|
32
|
+
const batchVectors = [];
|
|
33
|
+
for (const candidate of candidates) {
|
|
34
|
+
// Check against existing LanceDB lessons
|
|
35
|
+
let isDbDuplicate = false;
|
|
36
|
+
try {
|
|
37
|
+
const results = await store.search({
|
|
38
|
+
query: candidate.text,
|
|
39
|
+
typeFilter: 'spec',
|
|
40
|
+
maxResults: 1,
|
|
41
|
+
});
|
|
42
|
+
if (results.length > 0 && results[0].score >= threshold) {
|
|
43
|
+
isDbDuplicate = true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Empty DB or no table — no existing lessons to dedup against
|
|
48
|
+
}
|
|
49
|
+
if (isDbDuplicate) {
|
|
50
|
+
dropped.push(candidate);
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
// Check against already-accepted candidates in this batch
|
|
54
|
+
const [candidateVector] = await embedder.embed([candidate.text]);
|
|
55
|
+
let isIntraBatchDuplicate = false;
|
|
56
|
+
for (const batchVec of batchVectors) {
|
|
57
|
+
if (cosineSimilarity(candidateVector, batchVec) >= threshold) {
|
|
58
|
+
isIntraBatchDuplicate = true;
|
|
59
|
+
break;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (isIntraBatchDuplicate) {
|
|
63
|
+
dropped.push(candidate);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
kept.push(candidate);
|
|
67
|
+
batchVectors.push(candidateVector);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { kept, dropped };
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=semantic-dedup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semantic-dedup.js","sourceRoot":"","sources":["../src/semantic-dedup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import type { Embedder } from '../embedders/embedder.js';
|
|
3
|
+
import type { HealthCheckResult, SearchOptions, SearchResult } from '../types.js';
|
|
4
|
+
/**
|
|
5
|
+
* Run a health check against the index, verifying dimensions, search, and FTS.
|
|
6
|
+
*
|
|
7
|
+
* @param table - The LanceDB table (may be null if not yet created)
|
|
8
|
+
* @param embedder - The active embedder (used for dimension comparison)
|
|
9
|
+
* @param searchFn - A function that performs a search (used for the canary probe)
|
|
10
|
+
* @param detectFtsIndexFn - A function that detects FTS index availability
|
|
11
|
+
* @param getFtsStatus - A function that returns the current FTS availability flag
|
|
12
|
+
*/
|
|
13
|
+
export declare function runHealthCheck(table: lancedb.Table | null, embedder: Embedder, searchFn: (options: SearchOptions) => Promise<SearchResult[]>, detectFtsIndexFn: () => Promise<void>, getFtsStatus: () => boolean): Promise<HealthCheckResult>;
|
|
14
|
+
//# sourceMappingURL=lance-health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-health.d.ts","sourceRoot":"","sources":["../../src/store/lance-health.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAElF;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,IAAI,EAC3B,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,EAC7D,gBAAgB,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EACrC,YAAY,EAAE,MAAM,OAAO,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CA2F5B"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run a health check against the index, verifying dimensions, search, and FTS.
|
|
3
|
+
*
|
|
4
|
+
* @param table - The LanceDB table (may be null if not yet created)
|
|
5
|
+
* @param embedder - The active embedder (used for dimension comparison)
|
|
6
|
+
* @param searchFn - A function that performs a search (used for the canary probe)
|
|
7
|
+
* @param detectFtsIndexFn - A function that detects FTS index availability
|
|
8
|
+
* @param getFtsStatus - A function that returns the current FTS availability flag
|
|
9
|
+
*/
|
|
10
|
+
export async function runHealthCheck(table, embedder, searchFn, detectFtsIndexFn, getFtsStatus) {
|
|
11
|
+
const start = Date.now();
|
|
12
|
+
const issues = [];
|
|
13
|
+
let totalChunks = 0;
|
|
14
|
+
let storedDimensions = null;
|
|
15
|
+
let dimensionMatch = false;
|
|
16
|
+
let canarySearchOk = false;
|
|
17
|
+
let ftsAvailable = false;
|
|
18
|
+
const expectedDimensions = embedder.dimensions;
|
|
19
|
+
// 1. Count rows and check dimensions
|
|
20
|
+
try {
|
|
21
|
+
if (table) {
|
|
22
|
+
totalChunks = await table.countRows();
|
|
23
|
+
if (totalChunks > 0) {
|
|
24
|
+
// Read one row to get stored vector dimensions
|
|
25
|
+
const rows = await table.query().select(['vector']).limit(1).toArray();
|
|
26
|
+
if (rows.length > 0) {
|
|
27
|
+
const raw = rows[0]['vector'];
|
|
28
|
+
// LanceDB may return Arrow FixedSizeList — coerce to plain array
|
|
29
|
+
const vec = Array.isArray(raw)
|
|
30
|
+
? raw
|
|
31
|
+
: raw && typeof raw.toArray === 'function'
|
|
32
|
+
? raw.toArray()
|
|
33
|
+
: raw && typeof raw.length === 'number'
|
|
34
|
+
? Array.from(raw)
|
|
35
|
+
: null;
|
|
36
|
+
if (vec) {
|
|
37
|
+
storedDimensions = vec.length;
|
|
38
|
+
dimensionMatch = storedDimensions === expectedDimensions;
|
|
39
|
+
if (!dimensionMatch) {
|
|
40
|
+
issues.push(`Dimension mismatch: embedder expects ${expectedDimensions} but stored vectors have ${storedDimensions}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
issues.push('Could not read vector column from stored row');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
// Empty table — dimensions can't be verified but that's OK
|
|
50
|
+
dimensionMatch = true;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// No table — treat as empty, still healthy
|
|
55
|
+
dimensionMatch = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
60
|
+
issues.push(`Dimension check failed: ${msg}`);
|
|
61
|
+
}
|
|
62
|
+
// 2. Canary search — embed a probe string and run a search
|
|
63
|
+
try {
|
|
64
|
+
if (table && totalChunks > 0) {
|
|
65
|
+
await searchFn({ query: 'totem health check canary', maxResults: 1, hybrid: false });
|
|
66
|
+
canarySearchOk = true;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// No data to search — canary is trivially OK
|
|
70
|
+
canarySearchOk = true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch (err) {
|
|
74
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
75
|
+
issues.push(`Canary search failed: ${msg}`);
|
|
76
|
+
}
|
|
77
|
+
// 3. FTS availability
|
|
78
|
+
try {
|
|
79
|
+
await detectFtsIndexFn();
|
|
80
|
+
ftsAvailable = getFtsStatus();
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
84
|
+
issues.push(`FTS detection failed: ${msg}`);
|
|
85
|
+
}
|
|
86
|
+
const durationMs = Date.now() - start;
|
|
87
|
+
const healthy = issues.length === 0;
|
|
88
|
+
return {
|
|
89
|
+
healthy,
|
|
90
|
+
durationMs,
|
|
91
|
+
totalChunks,
|
|
92
|
+
expectedDimensions,
|
|
93
|
+
storedDimensions,
|
|
94
|
+
dimensionMatch,
|
|
95
|
+
canarySearchOk,
|
|
96
|
+
ftsAvailable,
|
|
97
|
+
issues,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=lance-health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-health.js","sourceRoot":"","sources":["../../src/store/lance-health.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import type { ContentType } from '../config-schema.js';
|
|
3
|
+
import type { Embedder } from '../embedders/embedder.js';
|
|
4
|
+
import type { SearchResult } from '../types.js';
|
|
5
|
+
/** Pure vector search (original behavior). */
|
|
6
|
+
export declare function runVectorSearch(table: lancedb.Table, embedder: Embedder, query: string, typeFilter: ContentType | undefined, maxResults: number, boundary?: string | string[]): Promise<SearchResult[]>;
|
|
7
|
+
/**
|
|
8
|
+
* Hybrid search: runs vector + FTS in parallel, merges with RRF.
|
|
9
|
+
* Each leg fetches `maxResults * HYBRID_OVERFETCH_FACTOR` candidates
|
|
10
|
+
* to give RRF enough diversity to produce `maxResults` fused results.
|
|
11
|
+
*/
|
|
12
|
+
export declare function runHybridSearch(table: lancedb.Table, embedder: Embedder, onWarn: (msg: string) => void, query: string, typeFilter: ContentType | undefined, maxResults: number, boundary?: string | string[]): Promise<SearchResult[]>;
|
|
13
|
+
//# sourceMappingURL=lance-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-search.d.ts","sourceRoot":"","sources":["../../src/store/lance-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkBhD,8CAA8C;AAC9C,wBAAsB,eAAe,CACnC,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CAUzB;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,EAC7B,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAC3B,OAAO,CAAC,YAAY,EAAE,CAAC,CAczB"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/** RRF constant — standard value from the original RRF paper. */
|
|
2
|
+
const RRF_K = 60;
|
|
3
|
+
/**
|
|
4
|
+
* Number of extra candidates to fetch per search leg during hybrid search.
|
|
5
|
+
* We fetch more than `maxResults` per leg so that after RRF fusion we
|
|
6
|
+
* still have enough results even when the two legs return different sets.
|
|
7
|
+
*/
|
|
8
|
+
const HYBRID_OVERFETCH_FACTOR = 3;
|
|
9
|
+
/** Pure vector search (original behavior). */
|
|
10
|
+
export async function runVectorSearch(table, embedder, query, typeFilter, maxResults, boundary) {
|
|
11
|
+
const [queryVector] = await embedder.embed([query]);
|
|
12
|
+
let q = table.vectorSearch(queryVector).limit(maxResults);
|
|
13
|
+
const whereClause = buildWhereClause(typeFilter, boundary);
|
|
14
|
+
if (whereClause)
|
|
15
|
+
q = q.where(whereClause);
|
|
16
|
+
const results = await q.toArray();
|
|
17
|
+
return results.map(rowToSearchResult);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Hybrid search: runs vector + FTS in parallel, merges with RRF.
|
|
21
|
+
* Each leg fetches `maxResults * HYBRID_OVERFETCH_FACTOR` candidates
|
|
22
|
+
* to give RRF enough diversity to produce `maxResults` fused results.
|
|
23
|
+
*/
|
|
24
|
+
export async function runHybridSearch(table, embedder, onWarn, query, typeFilter, maxResults, boundary) {
|
|
25
|
+
const fetchCount = maxResults * HYBRID_OVERFETCH_FACTOR;
|
|
26
|
+
const whereClause = buildWhereClause(typeFilter, boundary);
|
|
27
|
+
const [queryVector] = await embedder.embed([query]);
|
|
28
|
+
// Run both legs in parallel
|
|
29
|
+
const [vectorResults, ftsResults] = await Promise.all([
|
|
30
|
+
runVectorLeg(table, queryVector, whereClause, fetchCount),
|
|
31
|
+
runFtsLeg(table, onWarn, query, whereClause, fetchCount),
|
|
32
|
+
]);
|
|
33
|
+
// Merge with RRF
|
|
34
|
+
return rrfMerge(vectorResults, ftsResults, maxResults);
|
|
35
|
+
}
|
|
36
|
+
async function runVectorLeg(table, queryVector, whereClause, limit) {
|
|
37
|
+
let q = table.vectorSearch(queryVector).limit(limit).withRowId();
|
|
38
|
+
if (whereClause)
|
|
39
|
+
q = q.where(whereClause);
|
|
40
|
+
const rows = await q.toArray();
|
|
41
|
+
return rows.map((row, rank) => ({
|
|
42
|
+
row,
|
|
43
|
+
rank: rank + 1,
|
|
44
|
+
id: String(row['_rowid'] ?? row['id']),
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
async function runFtsLeg(table, onWarn, query, whereClause, limit) {
|
|
48
|
+
try {
|
|
49
|
+
let q = table.search(query, 'fts', 'content').withRowId();
|
|
50
|
+
if (whereClause)
|
|
51
|
+
q = q.where(whereClause);
|
|
52
|
+
q = q.limit(limit);
|
|
53
|
+
const rows = await q.toArray();
|
|
54
|
+
return rows.map((row, rank) => ({
|
|
55
|
+
row,
|
|
56
|
+
rank: rank + 1,
|
|
57
|
+
id: String(row['_rowid'] ?? row['id']),
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// FTS leg failed — degrade gracefully
|
|
62
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
63
|
+
onWarn(`FTS search failed, falling back to vector-only: ${msg}`);
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// ─── Internal helpers ──────────────────────────────────
|
|
68
|
+
/** Escape a single boundary prefix for use in a SQL LIKE clause. */
|
|
69
|
+
function escapeBoundaryPrefix(raw) {
|
|
70
|
+
// Normalize Windows backslashes to forward slashes
|
|
71
|
+
const normalized = raw.replace(/\\/g, '/');
|
|
72
|
+
// Escape SQL LIKE wildcards (%, _), backticks, and single quotes
|
|
73
|
+
return normalized
|
|
74
|
+
.replace(/`/g, '\\`')
|
|
75
|
+
.replace(/%/g, '\\%')
|
|
76
|
+
.replace(/_/g, '\\_')
|
|
77
|
+
.replace(/'/g, "''");
|
|
78
|
+
}
|
|
79
|
+
/** Build a SQL WHERE clause from optional type and boundary filters. */
|
|
80
|
+
function buildWhereClause(typeFilter, boundary) {
|
|
81
|
+
const conditions = [];
|
|
82
|
+
if (typeFilter) {
|
|
83
|
+
const safeType = typeFilter.replace(/`/g, '\\`').replace(/'/g, "''");
|
|
84
|
+
conditions.push(`\`type\` = '${safeType}'`);
|
|
85
|
+
}
|
|
86
|
+
// Normalize boundary to array
|
|
87
|
+
const prefixes = boundary
|
|
88
|
+
? (Array.isArray(boundary) ? boundary : [boundary]).filter((b) => b.length > 0)
|
|
89
|
+
: [];
|
|
90
|
+
if (prefixes.length > 0) {
|
|
91
|
+
const orClauses = prefixes
|
|
92
|
+
.map((p) => `\`filePath\` LIKE '${escapeBoundaryPrefix(p)}%'`)
|
|
93
|
+
.join(' OR ');
|
|
94
|
+
conditions.push(prefixes.length > 1 ? `(${orClauses})` : orClauses);
|
|
95
|
+
}
|
|
96
|
+
return conditions.length > 0 ? conditions.join(' AND ') : undefined;
|
|
97
|
+
}
|
|
98
|
+
/** Convert a raw LanceDB row to a SearchResult. */
|
|
99
|
+
function rowToSearchResult(row) {
|
|
100
|
+
return {
|
|
101
|
+
content: row['content'],
|
|
102
|
+
contextPrefix: row['contextPrefix'],
|
|
103
|
+
filePath: row['filePath'],
|
|
104
|
+
type: row['type'],
|
|
105
|
+
label: row['label'],
|
|
106
|
+
score: row['_distance'] != null ? 1 / (1 + row['_distance']) : 0,
|
|
107
|
+
metadata: JSON.parse(row['metadata'] || '{}'),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Reciprocal Rank Fusion — merges two ranked result lists.
|
|
112
|
+
* score(d) = Σ 1 / (k + rank_in_list) for each list containing d.
|
|
113
|
+
*/
|
|
114
|
+
function rrfMerge(listA, listB, limit) {
|
|
115
|
+
const scores = new Map();
|
|
116
|
+
for (const list of [listA, listB]) {
|
|
117
|
+
for (const { row, rank, id } of list) {
|
|
118
|
+
const entry = scores.get(id) ?? { score: 0, row };
|
|
119
|
+
entry.score += 1 / (RRF_K + rank);
|
|
120
|
+
scores.set(id, entry);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return [...scores.values()]
|
|
124
|
+
.sort((a, b) => b.score - a.score)
|
|
125
|
+
.slice(0, limit)
|
|
126
|
+
.map(({ score, row }) => ({ ...rowToSearchResult(row), score }));
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=lance-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lance-search.js","sourceRoot":"","sources":["../../src/store/lance-search.ts"],"names":[],"mappings":"AAMA,iEAAiE;AACjE,MAAM,KAAK,GAAG,EAAE,CAAC;AAEjB;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAQlC,8CAA8C;AAC9C,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAoB,EACpB,QAAkB,EAClB,KAAa,EACb,UAAmC,EACnC,UAAkB,EAClB,QAA4B;IAE5B,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,WAAY,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,WAAW;QAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAClC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAoB,EACpB,QAAkB,EAClB,MAA6B,EAC7B,KAAa,EACb,UAAmC,EACnC,UAAkB,EAClB,QAA4B;IAE5B,MAAM,UAAU,GAAG,UAAU,GAAG,uBAAuB,CAAC;IACxD,MAAM,WAAW,GAAG,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAE3D,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAEpD,4BAA4B;IAC5B,MAAM,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACpD,YAAY,CAAC,KAAK,EAAE,WAAY,EAAE,WAAW,EAAE,UAAU,CAAC;QAC1D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,CAAC;KACzD,CAAC,CAAC;IAEH,iBAAiB;IACjB,OAAO,QAAQ,CAAC,aAAa,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AACzD,CAAC;AAED,KAAK,UAAU,YAAY,CACzB,KAAoB,EACpB,WAAqB,EACrB,WAA+B,EAC/B,KAAa;IAEb,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC;IACjE,IAAI,WAAW;QAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,GAAG;QACH,IAAI,EAAE,IAAI,GAAG,CAAC;QACd,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;KACvC,CAAC,CAAC,CAAC;AACN,CAAC;AAED,KAAK,UAAU,SAAS,CACtB,KAAoB,EACpB,MAA6B,EAC7B,KAAa,EACb,WAA+B,EAC/B,KAAa;IAEb,IAAI,CAAC;QACH,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC;QAE1D,IAAI,WAAW;YAAE,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC1C,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAEnB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9B,GAAG;YACH,IAAI,EAAE,IAAI,GAAG,CAAC;YACd,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;SACvC,CAAC,CAAC,CAAC;IACN,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sCAAsC;QACtC,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,CAAC,mDAAmD,GAAG,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,0DAA0D;AAE1D,oEAAoE;AACpE,SAAS,oBAAoB,CAAC,GAAW;IACvC,mDAAmD;IACnD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,iEAAiE;IACjE,OAAO,UAAU;SACd,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACzB,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CACvB,UAAwB,EACxB,QAA4B;IAE5B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACrE,UAAU,CAAC,IAAI,CAAC,eAAe,QAAQ,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QAC/E,CAAC,CAAC,EAAE,CAAC;IACP,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,QAAQ;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC;aAC7D,IAAI,CAAC,MAAM,CAAC,CAAC;QAChB,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;IACD,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtE,CAAC;AAED,mDAAmD;AACnD,SAAS,iBAAiB,CAAC,GAA4B;IACrD,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,SAAS,CAAW;QACjC,aAAa,EAAE,GAAG,CAAC,eAAe,CAAW;QAC7C,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAW;QACnC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAgB;QAChC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAW;QAC7B,KAAK,EAAE,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAI,GAAG,CAAC,WAAW,CAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAE,GAAG,CAAC,UAAU,CAAY,IAAI,IAAI,CAA2B;KACpF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,KAAkB,EAAE,KAAkB,EAAE,KAAa;IACrE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2D,CAAC;IAElF,KAAK,MAAM,IAAI,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAClC,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;YAClD,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;SACjC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;SACf,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACrE,CAAC"}
|
|
@@ -38,16 +38,6 @@ export declare class LanceStore {
|
|
|
38
38
|
* Falls back to vector-only if no FTS index exists.
|
|
39
39
|
*/
|
|
40
40
|
search(options: SearchOptions): Promise<SearchResult[]>;
|
|
41
|
-
/** Pure vector search (original behavior). */
|
|
42
|
-
private vectorSearch;
|
|
43
|
-
/**
|
|
44
|
-
* Hybrid search: runs vector + FTS in parallel, merges with RRF.
|
|
45
|
-
* Each leg fetches `maxResults * HYBRID_OVERFETCH_FACTOR` candidates
|
|
46
|
-
* to give RRF enough diversity to produce `maxResults` fused results.
|
|
47
|
-
*/
|
|
48
|
-
private hybridSearch;
|
|
49
|
-
private runVectorLeg;
|
|
50
|
-
private runFtsLeg;
|
|
51
41
|
/** Delete all chunks from a specific file (for incremental re-index). */
|
|
52
42
|
deleteByFile(filePath: string): Promise<void>;
|
|
53
43
|
/** Drop the entire table. Used for full re-index. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lance-store.d.ts","sourceRoot":"","sources":["../../src/store/lance-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EACV,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EAEb,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"lance-store.d.ts","sourceRoot":"","sources":["../../src/store/lance-store.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EACV,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EAEb,MAAM,aAAa,CAAC;AAKrB,qBAAa,UAAU;IACrB,OAAO,CAAC,EAAE,CAAmC;IAC7C,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,MAAM,CAAwB;gBAE1B,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI;IAM9E;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B9B,8EAA8E;YAChE,oBAAoB;IAalC,gEAAgE;IAChE,OAAO,CAAC,eAAe;IAcvB,6DAA6D;YAC/C,YAAY;IAiB1B,uDAAuD;IACjD,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B5C;;;;;OAKG;IACG,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBrC,sDAAsD;YACxC,cAAc;IAiB5B,4DAA4D;IAC5D,IAAI,aAAa,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACG,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA6B7D,yEAAyE;IACnE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,qDAAqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,kFAAkF;IAC5E,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAOhC,+DAA+D;IACzD,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;IAKjC,4CAA4C;IACtC,KAAK,IAAI,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAe/E,mFAAmF;IAC7E,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAShD"}
|
|
@@ -1,15 +1,9 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
2
|
import * as fs from 'node:fs';
|
|
3
3
|
import * as lancedb from '@lancedb/lancedb';
|
|
4
|
+
import { runHealthCheck } from './lance-health.js';
|
|
4
5
|
import { TOTEM_TABLE_NAME } from './lance-schema.js';
|
|
5
|
-
|
|
6
|
-
const RRF_K = 60;
|
|
7
|
-
/**
|
|
8
|
-
* Number of extra candidates to fetch per search leg during hybrid search.
|
|
9
|
-
* We fetch more than `maxResults` per leg so that after RRF fusion we
|
|
10
|
-
* still have enough results even when the two legs return different sets.
|
|
11
|
-
*/
|
|
12
|
-
const HYBRID_OVERFETCH_FACTOR = 3;
|
|
6
|
+
import { runHybridSearch, runVectorSearch } from './lance-search.js';
|
|
13
7
|
export class LanceStore {
|
|
14
8
|
db = null;
|
|
15
9
|
table = null;
|
|
@@ -178,67 +172,9 @@ export class LanceStore {
|
|
|
178
172
|
const boundary = options.boundary;
|
|
179
173
|
const useHybrid = (options.hybrid ?? true) && this.hasFtsIndex;
|
|
180
174
|
if (useHybrid) {
|
|
181
|
-
return this.
|
|
182
|
-
}
|
|
183
|
-
return this.vectorSearch(options.query, options.typeFilter, maxResults, boundary);
|
|
184
|
-
}
|
|
185
|
-
/** Pure vector search (original behavior). */
|
|
186
|
-
async vectorSearch(query, typeFilter, maxResults, boundary) {
|
|
187
|
-
const [queryVector] = await this.embedder.embed([query]);
|
|
188
|
-
let q = this.table.vectorSearch(queryVector).limit(maxResults);
|
|
189
|
-
const whereClause = buildWhereClause(typeFilter, boundary);
|
|
190
|
-
if (whereClause)
|
|
191
|
-
q = q.where(whereClause);
|
|
192
|
-
const results = await q.toArray();
|
|
193
|
-
return results.map(rowToSearchResult);
|
|
194
|
-
}
|
|
195
|
-
/**
|
|
196
|
-
* Hybrid search: runs vector + FTS in parallel, merges with RRF.
|
|
197
|
-
* Each leg fetches `maxResults * HYBRID_OVERFETCH_FACTOR` candidates
|
|
198
|
-
* to give RRF enough diversity to produce `maxResults` fused results.
|
|
199
|
-
*/
|
|
200
|
-
async hybridSearch(query, typeFilter, maxResults, boundary) {
|
|
201
|
-
const fetchCount = maxResults * HYBRID_OVERFETCH_FACTOR;
|
|
202
|
-
const whereClause = buildWhereClause(typeFilter, boundary);
|
|
203
|
-
const [queryVector] = await this.embedder.embed([query]);
|
|
204
|
-
// Run both legs in parallel
|
|
205
|
-
const [vectorResults, ftsResults] = await Promise.all([
|
|
206
|
-
this.runVectorLeg(queryVector, whereClause, fetchCount),
|
|
207
|
-
this.runFtsLeg(query, whereClause, fetchCount),
|
|
208
|
-
]);
|
|
209
|
-
// Merge with RRF
|
|
210
|
-
return rrfMerge(vectorResults, ftsResults, maxResults);
|
|
211
|
-
}
|
|
212
|
-
async runVectorLeg(queryVector, whereClause, limit) {
|
|
213
|
-
let q = this.table.vectorSearch(queryVector).limit(limit).withRowId();
|
|
214
|
-
if (whereClause)
|
|
215
|
-
q = q.where(whereClause);
|
|
216
|
-
const rows = await q.toArray();
|
|
217
|
-
return rows.map((row, rank) => ({
|
|
218
|
-
row,
|
|
219
|
-
rank: rank + 1,
|
|
220
|
-
id: String(row['_rowid'] ?? row['id']),
|
|
221
|
-
}));
|
|
222
|
-
}
|
|
223
|
-
async runFtsLeg(query, whereClause, limit) {
|
|
224
|
-
try {
|
|
225
|
-
let q = this.table.search(query, 'fts', 'content').withRowId();
|
|
226
|
-
if (whereClause)
|
|
227
|
-
q = q.where(whereClause);
|
|
228
|
-
q = q.limit(limit);
|
|
229
|
-
const rows = await q.toArray();
|
|
230
|
-
return rows.map((row, rank) => ({
|
|
231
|
-
row,
|
|
232
|
-
rank: rank + 1,
|
|
233
|
-
id: String(row['_rowid'] ?? row['id']),
|
|
234
|
-
}));
|
|
235
|
-
}
|
|
236
|
-
catch (err) {
|
|
237
|
-
// FTS leg failed — degrade gracefully
|
|
238
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
239
|
-
this.onWarn(`FTS search failed, falling back to vector-only: ${msg}`);
|
|
240
|
-
return [];
|
|
175
|
+
return runHybridSearch(this.table, this.embedder, this.onWarn, options.query, options.typeFilter, maxResults, boundary);
|
|
241
176
|
}
|
|
177
|
+
return runVectorSearch(this.table, this.embedder, options.query, options.typeFilter, maxResults, boundary);
|
|
242
178
|
}
|
|
243
179
|
/** Delete all chunks from a specific file (for incremental re-index). */
|
|
244
180
|
async deleteByFile(filePath) {
|
|
@@ -286,154 +222,7 @@ export class LanceStore {
|
|
|
286
222
|
}
|
|
287
223
|
/** Run a health check against the index, verifying dimensions, search, and FTS. */
|
|
288
224
|
async healthCheck() {
|
|
289
|
-
|
|
290
|
-
const issues = [];
|
|
291
|
-
let totalChunks = 0;
|
|
292
|
-
let storedDimensions = null;
|
|
293
|
-
let dimensionMatch = false;
|
|
294
|
-
let canarySearchOk = false;
|
|
295
|
-
let ftsAvailable = false;
|
|
296
|
-
const expectedDimensions = this.embedder.dimensions;
|
|
297
|
-
// 1. Count rows and check dimensions
|
|
298
|
-
try {
|
|
299
|
-
if (this.table) {
|
|
300
|
-
totalChunks = await this.table.countRows();
|
|
301
|
-
if (totalChunks > 0) {
|
|
302
|
-
// Read one row to get stored vector dimensions
|
|
303
|
-
const rows = await this.table.query().select(['vector']).limit(1).toArray();
|
|
304
|
-
if (rows.length > 0) {
|
|
305
|
-
const raw = rows[0]['vector'];
|
|
306
|
-
// LanceDB may return Arrow FixedSizeList — coerce to plain array
|
|
307
|
-
const vec = Array.isArray(raw)
|
|
308
|
-
? raw
|
|
309
|
-
: raw && typeof raw.toArray === 'function'
|
|
310
|
-
? raw.toArray()
|
|
311
|
-
: raw && typeof raw.length === 'number'
|
|
312
|
-
? Array.from(raw)
|
|
313
|
-
: null;
|
|
314
|
-
if (vec) {
|
|
315
|
-
storedDimensions = vec.length;
|
|
316
|
-
dimensionMatch = storedDimensions === expectedDimensions;
|
|
317
|
-
if (!dimensionMatch) {
|
|
318
|
-
issues.push(`Dimension mismatch: embedder expects ${expectedDimensions} but stored vectors have ${storedDimensions}`);
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
else {
|
|
322
|
-
issues.push('Could not read vector column from stored row');
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
}
|
|
326
|
-
else {
|
|
327
|
-
// Empty table — dimensions can't be verified but that's OK
|
|
328
|
-
dimensionMatch = true;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
else {
|
|
332
|
-
// No table — treat as empty, still healthy
|
|
333
|
-
dimensionMatch = true;
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
catch (err) {
|
|
337
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
338
|
-
issues.push(`Dimension check failed: ${msg}`);
|
|
339
|
-
}
|
|
340
|
-
// 2. Canary search — embed a probe string and run a search
|
|
341
|
-
try {
|
|
342
|
-
if (this.table && totalChunks > 0) {
|
|
343
|
-
await this.search({ query: 'totem health check canary', maxResults: 1, hybrid: false });
|
|
344
|
-
canarySearchOk = true;
|
|
345
|
-
}
|
|
346
|
-
else {
|
|
347
|
-
// No data to search — canary is trivially OK
|
|
348
|
-
canarySearchOk = true;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
catch (err) {
|
|
352
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
353
|
-
issues.push(`Canary search failed: ${msg}`);
|
|
354
|
-
}
|
|
355
|
-
// 3. FTS availability
|
|
356
|
-
try {
|
|
357
|
-
await this.detectFtsIndex();
|
|
358
|
-
ftsAvailable = this.hasFtsIndex;
|
|
359
|
-
}
|
|
360
|
-
catch (err) {
|
|
361
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
362
|
-
issues.push(`FTS detection failed: ${msg}`);
|
|
363
|
-
}
|
|
364
|
-
const durationMs = Date.now() - start;
|
|
365
|
-
const healthy = issues.length === 0;
|
|
366
|
-
return {
|
|
367
|
-
healthy,
|
|
368
|
-
durationMs,
|
|
369
|
-
totalChunks,
|
|
370
|
-
expectedDimensions,
|
|
371
|
-
storedDimensions,
|
|
372
|
-
dimensionMatch,
|
|
373
|
-
canarySearchOk,
|
|
374
|
-
ftsAvailable,
|
|
375
|
-
issues,
|
|
376
|
-
};
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
/** Escape a single boundary prefix for use in a SQL LIKE clause. */
|
|
380
|
-
function escapeBoundaryPrefix(raw) {
|
|
381
|
-
// Normalize Windows backslashes to forward slashes
|
|
382
|
-
const normalized = raw.replace(/\\/g, '/');
|
|
383
|
-
// Escape SQL LIKE wildcards (%, _), backticks, and single quotes
|
|
384
|
-
return normalized
|
|
385
|
-
.replace(/`/g, '\\`')
|
|
386
|
-
.replace(/%/g, '\\%')
|
|
387
|
-
.replace(/_/g, '\\_')
|
|
388
|
-
.replace(/'/g, "''");
|
|
389
|
-
}
|
|
390
|
-
/** Build a SQL WHERE clause from optional type and boundary filters. */
|
|
391
|
-
function buildWhereClause(typeFilter, boundary) {
|
|
392
|
-
const conditions = [];
|
|
393
|
-
if (typeFilter) {
|
|
394
|
-
const safeType = typeFilter.replace(/`/g, '\\`').replace(/'/g, "''");
|
|
395
|
-
conditions.push(`\`type\` = '${safeType}'`);
|
|
396
|
-
}
|
|
397
|
-
// Normalize boundary to array
|
|
398
|
-
const prefixes = boundary
|
|
399
|
-
? (Array.isArray(boundary) ? boundary : [boundary]).filter((b) => b.length > 0)
|
|
400
|
-
: [];
|
|
401
|
-
if (prefixes.length > 0) {
|
|
402
|
-
const orClauses = prefixes
|
|
403
|
-
.map((p) => `\`filePath\` LIKE '${escapeBoundaryPrefix(p)}%'`)
|
|
404
|
-
.join(' OR ');
|
|
405
|
-
conditions.push(prefixes.length > 1 ? `(${orClauses})` : orClauses);
|
|
406
|
-
}
|
|
407
|
-
return conditions.length > 0 ? conditions.join(' AND ') : undefined;
|
|
408
|
-
}
|
|
409
|
-
/** Convert a raw LanceDB row to a SearchResult. */
|
|
410
|
-
function rowToSearchResult(row) {
|
|
411
|
-
return {
|
|
412
|
-
content: row['content'],
|
|
413
|
-
contextPrefix: row['contextPrefix'],
|
|
414
|
-
filePath: row['filePath'],
|
|
415
|
-
type: row['type'],
|
|
416
|
-
label: row['label'],
|
|
417
|
-
score: row['_distance'] != null ? 1 / (1 + row['_distance']) : 0,
|
|
418
|
-
metadata: JSON.parse(row['metadata'] || '{}'),
|
|
419
|
-
};
|
|
420
|
-
}
|
|
421
|
-
/**
|
|
422
|
-
* Reciprocal Rank Fusion — merges two ranked result lists.
|
|
423
|
-
* score(d) = Σ 1 / (k + rank_in_list) for each list containing d.
|
|
424
|
-
*/
|
|
425
|
-
function rrfMerge(listA, listB, limit) {
|
|
426
|
-
const scores = new Map();
|
|
427
|
-
for (const list of [listA, listB]) {
|
|
428
|
-
for (const { row, rank, id } of list) {
|
|
429
|
-
const entry = scores.get(id) ?? { score: 0, row };
|
|
430
|
-
entry.score += 1 / (RRF_K + rank);
|
|
431
|
-
scores.set(id, entry);
|
|
432
|
-
}
|
|
225
|
+
return runHealthCheck(this.table, this.embedder, (options) => this.search(options), () => this.detectFtsIndex(), () => this.hasFtsIndex);
|
|
433
226
|
}
|
|
434
|
-
return [...scores.values()]
|
|
435
|
-
.sort((a, b) => b.score - a.score)
|
|
436
|
-
.slice(0, limit)
|
|
437
|
-
.map(({ score, row }) => ({ ...rowToSearchResult(row), score }));
|
|
438
227
|
}
|
|
439
228
|
//# sourceMappingURL=lance-store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lance-store.js","sourceRoot":"","sources":["../../src/store/lance-store.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lance-store.js","sourceRoot":"","sources":["../../src/store/lance-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export interface ExtractedLesson {
|
|
2
|
+
heading?: string;
|
|
3
|
+
tags: string[];
|
|
4
|
+
text: string;
|
|
5
|
+
suspiciousFlags?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare const MAX_SUSPICIOUS_HEADING_LENGTH = 60;
|
|
8
|
+
/** Defensive keywords suggesting instructional/security discussion context. */
|
|
9
|
+
export declare const DEFENSIVE_KEYWORD_RE: RegExp;
|
|
10
|
+
/** Characters of context to check around a match for defensive keywords. */
|
|
11
|
+
export declare const DEFENSIVE_PROXIMITY_WINDOW = 100;
|
|
12
|
+
/**
|
|
13
|
+
* Collect all [start, end] ranges of code-fenced regions in the text.
|
|
14
|
+
* Uses inline regexes via matchAll to avoid module-level global state mutation.
|
|
15
|
+
*/
|
|
16
|
+
export declare function collectCodeRanges(text: string): Array<[number, number]>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if ALL matches of a pattern in text occur in instructional context
|
|
19
|
+
* (inside backticks/code blocks AND near defensive keywords).
|
|
20
|
+
* Both conditions must be met for EVERY match to suppress a flag.
|
|
21
|
+
* If any single match is outside instructional context, returns false (fail closed).
|
|
22
|
+
*/
|
|
23
|
+
export declare function isInstructionalContext(text: string, // totem-ignore
|
|
24
|
+
pattern: RegExp, codeRanges?: Array<[number, number]>): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Scans extracted lessons for heuristic indicators of prompt injection or
|
|
27
|
+
* LLM constraint violations. Returns a new array with `suspiciousFlags`
|
|
28
|
+
* populated on any lesson that triggers one or more checks.
|
|
29
|
+
*
|
|
30
|
+
* For XML tag and instructional leakage patterns, a context-aware heuristic
|
|
31
|
+
* suppresses false positives: if the match is inside backticks/code fences
|
|
32
|
+
* AND defensive keywords are nearby, it's treated as instructional discussion.
|
|
33
|
+
*/
|
|
34
|
+
export declare function flagSuspiciousLessons(lessons: ExtractedLesson[]): ExtractedLesson[];
|
|
35
|
+
//# sourceMappingURL=suspicious-lesson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suspicious-lesson.d.ts","sourceRoot":"","sources":["../src/suspicious-lesson.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAID,eAAO,MAAM,6BAA6B,KAAK,CAAC;AAEhD,+EAA+E;AAC/E,eAAO,MAAM,oBAAoB,QACiH,CAAC;AAEnJ,4EAA4E;AAC5E,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAI9C;;;GAGG;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAmBvE;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EAAE,eAAe;AAC7B,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACnC,OAAO,CA2BT;AAID;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAqCnF"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { BASE64_BLOB_RE, INSTRUCTIONAL_LEAKAGE_RE, UNICODE_ESCAPE_RE, XML_TAG_LEAKAGE_RE, } from './sanitize.js';
|
|
2
|
+
// ─── Constants ──────────────────────────────────────────
|
|
3
|
+
export const MAX_SUSPICIOUS_HEADING_LENGTH = 60;
|
|
4
|
+
/** Defensive keywords suggesting instructional/security discussion context. */
|
|
5
|
+
export const DEFENSIVE_KEYWORD_RE = /\b(?:detect|prevent|harden|defense|defensive|strip|flag|mitigat|sanitiz|block|neutraliz|scrub|filter|reject|validat|protect|guard|secur)\w*\b/i;
|
|
6
|
+
/** Characters of context to check around a match for defensive keywords. */
|
|
7
|
+
export const DEFENSIVE_PROXIMITY_WINDOW = 100;
|
|
8
|
+
// ─── Helpers ────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Collect all [start, end] ranges of code-fenced regions in the text.
|
|
11
|
+
* Uses inline regexes via matchAll to avoid module-level global state mutation.
|
|
12
|
+
*/
|
|
13
|
+
// totem-ignore-next-line
|
|
14
|
+
export function collectCodeRanges(text) {
|
|
15
|
+
const ranges = [];
|
|
16
|
+
// Fenced blocks first (higher priority — consume triple backticks before singles)
|
|
17
|
+
for (const match of text.matchAll(/```[\s\S]*?```/g)) {
|
|
18
|
+
ranges.push([match.index, match.index + match[0].length]);
|
|
19
|
+
}
|
|
20
|
+
for (const match of text.matchAll(/`[^`\n]+`/g)) {
|
|
21
|
+
const start = match.index;
|
|
22
|
+
const end = start + match[0].length;
|
|
23
|
+
// Skip if this range overlaps with a fenced block
|
|
24
|
+
const overlaps = ranges.some(([rs, re]) => start >= rs && end <= re);
|
|
25
|
+
if (!overlaps) {
|
|
26
|
+
ranges.push([start, end]);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return ranges;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Check if ALL matches of a pattern in text occur in instructional context
|
|
33
|
+
* (inside backticks/code blocks AND near defensive keywords).
|
|
34
|
+
* Both conditions must be met for EVERY match to suppress a flag.
|
|
35
|
+
* If any single match is outside instructional context, returns false (fail closed).
|
|
36
|
+
*/
|
|
37
|
+
export function isInstructionalContext(text, // totem-ignore
|
|
38
|
+
pattern, codeRanges) {
|
|
39
|
+
// Create global copy to iterate all matches — guard against duplicate 'g' flag
|
|
40
|
+
const flags = pattern.flags.includes('g') ? pattern.flags : pattern.flags + 'g';
|
|
41
|
+
const globalPattern = new RegExp(pattern.source, flags);
|
|
42
|
+
const ranges = codeRanges ?? collectCodeRanges(text);
|
|
43
|
+
let foundAny = false;
|
|
44
|
+
for (const match of text.matchAll(globalPattern)) {
|
|
45
|
+
foundAny = true;
|
|
46
|
+
const matchStart = match.index;
|
|
47
|
+
const matchEnd = matchStart + match[0].length;
|
|
48
|
+
// Condition 1: Match must fall within a code-fenced region
|
|
49
|
+
const inCode = ranges.some(([rs, re]) => matchStart >= rs && matchEnd <= re);
|
|
50
|
+
if (!inCode)
|
|
51
|
+
return false;
|
|
52
|
+
// Condition 2: Defensive keywords must be nearby (outside the match itself)
|
|
53
|
+
// Space delimiter prevents cross-boundary keyword synthesis
|
|
54
|
+
const windowStart = Math.max(0, matchStart - DEFENSIVE_PROXIMITY_WINDOW);
|
|
55
|
+
const windowEnd = Math.min(text.length, matchEnd + DEFENSIVE_PROXIMITY_WINDOW);
|
|
56
|
+
const surroundingText = text.slice(windowStart, matchStart) + ' ' + text.slice(matchEnd, windowEnd);
|
|
57
|
+
if (!DEFENSIVE_KEYWORD_RE.test(surroundingText))
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
return foundAny;
|
|
61
|
+
}
|
|
62
|
+
// ─── Main detection ─────────────────────────────────────
|
|
63
|
+
/**
|
|
64
|
+
* Scans extracted lessons for heuristic indicators of prompt injection or
|
|
65
|
+
* LLM constraint violations. Returns a new array with `suspiciousFlags`
|
|
66
|
+
* populated on any lesson that triggers one or more checks.
|
|
67
|
+
*
|
|
68
|
+
* For XML tag and instructional leakage patterns, a context-aware heuristic
|
|
69
|
+
* suppresses false positives: if the match is inside backticks/code fences
|
|
70
|
+
* AND defensive keywords are nearby, it's treated as instructional discussion.
|
|
71
|
+
*/
|
|
72
|
+
export function flagSuspiciousLessons(lessons) {
|
|
73
|
+
return lessons.map((lesson) => {
|
|
74
|
+
const flags = [];
|
|
75
|
+
const heading = lesson.heading ?? '';
|
|
76
|
+
const combined = `${heading} ${lesson.text}`;
|
|
77
|
+
if (heading.length > MAX_SUSPICIOUS_HEADING_LENGTH) {
|
|
78
|
+
flags.push('Heading exceeds 60 characters');
|
|
79
|
+
}
|
|
80
|
+
// Compute code ranges once per lesson for both context-aware checks
|
|
81
|
+
const codeRanges = collectCodeRanges(combined);
|
|
82
|
+
if (INSTRUCTIONAL_LEAKAGE_RE.test(combined) &&
|
|
83
|
+
!isInstructionalContext(combined, INSTRUCTIONAL_LEAKAGE_RE, codeRanges)) {
|
|
84
|
+
flags.push('Contains potential instructional leakage');
|
|
85
|
+
}
|
|
86
|
+
if (XML_TAG_LEAKAGE_RE.test(combined) &&
|
|
87
|
+
!isInstructionalContext(combined, XML_TAG_LEAKAGE_RE, codeRanges)) {
|
|
88
|
+
flags.push('Contains system XML tags');
|
|
89
|
+
}
|
|
90
|
+
if (BASE64_BLOB_RE.test(combined)) {
|
|
91
|
+
flags.push('Contains potential Base64 payload');
|
|
92
|
+
}
|
|
93
|
+
if (UNICODE_ESCAPE_RE.test(combined)) {
|
|
94
|
+
flags.push('Contains excessive unicode escapes');
|
|
95
|
+
}
|
|
96
|
+
return flags.length > 0 ? { ...lesson, suspiciousFlags: flags } : lesson;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=suspicious-lesson.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"suspicious-lesson.js","sourceRoot":"","sources":["../src/suspicious-lesson.ts"],"names":[],"mappings":"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"}
|