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 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 个词会直接报错。
Binary file
Binary file
Binary file
Binary file
Binary file
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) out.push({ group, hit })
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
- hits.length === 0
2290
+ visibleHits.length === 0
2156
2291
  ? h('div', { className: 'dsh-locator-groupempty' },
2157
- key === 'content' && scopes.content
2158
- ? (sessionOnly && query.trim().length >= 3 ? t('panelSessionHint')
2159
- : query.trim().length < 3 ? t('contentShort') : (contentBuilding ? t('loading') : t('emptyResults')))
2160
- : (query.trim() === '' ? t('emptyQuery') : t('emptyResults')))
2161
- : hits.map(hit => { index++; return rowFor(key, hit, index) }),
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;
@@ -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: 0,
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 {
@@ -1 +1 @@
1
- {"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"combined.js","sourceRoot":"","sources":["../src/combined.ts"],"names":[],"mappings":"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"}
@@ -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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"}
@@ -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
  }