dsh-locator 0.10.1 → 0.11.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 +10 -0
- package/README-es.md +7 -0
- package/README-hi.md +7 -0
- package/README-pt.md +7 -0
- package/README.en.md +8 -0
- package/README.md +8 -0
- package/bin/darwin-arm64/indexd +0 -0
- package/bin/darwin-x64/indexd +0 -0
- package/bin/linux-arm64/indexd +0 -0
- package/bin/linux-x64/indexd +0 -0
- package/bin/win32-arm64/indexd.exe +0 -0
- package/bin/win32-x64/indexd.exe +0 -0
- package/client.js +173 -10
- package/lib/combined.d.ts +6 -0
- package/lib/combined.d.ts.map +1 -1
- package/lib/combined.js +6 -1
- package/lib/combined.js.map +1 -1
- package/lib/content-search.d.ts +2 -0
- package/lib/content-search.d.ts.map +1 -1
- package/lib/content-search.js +8 -8
- package/lib/content-search.js.map +1 -1
- package/lib/find.d.ts +1 -1
- package/lib/find.d.ts.map +1 -1
- package/lib/find.js +9 -2
- package/lib/find.js.map +1 -1
- package/lib/http.js +19 -1
- package/lib/http.js.map +1 -1
- package/lib/index.js +1 -1
- package/lib/index.js.map +1 -1
- package/lib/reveal.d.ts +7 -0
- package/lib/reveal.d.ts.map +1 -1
- package/lib/reveal.js +56 -4
- package/lib/reveal.js.map +1 -1
- package/package.json +1 -1
- package/src/combined.ts +12 -1
- package/src/content-search.ts +10 -7
- package/src/find.ts +9 -2
- package/src/http.ts +16 -1
- package/src/index.ts +1 -1
- package/src/reveal.ts +45 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.11.0 — 2026-11-13
|
|
4
|
+
|
|
5
|
+
Search coverage, panel productivity and boundary hardening.
|
|
6
|
+
|
|
7
|
+
* **Full content index mode**: setting `contentMaxTotalBytes: 0` and `contentMaxFiles: 0` indexes every eligible text file (reference machine: ~185k eligible files / 2.0 GB text, ~5.9 GB FTS database; contentExcludes already removes package/toolchain trees). The first build takes a few minutes and exact/first-page queries stay ~0.04–0.7 s for common terms (worker remains the only query path, timeout still bounded). The default caps stay at 1 GB / 200k so ordinary installs do not silently consume tens of GB.
|
|
8
|
+
* **`locator_find` default scope fix**: a caller cwd outside every configured root no longer restricts file hits to that cwd (which necessarily produced zero rows); it searches the indexed roots while session hits stay limited to the caller session. Explicit `scope: "all"` still crosses both. The tool description states the behavior.
|
|
9
|
+
* **Panel pagination/history/filter**: name and content groups support offsets; the panel has a Load more button, recent searches (localStorage, per-item and clear-all), and an in-results filter over loaded rows. Content search accepts an offset and returns the same total count across pages; the worker protocol carries it unchanged.
|
|
10
|
+
* **Boundary hardening**: Linux targets below a nested mount point inside a root are refused (bind-mount escape defence via `/proc/self/mountinfo`); `/open` opens the final component with `O_NOFOLLOW` and compares inode/device against the authorized stat before spawning, narrowing the TOCTOU window. Symlink/realpath checks remain.
|
|
11
|
+
* Tests: 122+ vitest (offset/page tests incl. content paging, mount-escape, outside-root locator_find, panel jsdom harness covering filter/load-more/history).
|
|
12
|
+
|
|
3
13
|
## 0.10.1 — 2026-11-12
|
|
4
14
|
|
|
5
15
|
Watcher hotfix for 0.10.0.
|
package/README-es.md
CHANGED
|
@@ -401,6 +401,13 @@ DeepSeek Harness
|
|
|
401
401
|
|
|
402
402
|
El motor es un único proceso Go y respeta las variables estándar `GOMEMLIMIT` y `GOGC` (o `memoryLimitMB` en la configuración). Un índice de 1,2–1,5 M de entradas alcanza varios cientos de MB de RSS con el GC por defecto; usa `GOMEMLIMIT=600MiB` (límite blando, el runtime cambia CPU por memoria) o `GOGC=50` cuando el host vaya justo de RAM. Ninguno cambia el formato de la instantánea. En la instalación en vivo usada para las cifras anteriores, el proceso anfitrión de DSH (incluida la caché de páginas de la base de contenido) rondaba los 700 MB de RSS con el índice construido, y la latencia del host en reposo se mantenía en p50 2 ms.
|
|
403
403
|
|
|
404
|
+
## Notas de actualización 0.11.0
|
|
405
|
+
|
|
406
|
+
- **Índice de contenido completo**: `contentMaxTotalBytes: 0` y `contentMaxFiles: 0` indexan todos los archivos de texto elegibles (~185k archivos / 2.0 GB, ~5.9 GB de FTS en la máquina de referencia); la primera construcción tarda unos minutos y las consultas rondan 0.04–0.7 s. Los límites por defecto siguen activos para no consumir decenas de GB sin avisar.
|
|
407
|
+
- `locator_find` sigue limitado al workspace; si el cwd no está dentro de ningún root indexado, ya no restringe los archivos a ese cwd (antes devolvía vacío) y busca en los roots; las sesiones siguen limitadas a la actual. Usa `scope: "all"` para cruzar ámbitos.
|
|
408
|
+
- Panel: **cargar más** (paginación por offset), **búsquedas recientes** y **filtro de resultados cargados**.
|
|
409
|
+
- Seguridad: se rechazan destinos bajo mount points anidados dentro de un root en Linux; `/open` usa `O_NOFOLLOW` y verifica el inodo.
|
|
410
|
+
|
|
404
411
|
## Notas de actualización 0.10.0
|
|
405
412
|
|
|
406
413
|
- La búsqueda de contenido requiere al menos **3 caracteres**; usa `Ctrl+F` para 1–2. Se rechazan consultas de más de 256 caracteres o 32 términos.
|
package/README-hi.md
CHANGED
|
@@ -402,6 +402,13 @@ DeepSeek Harness
|
|
|
402
402
|
|
|
403
403
|
इंजन एक Go प्रोसेस है और मानक `GOMEMLIMIT` और `GOGC` (या कॉन्फ़िग में `memoryLimitMB`) मानता है। 1.2–1.5 M एंट्री का इंडेक्स डिफ़ॉल्ट GC के साथ कई सौ MB RSS तक जाता है; होस्ट पर RAM कम हो तो `GOMEMLIMIT=600MiB` (सॉफ़्ट सीमा, रनटाइम CPU देकर मेमोरी बचाता है) या `GOGC=50` रखें। इनसे स्नैपशॉट फ़ॉर्मेट नहीं बदलता। ऊपर के आँकड़ों वाले लाइव सेटअप में DSH होस्ट प्रोसेस (कंटेंट डेटाबेस पेज कैश सहित) इंडेक्स बने रहने पर लगभग 700 MB RSS पर था, और खाली बैठे होस्ट की देरी p50 2ms रही।
|
|
404
404
|
|
|
405
|
+
## 0.11.0 अपग्रेड नोट्स
|
|
406
|
+
|
|
407
|
+
- **पूर्ण सामग्री इंडेक्स**: `contentMaxTotalBytes: 0` और `contentMaxFiles: 0` से सभी पात्र टेक्स्ट फ़ाइलें इंडेक्स होती हैं (~185k फ़ाइलें / 2.0 GB, संदर्भ मशीन पर ~5.9 GB FTS); पहला निर्माण कुछ मिनट लेता है, क्वेरी ~0.04–0.7 s रहती हैं। डिफ़ॉल्ट सीमाएँ बनी रहती हैं ताकि सामान्य उपयोग में दसियों GB अचानक न भरें।
|
|
408
|
+
- `locator_find` workspace-स्कोप्ड रहता है; यदि cwd किसी indexed root में नहीं है तो फ़ाइल हिट उस cwd तक सीमित नहीं रहते (पहले खाली आते थे), indexed roots में खोज होती है; सत्र हिट केवल वर्तमान सत्र। क्रॉस-स्कोप के लिए `scope: "all"`.
|
|
409
|
+
- पैनल: **और लोड करें** (offset पेजिंग), **हाल की खोजें**, **लोड किए गए परिणाम फ़िल्टर करें**।
|
|
410
|
+
- सुरक्षा: Linux में root के भीतर nested mount point वाले लक्ष्य अस्वीकार; `/open` `O_NOFOLLOW` से खोलकर inode जाँचता है।
|
|
411
|
+
|
|
405
412
|
## 0.10.0 अपग्रेड नोट्स
|
|
406
413
|
|
|
407
414
|
- सामग्री खोज के लिए कम से कम **3 अक्षर** चाहिए; 1–2 अक्षर के लिए `Ctrl+F` उपयोग करें। 256 अक्षर/32 शब्द से बड़ी क्वेरी अस्वीकार होती है।
|
package/README-pt.md
CHANGED
|
@@ -402,6 +402,13 @@ DeepSeek Harness
|
|
|
402
402
|
|
|
403
403
|
O motor é um único processo Go e respeita as variáveis padrão `GOMEMLIMIT` e `GOGC` (ou `memoryLimitMB` na configuração). Um índice de 1,2–1,5 M de entradas chega a várias centenas de MB de RSS com o GC padrão; use `GOMEMLIMIT=600MiB` (limite suave, o runtime troca CPU por memória) ou `GOGC=50` quando o host estiver apertado de RAM. Nenhum altera o formato do snapshot. Na instalação ao vivo usada para os números acima, o processo anfitrião do DSH (incluindo o cache de páginas do banco de conteúdo) ficava por volta de 700 MB de RSS com o índice construído, e a latência do host ocioso permanecia em p50 2 ms.
|
|
404
404
|
|
|
405
|
+
## Notas de atualização 0.11.0
|
|
406
|
+
|
|
407
|
+
- **Índice de conteúdo completo**: `contentMaxTotalBytes: 0` e `contentMaxFiles: 0` indexam todos os arquivos de texto elegíveis (~185k arquivos / 2.0 GB, ~5.9 GB de FTS na máquina de referência); a primeira construção leva alguns minutos e as consultas ficam em ~0,04–0,7 s. Os limites padrão continuam ativos para não consumir dezenas de GB sem aviso.
|
|
408
|
+
- `locator_find` continua no workspace; se o cwd estiver fora de todos os roots indexados, ele não restringe mais os arquivos a esse cwd (antes retornava vazio) e busca nos roots; sessões continuam limitadas à atual. Use `scope: "all"` para cruzar escopos.
|
|
409
|
+
- Painel: **carregar mais** (paginação por offset), **buscas recentes** e **filtro dos resultados carregados**.
|
|
410
|
+
- Segurança: rejeita destinos sob mount points aninhados dentro de um root no Linux; `/open` usa `O_NOFOLLOW` e confere o inode.
|
|
411
|
+
|
|
405
412
|
## Notas de atualização 0.10.0
|
|
406
413
|
|
|
407
414
|
- A busca de conteúdo exige pelo menos **3 caracteres**; use `Ctrl+F` para 1–2. Consultas com mais de 256 caracteres ou 32 termos são rejeitadas.
|
package/README.en.md
CHANGED
|
@@ -402,6 +402,14 @@ DeepSeek Harness
|
|
|
402
402
|
|
|
403
403
|
The engine is a single Go process and honours the standard `GOMEMLIMIT` and `GOGC` environment variables (or `memoryLimitMB` in the config). A 1.2–1.5 M-entry index peaks around several hundred MB of RSS with the default GC; set `GOMEMLIMIT=600MiB` (soft limit, the runtime trades CPU for memory) or `GOGC=50` when the host is tight on RAM. Neither changes the snapshot format. In the live setup used for the numbers above, the DSH host process (including the content database page cache) sat around 700 MB RSS with the content index built, and idle host latency stayed at p50 2 ms.
|
|
404
404
|
|
|
405
|
+
## 0.11.0 upgrade notes
|
|
406
|
+
|
|
407
|
+
- **Full content index**: set `contentMaxTotalBytes: 0` and `contentMaxFiles: 0` to index every eligible text file. On the reference machine that is ~**185k files / 2.0 GB** of text, ~**5.9 GB** FTS database; the first build takes a few minutes and queries stay ~**0.04–0.7 s**. The default caps (1 GB / 200k) stay in place so ordinary installs do not silently consume tens of GB; the panel shows `truncated`.
|
|
408
|
+
- `locator_find` stays workspace-scoped (current session + caller cwd), but when the caller cwd is **outside every indexed root** it no longer restricts file hits to that cwd (which could only return nothing); it searches the indexed roots and still limits session hits to the current session. Use `scope: "all"` to cross scopes explicitly.
|
|
409
|
+
- Panel: **load more** (offset paging), **recent searches** (localStorage, clearable), and **filter loaded results**.
|
|
410
|
+
- Security: reject targets below nested mount points inside a root on Linux (bind-mount escape); `/open` opens with `O_NOFOLLOW` and verifies the inode, narrowing the TOCTOU window.
|
|
411
|
+
- Content queries accept offsets; name/content groups page independently.
|
|
412
|
+
|
|
405
413
|
## 0.10.0 upgrade notes
|
|
406
414
|
|
|
407
415
|
- Content search requires at least **3 characters**; use `Ctrl+F` for 1–2 character searches. Queries over 256 characters/32 terms are rejected.
|
package/README.md
CHANGED
|
@@ -364,6 +364,14 @@ Go 引擎在 `engine/` 下,测试用 `cd engine && go test ./...`。macOS 的
|
|
|
364
364
|
- 当前会话范围只覆盖已落定索引的会话消息(活跃会话约 2 分钟延迟);实时查找用 `Ctrl+F`。会话内查找条只覆盖已加载窗口,更早历史需手动加载。
|
|
365
365
|
- 会话内高亮依赖 CSS Custom Highlight API;不支持它的旧浏览器会退化为整行描边。
|
|
366
366
|
|
|
367
|
+
## 0.11.0 升级注意
|
|
368
|
+
|
|
369
|
+
- **全量内容索引**:把 `contentMaxTotalBytes` 和 `contentMaxFiles` 都设为 `0`,即可索引全部符合文本扩展名/单文件上限的文件。实测本机 eligible 约 **185k 文件 / 2.0GB 文本**,FTS 库约 **5.9GB**;首次构建约几分钟,查询约 **0.04–0.7s**。默认仍保留 1GB/200k 上限,避免普通用户磁盘暴涨;面板会显示 `truncated`。
|
|
370
|
+
- `locator_find` 默认仍 workspace:当前会话 + 调用者 cwd;但如果 cwd **不在任何已索引 root 内**,不再把文件命中限制到 cwd(否则必然为空),而是搜索已索引 root 的文件;会话仍只查当前会话。跨范围仍用 `scope:"all"`。
|
|
371
|
+
- 面板新增:**加载更多**(按 offset 分页)、**最近搜索**(localStorage,可清空)、**过滤已加载结果**。
|
|
372
|
+
- 安全:Linux 下拒绝 root 内嵌套 mount point 的目标(bind mount 防逃逸);`/open` 用 `O_NOFOLLOW` 打开并核对 inode,缩小 TOCTOU 窗口。
|
|
373
|
+
- 内容查询支持 offset;名称/内容分组各自分页。
|
|
374
|
+
|
|
367
375
|
## 0.10.0 升级注意
|
|
368
376
|
|
|
369
377
|
- 内容搜索最短 **3 个字符**;1–2 字符请用 `Ctrl+F` 会话内查找。查询超过 256 字符/32 个词会直接报错。
|
package/bin/darwin-arm64/indexd
CHANGED
|
Binary file
|
package/bin/darwin-x64/indexd
CHANGED
|
Binary file
|
package/bin/linux-arm64/indexd
CHANGED
|
Binary file
|
package/bin/linux-x64/indexd
CHANGED
|
Binary file
|
|
Binary file
|
package/bin/win32-x64/indexd.exe
CHANGED
|
Binary file
|
package/client.js
CHANGED
|
@@ -83,6 +83,13 @@ window.__ModuleLoader__.load({
|
|
|
83
83
|
.dsh-locator-bar .grow{flex:1}
|
|
84
84
|
.dsh-locator-sort{border:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.3));border-radius:6px;background:transparent;color:inherit;font:inherit;font-size:11.5px;padding:2px 4px}
|
|
85
85
|
.dsh-locator-dirbtn{border:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.3));border-radius:6px;background:transparent;color:inherit;font:inherit;font-size:11.5px;padding:2px 6px;cursor:pointer}
|
|
86
|
+
.dsh-locator-history{display:flex;align-items:center;gap:6px;padding:5px 14px;border-bottom:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.1));overflow:auto;white-space:nowrap}
|
|
87
|
+
.dsh-locator-history-label{font-size:10.5px;opacity:.6;flex:none}
|
|
88
|
+
.dsh-locator-chip{display:inline-flex;align-items:center;gap:2px;border:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.25));border-radius:999px;padding:1px 2px 1px 8px;flex:none}
|
|
89
|
+
.dsh-locator-chip-go,.dsh-locator-chip-x{border:0;background:transparent;color:inherit;font:inherit;font-size:10.5px;cursor:pointer;padding:1px 3px}
|
|
90
|
+
.dsh-locator-chip-x{opacity:.55}
|
|
91
|
+
.dsh-locator-filterbar{display:flex;align-items:center;gap:8px;padding:5px 14px;border-bottom:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.1))}
|
|
92
|
+
.dsh-locator-filter{flex:1;min-width:0;border:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.2));border-radius:5px;background:transparent;color:inherit;font:inherit;font-size:11.5px;padding:2px 7px}
|
|
86
93
|
.dsh-locator-status{margin-left:auto;opacity:.65;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:50%}
|
|
87
94
|
.dsh-locator-scroll{overflow:auto;flex:1;min-height:160px}
|
|
88
95
|
.dsh-locator-group{display:block;border-bottom:1px solid var(--dsw-alias-border-base,rgba(120,125,135,.12))}
|
|
@@ -229,6 +236,7 @@ body[data-ds-dark-theme] .dsh-locator-overlay{background:var(--dsw-alias-bg-mask
|
|
|
229
236
|
contentWarning: 'Index warning: {list}', contentBudget: 'Content index budget reached; some files are not indexed', contentTooShort: 'Content needs at least 3 characters (use Ctrl+F for shorter searches)', contentTimeout: 'Content search timed out; narrow the query or scope', contentBadChars: 'Content search does not support NUL/control characters',
|
|
230
237
|
panelCaseShort: 'Aa', panelWholeShort: 'Word', panelModeLabel: 'Mode',
|
|
231
238
|
watchDegraded: 'watcher degraded; periodic refresh active',
|
|
239
|
+
panelFilter: 'Filter loaded results…', filterEmpty: 'No loaded result matches this filter', panelLoadMore: 'Load more', panelHistory: 'Recent searches', panelHistoryClear: 'Clear',
|
|
232
240
|
},
|
|
233
241
|
zh: {
|
|
234
242
|
scopeContent: '内容', scopeFiles: '文件', scopeDirs: '目录',
|
|
@@ -275,6 +283,7 @@ contentWarning: 'Index warning: {list}', contentBudget: 'Content index budget re
|
|
|
275
283
|
contentWarning: '索引警告:{list}', contentBudget: '内容索引已达预算上限,部分文件未被收录', contentTooShort: '内容搜索至少需要 3 个字符(更短的词请用 Ctrl+F 在会话内查找)', contentTimeout: '内容搜索超时,请缩小关键词或范围', contentBadChars: '内容搜索不支持 NUL/控制字符',
|
|
276
284
|
panelCaseShort: 'Aa', panelWholeShort: '全词', panelModeLabel: '模式',
|
|
277
285
|
watchDegraded: '文件监听降级,正在周期刷新',
|
|
286
|
+
panelFilter: '过滤当前结果…', filterEmpty: '已加载结果中没有符合过滤条件的内容', panelLoadMore: '加载更多', panelHistory: '最近搜索', panelHistoryClear: '清空',
|
|
278
287
|
},
|
|
279
288
|
es: {
|
|
280
289
|
scopeContent: 'Contenido', scopeFiles: 'Archivos', scopeDirs: 'Carpetas',
|
|
@@ -321,6 +330,7 @@ contentWarning: '索引警告:{list}', contentBudget: '内容索引已达预
|
|
|
321
330
|
contentWarning: 'Aviso del índice: {list}', contentBudget: 'Se alcanzó el presupuesto del índice; algunos archivos no están indexados', contentTooShort: 'El contenido requiere al menos 3 caracteres (usa Ctrl+F para búsquedas más cortas)', contentTimeout: 'La búsqueda de contenido agotó el tiempo; reduce la consulta o el ámbito', contentBadChars: 'La búsqueda de contenido no admite NUL/caracteres de control',
|
|
322
331
|
panelCaseShort: 'Aa', panelWholeShort: 'Palabra', panelModeLabel: 'Modo',
|
|
323
332
|
watchDegraded: 'vigilante degradado; refresco periódico activo',
|
|
333
|
+
panelFilter: 'Filtrar resultados cargados…', filterEmpty: 'Ningún resultado cargado coincide con el filtro', panelLoadMore: 'Cargar más', panelHistory: 'Búsquedas recientes', panelHistoryClear: 'Borrar',
|
|
324
334
|
},
|
|
325
335
|
pt: {
|
|
326
336
|
scopeContent: 'Conteúdo', scopeFiles: 'Arquivos', scopeDirs: 'Pastas',
|
|
@@ -367,6 +377,7 @@ contentWarning: 'Aviso del índice: {list}', contentBudget: 'Se alcanzó el pres
|
|
|
367
377
|
contentWarning: 'Aviso do índice: {list}', contentBudget: 'O orçamento do índice foi atingido; alguns arquivos não estão indexados', contentTooShort: 'O conteúdo exige pelo menos 3 caracteres (use Ctrl+F para buscas menores)', contentTimeout: 'A busca de conteúdo excedeu o tempo; reduza a consulta ou o escopo', contentBadChars: 'A busca de conteúdo não suporta NUL/caracteres de controle',
|
|
368
378
|
panelCaseShort: 'Aa', panelWholeShort: 'Palavra', panelModeLabel: 'Modo',
|
|
369
379
|
watchDegraded: 'watcher degradado; atualização periódica ativa',
|
|
380
|
+
panelFilter: 'Filtrar resultados carregados…', filterEmpty: 'Nenhum resultado carregado corresponde ao filtro', panelLoadMore: 'Carregar mais', panelHistory: 'Buscas recentes', panelHistoryClear: 'Limpar',
|
|
370
381
|
},
|
|
371
382
|
hi: {
|
|
372
383
|
scopeContent: 'सामग्री', scopeFiles: 'फ़ाइलें', scopeDirs: 'फ़ोल्डर',
|
|
@@ -413,6 +424,7 @@ contentWarning: 'Aviso do índice: {list}', contentBudget: 'O orçamento do índ
|
|
|
413
424
|
contentWarning: 'इंडेक्स चेतावनी: {list}', contentBudget: 'सामग्री इंडेक्स बजट पूरा; कुछ फ़ाइलें इंडेक्स नहीं हैं', contentTooShort: 'सामग्री के लिए कम से कम 3 अक्षर चाहिए (छोटी खोज के लिए Ctrl+F)', contentTimeout: 'सामग्री खोज का समय समाप्त; क्वेरी या क्षेत्र घटाएँ', contentBadChars: 'सामग्री खोज NUL/नियंत्रण अक्षर नहीं लेती',
|
|
414
425
|
panelCaseShort: 'Aa', panelWholeShort: 'शब्द', panelModeLabel: 'मोड',
|
|
415
426
|
watchDegraded: 'वॉचर क्षीण; आवधिक रिफ्रेश सक्रिय',
|
|
427
|
+
panelFilter: 'लोड किए गए परिणाम छाँटें…', filterEmpty: 'लोड किए गए परिणामों में फ़िल्टर से मेल नहीं', panelLoadMore: 'और लोड करें', panelHistory: 'हाल की खोजें', panelHistoryClear: 'साफ़ करें',
|
|
416
428
|
},
|
|
417
429
|
}
|
|
418
430
|
const LANG = (() => {
|
|
@@ -1730,6 +1742,17 @@ self.onmessage = event => {
|
|
|
1730
1742
|
)
|
|
1731
1743
|
}
|
|
1732
1744
|
|
|
1745
|
+
const PANEL_HISTORY_KEY = 'dsh-locator-panel-history-v1'
|
|
1746
|
+
function readPanelHistory() {
|
|
1747
|
+
try {
|
|
1748
|
+
const parsed = JSON.parse(localStorage.getItem(PANEL_HISTORY_KEY) || '[]')
|
|
1749
|
+
return Array.isArray(parsed) ? parsed.filter(value => typeof value === 'string').slice(0, 10) : []
|
|
1750
|
+
} catch { return [] }
|
|
1751
|
+
}
|
|
1752
|
+
function writePanelHistory(list) {
|
|
1753
|
+
try { localStorage.setItem(PANEL_HISTORY_KEY, JSON.stringify(list.slice(0, 10))) } catch { /* ignore */ }
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1733
1756
|
function Panel() {
|
|
1734
1757
|
const open = useOpen()
|
|
1735
1758
|
const prefs = useMemo(readPrefs, [])
|
|
@@ -1739,6 +1762,10 @@ self.onmessage = event => {
|
|
|
1739
1762
|
const [scopes, setScopes] = useState(prefs.scopes)
|
|
1740
1763
|
const [groups, setGroups] = useState(null)
|
|
1741
1764
|
const [loading, setLoading] = useState(false)
|
|
1765
|
+
const [loadingMore, setLoadingMore] = useState(false)
|
|
1766
|
+
const [filter, setFilter] = useState('')
|
|
1767
|
+
const [history, setHistory] = useState(readPanelHistory)
|
|
1768
|
+
const [offsets, setOffsets] = useState({ files: 0, dirs: 0, content: 0 })
|
|
1742
1769
|
const [error, setError] = useState('')
|
|
1743
1770
|
const [took, setTook] = useState(0)
|
|
1744
1771
|
const [status, setStatus] = useState(null)
|
|
@@ -1769,6 +1796,21 @@ self.onmessage = event => {
|
|
|
1769
1796
|
writePrefs({ scopes, sort, desc, matchMode, caseSensitive, wholeWord })
|
|
1770
1797
|
}, [scopes, sort, desc, matchMode, caseSensitive, wholeWord])
|
|
1771
1798
|
|
|
1799
|
+
useEffect(() => {
|
|
1800
|
+
if (!open) return undefined
|
|
1801
|
+
const text = query.trim()
|
|
1802
|
+
if (text.length < 2) return undefined
|
|
1803
|
+
const timer = setTimeout(() => {
|
|
1804
|
+
setHistory(previous => {
|
|
1805
|
+
if (previous[0] === text) return previous
|
|
1806
|
+
const next = [text, ...previous.filter(value => value !== text)].slice(0, 10)
|
|
1807
|
+
writePanelHistory(next)
|
|
1808
|
+
return next
|
|
1809
|
+
})
|
|
1810
|
+
}, 900)
|
|
1811
|
+
return () => clearTimeout(timer)
|
|
1812
|
+
}, [open, query])
|
|
1813
|
+
|
|
1772
1814
|
useEffect(() => {
|
|
1773
1815
|
if (!open) return undefined
|
|
1774
1816
|
if (sessionOnly && activeSessionId === '') setSessionOnly(false)
|
|
@@ -1839,6 +1881,7 @@ self.onmessage = event => {
|
|
|
1839
1881
|
abortRef.current = controller
|
|
1840
1882
|
setLoading(true)
|
|
1841
1883
|
setError('')
|
|
1884
|
+
setOffsets({ files: 0, dirs: 0, content: 0 })
|
|
1842
1885
|
post('/dsh-locator/combined', {
|
|
1843
1886
|
query,
|
|
1844
1887
|
content: effectiveScopes.content,
|
|
@@ -1846,6 +1889,9 @@ self.onmessage = event => {
|
|
|
1846
1889
|
dirs: effectiveScopes.dirs,
|
|
1847
1890
|
limit: PAGE_NAME,
|
|
1848
1891
|
contentLimit: PAGE_CONTENT,
|
|
1892
|
+
filesOffset: 0,
|
|
1893
|
+
dirsOffset: 0,
|
|
1894
|
+
contentOffset: 0,
|
|
1849
1895
|
sort,
|
|
1850
1896
|
desc,
|
|
1851
1897
|
matchMode,
|
|
@@ -1860,6 +1906,11 @@ self.onmessage = event => {
|
|
|
1860
1906
|
files: data.files,
|
|
1861
1907
|
dirs: data.dirs,
|
|
1862
1908
|
})
|
|
1909
|
+
setOffsets({
|
|
1910
|
+
files: data.files?.returned ?? 0,
|
|
1911
|
+
dirs: data.dirs?.returned ?? 0,
|
|
1912
|
+
content: data.content?.returned ?? 0,
|
|
1913
|
+
})
|
|
1863
1914
|
if (typeof data.contentEnabled === 'boolean') setAvailableContent(data.contentEnabled)
|
|
1864
1915
|
setTook(typeof data.tookMs === 'number' ? data.tookMs : 0)
|
|
1865
1916
|
setLoading(false)
|
|
@@ -1879,16 +1930,25 @@ self.onmessage = event => {
|
|
|
1879
1930
|
return () => clearTimeout(timer)
|
|
1880
1931
|
}, [open, contentBuilding, refreshTick])
|
|
1881
1932
|
|
|
1933
|
+
const panelHitKey = (group, hit) => group + '|' + String(hit.path || '') + '|' + String(hit.messageId || '')
|
|
1882
1934
|
const rows = useMemo(() => {
|
|
1883
1935
|
if (groups === null) return []
|
|
1936
|
+
const needle = filter.trim().toLowerCase()
|
|
1884
1937
|
const out = []
|
|
1885
1938
|
for (const group of ['content', 'files', 'dirs']) {
|
|
1886
1939
|
if (!effectiveScopes[group]) continue
|
|
1887
1940
|
const hits = groups[group] && Array.isArray(groups[group].hits) ? groups[group].hits : []
|
|
1888
|
-
for (const hit of hits)
|
|
1941
|
+
for (const hit of hits) {
|
|
1942
|
+
if (needle !== '') {
|
|
1943
|
+
const haystack = [hit.path, hit.name, hit.title, hit.snippet].filter(value => typeof value === 'string').join(' ').toLowerCase()
|
|
1944
|
+
if (!haystack.includes(needle)) continue
|
|
1945
|
+
}
|
|
1946
|
+
out.push({ group, hit })
|
|
1947
|
+
}
|
|
1889
1948
|
}
|
|
1890
1949
|
return out
|
|
1891
|
-
}, [groups, effectiveScopes.content, effectiveScopes.files, effectiveScopes.dirs])
|
|
1950
|
+
}, [groups, effectiveScopes.content, effectiveScopes.files, effectiveScopes.dirs, filter])
|
|
1951
|
+
const rowIndexByKey = useMemo(() => new Map(rows.map((entry, index) => [panelHitKey(entry.group, entry.hit), index])), [rows])
|
|
1892
1952
|
|
|
1893
1953
|
useEffect(() => {
|
|
1894
1954
|
setSelected(value => Math.min(Math.max(0, value), Math.max(0, rows.length - 1)))
|
|
@@ -2036,6 +2096,81 @@ self.onmessage = event => {
|
|
|
2036
2096
|
if (row && typeof row.scrollIntoView === 'function') row.scrollIntoView({ block: 'nearest' })
|
|
2037
2097
|
}, [selected])
|
|
2038
2098
|
|
|
2099
|
+
const loadMore = useCallback(async () => {
|
|
2100
|
+
if (loading || loadingMore || groups === null) return
|
|
2101
|
+
setLoadingMore(true)
|
|
2102
|
+
setError('')
|
|
2103
|
+
try {
|
|
2104
|
+
const data = await post('/dsh-locator/combined', {
|
|
2105
|
+
query,
|
|
2106
|
+
content: effectiveScopes.content,
|
|
2107
|
+
files: effectiveScopes.files,
|
|
2108
|
+
dirs: effectiveScopes.dirs,
|
|
2109
|
+
limit: PAGE_NAME,
|
|
2110
|
+
contentLimit: PAGE_CONTENT,
|
|
2111
|
+
filesOffset: offsets.files,
|
|
2112
|
+
dirsOffset: offsets.dirs,
|
|
2113
|
+
contentOffset: offsets.content,
|
|
2114
|
+
sort,
|
|
2115
|
+
desc,
|
|
2116
|
+
matchMode,
|
|
2117
|
+
caseSensitive,
|
|
2118
|
+
wholeWord,
|
|
2119
|
+
sessionId: sessionOnly ? activeSessionId : '',
|
|
2120
|
+
count: matchMode === 'regex' ? 'none' : 'exact',
|
|
2121
|
+
})
|
|
2122
|
+
setGroups(previous => {
|
|
2123
|
+
if (previous === null) return previous
|
|
2124
|
+
const merged = { ...previous }
|
|
2125
|
+
for (const key of ['content', 'files', 'dirs']) {
|
|
2126
|
+
const oldGroup = previous[key]
|
|
2127
|
+
const nextGroup = data[key]
|
|
2128
|
+
if (oldGroup === undefined || nextGroup === undefined) continue
|
|
2129
|
+
const oldHits = Array.isArray(oldGroup.hits) ? oldGroup.hits : []
|
|
2130
|
+
const nextHits = Array.isArray(nextGroup.hits) ? nextGroup.hits : []
|
|
2131
|
+
const seen = new Set(oldHits.map(hit => panelHitKey(key, hit)))
|
|
2132
|
+
const added = nextHits.filter(hit => !seen.has(panelHitKey(key, hit)))
|
|
2133
|
+
merged[key] = {
|
|
2134
|
+
...nextGroup,
|
|
2135
|
+
hits: [...oldHits, ...added],
|
|
2136
|
+
returned: oldHits.length + added.length,
|
|
2137
|
+
total: Math.max(oldGroup.total ?? 0, nextGroup.total ?? 0),
|
|
2138
|
+
count: oldGroup.count?.kind === 'exact' ? oldGroup.count : nextGroup.count,
|
|
2139
|
+
}
|
|
2140
|
+
}
|
|
2141
|
+
// Keep the one-row-per-path invariant across pages too.
|
|
2142
|
+
const contentPaths = new Set((merged.content?.hits ?? []).map(hit => hit.path))
|
|
2143
|
+
if (merged.files !== undefined) {
|
|
2144
|
+
merged.files = { ...merged.files, hits: (merged.files.hits ?? []).filter(hit => !contentPaths.has(hit.path)) }
|
|
2145
|
+
merged.files.returned = merged.files.hits.length
|
|
2146
|
+
}
|
|
2147
|
+
return merged
|
|
2148
|
+
})
|
|
2149
|
+
setOffsets(current => ({
|
|
2150
|
+
files: current.files + (data.files?.returned ?? 0),
|
|
2151
|
+
dirs: current.dirs + (data.dirs?.returned ?? 0),
|
|
2152
|
+
content: current.content + (data.content?.returned ?? 0),
|
|
2153
|
+
}))
|
|
2154
|
+
} catch (cause) {
|
|
2155
|
+
setError(cause instanceof Error ? cause.message : String(cause))
|
|
2156
|
+
} finally {
|
|
2157
|
+
setLoadingMore(false)
|
|
2158
|
+
}
|
|
2159
|
+
}, [activeSessionId, caseSensitive, desc, effectiveScopes.content, effectiveScopes.dirs, effectiveScopes.files, groups, loading, loadingMore, matchMode, offsets, query, sessionOnly, sort, wholeWord])
|
|
2160
|
+
|
|
2161
|
+
const canLoadMore = groups !== null && ['content', 'files', 'dirs'].some(key => {
|
|
2162
|
+
if (!effectiveScopes[key]) return false
|
|
2163
|
+
const group = groups[key]
|
|
2164
|
+
if (group === undefined) return false
|
|
2165
|
+
const fetched = offsets[key]
|
|
2166
|
+
if (key === 'content') {
|
|
2167
|
+
const count = group.count
|
|
2168
|
+
if (count !== undefined && count.kind === 'exact') return count.value > fetched
|
|
2169
|
+
return (group.returned ?? 0) >= PAGE_CONTENT && typeof group.error !== 'string'
|
|
2170
|
+
}
|
|
2171
|
+
return (group.total ?? 0) > fetched
|
|
2172
|
+
})
|
|
2173
|
+
|
|
2039
2174
|
if (!open) return null
|
|
2040
2175
|
|
|
2041
2176
|
const content = groups !== null ? groups.content : undefined
|
|
@@ -2124,10 +2259,10 @@ self.onmessage = event => {
|
|
|
2124
2259
|
if (code === 'invalid-control-char') return t('contentBadChars')
|
|
2125
2260
|
return code
|
|
2126
2261
|
}
|
|
2127
|
-
let index = -1
|
|
2128
2262
|
const renderGroup = (key, label, group, extra) => {
|
|
2129
2263
|
if (!scopes[key] || group === undefined) return null
|
|
2130
2264
|
const hits = Array.isArray(group.hits) ? group.hits : []
|
|
2265
|
+
const visibleHits = hits.filter(hit => rowIndexByKey.has(panelHitKey(key, hit)))
|
|
2131
2266
|
const count = typeof group.returned === 'number' ? group.returned : hits.length
|
|
2132
2267
|
const warnings = Array.isArray(group.warnings) && group.warnings.length > 0
|
|
2133
2268
|
? t('contentWarning', { list: group.warnings.join(', ') })
|
|
@@ -2152,13 +2287,15 @@ self.onmessage = event => {
|
|
|
2152
2287
|
return h('div', { className: 'dsh-locator-group', role: 'group', 'aria-labelledby': 'dsh-locator-group-' + key },
|
|
2153
2288
|
groupHead(key, label, countLabel(group, count), combinedNote === '' ? null : combinedNote),
|
|
2154
2289
|
extra === undefined ? null : extra,
|
|
2155
|
-
|
|
2290
|
+
visibleHits.length === 0
|
|
2156
2291
|
? h('div', { className: 'dsh-locator-groupempty' },
|
|
2157
|
-
|
|
2158
|
-
?
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2292
|
+
filter.trim() !== '' && hits.length > 0
|
|
2293
|
+
? t('filterEmpty')
|
|
2294
|
+
: (key === 'content' && scopes.content
|
|
2295
|
+
? (sessionOnly && query.trim().length >= 3 ? t('panelSessionHint')
|
|
2296
|
+
: query.trim().length < 3 ? t('contentShort') : (contentBuilding ? t('loading') : t('emptyResults')))
|
|
2297
|
+
: (query.trim() === '' ? t('emptyQuery') : t('emptyResults'))))
|
|
2298
|
+
: visibleHits.map(hit => rowFor(key, hit, rowIndexByKey.get(panelHitKey(key, hit)))),
|
|
2162
2299
|
)
|
|
2163
2300
|
}
|
|
2164
2301
|
|
|
@@ -2182,7 +2319,8 @@ self.onmessage = event => {
|
|
|
2182
2319
|
spellCheck: false,
|
|
2183
2320
|
autoComplete: 'off',
|
|
2184
2321
|
placeholder: t('placeholder'),
|
|
2185
|
-
onChange: event => { setQuery(event.target.value); setSelected(0) },
|
|
2322
|
+
onChange: event => { setQuery(event.target.value); setFilter(''); setSelected(0) },
|
|
2323
|
+
onInput: event => { setQuery(event.target.value); setFilter(''); setSelected(0) },
|
|
2186
2324
|
'aria-label': t('searchLabel'),
|
|
2187
2325
|
role: 'combobox',
|
|
2188
2326
|
'aria-expanded': 'true',
|
|
@@ -2245,6 +2383,28 @@ self.onmessage = event => {
|
|
|
2245
2383
|
? ' · ' + t('watchDegraded')
|
|
2246
2384
|
: '')),
|
|
2247
2385
|
),
|
|
2386
|
+
history.length > 0
|
|
2387
|
+
? h('div', { className: 'dsh-locator-history' },
|
|
2388
|
+
h('span', { className: 'dsh-locator-history-label' }, t('panelHistory')),
|
|
2389
|
+
history.map(text => h('span', { key: 'hist-' + text, className: 'dsh-locator-chip' },
|
|
2390
|
+
h('button', { className: 'dsh-locator-chip-go', onClick: () => { setQuery(text); setFilter(''); setSelected(0) } }, text),
|
|
2391
|
+
h('button', { className: 'dsh-locator-chip-x', 'aria-label': t('panelHistoryClear'),
|
|
2392
|
+
onClick: () => setHistory(previous => { const next = previous.filter(value => value !== text); writePanelHistory(next); return next }) }, '×'))),
|
|
2393
|
+
h('button', { className: 'dsh-locator-dirbtn', onClick: () => { setHistory([]); writePanelHistory([]) } }, t('panelHistoryClear')),
|
|
2394
|
+
)
|
|
2395
|
+
: null,
|
|
2396
|
+
h('div', { className: 'dsh-locator-filterbar' },
|
|
2397
|
+
h('input', {
|
|
2398
|
+
className: 'dsh-locator-filter',
|
|
2399
|
+
value: filter,
|
|
2400
|
+
placeholder: t('panelFilter'),
|
|
2401
|
+
spellCheck: false,
|
|
2402
|
+
'aria-label': t('panelFilter'),
|
|
2403
|
+
onChange: event => { setFilter(event.target.value); setSelected(0) },
|
|
2404
|
+
onInput: event => { setFilter(event.target.value); setSelected(0) },
|
|
2405
|
+
}),
|
|
2406
|
+
filter.trim() === '' ? null : h('span', { className: 'dsh-locator-count' }, String(rows.length)),
|
|
2407
|
+
),
|
|
2248
2408
|
sessionOnly ? h('div', { className: 'dsh-locator-groupempty' }, t('panelSessionHint')) : null,
|
|
2249
2409
|
h('div', { id: 'dsh-locator-results', className: 'dsh-locator-scroll', ref: listRef, role: 'listbox', 'aria-busy': loading ? 'true' : 'false' },
|
|
2250
2410
|
error !== ''
|
|
@@ -2271,6 +2431,9 @@ self.onmessage = event => {
|
|
|
2271
2431
|
+ (status && status.scanning ? ' · ' + t('indexing') : '')
|
|
2272
2432
|
+ (contentBuilding ? ' · ' + t('indexing') : '')),
|
|
2273
2433
|
h('span', { className: 'grow' }),
|
|
2434
|
+
canLoadMore
|
|
2435
|
+
? h('button', { className: 'dsh-locator-dirbtn', disabled: loadingMore, onClick: loadMore }, loadingMore ? t('loading') : t('panelLoadMore'))
|
|
2436
|
+
: null,
|
|
2274
2437
|
toast === '' ? null : h('span', { className: 'dsh-locator-toast' }, toast),
|
|
2275
2438
|
h('span', null, t('footer') + ' · Ctrl+F ' + t('findOpen')),
|
|
2276
2439
|
),
|
package/lib/combined.d.ts
CHANGED
|
@@ -23,6 +23,12 @@ export interface CombinedRequest {
|
|
|
23
23
|
query: string;
|
|
24
24
|
limit: number;
|
|
25
25
|
contentLimit: number;
|
|
26
|
+
/** Name-index offsets for load-more. */
|
|
27
|
+
offset: number;
|
|
28
|
+
filesOffset: number;
|
|
29
|
+
dirsOffset: number;
|
|
30
|
+
/** Content-index offset for load-more. */
|
|
31
|
+
contentOffset: number;
|
|
26
32
|
sort: string;
|
|
27
33
|
desc: boolean;
|
|
28
34
|
scopes: CombinedScopes;
|
package/lib/combined.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined.d.ts","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"combined.d.ts","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
|
package/lib/combined.js
CHANGED
|
@@ -38,6 +38,10 @@ export function readCombinedRequest(body, maxResults) {
|
|
|
38
38
|
query: typeof body.query === 'string' ? body.query : '',
|
|
39
39
|
limit: nameLimit,
|
|
40
40
|
contentLimit,
|
|
41
|
+
offset: clamp(body.offset, 0, 1_000_000, 0),
|
|
42
|
+
filesOffset: clamp(body.filesOffset ?? body.offset, 0, 1_000_000, 0),
|
|
43
|
+
dirsOffset: clamp(body.dirsOffset ?? body.offset, 0, 1_000_000, 0),
|
|
44
|
+
contentOffset: clamp(body.contentOffset, 0, 1_000_000, 0),
|
|
41
45
|
sort: sortKey(body.sort),
|
|
42
46
|
desc: body.desc === true,
|
|
43
47
|
scopes: readScopes(body),
|
|
@@ -150,7 +154,7 @@ async function nameGroup(deps, request, files) {
|
|
|
150
154
|
const result = await deps.search({
|
|
151
155
|
query: nameQuery,
|
|
152
156
|
limit: request.limit,
|
|
153
|
-
offset:
|
|
157
|
+
offset: files ? request.filesOffset : request.dirsOffset,
|
|
154
158
|
sort: request.sort,
|
|
155
159
|
desc: request.desc,
|
|
156
160
|
regex: request.matchMode === 'regex',
|
|
@@ -221,6 +225,7 @@ async function contentGroup(deps, request, ask) {
|
|
|
221
225
|
wholeWord: request.wholeWord,
|
|
222
226
|
count: request.count,
|
|
223
227
|
countLimit: request.countLimit,
|
|
228
|
+
offset: request.contentOffset,
|
|
224
229
|
...(request.sessionId === null ? {} : { sessionId: request.sessionId }),
|
|
225
230
|
};
|
|
226
231
|
try {
|
package/lib/combined.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
|
package/lib/content-search.d.ts
CHANGED
|
@@ -49,6 +49,8 @@ export interface ContentSearchOptions {
|
|
|
49
49
|
sessionPath?: string | null;
|
|
50
50
|
count?: ContentCountMode;
|
|
51
51
|
countLimit?: number;
|
|
52
|
+
/** Skip this many ranked matches before the page (panel load-more). */
|
|
53
|
+
offset?: number;
|
|
52
54
|
/**
|
|
53
55
|
* Keep only file/session documents whose stored path lives under this
|
|
54
56
|
* directory prefix (the locator_find `scope: workspace` filter). Session
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"content-search.d.ts","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"content-search.d.ts","sourceRoot":"","sources":["../src/content-search.ts"],"names":[],"mappings":"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"}
|
package/lib/content-search.js
CHANGED
|
@@ -402,12 +402,12 @@ function buildHits(db, plan, rowids, scores) {
|
|
|
402
402
|
return hits;
|
|
403
403
|
}
|
|
404
404
|
/** Candidate rowids for one page (no post-filter). */
|
|
405
|
-
function pageRowids(db, plan, limit) {
|
|
405
|
+
function pageRowids(db, plan, limit, offset = 0) {
|
|
406
406
|
const scores = new Map();
|
|
407
407
|
const sql = plan.rankOrder
|
|
408
|
-
? `SELECT rowid AS rowid, rank AS score FROM docs WHERE ${plan.where} ORDER BY rank LIMIT ?`
|
|
409
|
-
: `SELECT rowid AS rowid FROM docs WHERE ${plan.where} LIMIT ?`;
|
|
410
|
-
const rows = db.prepare(sql).all(...plan.params, limit);
|
|
408
|
+
? `SELECT rowid AS rowid, rank AS score FROM docs WHERE ${plan.where} ORDER BY rank LIMIT ? OFFSET ?`
|
|
409
|
+
: `SELECT rowid AS rowid FROM docs WHERE ${plan.where} LIMIT ? OFFSET ?`;
|
|
410
|
+
const rows = db.prepare(sql).all(...plan.params, limit, offset);
|
|
411
411
|
const rowids = [];
|
|
412
412
|
for (const row of rows) {
|
|
413
413
|
if (typeof row.rowid !== 'number')
|
|
@@ -443,7 +443,7 @@ function boundedCount(db, plan, limit) {
|
|
|
443
443
|
* reports a bounded count plus a `scan-capped` warning. Session-scoped scans go
|
|
444
444
|
* through the same budget, so a huge session cannot run unbounded either.
|
|
445
445
|
*/
|
|
446
|
-
function scanWholeWord(db, plan, limit, countMode, countLimit, sessionScoped, budget) {
|
|
446
|
+
function scanWholeWord(db, plan, limit, offset, countMode, countLimit, sessionScoped, budget) {
|
|
447
447
|
const warnings = new Set();
|
|
448
448
|
const rowids = [];
|
|
449
449
|
const sql = plan.rankOrder
|
|
@@ -474,7 +474,7 @@ function scanWholeWord(db, plan, limit, countMode, countLimit, sessionScoped, bu
|
|
|
474
474
|
if (!matchesWholeWord(row.body, plan.terms, plan.caseSensitive))
|
|
475
475
|
continue;
|
|
476
476
|
count++;
|
|
477
|
-
if (rowids.length < limit)
|
|
477
|
+
if (count > offset && rowids.length < limit)
|
|
478
478
|
rowids.push(rowid);
|
|
479
479
|
if (countMode === 'none') {
|
|
480
480
|
if (rowids.length >= limit) {
|
|
@@ -550,7 +550,7 @@ export function searchContent(db, query, limit, options = {}) {
|
|
|
550
550
|
if (plan === null)
|
|
551
551
|
return { hits: [], count: emptyCount(countMode), warnings };
|
|
552
552
|
if (plan.wholeWord) {
|
|
553
|
-
const scanned = scanWholeWord(db, plan, capped, countMode, countLimit, options.sessionPath != null, resolveScanBudget(options.scanBudget));
|
|
553
|
+
const scanned = scanWholeWord(db, plan, capped, Math.max(0, Math.trunc(options.offset ?? 0)), countMode, countLimit, options.sessionPath != null, resolveScanBudget(options.scanBudget));
|
|
554
554
|
for (const warning of scanned.warnings)
|
|
555
555
|
warnings.push(warning);
|
|
556
556
|
const hits = buildHits(db, plan, scanned.rowids, new Map());
|
|
@@ -575,7 +575,7 @@ export function searchContent(db, query, limit, options = {}) {
|
|
|
575
575
|
if (count.kind === 'bounded')
|
|
576
576
|
warnings.push('bounded-count');
|
|
577
577
|
}
|
|
578
|
-
const page = pageRowids(db, plan, capped);
|
|
578
|
+
const page = pageRowids(db, plan, capped, Math.max(0, Math.trunc(options.offset ?? 0)));
|
|
579
579
|
const hits = buildHits(db, plan, page.rowids, page.scores);
|
|
580
580
|
return { hits, count, warnings: [...new Set(warnings)] };
|
|
581
581
|
}
|