dsh-locator 0.8.2 → 0.9.0
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/CHANGELOG.md +13 -0
- package/README-es.md +21 -5
- package/README-hi.md +22 -5
- package/README-pt.md +22 -5
- package/README.en.md +22 -5
- package/README.md +22 -5
- package/client.js +931 -41
- package/lib/combined.d.ts +20 -3
- package/lib/combined.d.ts.map +1 -1
- package/lib/combined.js +72 -12
- package/lib/combined.js.map +1 -1
- package/lib/content-search-worker.d.ts +3 -3
- package/lib/content-search-worker.js +11 -6
- package/lib/content-search-worker.js.map +1 -1
- package/lib/content-search.d.ts +81 -7
- package/lib/content-search.d.ts.map +1 -1
- package/lib/content-search.js +454 -36
- package/lib/content-search.js.map +1 -1
- package/lib/content.d.ts +20 -0
- package/lib/content.d.ts.map +1 -1
- package/lib/content.js +71 -21
- package/lib/content.js.map +1 -1
- package/lib/find.d.ts.map +1 -1
- package/lib/find.js +2 -1
- package/lib/find.js.map +1 -1
- package/lib/http.d.ts.map +1 -1
- package/lib/http.js +9 -2
- package/lib/http.js.map +1 -1
- package/package.json +1 -1
- package/src/combined.ts +95 -14
- package/src/content-search-worker.ts +15 -8
- package/src/content-search.ts +559 -36
- package/src/content.ts +81 -18
- package/src/find.ts +3 -2
- package/src/http.ts +11 -2
package/lib/content-search.js
CHANGED
|
@@ -1,47 +1,465 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Content FTS5 query
|
|
2
|
+
* Content FTS5 query engine: normal substring search, Notepad++-style extended
|
|
3
|
+
* escaping, case-sensitive GLOB matching and whole-word post-filtering, with
|
|
4
|
+
* exact or bounded counts.
|
|
5
|
+
*
|
|
6
|
+
* Shared by the host thread, the search worker and the combined panel search.
|
|
7
|
+
* The page path is deliberately two-phase: rank the rowids first, then read the
|
|
8
|
+
* few bodies and build the snippet in JS. Putting `snippet()` in the same
|
|
9
|
+
* `ORDER BY rank` statement made a SQLite sorter evaluate it for every match
|
|
10
|
+
* (measured 2.7 s for "the" on a 1 GB corpus; 60 ms with this split).
|
|
3
11
|
* @module dsh-locator/content-search
|
|
4
12
|
*/
|
|
13
|
+
/** Shortest text a trigram tokenizer can index. */
|
|
14
|
+
const TRIGRAM_MIN = 3;
|
|
15
|
+
const MAX_LIMIT = 100;
|
|
16
|
+
const DEFAULT_COUNT_LIMIT = 1000;
|
|
17
|
+
const MAX_COUNT_LIMIT = 5000;
|
|
18
|
+
const SNIPPET_BEFORE = 60;
|
|
19
|
+
const SNIPPET_AFTER = 120;
|
|
20
|
+
const SNIPPET_MAX = 400;
|
|
21
|
+
/** Bytes that count as "inside a word", matching the name engine. */
|
|
22
|
+
const WORD_BYTE = /[A-Za-z0-9_]/;
|
|
23
|
+
const CONTROL_CHARS = /[\u0000-\u001f]/;
|
|
24
|
+
/** Text escaped for an FTS5 quoted phrase (`"` doubled). */
|
|
25
|
+
export function quoteFts(text) {
|
|
26
|
+
return '"' + text.replace(/"/g, '""') + '"';
|
|
27
|
+
}
|
|
28
|
+
/** Escape a literal for SQLite GLOB (`*`, `?`, `[`, `]`). */
|
|
29
|
+
export function escapeGlob(text) {
|
|
30
|
+
return text.replace(/[*?[\]]/g, ch => (ch === ']' ? '[]]' : '[' + ch + ']'));
|
|
31
|
+
}
|
|
32
|
+
/** Escape a literal for SQL LIKE with `ESCAPE '\'`. */
|
|
33
|
+
export function escapeLike(text) {
|
|
34
|
+
return text.replace(/[\\%_]/g, ch => '\\' + ch);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Decode Notepad++-style extended escapes: `\n`, `\r`, `\t`, `\0`, `\\`,
|
|
38
|
+
* `\xNN`. Unknown escapes are kept literally with a warning.
|
|
39
|
+
*/
|
|
40
|
+
export function decodeExtended(input) {
|
|
41
|
+
const warnings = new Set();
|
|
42
|
+
let text = '';
|
|
43
|
+
for (let i = 0; i < input.length; i++) {
|
|
44
|
+
const ch = input[i];
|
|
45
|
+
if (ch !== '\\') {
|
|
46
|
+
text += ch;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const next = input[i + 1];
|
|
50
|
+
if (next === undefined) {
|
|
51
|
+
warnings.add('extended-trailing-backslash');
|
|
52
|
+
text += '\\';
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
switch (next) {
|
|
56
|
+
case 'n':
|
|
57
|
+
text += '\n';
|
|
58
|
+
i++;
|
|
59
|
+
continue;
|
|
60
|
+
case 'r':
|
|
61
|
+
text += '\r';
|
|
62
|
+
i++;
|
|
63
|
+
continue;
|
|
64
|
+
case 't':
|
|
65
|
+
text += '\t';
|
|
66
|
+
i++;
|
|
67
|
+
continue;
|
|
68
|
+
case '0':
|
|
69
|
+
text += '\0';
|
|
70
|
+
warnings.add('extended-control-char');
|
|
71
|
+
i++;
|
|
72
|
+
continue;
|
|
73
|
+
case '\\':
|
|
74
|
+
text += '\\';
|
|
75
|
+
i++;
|
|
76
|
+
continue;
|
|
77
|
+
case 'x': {
|
|
78
|
+
const hex = input.slice(i + 2, i + 4);
|
|
79
|
+
if (!/^[0-9a-fA-F]{2}$/.test(hex)) {
|
|
80
|
+
return { ok: false, text: '', warnings: [...warnings], error: 'invalid-escape' };
|
|
81
|
+
}
|
|
82
|
+
const code = Number.parseInt(hex, 16);
|
|
83
|
+
text += String.fromCharCode(code);
|
|
84
|
+
if (code < 0x20 && code !== 0x09 && code !== 0x0a && code !== 0x0d)
|
|
85
|
+
warnings.add('extended-control-char');
|
|
86
|
+
i += 3;
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
default:
|
|
90
|
+
warnings.add('extended-unknown-escape');
|
|
91
|
+
text += '\\' + next;
|
|
92
|
+
i++;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return { ok: true, text, warnings: [...warnings] };
|
|
96
|
+
}
|
|
5
97
|
/**
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @param limit - maximum hits.
|
|
10
|
-
* @returns hits, ordered by relevance.
|
|
98
|
+
* Extended decoding for file names: names cannot contain control characters, so
|
|
99
|
+
* they are dropped from the pattern and reported instead of silently matching
|
|
100
|
+
* nothing.
|
|
11
101
|
*/
|
|
12
|
-
export function
|
|
102
|
+
export function decodeExtendedForNames(input) {
|
|
103
|
+
const decoded = decodeExtended(input);
|
|
104
|
+
if (!decoded.ok)
|
|
105
|
+
return decoded;
|
|
106
|
+
const kept = decoded.text.replace(CONTROL_CHARS, '');
|
|
107
|
+
if (kept !== decoded.text)
|
|
108
|
+
decoded.warnings.push('name-extended-control-char');
|
|
109
|
+
return { ...decoded, text: kept };
|
|
110
|
+
}
|
|
111
|
+
/** Whether `index` starts a whole-word occurrence of `length` bytes. */
|
|
112
|
+
export function isWholeWord(hay, index, length) {
|
|
113
|
+
const left = index === 0 || !WORD_BYTE.test(hay[index - 1] ?? '');
|
|
114
|
+
const end = index + length;
|
|
115
|
+
const right = end >= hay.length || !WORD_BYTE.test(hay[end] ?? '');
|
|
116
|
+
return left && right;
|
|
117
|
+
}
|
|
118
|
+
/** First whole-word (or plain) occurrence of any term, or null. */
|
|
119
|
+
export function locateMatch(body, terms, caseSensitive, wholeWord) {
|
|
120
|
+
const hay = caseSensitive ? body : body.toLowerCase();
|
|
121
|
+
let best = null;
|
|
122
|
+
for (const term of terms) {
|
|
123
|
+
if (term === '')
|
|
124
|
+
continue;
|
|
125
|
+
const needle = caseSensitive ? term : term.toLowerCase();
|
|
126
|
+
let from = 0;
|
|
127
|
+
while (from <= hay.length) {
|
|
128
|
+
const index = hay.indexOf(needle, from);
|
|
129
|
+
if (index < 0)
|
|
130
|
+
break;
|
|
131
|
+
if (!wholeWord || isWholeWord(hay, index, needle.length)) {
|
|
132
|
+
if (best === null || index < best.index)
|
|
133
|
+
best = { index, length: needle.length };
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
from = index + 1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return best;
|
|
140
|
+
}
|
|
141
|
+
/** Every term must appear as a whole word (normal mode) or the literal must
|
|
142
|
+
* have non-word edges (extended mode is a single "term"). */
|
|
143
|
+
function matchesWholeWord(body, terms, caseSensitive) {
|
|
144
|
+
for (const term of terms) {
|
|
145
|
+
if (term === '')
|
|
146
|
+
continue;
|
|
147
|
+
if (locateMatch(body, [term], caseSensitive, true) === null)
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
/** 1-based line number of a byte offset. */
|
|
153
|
+
export function lineOf(body, index) {
|
|
154
|
+
let line = 1;
|
|
155
|
+
let from = 0;
|
|
156
|
+
for (;;) {
|
|
157
|
+
const next = body.indexOf('\n', from);
|
|
158
|
+
if (next < 0 || next >= index)
|
|
159
|
+
return line;
|
|
160
|
+
line++;
|
|
161
|
+
from = next + 1;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** Bounded, single-line snippet around the first match. */
|
|
165
|
+
function makeSnippet(body, located) {
|
|
166
|
+
if (located === null) {
|
|
167
|
+
const flat = body.replace(/\s+/g, ' ').trim();
|
|
168
|
+
return flat.length > SNIPPET_MAX ? flat.slice(0, SNIPPET_MAX - 1) + '…' : flat;
|
|
169
|
+
}
|
|
170
|
+
const start = Math.max(0, located.index - SNIPPET_BEFORE);
|
|
171
|
+
const end = Math.min(body.length, located.index + located.length + SNIPPET_AFTER);
|
|
172
|
+
const flat = body.slice(start, end).replace(/\s+/g, ' ');
|
|
173
|
+
const text = (start > 0 ? '…' : '') + flat + (end < body.length ? '…' : '');
|
|
174
|
+
return text.length > SNIPPET_MAX ? text.slice(0, SNIPPET_MAX - 1) + '…' : text;
|
|
175
|
+
}
|
|
176
|
+
function emptyCount(mode) {
|
|
177
|
+
if (mode === 'none')
|
|
178
|
+
return { value: 0, kind: 'unknown' };
|
|
179
|
+
return { value: 0, kind: 'exact' };
|
|
180
|
+
}
|
|
181
|
+
function clampLimit(limit) {
|
|
182
|
+
return Math.max(1, Math.min(MAX_LIMIT, Number.isFinite(limit) ? Math.trunc(limit) : MAX_LIMIT));
|
|
183
|
+
}
|
|
184
|
+
function clampCountLimit(limit) {
|
|
185
|
+
if (limit === undefined || !Number.isFinite(limit))
|
|
186
|
+
return DEFAULT_COUNT_LIMIT;
|
|
187
|
+
return Math.max(1, Math.min(MAX_COUNT_LIMIT, Math.trunc(limit)));
|
|
188
|
+
}
|
|
189
|
+
/** Split a normal-mode query on whitespace, dropping empty terms. */
|
|
190
|
+
function splitTerms(text) {
|
|
191
|
+
return text.split(/\s+/).map(part => part.replace(/^"|"$/g, '')).filter(part => part !== '');
|
|
192
|
+
}
|
|
193
|
+
function buildPlan(terms, options) {
|
|
194
|
+
const { caseSensitive, wholeWord, phrase, sessionPath } = options;
|
|
195
|
+
if (terms.length === 0)
|
|
196
|
+
return null;
|
|
197
|
+
const sessionClause = sessionPath === null ? '' : ' AND rowid IN (SELECT rowid FROM docs_meta WHERE path = ?)';
|
|
198
|
+
const sessionParams = sessionPath === null ? [] : [sessionPath];
|
|
199
|
+
const tooShort = terms.some(term => term.length < TRIGRAM_MIN);
|
|
200
|
+
if (phrase) {
|
|
201
|
+
const literal = terms[0];
|
|
202
|
+
if (caseSensitive) {
|
|
203
|
+
return {
|
|
204
|
+
where: 'body GLOB ?' + sessionClause,
|
|
205
|
+
params: ['*' + escapeGlob(literal) + '*', ...sessionParams],
|
|
206
|
+
terms: [literal],
|
|
207
|
+
caseSensitive,
|
|
208
|
+
wholeWord,
|
|
209
|
+
phrase,
|
|
210
|
+
rankOrder: false,
|
|
211
|
+
exactCount: true,
|
|
212
|
+
boundedCount: true,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
if (literal.length < TRIGRAM_MIN) {
|
|
216
|
+
return {
|
|
217
|
+
where: "body LIKE ? ESCAPE '\\'" + sessionClause,
|
|
218
|
+
params: ['%' + escapeLike(literal) + '%', ...sessionParams],
|
|
219
|
+
terms: [literal],
|
|
220
|
+
caseSensitive,
|
|
221
|
+
wholeWord,
|
|
222
|
+
phrase,
|
|
223
|
+
rankOrder: false,
|
|
224
|
+
exactCount: false,
|
|
225
|
+
boundedCount: true,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
where: 'docs MATCH ?' + sessionClause,
|
|
230
|
+
params: [quoteFts(literal), ...sessionParams],
|
|
231
|
+
terms: [literal],
|
|
232
|
+
caseSensitive,
|
|
233
|
+
wholeWord,
|
|
234
|
+
phrase,
|
|
235
|
+
rankOrder: true,
|
|
236
|
+
exactCount: true,
|
|
237
|
+
boundedCount: false,
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
if (caseSensitive) {
|
|
241
|
+
return {
|
|
242
|
+
where: terms.map(() => 'body GLOB ?').join(' AND ') + sessionClause,
|
|
243
|
+
params: [...terms.map(term => '*' + escapeGlob(term) + '*'), ...sessionParams],
|
|
244
|
+
terms: [...terms],
|
|
245
|
+
caseSensitive,
|
|
246
|
+
wholeWord,
|
|
247
|
+
phrase,
|
|
248
|
+
rankOrder: false,
|
|
249
|
+
exactCount: true,
|
|
250
|
+
boundedCount: true,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
if (tooShort) {
|
|
254
|
+
return {
|
|
255
|
+
where: terms.map(() => "body LIKE ? ESCAPE '\\'").join(' AND ') + sessionClause,
|
|
256
|
+
params: [...terms.map(term => '%' + escapeLike(term) + '%'), ...sessionParams],
|
|
257
|
+
terms: [...terms],
|
|
258
|
+
caseSensitive,
|
|
259
|
+
wholeWord,
|
|
260
|
+
phrase,
|
|
261
|
+
rankOrder: false,
|
|
262
|
+
exactCount: false,
|
|
263
|
+
boundedCount: true,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
where: 'docs MATCH ?' + sessionClause,
|
|
268
|
+
params: [terms.map(quoteFts).join(' AND '), ...sessionParams],
|
|
269
|
+
terms: [...terms],
|
|
270
|
+
caseSensitive,
|
|
271
|
+
wholeWord,
|
|
272
|
+
phrase,
|
|
273
|
+
rankOrder: true,
|
|
274
|
+
exactCount: true,
|
|
275
|
+
boundedCount: false,
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
const DOC_SQL = `SELECT d.kind AS kind, d.path AS path, d.title AS title,
|
|
279
|
+
d.session_id AS session_id, d.message_id AS message_id, d.body AS body,
|
|
280
|
+
m.node_key AS node_key
|
|
281
|
+
FROM docs d LEFT JOIN docs_meta m ON m.rowid = d.rowid
|
|
282
|
+
WHERE d.rowid = ?`;
|
|
283
|
+
/** Build hits from rowids: metadata, snippet, first-match line and score. */
|
|
284
|
+
function buildHits(db, plan, rowids, scores) {
|
|
285
|
+
const statement = db.prepare(DOC_SQL);
|
|
286
|
+
const hits = [];
|
|
287
|
+
for (const rowid of rowids) {
|
|
288
|
+
const row = statement.get(rowid);
|
|
289
|
+
if (row === undefined || typeof row.body !== 'string')
|
|
290
|
+
continue;
|
|
291
|
+
const located = locateMatch(row.body, plan.terms, plan.caseSensitive, plan.wholeWord);
|
|
292
|
+
const line = located === null ? undefined : lineOf(row.body, located.index);
|
|
293
|
+
const score = scores.get(rowid);
|
|
294
|
+
const hit = {
|
|
295
|
+
kind: row.kind === 'session' ? 'session' : 'file',
|
|
296
|
+
path: typeof row.path === 'string' ? row.path : '',
|
|
297
|
+
title: typeof row.title === 'string' ? row.title : '',
|
|
298
|
+
snippet: makeSnippet(row.body, located),
|
|
299
|
+
score: score === undefined ? 0 : score,
|
|
300
|
+
...(typeof row.session_id === 'string' && row.session_id !== '' ? { sessionId: row.session_id } : {}),
|
|
301
|
+
...(typeof row.message_id === 'string' && row.message_id !== '' ? { messageId: row.message_id } : {}),
|
|
302
|
+
...(typeof row.node_key === 'string' && row.node_key !== '' ? { nodeKey: row.node_key } : {}),
|
|
303
|
+
...(line === undefined ? {} : { line }),
|
|
304
|
+
};
|
|
305
|
+
hits.push(hit);
|
|
306
|
+
}
|
|
307
|
+
return hits;
|
|
308
|
+
}
|
|
309
|
+
/** Candidate rowids for one page (no post-filter). */
|
|
310
|
+
function pageRowids(db, plan, limit) {
|
|
311
|
+
const scores = new Map();
|
|
312
|
+
const sql = plan.rankOrder
|
|
313
|
+
? `SELECT rowid AS rowid, rank AS score FROM docs WHERE ${plan.where} ORDER BY rank LIMIT ?`
|
|
314
|
+
: `SELECT rowid AS rowid FROM docs WHERE ${plan.where} LIMIT ?`;
|
|
315
|
+
const rows = db.prepare(sql).all(...plan.params, limit);
|
|
316
|
+
const rowids = [];
|
|
317
|
+
for (const row of rows) {
|
|
318
|
+
if (typeof row.rowid !== 'number')
|
|
319
|
+
continue;
|
|
320
|
+
rowids.push(row.rowid);
|
|
321
|
+
if (typeof row.score === 'number')
|
|
322
|
+
scores.set(row.rowid, row.score);
|
|
323
|
+
}
|
|
324
|
+
return { rowids, scores };
|
|
325
|
+
}
|
|
326
|
+
/** Exact COUNT over the plan's WHERE fragment. */
|
|
327
|
+
function exactCount(db, plan) {
|
|
328
|
+
const row = db.prepare(`SELECT count(*) AS n FROM docs WHERE ${plan.where}`).get(...plan.params);
|
|
329
|
+
return Number(row?.n ?? 0);
|
|
330
|
+
}
|
|
331
|
+
/** Count up to `limit + 1` rows: exact below the cap, bounded at the cap. */
|
|
332
|
+
function boundedCount(db, plan, limit) {
|
|
333
|
+
const row = db
|
|
334
|
+
.prepare(`SELECT count(*) AS n FROM (SELECT rowid FROM docs WHERE ${plan.where} LIMIT ?)`)
|
|
335
|
+
.get(...plan.params, limit + 1);
|
|
336
|
+
const value = Number(row?.n ?? 0);
|
|
337
|
+
if (value > limit)
|
|
338
|
+
return { value: limit, kind: 'bounded', limit };
|
|
339
|
+
return { value, kind: 'exact' };
|
|
340
|
+
}
|
|
341
|
+
function scanWholeWord(db, plan, limit, countMode, countLimit, sessionScoped) {
|
|
342
|
+
const warnings = [];
|
|
343
|
+
const rowids = [];
|
|
344
|
+
const sql = plan.rankOrder
|
|
345
|
+
? `SELECT rowid AS rowid FROM docs WHERE ${plan.where} ORDER BY rank`
|
|
346
|
+
: `SELECT rowid AS rowid FROM docs WHERE ${plan.where}`;
|
|
347
|
+
const iterator = db.prepare(sql).iterate(...plan.params);
|
|
348
|
+
const bodyStatement = db.prepare('SELECT body FROM docs WHERE rowid = ?');
|
|
349
|
+
let count = 0;
|
|
350
|
+
let exhausted = true;
|
|
351
|
+
for (const raw of iterator) {
|
|
352
|
+
const rowid = raw.rowid;
|
|
353
|
+
if (typeof rowid !== 'number')
|
|
354
|
+
continue;
|
|
355
|
+
const row = bodyStatement.get(rowid);
|
|
356
|
+
if (row === undefined || typeof row.body !== 'string')
|
|
357
|
+
continue;
|
|
358
|
+
if (!matchesWholeWord(row.body, plan.terms, plan.caseSensitive))
|
|
359
|
+
continue;
|
|
360
|
+
count++;
|
|
361
|
+
if (rowids.length < limit)
|
|
362
|
+
rowids.push(rowid);
|
|
363
|
+
if (countMode === 'none') {
|
|
364
|
+
if (rowids.length >= limit)
|
|
365
|
+
break;
|
|
366
|
+
}
|
|
367
|
+
else if (!sessionScoped && count > countLimit) {
|
|
368
|
+
exhausted = false;
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
let result;
|
|
373
|
+
if (countMode === 'none') {
|
|
374
|
+
result = { value: 0, kind: 'unknown' };
|
|
375
|
+
}
|
|
376
|
+
else if (!exhausted || count > countLimit) {
|
|
377
|
+
// Above the cap: report the known floor, never an exact count we did not
|
|
378
|
+
// finish. Global whole-word counts are deliberately bounded.
|
|
379
|
+
result = { value: countLimit, kind: 'bounded', limit: countLimit };
|
|
380
|
+
warnings.push('bounded-count');
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
result = { value: count, kind: 'exact' };
|
|
384
|
+
}
|
|
385
|
+
return { rowids, count: result, warnings: [...new Set(warnings)] };
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Run one content query.
|
|
389
|
+
*
|
|
390
|
+
* Modes: `normal` (whitespace-separated substring terms), `extended`
|
|
391
|
+
* (Notepad++ escapes, one literal phrase), `regex` (not executed server-side in
|
|
392
|
+
* 0.9.0: returns `content-regex-not-supported`).
|
|
393
|
+
*/
|
|
394
|
+
export function searchContent(db, query, limit, options = {}) {
|
|
13
395
|
const text = query.trim();
|
|
396
|
+
const capped = clampLimit(limit);
|
|
397
|
+
const matchMode = options.matchMode ?? 'normal';
|
|
398
|
+
const countMode = options.count ?? 'exact';
|
|
399
|
+
const countLimit = clampCountLimit(options.countLimit);
|
|
400
|
+
const warnings = [];
|
|
14
401
|
if (text === '')
|
|
15
|
-
return [];
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
402
|
+
return { hits: [], count: emptyCount(countMode), warnings };
|
|
403
|
+
if (matchMode === 'regex') {
|
|
404
|
+
return {
|
|
405
|
+
hits: [],
|
|
406
|
+
count: { value: 0, kind: 'unknown' },
|
|
407
|
+
warnings: ['content-regex-paused'],
|
|
408
|
+
error: 'content-regex-not-supported',
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
let terms;
|
|
412
|
+
let phrase = false;
|
|
413
|
+
if (matchMode === 'extended') {
|
|
414
|
+
const decoded = decodeExtended(text);
|
|
415
|
+
warnings.push(...decoded.warnings);
|
|
416
|
+
if (!decoded.ok) {
|
|
417
|
+
return { hits: [], count: { value: 0, kind: 'unknown' }, warnings, error: decoded.error ?? 'invalid-escape' };
|
|
418
|
+
}
|
|
419
|
+
phrase = true;
|
|
420
|
+
terms = decoded.text === '' ? [] : [decoded.text];
|
|
25
421
|
}
|
|
26
422
|
else {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
423
|
+
terms = splitTerms(text);
|
|
424
|
+
}
|
|
425
|
+
if (terms.length === 0)
|
|
426
|
+
return { hits: [], count: emptyCount(countMode), warnings };
|
|
427
|
+
const sessionPath = options.sessionPath ?? null;
|
|
428
|
+
const plan = buildPlan(terms, {
|
|
429
|
+
caseSensitive: options.caseSensitive === true,
|
|
430
|
+
wholeWord: options.wholeWord === true,
|
|
431
|
+
phrase,
|
|
432
|
+
sessionPath,
|
|
433
|
+
});
|
|
434
|
+
if (plan === null)
|
|
435
|
+
return { hits: [], count: emptyCount(countMode), warnings };
|
|
436
|
+
if (plan.wholeWord) {
|
|
437
|
+
const scanned = scanWholeWord(db, plan, capped, countMode, countLimit, sessionPath !== null);
|
|
438
|
+
warnings.push(...scanned.warnings);
|
|
439
|
+
const hits = buildHits(db, plan, scanned.rowids, new Map());
|
|
440
|
+
return { hits, count: scanned.count, warnings: [...new Set(warnings)] };
|
|
441
|
+
}
|
|
442
|
+
let count;
|
|
443
|
+
if (countMode === 'none') {
|
|
444
|
+
count = { value: 0, kind: 'unknown' };
|
|
445
|
+
}
|
|
446
|
+
else if (countMode === 'bounded') {
|
|
447
|
+
count = boundedCount(db, plan, countLimit);
|
|
448
|
+
if (count.kind === 'bounded')
|
|
449
|
+
warnings.push('bounded-count');
|
|
450
|
+
}
|
|
451
|
+
else if (plan.exactCount && !plan.boundedCount) {
|
|
452
|
+
count = { value: exactCount(db, plan), kind: 'exact' };
|
|
453
|
+
}
|
|
454
|
+
else {
|
|
455
|
+
// LIKE plans and very common GLOB patterns cannot count cheaply: cap the
|
|
456
|
+
// work and report the known floor plus a warning.
|
|
457
|
+
count = boundedCount(db, plan, countLimit);
|
|
458
|
+
if (count.kind === 'bounded')
|
|
459
|
+
warnings.push('bounded-count');
|
|
460
|
+
}
|
|
461
|
+
const page = pageRowids(db, plan, capped);
|
|
462
|
+
const hits = buildHits(db, plan, page.rowids, page.scores);
|
|
463
|
+
return { hits, count, warnings: [...new Set(warnings)] };
|
|
46
464
|
}
|
|
47
465
|
//# sourceMappingURL=content-search.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-search.js","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,EAAgB,EAAE,KAAa,EAAE,KAAa;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAA;IACzB,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,CAAA;IAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IAChD,IAAI,IAAoC,CAAA;IACxC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,2EAA2E;QAC3E,sEAAsE;QACtE,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;wDAGkC,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAmC,CAAA;IAC3G,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC7G,2EAA2E;QAC3E,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;0DAGoC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAmC,CAAA;IAC9G,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QACjD,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAC5B,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAC7E,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;KAC9B,CAAC,CAAC,CAAA;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"content-search.js","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"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"}
|
package/lib/content.d.ts
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
* alone unless `includeArchived` is set.
|
|
16
16
|
* @module dsh-locator/content
|
|
17
17
|
*/
|
|
18
|
+
import { type ContentSearchOptions, type ContentSearchResult } from './content-search.ts';
|
|
18
19
|
import type { LocatorRuntime } from './runtime.ts';
|
|
19
20
|
export interface ContentHit {
|
|
20
21
|
kind: 'file' | 'session';
|
|
@@ -25,6 +26,8 @@ export interface ContentHit {
|
|
|
25
26
|
messageId?: string;
|
|
26
27
|
/** Exact `data-chat-node-key` of the rendered row, when the host has one. */
|
|
27
28
|
nodeKey?: string;
|
|
29
|
+
/** 1-based line of the first match inside the stored body, for file hits. */
|
|
30
|
+
line?: number;
|
|
28
31
|
score: number;
|
|
29
32
|
}
|
|
30
33
|
export interface ContentState {
|
|
@@ -73,6 +76,8 @@ export declare class ContentIndex {
|
|
|
73
76
|
private workerSeq;
|
|
74
77
|
private pendingStart;
|
|
75
78
|
private dbIdentity;
|
|
79
|
+
/** Session id → indexed session log path, for session-scoped content search. */
|
|
80
|
+
private readonly sessionPaths;
|
|
76
81
|
private readonly pending;
|
|
77
82
|
constructor(rt: LocatorRuntime, options: ContentOptions);
|
|
78
83
|
status(): ContentState;
|
|
@@ -143,6 +148,12 @@ export declare class ContentIndex {
|
|
|
143
148
|
/** True when a session log has been quiet long enough to be read safely. */
|
|
144
149
|
private settled;
|
|
145
150
|
private finish;
|
|
151
|
+
/**
|
|
152
|
+
* Rebuild the session id → session log path map from the persisted sources.
|
|
153
|
+
* Runs after `open()` and after every build/refresh, so session-scoped
|
|
154
|
+
* searches work against an existing database before the first refresh ends.
|
|
155
|
+
*/
|
|
156
|
+
private refreshSessionPaths;
|
|
146
157
|
private addDoc;
|
|
147
158
|
private deleteDoc;
|
|
148
159
|
private deletePath;
|
|
@@ -161,11 +172,20 @@ export declare class ContentIndex {
|
|
|
161
172
|
* Search file bodies and session messages. With `searchWorker` enabled the
|
|
162
173
|
* query itself runs off the host thread; a failed or wedged worker falls back
|
|
163
174
|
* to the in-process query so a result is still produced.
|
|
175
|
+
*
|
|
176
|
+
* The two-argument form returns the hit array (tools and the legacy
|
|
177
|
+
* `/content` route). The three-argument form returns hits plus count,
|
|
178
|
+
* warnings and an error code, and understands the advanced match options.
|
|
164
179
|
* @param query - words or a phrase to find.
|
|
165
180
|
* @param limit - maximum hits.
|
|
181
|
+
* @param options - match mode, case/whole-word flags, session scope, count mode.
|
|
166
182
|
* @returns matching documents ordered by relevance.
|
|
167
183
|
*/
|
|
168
184
|
search(query: string, limit: number): Promise<ContentHit[]>;
|
|
185
|
+
search(query: string, limit: number, options: ContentSearchOptions): Promise<ContentSearchResult>;
|
|
186
|
+
private searchDetailed;
|
|
187
|
+
/** Map a request's sessionId onto the indexed session log path. */
|
|
188
|
+
private resolveSession;
|
|
169
189
|
private searchSync;
|
|
170
190
|
}
|
|
171
191
|
//# sourceMappingURL=content.d.ts.map
|
package/lib/content.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;
|
|
1
|
+
{"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
|