@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 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';
@@ -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":"AACA,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,eAAe,GAChB,MAAM,aAAa,CAAC;AAGrB,YAAY,EACV,aAAa,EACb,UAAU,EACV,WAAW,EACX,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAG5B,YAAY,EACV,KAAK,EACL,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,YAAY,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAGzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAGlD,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,qBAAqB,EACrB,KAAK,eAAe,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GACd,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,YAAY,EACZ,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClG,YAAY,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAGrD,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAGrE,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAGrF,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAG1E,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AACzE,YAAY,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,sBAAsB,EACtB,6BAA6B,GAC9B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG3E,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
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":"AAEA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,eAAe,GAChB,MAAM,aAAa,CAAC;AAarB,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAe5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAItD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,QAAQ;AACR,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,EACL,eAAe,EACf,UAAU,EACV,YAAY,EACZ,OAAO,EACP,eAAe,GAChB,MAAM,kBAAkB,CAAC;AAE1B,mBAAmB;AACnB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAIlD,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAE7B,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,cAAc,EACd,eAAe,EACf,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAYxB,OAAO,EACL,wBAAwB,EACxB,UAAU,EACV,qBAAqB,EACrB,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,qBAAqB,EAErB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EACL,YAAY,EACZ,YAAY,EAIZ,YAAY,EACZ,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAI1B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElG,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIrD,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAIrE,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAErF,WAAW;AACX,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,mBAAmB,EACnB,YAAY,EACZ,cAAc,GACf,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAI1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,WAAW,EACX,QAAQ,EACR,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAI7D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
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":"AAGA,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,CA8BrF;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"}
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"}
@@ -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
- // Test fail lines each should produce at least one violation
45
- for (const line of fixture.failLines) {
46
- const additions = linesToAdditions([line], fixture.filePath);
47
- const violations = applyRulesToAdditions([rule], additions);
48
- if (violations.length === 0) {
49
- result.missedFails.push(line);
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
- // Test pass lines — none should produce violations
53
- for (const line of fixture.passLines) {
54
- const additions = linesToAdditions([line], fixture.filePath);
55
- const violations = applyRulesToAdditions([rule], additions);
56
- if (violations.length > 0) {
57
- result.falsePositives.push(line);
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;
@@ -1 +1 @@
1
- {"version":3,"file":"rule-tester.js","sourceRoot":"","sources":["../src/rule-tester.ts"],"names":[],"mappings":"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"}
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":"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"}
@@ -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;AAarB,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;IAc7D,8CAA8C;YAChC,YAAY;IAiB1B;;;;OAIG;YACW,YAAY;YAqBZ,YAAY;YAgBZ,SAAS;IAyBvB,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;CA4FhD"}
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
- /** RRF constant standard value from the original RRF paper. */
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.hybridSearch(options.query, options.typeFilter, maxResults, boundary);
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
- const start = Date.now();
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/totem",
3
- "version": "1.3.15",
3
+ "version": "1.3.17",
4
4
  "description": "Persistent memory and context layer for AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",