mindlore 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/scripts/cc-memory-bulk-sync.js +1 -1
- package/dist/scripts/cc-memory-bulk-sync.js.map +1 -1
- package/dist/scripts/cc-session-sync.js +2 -2
- package/dist/scripts/cc-session-sync.js.map +1 -1
- package/dist/scripts/fetch-raw.js +17 -8
- package/dist/scripts/fetch-raw.js.map +1 -1
- package/dist/scripts/init.js +8 -8
- package/dist/scripts/init.js.map +1 -1
- package/dist/scripts/lib/chunker.d.ts.map +1 -1
- package/dist/scripts/lib/chunker.js +3 -0
- package/dist/scripts/lib/chunker.js.map +1 -1
- package/dist/scripts/lib/constants.d.ts +5 -0
- package/dist/scripts/lib/constants.d.ts.map +1 -1
- package/dist/scripts/lib/constants.js +35 -1
- package/dist/scripts/lib/constants.js.map +1 -1
- package/dist/scripts/lib/daemon.d.ts.map +1 -1
- package/dist/scripts/lib/daemon.js +3 -0
- package/dist/scripts/lib/daemon.js.map +1 -1
- package/dist/scripts/lib/fuzzy.d.ts.map +1 -1
- package/dist/scripts/lib/fuzzy.js +6 -4
- package/dist/scripts/lib/fuzzy.js.map +1 -1
- package/dist/scripts/lib/input-validation.d.ts +5 -0
- package/dist/scripts/lib/input-validation.d.ts.map +1 -0
- package/dist/scripts/lib/input-validation.js +48 -0
- package/dist/scripts/lib/input-validation.js.map +1 -0
- package/dist/scripts/lib/privacy-filter.d.ts.map +1 -1
- package/dist/scripts/lib/privacy-filter.js +3 -0
- package/dist/scripts/lib/privacy-filter.js.map +1 -1
- package/dist/scripts/lib/proximity.d.ts.map +1 -1
- package/dist/scripts/lib/proximity.js +6 -0
- package/dist/scripts/lib/proximity.js.map +1 -1
- package/dist/scripts/lib/rrf.d.ts +7 -2
- package/dist/scripts/lib/rrf.d.ts.map +1 -1
- package/dist/scripts/lib/rrf.js +20 -16
- package/dist/scripts/lib/rrf.js.map +1 -1
- package/dist/scripts/lib/search-cache.d.ts +15 -0
- package/dist/scripts/lib/search-cache.d.ts.map +1 -1
- package/dist/scripts/lib/search-cache.js +50 -2
- package/dist/scripts/lib/search-cache.js.map +1 -1
- package/dist/scripts/lib/search-engine.d.ts +1 -1
- package/dist/scripts/lib/search-engine.d.ts.map +1 -1
- package/dist/scripts/lib/search-engine.js +31 -31
- package/dist/scripts/lib/search-engine.js.map +1 -1
- package/dist/scripts/mindlore-daemon.js +1 -3
- package/dist/scripts/mindlore-daemon.js.map +1 -1
- package/dist/scripts/mindlore-obsidian.js +4 -0
- package/dist/scripts/mindlore-obsidian.js.map +1 -1
- package/dist/scripts/mindlore-rrf-bench.d.ts +2 -0
- package/dist/scripts/mindlore-rrf-bench.d.ts.map +1 -0
- package/dist/scripts/mindlore-rrf-bench.js +30 -0
- package/dist/scripts/mindlore-rrf-bench.js.map +1 -0
- package/dist/tests/fetch-raw-security.test.d.ts +2 -0
- package/dist/tests/fetch-raw-security.test.d.ts.map +1 -0
- package/dist/tests/fetch-raw-security.test.js +72 -0
- package/dist/tests/fetch-raw-security.test.js.map +1 -0
- package/dist/tests/fetch-raw.test.js +4 -4
- package/dist/tests/fetch-raw.test.js.map +1 -1
- package/dist/tests/fts5.test.js +0 -22
- package/dist/tests/fts5.test.js.map +1 -1
- package/dist/tests/input-validation.test.d.ts +2 -0
- package/dist/tests/input-validation.test.d.ts.map +1 -0
- package/dist/tests/input-validation.test.js +113 -0
- package/dist/tests/input-validation.test.js.map +1 -0
- package/dist/tests/privacy-filter.test.js +25 -50
- package/dist/tests/privacy-filter.test.js.map +1 -1
- package/dist/tests/rrf.test.js +42 -3
- package/dist/tests/rrf.test.js.map +1 -1
- package/dist/tests/search-cache.test.js +44 -12
- package/dist/tests/search-cache.test.js.map +1 -1
- package/dist/tests/search-hook.test.js +0 -44
- package/dist/tests/search-hook.test.js.map +1 -1
- package/dist/tests/sec-regression.test.d.ts +2 -0
- package/dist/tests/sec-regression.test.d.ts.map +1 -0
- package/dist/tests/sec-regression.test.js +174 -0
- package/dist/tests/sec-regression.test.js.map +1 -0
- package/dist/tests/stop-words.test.d.ts +2 -0
- package/dist/tests/stop-words.test.d.ts.map +1 -0
- package/dist/tests/stop-words.test.js +47 -0
- package/dist/tests/stop-words.test.js.map +1 -0
- package/hooks/lib/mindlore-common.cjs +39 -36
- package/hooks/mindlore-fts5-sync.cjs +4 -3
- package/hooks/mindlore-index.cjs +6 -7
- package/hooks/mindlore-pre-compact.cjs +5 -4
- package/hooks/mindlore-search.cjs +3 -2
- package/hooks/mindlore-session-end.cjs +10 -10
- package/hooks/mindlore-session-focus.cjs +11 -1
- package/package.json +1 -1
- package/plugin.json +1 -1
- package/templates/SCHEMA.md +10 -108
- package/templates/config.json +1 -1
- package/dist/scripts/lib/hybrid-search.d.ts +0 -62
- package/dist/scripts/lib/hybrid-search.d.ts.map +0 -1
- package/dist/scripts/lib/hybrid-search.js +0 -171
- package/dist/scripts/lib/hybrid-search.js.map +0 -1
- package/dist/tests/hybrid-search.test.d.ts +0 -2
- package/dist/tests/hybrid-search.test.d.ts.map +0 -1
- package/dist/tests/hybrid-search.test.js +0 -139
- package/dist/tests/hybrid-search.test.js.map +0 -1
- package/dist/tests/index-cli-embed.test.d.ts +0 -7
- package/dist/tests/index-cli-embed.test.d.ts.map +0 -1
- package/dist/tests/index-cli-embed.test.js +0 -128
- package/dist/tests/index-cli-embed.test.js.map +0 -1
- package/dist/tests/search-cli-hybrid.test.d.ts +0 -6
- package/dist/tests/search-cli-hybrid.test.d.ts.map +0 -1
- package/dist/tests/search-cli-hybrid.test.js +0 -103
- package/dist/tests/search-cli-hybrid.test.js.map +0 -1
|
@@ -49,6 +49,8 @@ function createDaemonServer(options) {
|
|
|
49
49
|
await loadModel();
|
|
50
50
|
return new Promise((resolve) => {
|
|
51
51
|
server = net_1.default.createServer((conn) => {
|
|
52
|
+
conn.setTimeout(5000);
|
|
53
|
+
conn.on('timeout', () => conn.destroy());
|
|
52
54
|
let buffer = '';
|
|
53
55
|
const MAX_BUFFER = 1024 * 1024;
|
|
54
56
|
conn.on('data', async (data) => {
|
|
@@ -77,6 +79,7 @@ function createDaemonServer(options) {
|
|
|
77
79
|
}
|
|
78
80
|
});
|
|
79
81
|
});
|
|
82
|
+
server.maxConnections = 10;
|
|
80
83
|
server.listen(0, constants_js_1.DAEMON_HOST, () => {
|
|
81
84
|
const addr = server?.address();
|
|
82
85
|
if (addr && typeof addr === 'object') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../scripts/lib/daemon.ts"],"names":[],"mappings":";;;;;AA8BA,
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../scripts/lib/daemon.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../../scripts/lib/fuzzy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"fuzzy.d.ts","sourceRoot":"","sources":["../../../scripts/lib/fuzzy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAIvC,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAQD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,MAAM,EAAE,CAYxF;AAID,wBAAgB,cAAc,CAAC,EAAE,EAAE,QAAQ,GAAG,MAAM,EAAE,CAMrD;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAStE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAc9E"}
|
|
@@ -7,6 +7,7 @@ exports.invalidateVocabCache = invalidateVocabCache;
|
|
|
7
7
|
exports.populateVocabulary = populateVocabulary;
|
|
8
8
|
exports.correctQuery = correctQuery;
|
|
9
9
|
const db_helpers_js_1 = require("./db-helpers.js");
|
|
10
|
+
const constants_js_1 = require("./constants.js");
|
|
10
11
|
function levenshtein(a, b) {
|
|
11
12
|
const m = a.length, n = b.length;
|
|
12
13
|
const prev = new Int32Array(n + 1);
|
|
@@ -16,13 +17,14 @@ function levenshtein(a, b) {
|
|
|
16
17
|
for (let i = 1; i <= m; i++) {
|
|
17
18
|
curr[0] = i;
|
|
18
19
|
for (let j = 1; j <= n; j++) {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
: 1 + Math.min(prev[j], curr[j - 1], prev[j - 1]);
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Int32Array indices within loop bounds [0..n]
|
|
21
|
+
curr[j] = a[i - 1] === b[j - 1] ? prev[j - 1] : 1 + Math.min(prev[j], curr[j - 1], prev[j - 1]);
|
|
22
22
|
}
|
|
23
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Int32Array index j within [0..n]
|
|
23
24
|
for (let j = 0; j <= n; j++)
|
|
24
25
|
prev[j] = curr[j];
|
|
25
26
|
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- Int32Array index n is always within bounds
|
|
26
28
|
return prev[n];
|
|
27
29
|
}
|
|
28
30
|
function maxDistance(wordLen) {
|
|
@@ -60,7 +62,7 @@ function invalidateVocabCache() {
|
|
|
60
62
|
}
|
|
61
63
|
function populateVocabulary(db, content) {
|
|
62
64
|
const words = content
|
|
63
|
-
.replace(
|
|
65
|
+
.replace(constants_js_1.TURKISH_WORD_RE, ' ')
|
|
64
66
|
.split(/\s+/)
|
|
65
67
|
.filter(w => w.length >= 3)
|
|
66
68
|
.map(w => w.toLowerCase());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../../scripts/lib/fuzzy.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"fuzzy.js","sourceRoot":"","sources":["../../../scripts/lib/fuzzy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function validatePath(targetPath: string, allowedBase: string): void;
|
|
2
|
+
export declare function validateUrl(urlOrString: string | URL): void;
|
|
3
|
+
export declare function sanitizeForExecFile(value: string): string;
|
|
4
|
+
export declare function escapeYamlValue(value: string): string;
|
|
5
|
+
//# sourceMappingURL=input-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validation.d.ts","sourceRoot":"","sources":["../../../scripts/lib/input-validation.ts"],"names":[],"mappings":"AAMA,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAM1E;AAED,wBAAgB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAW3D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKzD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQrD"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.validatePath = validatePath;
|
|
7
|
+
exports.validateUrl = validateUrl;
|
|
8
|
+
exports.sanitizeForExecFile = sanitizeForExecFile;
|
|
9
|
+
exports.escapeYamlValue = escapeYamlValue;
|
|
10
|
+
const path_1 = __importDefault(require("path"));
|
|
11
|
+
const PRIVATE_IP_RE = /^(?:127\.|10\.|172\.(?:1[6-9]|2\d|3[01])\.|192\.168\.|169\.254\.|0\.0\.0\.0|fc00:|fe80:|::1$|localhost$)/i;
|
|
12
|
+
const SHELL_UNSAFE = /[;|&`$(){}[\]!#~<>\\'"*?\n\r]/;
|
|
13
|
+
function validatePath(targetPath, allowedBase) {
|
|
14
|
+
const resolved = path_1.default.resolve(targetPath);
|
|
15
|
+
const base = path_1.default.resolve(allowedBase);
|
|
16
|
+
if (!resolved.startsWith(base + path_1.default.sep) && resolved !== base) {
|
|
17
|
+
throw new Error(`Path must be under ${allowedBase}, got: ${targetPath}`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
function validateUrl(urlOrString) {
|
|
21
|
+
let hostname;
|
|
22
|
+
try {
|
|
23
|
+
const u = typeof urlOrString === 'string' ? new URL(urlOrString) : urlOrString;
|
|
24
|
+
hostname = u.hostname.replace(/^\[|]$/g, '');
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
throw new Error(`Invalid URL: ${String(urlOrString)}`);
|
|
28
|
+
}
|
|
29
|
+
if (PRIVATE_IP_RE.test(hostname)) {
|
|
30
|
+
throw new Error(`Private/reserved IP range not allowed: ${hostname}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function sanitizeForExecFile(value) {
|
|
34
|
+
if (SHELL_UNSAFE.test(value)) {
|
|
35
|
+
throw new Error('Invalid characters in argument');
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
function escapeYamlValue(value) {
|
|
40
|
+
const escaped = value
|
|
41
|
+
.replace(/\\/g, '\\\\')
|
|
42
|
+
.replace(/"/g, '\\"')
|
|
43
|
+
.replace(/\n/g, '\\n')
|
|
44
|
+
.replace(/\r/g, '\\r')
|
|
45
|
+
.replace(/\t/g, '\\t');
|
|
46
|
+
return `"${escaped}"`;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=input-validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-validation.js","sourceRoot":"","sources":["../../../scripts/lib/input-validation.ts"],"names":[],"mappings":";;;;;AAMA,oCAMC;AAED,kCAWC;AAED,kDAKC;AAED,0CAQC;AA1CD,gDAAwB;AAExB,MAAM,aAAa,GAAG,2GAA2G,CAAC;AAElI,MAAM,YAAY,GAAG,+BAA+B,CAAC;AAErD,SAAgB,YAAY,CAAC,UAAkB,EAAE,WAAmB;IAClE,MAAM,QAAQ,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,cAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,cAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,sBAAsB,WAAW,UAAU,UAAU,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,SAAgB,WAAW,CAAC,WAAyB;IACnD,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QAC/E,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,QAAQ,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,KAAa;IAC/C,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAgB,eAAe,CAAC,KAAa;IAC3C,MAAM,OAAO,GAAG,KAAK;SAClB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACzB,OAAO,IAAI,OAAO,GAAG,CAAC;AACxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy-filter.d.ts","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"privacy-filter.d.ts","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAGpC,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAoB5E"}
|
|
@@ -17,10 +17,13 @@ const PATTERN_PREFIXES = [
|
|
|
17
17
|
{ prefix: 'pk_live_', pattern: /pk_live_[a-zA-Z0-9]{20,}/g },
|
|
18
18
|
{ prefix: 'Bearer', pattern: /Bearer\s+[a-zA-Z0-9\-._~+/]+=*/g },
|
|
19
19
|
{ prefix: '-----BEGIN', pattern: /-----BEGIN\s(?:RSA\s|EC\s|DSA\s|OPENSSH\s)?PRIVATE\sKEY-----/g },
|
|
20
|
+
{ prefix: 'Basic', pattern: /Basic\s+[a-zA-Z0-9+\/]{16,}={0,2}/g },
|
|
21
|
+
{ prefix: '-----BEGIN CERTIFICATE', pattern: /-----BEGIN\sCERTIFICATE-----/g },
|
|
20
22
|
];
|
|
21
23
|
const NO_PREFIX_PATTERNS = [
|
|
22
24
|
/(?:postgres|mysql|mongodb|redis|amqp)(?:\+srv)?:\/\/[^\s"']+/g,
|
|
23
25
|
/(?:PASSWORD|SECRET|TOKEN|API_KEY|PRIVATE_KEY|DATABASE_URL|DB_PASSWORD|AUTH_TOKEN|ACCESS_KEY|SECRET_KEY)=\S+/gi,
|
|
26
|
+
/(?:api_key|auth_token|access_token|refresh_token|client_secret|private_key|secret_key)\s*[:=]\s*["']?[^\s"',}{]{8,}["']?/gi,
|
|
24
27
|
];
|
|
25
28
|
exports.DEFAULT_PATTERNS = [
|
|
26
29
|
...PATTERN_PREFIXES.map(p => p.pattern),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy-filter.js","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"privacy-filter.js","sourceRoot":"","sources":["../../../scripts/lib/privacy-filter.ts"],"names":[],"mappings":";;;AA+BA,sCAoBC;AAnDD,MAAM,WAAW,GAAG,YAAY,CAAC;AAEjC,MAAM,gBAAgB,GAA+C;IACnE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,uCAAuC,EAAE;IACnE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE;IAChD,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE;IACpD,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE;IACpD,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,+BAA+B,EAAE;IACnE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,uBAAuB,EAAE;IACpD,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,gCAAgC,EAAE;IAC5D,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,mEAAmE,EAAE;IAC/F,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,0BAA0B,EAAE;IACvD,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE;IAC5D,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,2BAA2B,EAAE;IAC5D,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,iCAAiC,EAAE;IAChE,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,+DAA+D,EAAE;IAClG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,oCAAoC,EAAE;IAClE,EAAE,MAAM,EAAE,wBAAwB,EAAE,OAAO,EAAE,+BAA+B,EAAE;CAC/E,CAAC;AAEF,MAAM,kBAAkB,GAAa;IACnC,+DAA+D;IAC/D,+GAA+G;IAC/G,4HAA4H;CAC7H,CAAC;AAEW,QAAA,gBAAgB,GAAa;IACxC,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;IACvC,GAAG,kBAAkB;CACtB,CAAC;AAEF,SAAgB,aAAa,CAAC,IAAY,EAAE,aAAwB;IAClE,IAAI,MAAM,GAAG,IAAI,CAAC;IAElB,KAAK,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,gBAAgB,EAAE,CAAC;QACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;YACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,aAAa;QAC7B,CAAC,CAAC,CAAC,GAAG,kBAAkB,EAAE,GAAG,aAAa,CAAC;QAC3C,CAAC,CAAC,kBAAkB,CAAC;IAEvB,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proximity.d.ts","sourceRoot":"","sources":["../../../scripts/lib/proximity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"proximity.d.ts","sourceRoot":"","sources":["../../../scripts/lib/proximity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AA8CvD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CAU1F"}
|
|
@@ -15,14 +15,20 @@ function findMinSpan(content, terms) {
|
|
|
15
15
|
if (positions.some(p => p.length === 0))
|
|
16
16
|
return Infinity;
|
|
17
17
|
let minSpan = Infinity;
|
|
18
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[0] exists: guarded by `positions.some(p => p.length === 0)` check above
|
|
18
19
|
for (let i = 0; i < positions[0].length; i++) {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[0] exists (see above); i is within bounds of its length
|
|
19
21
|
let maxPos = positions[0][i];
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[0] exists (see above); i is within bounds of its length
|
|
20
23
|
let minPos = positions[0][i];
|
|
21
24
|
for (let t = 1; t < terms.length; t++) {
|
|
22
25
|
let bestDist = Infinity;
|
|
23
26
|
let bestPos = 0;
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[t] exists: loop t < terms.length, positions has same length as terms
|
|
24
28
|
for (let j = 0; j < positions[t].length; j++) {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[t][j] within loop bounds; positions[0][i] within loop bounds
|
|
25
30
|
const dist = Math.abs(positions[t][j] - positions[0][i]);
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- positions[t][j] within loop bounds
|
|
26
32
|
if (dist < bestDist) {
|
|
27
33
|
bestDist = dist;
|
|
28
34
|
bestPos = positions[t][j];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proximity.js","sourceRoot":"","sources":["../../../scripts/lib/proximity.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"proximity.js","sourceRoot":"","sources":["../../../scripts/lib/proximity.ts"],"names":[],"mappings":";;AA8CA,8CAUC;AAtDD,SAAS,WAAW,CAAC,OAAe,EAAE,KAAe;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,SAAS,GAAe,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YAClB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAAE,OAAO,QAAQ,CAAC;IAEzD,IAAI,OAAO,GAAG,QAAQ,CAAC;IAEvB,yJAAyJ;IACzJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,yIAAyI;QACzI,IAAI,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;QAC/B,yIAAyI;QACzI,IAAI,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,IAAI,QAAQ,GAAG,QAAQ,CAAC;YACxB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,sJAAsJ;YACtJ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC9C,8IAA8I;gBAC9I,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;gBAC7D,0GAA0G;gBAC1G,IAAI,IAAI,GAAG,QAAQ,EAAE,CAAC;oBAAC,QAAQ,GAAG,IAAI,CAAC;oBAAC,OAAO,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC;gBAAC,CAAC;YACxE,CAAC;YACD,IAAI,OAAO,GAAG,MAAM;gBAAE,MAAM,GAAG,OAAO,CAAC;YACvC,IAAI,OAAO,GAAG,MAAM;gBAAE,MAAM,GAAG,OAAO,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;QAC7B,IAAI,IAAI,GAAG,OAAO;YAAE,OAAO,GAAG,IAAI,CAAC;IACrC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAAuB,EAAE,KAAe;IACxE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IAErC,OAAO,OAAO;SACX,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QACtE,OAAO,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,GAAG,KAAK,EAAE,CAAC;IAC1C,CAAC,CAAC;SACD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC"}
|
|
@@ -16,8 +16,13 @@ export interface RRFOptions {
|
|
|
16
16
|
k?: number;
|
|
17
17
|
dedupByPath?: boolean;
|
|
18
18
|
}
|
|
19
|
+
export interface SearchQueryOptions {
|
|
20
|
+
query: string;
|
|
21
|
+
limit: number;
|
|
22
|
+
project?: string;
|
|
23
|
+
}
|
|
19
24
|
export declare function computeRRF(porterResults: RankedResult[], trigramResults: RankedResult[], options?: RRFOptions): RankedResult[];
|
|
20
|
-
export declare function searchPorter(db: Database,
|
|
21
|
-
export declare function searchTrigram(db: Database,
|
|
25
|
+
export declare function searchPorter(db: Database, options: SearchQueryOptions): RankedResult[];
|
|
26
|
+
export declare function searchTrigram(db: Database, options: SearchQueryOptions): RankedResult[];
|
|
22
27
|
export {};
|
|
23
28
|
//# sourceMappingURL=rrf.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../../scripts/lib/rrf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAGvC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,UAAU,CACxB,aAAa,EAAE,YAAY,EAAE,EAC7B,cAAc,EAAE,YAAY,EAAE,EAC9B,OAAO,GAAE,UAAe,GACvB,YAAY,EAAE,CA4BhB;
|
|
1
|
+
{"version":3,"file":"rrf.d.ts","sourceRoot":"","sources":["../../../scripts/lib/rrf.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAGvC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAgB,UAAU,CACxB,aAAa,EAAE,YAAY,EAAE,EAC7B,cAAc,EAAE,YAAY,EAAE,EAC9B,OAAO,GAAE,UAAe,GACvB,YAAY,EAAE,CA4BhB;AAUD,wBAAgB,YAAY,CAC1B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,kBAAkB,GAC1B,YAAY,EAAE,CAIhB;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,kBAAkB,GAC1B,YAAY,EAAE,CAYhB"}
|
package/dist/scripts/lib/rrf.js
CHANGED
|
@@ -6,8 +6,9 @@ exports.searchPorter = searchPorter;
|
|
|
6
6
|
exports.searchTrigram = searchTrigram;
|
|
7
7
|
const db_helpers_js_1 = require("./db-helpers.js");
|
|
8
8
|
function sanitizeFtsQuery(query) {
|
|
9
|
-
return query.replace(/["*(){}[\]
|
|
9
|
+
return query.replace(/["*(){}[\]^~:-]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
10
10
|
}
|
|
11
|
+
const BM25_RANK_EXPR = 'bm25(mindlore_fts, 1, 1, 1, 5.0, 1, 1) as bm';
|
|
11
12
|
function computeRRF(porterResults, trigramResults, options = {}) {
|
|
12
13
|
const k = options.k ?? 60;
|
|
13
14
|
const scores = new Map();
|
|
@@ -35,28 +36,31 @@ function computeRRF(porterResults, trigramResults, options = {}) {
|
|
|
35
36
|
}
|
|
36
37
|
return results;
|
|
37
38
|
}
|
|
38
|
-
function
|
|
39
|
-
const
|
|
39
|
+
function _searchFts(db, p) {
|
|
40
|
+
const sql = p.project
|
|
41
|
+
? `SELECT path, slug, description, title, category, tags, content, ${p.rankExpr} FROM ${p.table} WHERE ${p.table} MATCH ? AND project = ? ORDER BY ${p.orderBy} LIMIT ?`
|
|
42
|
+
: `SELECT path, slug, description, title, category, tags, content, ${p.rankExpr} FROM ${p.table} WHERE ${p.table} MATCH ? ORDER BY ${p.orderBy} LIMIT ?`;
|
|
43
|
+
const params = p.project ? [p.query, p.project, p.limit] : [p.query, p.limit];
|
|
44
|
+
return (0, db_helpers_js_1.dbAll)(db, sql, ...params).map((r, i) => ({ ...r, rank: i + 1, score: 0 }));
|
|
45
|
+
}
|
|
46
|
+
function searchPorter(db, options) {
|
|
47
|
+
const sanitized = sanitizeFtsQuery(options.query);
|
|
40
48
|
if (!sanitized)
|
|
41
49
|
return [];
|
|
42
|
-
|
|
43
|
-
? 'SELECT path, slug, description, title, category, tags, content, bm25(mindlore_fts, 1, 1, 1, 5.0, 1, 1) as bm FROM mindlore_fts WHERE mindlore_fts MATCH ? AND project = ? ORDER BY bm LIMIT ?'
|
|
44
|
-
: 'SELECT path, slug, description, title, category, tags, content, bm25(mindlore_fts, 1, 1, 1, 5.0, 1, 1) as bm FROM mindlore_fts WHERE mindlore_fts MATCH ? ORDER BY bm LIMIT ?';
|
|
45
|
-
const params = project ? [sanitized, project, limit] : [sanitized, limit];
|
|
46
|
-
return (0, db_helpers_js_1.dbAll)(db, sql, ...params).map((r, i) => ({ ...r, rank: i + 1, score: 0 }));
|
|
50
|
+
return _searchFts(db, { table: 'mindlore_fts', rankExpr: BM25_RANK_EXPR, orderBy: 'bm', query: sanitized, project: options.project, limit: options.limit });
|
|
47
51
|
}
|
|
48
|
-
function searchTrigram(db,
|
|
49
|
-
const sanitized = sanitizeFtsQuery(query);
|
|
52
|
+
function searchTrigram(db, options) {
|
|
53
|
+
const sanitized = sanitizeFtsQuery(options.query);
|
|
50
54
|
if (!sanitized)
|
|
51
55
|
return [];
|
|
52
56
|
try {
|
|
53
|
-
|
|
54
|
-
? 'SELECT path, slug, description, title, category, tags, content, rank FROM mindlore_fts_trigram WHERE mindlore_fts_trigram MATCH ? AND project = ? ORDER BY rank LIMIT ?'
|
|
55
|
-
: 'SELECT path, slug, description, title, category, tags, content, rank FROM mindlore_fts_trigram WHERE mindlore_fts_trigram MATCH ? ORDER BY rank LIMIT ?';
|
|
56
|
-
const params = project ? [sanitized, project, limit] : [sanitized, limit];
|
|
57
|
-
return (0, db_helpers_js_1.dbAll)(db, sql, ...params).map((r, i) => ({ ...r, rank: i + 1, score: 0 }));
|
|
57
|
+
return _searchFts(db, { table: 'mindlore_fts_trigram', rankExpr: 'rank', orderBy: 'rank', query: sanitized, project: options.project, limit: options.limit });
|
|
58
58
|
}
|
|
59
|
-
catch (
|
|
59
|
+
catch (err) {
|
|
60
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
61
|
+
if (!msg.includes('no such table')) {
|
|
62
|
+
console.warn(`searchTrigram: ${msg}`);
|
|
63
|
+
}
|
|
60
64
|
return [];
|
|
61
65
|
}
|
|
62
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../../scripts/lib/rrf.ts"],"names":[],"mappings":";;AAIA,4CAEC;
|
|
1
|
+
{"version":3,"file":"rrf.js","sourceRoot":"","sources":["../../../scripts/lib/rrf.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,12 +7,27 @@ export interface SearchCacheOptions {
|
|
|
7
7
|
export declare class SearchCache {
|
|
8
8
|
private db;
|
|
9
9
|
private ttlMs;
|
|
10
|
+
private statsReady;
|
|
11
|
+
private stmtHit;
|
|
12
|
+
private stmtMiss;
|
|
13
|
+
private lastCleanup;
|
|
10
14
|
constructor(db: Database, options?: SearchCacheOptions);
|
|
11
15
|
private hash;
|
|
16
|
+
private ensureStatsTable;
|
|
17
|
+
getStats(): {
|
|
18
|
+
hits: number;
|
|
19
|
+
misses: number;
|
|
20
|
+
hitRate: number;
|
|
21
|
+
};
|
|
22
|
+
resetStats(): void;
|
|
12
23
|
get(query: string): SearchResult[] | null;
|
|
13
24
|
set(query: string, results: SearchResult[]): void;
|
|
14
25
|
invalidate(): void;
|
|
15
26
|
cleanup(): void;
|
|
27
|
+
}
|
|
28
|
+
export declare class SearchThrottle {
|
|
29
|
+
private db;
|
|
30
|
+
constructor(db: Database);
|
|
16
31
|
incrementCallCount(sessionId: string): number;
|
|
17
32
|
getMaxResults(callCount: number): number;
|
|
18
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-cache.d.ts","sourceRoot":"","sources":["../../../scripts/lib/search-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-cache.d.ts","sourceRoot":"","sources":["../../../scripts/lib/search-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,QAAQ,CAAwC;IACxD,OAAO,CAAC,WAAW,CAAK;gBAEZ,EAAE,EAAE,QAAQ,EAAE,OAAO,GAAE,kBAAuB;IAK1D,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,gBAAgB;IAexB,QAAQ,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAQ7D,UAAU,IAAI,IAAI;IAKlB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,GAAG,IAAI;IAoBzC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,IAAI;IAQjD,UAAU,IAAI,IAAI;IAIlB,OAAO,IAAI,IAAI;CAOhB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAW;gBAET,EAAE,EAAE,QAAQ;IAIxB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAY7C,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAKzC"}
|
|
@@ -3,11 +3,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.SearchCache = void 0;
|
|
6
|
+
exports.SearchThrottle = exports.SearchCache = void 0;
|
|
7
7
|
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
+
const CLEANUP_INTERVAL_MS = 60_000;
|
|
8
9
|
class SearchCache {
|
|
9
10
|
db;
|
|
10
11
|
ttlMs;
|
|
12
|
+
statsReady = false;
|
|
13
|
+
stmtHit = null;
|
|
14
|
+
stmtMiss = null;
|
|
15
|
+
lastCleanup = 0;
|
|
11
16
|
constructor(db, options = {}) {
|
|
12
17
|
this.db = db;
|
|
13
18
|
this.ttlMs = options.ttlMs ?? 300000;
|
|
@@ -15,14 +20,46 @@ class SearchCache {
|
|
|
15
20
|
hash(query) {
|
|
16
21
|
return crypto_1.default.createHash('sha256').update(query).digest('hex').slice(0, 16);
|
|
17
22
|
}
|
|
23
|
+
ensureStatsTable() {
|
|
24
|
+
if (this.statsReady)
|
|
25
|
+
return;
|
|
26
|
+
this.db.exec(`
|
|
27
|
+
CREATE TABLE IF NOT EXISTS search_cache_stats (
|
|
28
|
+
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
29
|
+
hits INTEGER NOT NULL DEFAULT 0,
|
|
30
|
+
misses INTEGER NOT NULL DEFAULT 0
|
|
31
|
+
)
|
|
32
|
+
`);
|
|
33
|
+
this.db.prepare('INSERT OR IGNORE INTO search_cache_stats (id, hits, misses) VALUES (1, 0, 0)').run();
|
|
34
|
+
this.stmtHit = this.db.prepare('UPDATE search_cache_stats SET hits = hits + 1 WHERE id = 1');
|
|
35
|
+
this.stmtMiss = this.db.prepare('UPDATE search_cache_stats SET misses = misses + 1 WHERE id = 1');
|
|
36
|
+
this.statsReady = true;
|
|
37
|
+
}
|
|
38
|
+
getStats() {
|
|
39
|
+
this.ensureStatsTable();
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- single-row table
|
|
41
|
+
const row = this.db.prepare('SELECT hits, misses FROM search_cache_stats WHERE id = 1').get();
|
|
42
|
+
const total = row.hits + row.misses;
|
|
43
|
+
return { hits: row.hits, misses: row.misses, hitRate: total > 0 ? row.hits / total : 0 };
|
|
44
|
+
}
|
|
45
|
+
resetStats() {
|
|
46
|
+
this.ensureStatsTable();
|
|
47
|
+
this.db.prepare('UPDATE search_cache_stats SET hits = 0, misses = 0 WHERE id = 1').run();
|
|
48
|
+
}
|
|
18
49
|
get(query) {
|
|
19
50
|
const h = this.hash(query);
|
|
20
51
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
21
52
|
const row = this.db.prepare('SELECT results_json FROM search_cache WHERE query_hash = ? AND expires_at > ?').get(h, new Date().toISOString());
|
|
22
53
|
if (!row) {
|
|
54
|
+
this.ensureStatsTable();
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- ensureStatsTable sets stmtMiss
|
|
56
|
+
this.stmtMiss.run();
|
|
23
57
|
this.cleanup();
|
|
24
58
|
return null;
|
|
25
59
|
}
|
|
60
|
+
this.ensureStatsTable();
|
|
61
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- ensureStatsTable sets stmtHit
|
|
62
|
+
this.stmtHit.run();
|
|
26
63
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- JSON stored by set()
|
|
27
64
|
return JSON.parse(row.results_json);
|
|
28
65
|
}
|
|
@@ -35,8 +72,19 @@ class SearchCache {
|
|
|
35
72
|
this.db.exec('DELETE FROM search_cache');
|
|
36
73
|
}
|
|
37
74
|
cleanup() {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
if (now - this.lastCleanup < CLEANUP_INTERVAL_MS)
|
|
77
|
+
return;
|
|
78
|
+
this.lastCleanup = now;
|
|
38
79
|
this.db.prepare('DELETE FROM search_cache WHERE expires_at < ?').run(new Date().toISOString());
|
|
39
80
|
}
|
|
81
|
+
}
|
|
82
|
+
exports.SearchCache = SearchCache;
|
|
83
|
+
class SearchThrottle {
|
|
84
|
+
db;
|
|
85
|
+
constructor(db) {
|
|
86
|
+
this.db = db;
|
|
87
|
+
}
|
|
40
88
|
incrementCallCount(sessionId) {
|
|
41
89
|
const now = new Date().toISOString();
|
|
42
90
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- better-sqlite3 .get() returns unknown
|
|
@@ -56,5 +104,5 @@ class SearchCache {
|
|
|
56
104
|
return 0;
|
|
57
105
|
}
|
|
58
106
|
}
|
|
59
|
-
exports.
|
|
107
|
+
exports.SearchThrottle = SearchThrottle;
|
|
60
108
|
//# sourceMappingURL=search-cache.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-cache.js","sourceRoot":"","sources":["../../../scripts/lib/search-cache.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;
|
|
1
|
+
{"version":3,"file":"search-cache.js","sourceRoot":"","sources":["../../../scripts/lib/search-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,7 +16,7 @@ export interface SearchResult {
|
|
|
16
16
|
snippet?: string;
|
|
17
17
|
content?: string;
|
|
18
18
|
}
|
|
19
|
-
export declare function extractKeywords(text: string): string[];
|
|
19
|
+
export declare function extractKeywords(text: string, maxKeywords?: number): string[];
|
|
20
20
|
export declare function search(db: Database, query: string, options: SearchOptions): SearchResult[];
|
|
21
21
|
export {};
|
|
22
22
|
//# sourceMappingURL=search-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../../scripts/lib/search-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAOvC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;
|
|
1
|
+
{"version":3,"file":"search-engine.d.ts","sourceRoot":"","sources":["../../../scripts/lib/search-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,gBAAgB,CAAC;AAChD,KAAK,QAAQ,GAAG,aAAa,CAAC,QAAQ,CAAC;AAOvC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAO5E;AAwDD,wBAAgB,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,YAAY,EAAE,CAwD1F"}
|
|
@@ -7,24 +7,13 @@ const fuzzy_js_1 = require("./fuzzy.js");
|
|
|
7
7
|
const proximity_js_1 = require("./proximity.js");
|
|
8
8
|
const snippet_js_1 = require("./snippet.js");
|
|
9
9
|
const constants_js_1 = require("./constants.js");
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
'should', 'may', 'might', 'can', 'shall', 'must', 'need', 'not',
|
|
14
|
-
'and', 'or', 'but', 'if', 'then', 'else', 'when', 'where', 'how',
|
|
15
|
-
'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those',
|
|
16
|
-
'i', 'me', 'my', 'we', 'our', 'you', 'your', 'he', 'she', 'it',
|
|
17
|
-
'they', 'them', 'their', 'its', 'of', 'in', 'to', 'for', 'with',
|
|
18
|
-
'on', 'at', 'by', 'from', 'as', 'into', 'about', 'between',
|
|
19
|
-
'ne', 'bir', 'bu', 'da', 'de', 'mi', 'mu', 'mı',
|
|
20
|
-
'var', 'yok', 'ile', 'için', 'gibi', 'daha', 'çok', 'en',
|
|
21
|
-
]);
|
|
22
|
-
function extractKeywords(text) {
|
|
23
|
-
return text
|
|
24
|
-
.replace(/[^\w\sçğıöşüÇĞİÖŞÜ-]/g, ' ')
|
|
10
|
+
function extractKeywords(text, maxKeywords) {
|
|
11
|
+
const keywords = text
|
|
12
|
+
.replace(constants_js_1.TURKISH_WORD_RE, ' ')
|
|
25
13
|
.split(/\s+/)
|
|
26
|
-
.filter(w => w.length >=
|
|
14
|
+
.filter(w => w.length >= constants_js_1.STOP_WORDS_MIN_LENGTH && !constants_js_1.STOP_WORDS.has(w.toLowerCase()))
|
|
27
15
|
.map(w => w.toLowerCase());
|
|
16
|
+
return maxKeywords ? keywords.slice(0, maxKeywords) : keywords;
|
|
28
17
|
}
|
|
29
18
|
function expandWithSynonyms(keywords, synonyms) {
|
|
30
19
|
if (!synonyms)
|
|
@@ -47,21 +36,30 @@ const CATEGORY_WEIGHTS = {
|
|
|
47
36
|
sessions: 0.85,
|
|
48
37
|
cc_memory: 1.3,
|
|
49
38
|
};
|
|
50
|
-
const
|
|
51
|
-
|
|
39
|
+
const INTENT_CONFIG = {
|
|
40
|
+
debug: {
|
|
41
|
+
keywords: ['debug', 'fix', 'hata', 'bug', 'error', 'crash', 'fail'],
|
|
42
|
+
boosts: { episodes: 1.3, raw: 1.1 },
|
|
43
|
+
},
|
|
44
|
+
research: {
|
|
45
|
+
keywords: ['araştır', 'bul', 'search', 'nedir', 'nasıl', 'compare'],
|
|
46
|
+
boosts: { sources: 1.3, analyses: 1.2 },
|
|
47
|
+
},
|
|
48
|
+
implementation: {
|
|
49
|
+
keywords: [],
|
|
50
|
+
boosts: { domains: 1.2, sessions: 1.1 },
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- Object.keys cast triggers lint; keep in sync with INTENT_CONFIG
|
|
54
|
+
const INTENT_KEYS = Object.keys(INTENT_CONFIG);
|
|
52
55
|
function detectIntent(query) {
|
|
53
56
|
const lower = query.toLowerCase();
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
57
|
+
for (const intent of INTENT_KEYS) {
|
|
58
|
+
if (INTENT_CONFIG[intent].keywords.some(k => lower.includes(k)))
|
|
59
|
+
return intent;
|
|
60
|
+
}
|
|
58
61
|
return 'implementation';
|
|
59
62
|
}
|
|
60
|
-
const INTENT_BOOSTS = {
|
|
61
|
-
debug: { episodes: 1.3, raw: 1.1 },
|
|
62
|
-
research: { sources: 1.3, analyses: 1.2 },
|
|
63
|
-
implementation: { domains: 1.2, sessions: 1.1 },
|
|
64
|
-
};
|
|
65
63
|
function search(db, query, options) {
|
|
66
64
|
const maxResults = options.maxResults ?? 3;
|
|
67
65
|
const keywords = extractKeywords(query);
|
|
@@ -71,7 +69,7 @@ function search(db, query, options) {
|
|
|
71
69
|
const queryStr = (0, constants_js_1.fixVersionTokens)(expanded.join(' '));
|
|
72
70
|
const limit = 20;
|
|
73
71
|
function fusedSearch(q) {
|
|
74
|
-
return (0, rrf_js_1.computeRRF)((0, rrf_js_1.searchPorter)(db, q, limit, options.project), (0, rrf_js_1.searchTrigram)(db, q, limit, options.project), { dedupByPath: true });
|
|
72
|
+
return (0, rrf_js_1.computeRRF)((0, rrf_js_1.searchPorter)(db, { query: q, limit, project: options.project }), (0, rrf_js_1.searchTrigram)(db, { query: q, limit, project: options.project }), { dedupByPath: true });
|
|
75
73
|
}
|
|
76
74
|
let fused = fusedSearch(queryStr);
|
|
77
75
|
if (fused.length === 0) {
|
|
@@ -81,10 +79,12 @@ function search(db, query, options) {
|
|
|
81
79
|
}
|
|
82
80
|
}
|
|
83
81
|
const intent = detectIntent(query);
|
|
84
|
-
const intentBoosts =
|
|
82
|
+
const intentBoosts = INTENT_CONFIG[intent].boosts;
|
|
85
83
|
for (const r of fused) {
|
|
86
|
-
|
|
87
|
-
r.score *=
|
|
84
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- DB category value matches Category union
|
|
85
|
+
r.score *= CATEGORY_WEIGHTS[r.category] ?? 1.0;
|
|
86
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-type-assertion -- DB category value matches Category union
|
|
87
|
+
r.score *= intentBoosts[r.category] ?? 1.0;
|
|
88
88
|
}
|
|
89
89
|
fused.sort((a, b) => b.score - a.score);
|
|
90
90
|
const ranked = (0, proximity_js_1.rerankByProximity)(fused.map(r => ({
|