dsh-locator 0.8.2 → 0.10.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.
Files changed (58) hide show
  1. package/CHANGELOG.md +47 -0
  2. package/README-es.md +30 -5
  3. package/README-hi.md +31 -5
  4. package/README-pt.md +31 -5
  5. package/README.en.md +31 -5
  6. package/README.md +31 -5
  7. package/bin/darwin-arm64/indexd +0 -0
  8. package/bin/darwin-x64/indexd +0 -0
  9. package/bin/linux-arm64/indexd +0 -0
  10. package/bin/linux-x64/indexd +0 -0
  11. package/bin/win32-arm64/indexd.exe +0 -0
  12. package/bin/win32-x64/indexd.exe +0 -0
  13. package/client.js +1198 -117
  14. package/lib/combined.d.ts +20 -3
  15. package/lib/combined.d.ts.map +1 -1
  16. package/lib/combined.js +85 -15
  17. package/lib/combined.js.map +1 -1
  18. package/lib/content-search-worker.d.ts +8 -3
  19. package/lib/content-search-worker.d.ts.map +1 -1
  20. package/lib/content-search-worker.js +54 -27
  21. package/lib/content-search-worker.js.map +1 -1
  22. package/lib/content-search.d.ts +127 -7
  23. package/lib/content-search.d.ts.map +1 -1
  24. package/lib/content-search.js +571 -36
  25. package/lib/content-search.js.map +1 -1
  26. package/lib/content.d.ts +83 -5
  27. package/lib/content.d.ts.map +1 -1
  28. package/lib/content.js +351 -87
  29. package/lib/content.js.map +1 -1
  30. package/lib/export.d.ts +61 -0
  31. package/lib/export.d.ts.map +1 -1
  32. package/lib/export.js +217 -52
  33. package/lib/export.js.map +1 -1
  34. package/lib/find.d.ts.map +1 -1
  35. package/lib/find.js +73 -16
  36. package/lib/find.js.map +1 -1
  37. package/lib/http.d.ts +38 -2
  38. package/lib/http.d.ts.map +1 -1
  39. package/lib/http.js +279 -82
  40. package/lib/http.js.map +1 -1
  41. package/lib/reveal.d.ts +69 -3
  42. package/lib/reveal.d.ts.map +1 -1
  43. package/lib/reveal.js +140 -11
  44. package/lib/reveal.js.map +1 -1
  45. package/lib/tools.d.ts +30 -0
  46. package/lib/tools.d.ts.map +1 -1
  47. package/lib/tools.js +65 -3
  48. package/lib/tools.js.map +1 -1
  49. package/package.json +1 -1
  50. package/src/combined.ts +107 -17
  51. package/src/content-search-worker.ts +52 -24
  52. package/src/content-search.ts +710 -36
  53. package/src/content.ts +349 -73
  54. package/src/export.ts +240 -50
  55. package/src/find.ts +83 -16
  56. package/src/http.ts +271 -83
  57. package/src/reveal.ts +148 -10
  58. package/src/tools.ts +83 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,52 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.10.0 — 2026-11-12
4
+
5
+ Full-plugin hardening pass from a 20-agent audit. This release focuses on stability, release integrity, security boundaries, client correctness and performance rather than new search features.
6
+
7
+ **Stability / performance**
8
+ * Whole-word content search now has a hard scan budget (rows, bytes, time) and stops with a bounded count + `scan-capped` warning instead of scanning an unbounded corpus.
9
+ * A content worker timeout no longer falls back to the same query on the host event loop; it returns `content-search-timeout` (or a worker error) and discards the stuck worker. This removes the multi-second DSH freeze.
10
+ * Content queries are bounded to 256 characters / 32 terms / 3 characters per term; shorter or over-long queries return explicit errors instead of a full-table LIKE/GLOB scan. NUL/control characters are rejected. emoji are counted by code point.
11
+ * Content refresh reuses a successful parse before replacing a session; a read/decompression failure keeps the old messages and retries next refresh. `maxFiles` no longer deletes tail documents after a transient read failure. Corrupt/zero-byte/old-schema content databases are quarantined and rebuilt.
12
+ * Engine: generation only advances on real changes; snapshot save is dirty-debounced (60 s quiet / 5 min max) and shutdown skips an unchanged snapshot; `sort=path` no longer builds a path map for every hit; dump supports `since`/`mtimeFrom`; watcher reports degraded/fallback state and `--refresh 0` disables periodic rebuilds; Windows roots/handles stay paired.
13
+ * Six engine binaries are rebuilt at 0.10.0; the release workflow rebuilds Linux/Windows on Ubuntu and darwin with cgo/FSEvents on macOS, verifies versions, and refuses to publish from a red CI commit.
14
+
15
+ **Security / boundaries**
16
+ * HTTP panel routes now require the DSH `connection` service (fail-closed), enforce POST + JSON content-type, same-origin Fetch metadata, 64 KiB body limit and proper 400/405/413/415/503 responses.
17
+ * `/reveal` and `/open` resolve real paths and reject symlink escapes from the indexed roots; `/open` rejects executable/script extensions. `locator_export` defaults to the plugin state directory, validates ownership before overwrite and writes atomically; `locator_rebuild` only accepts configured roots/excludes subsets.
18
+ * `locator_find` now exposes `matchMode`, `caseSensitive`, `wholeWord`, `sessionId`, `count`, `countLimit`, `pathPrefix` and defaults to **workspace scope** (caller session for session hits, caller cwd for file hits); `scope: 'all'` is explicit cross-workspace access. The tool description, count/warnings and session/message references are rendered for the agent.
19
+
20
+ **Client**
21
+ * Panel result rows keep focus, so Esc/arrow/F3/Enter work after clicking a hit; a document-level Escape fallback closes the panel; Ctrl+Shift+F ignores host modals, editors/terminals, key repeat and AltGr.
22
+ * Unified visible-text projection for the find bar and jump: soft newlines/`<br>` collapse to a space outside `<pre>`, CJK soft-wrapped phrases match, KaTeX/sr-only/aria-live/status text is excluded; the projection uses segment maps instead of one object per character.
23
+ * Assistant steps rendered as two rows with the same node key now prefer the response row; anchored hits no longer fall back to an unrelated phrase in the loaded window, and older pages are loaded until the anchor exists.
24
+ * Regular expressions prefer the Unicode `u` flag (so `\p{L}`/`\p{Script=Han}` work) and never fall back to a main-thread regex when the worker is blocked or times out; the find bar reports the timeout/unavailable state.
25
+ * The panel renders content warnings, scan caps, budget truncation and query errors as information instead of a retryable failure; footer/group counts use the exact/bounded count consistently; content queries need 3 characters (shorter searches use Ctrl+F).
26
+ * One-shot toast/insert/reveal timers are tracked and cleared; plugin disposal resets overlay state.
27
+
28
+ **Upgrade notes**
29
+ * No content schema change. 0.10.0 runs on schema v3; the engine binary version changes to 0.10.0.
30
+ * Content search minimum length is 3 characters; use the in-conversation find bar (`Ctrl+F`) for 1–2 character searches.
31
+ * `locator_find` is workspace-scoped by default; pass `scope: 'all'` for cross-workspace session/file content.
32
+ * Panel routes require the stock web `connection` service; custom compositions without it will not mount them (intentional fail-closed).
33
+ * `locator_export` writes under the plugin state directory by default; pass `allowOutsideStateDir: true` only for a deliberate external export. Importing an existing arbitrary file is refused.
34
+
35
+ **Tests**: 122 tests across content, combined, HTTP, tools, find, plugin, runtime, export, reveal and lag suites; CI runs Node 22/24 on Linux/Windows/macOS with rebuilt engines and fail-on-skip gates.
36
+
37
+ ## 0.9.0 — 2026-11-12
38
+
39
+ Advanced find and a two-surface search model, informed by Notepad++/Notepad--/VS Code and a live-DB benchmark.
40
+
41
+ * **Counts**: `/combined` returns `count: { value, kind: exact|bounded }` per group; the panel shows exact counts where cheap and `≥ N` for bounded counts, plus the selected position and footer summary. Name groups keep exact totals.
42
+ * **Match options**: mode (Normal / Extended / Regex), match case and whole word. Names use the existing engine flags; content gains Normal/Extended/case/whole-word with GLOB/LIKE/JS-boundary paths. Regex pauses the content group (names still work) so a keystroke never scans the corpus.
43
+ * **Current conversation scope**: the panel can restrict content to one session; the content index keeps a session-id → log-path map and queries `rowid IN (docs_meta.path = ?)` (0.1–0.9 ms). Unknown sessions return an empty group plus a warning.
44
+ * **In-conversation find bar (`Ctrl+F`)**: non-modal bar anchored to the conversation; counts `i/N`, next/previous, wrap (on by default), reverse direction, match case, whole word, Normal/Extended/Regex, selection scoping (`Ctrl+F` with a selection starts in that selection), loaded-window notice with “load earlier messages and retry”, current match underlined, Esc clears the highlight and restores focus.
45
+ * **Performance**: the content page path no longer evaluates `snippet()`/`bm25` with `ORDER BY score` for every matching row. It fetches rank rowids, then bodies by rowid (no MATCH on that statement), and builds snippets/line numbers in JS: normal `the` on the live 1 GB corpus went from about **2.7 s to 65 ms**; case/whole/extended/session paths are bounded.
46
+ * **Robustness**: the find bar uses an owner-aware CSS-Highlight manager (jump vs find), cancels pending scans with a sequence token, debounces DOM mutations, caps matches/text, runs regex in a worker with a 500 ms timeout, ignores IME composition, drops a dead selection back to the session, closes on conversation switch/panel open/dispose, and cleans all timers/observers/style tags.
47
+ * **Tests**: 52 (26 content, 13 combined, plus find/plugin/runtime/lag/export/reveal); verify checks the find-bar and owner-highlight markers.
48
+ * No content schema change and no rebuild: 0.9.0 runs on the 0.8.1 schema v3 database. Whole-corpus content regex remains intentionally out of P0 (ReDoS/cost); use the conversation find bar.
49
+
3
50
  ## 0.8.2 — 2026-11-12
4
51
 
5
52
  Robustness pass over the 0.8.1 review fixes.
package/README-es.md CHANGED
@@ -35,6 +35,7 @@ dsh plugin --profile web add dsh-locator
35
35
  - [Primera ejecución](#primera-ejecución)
36
36
  - [Dos búsquedas](#dos-búsquedas)
37
37
  - [Panel web](#panel-web)
38
+ - [Buscar en la conversación (Ctrl+F)](#buscar-en-la-conversación-ctrlf)
38
39
  - [Herramientas](#herramientas)
39
40
  - [Lenguaje de consulta](#lenguaje-de-consulta)
40
41
  - [Configuración](#configuración)
@@ -162,20 +163,33 @@ La construcción ocurre dentro del proceso anfitrión de DSH, pero las lecturas
162
163
 
163
164
  ## Panel web
164
165
 
165
- Pulsa `Ctrl+Shift+F` en la GUI web, o haz clic en la lupa del pie de la barra lateral. El panel usa rutas del mismo origen (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), sin otro servidor ni otro puerto.
166
+ Pulsa `Ctrl+Shift+F` en la GUI web, o haz clic en la lupa del pie de la barra lateral. El panel usa rutas del mismo origen (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), sin otro servidor ni otro puerto. La ruta `/combined` acepta `matchMode`, `caseSensitive`, `wholeWord`, `sessionId` y `count`; el grupo de contenido devuelve `count`/`warnings`, y sus aciertos de archivo incluyen `line`.
166
167
 
167
168
  - **Los tres ámbitos están activos por defecto**: contenido (cuerpos + sesiones), archivos y carpetas; desmarca cualquiera para acotar. Los resultados se agrupan **contenido → archivos → carpetas** con el recuento por grupo; el contenido se ordena por relevancia y los grupos de nombres siguen el menú de orden.
168
169
  - **Doble clic o `Enter` activa un resultado**: una sesión abre la conversación y pinta las palabras encontradas con un resaltado ámbar translúcido que sigue el desplazamiento, se centra al llegar y se limpia con `Esc`; archivos y carpetas se muestran en el gestor de archivos. `Ctrl+Shift+C` copia la ruta, `Ctrl+O` abre, `Ctrl+Enter` inserta `@file` y `Alt+1–3` alterna los ámbitos.
169
- - Las consultas de contenido requieren al menos dos caracteres; las consultas vacías o de un carácter no inician la construcción. Mientras construye, el grupo de contenido muestra el progreso y los nombres responden al momento; la elección de ámbitos se recuerda.
170
- - Teclado: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` mueven, `Enter` activa y `Esc` cierra; el diálogo atrapa el foco y lo restaura al cerrar. El texto sigue `navigator.language` (zh/en/es/pt/hi).
170
+ - **Recuentos**: cada encabezado de grupo muestra su número de aciertos; es exacto cuando el cálculo es barato y aparece como `≥ N` cuando hay un tope. La cabecera indica la posición seleccionada (`3/37`) y el pie resume los tres grupos. La consulta paginada del contenido ahora obtiene primero los rowid ordenados por `rank`, luego el cuerpo por rowid y genera el fragmento y la línea en JS: las palabras comunes bajaron de unos 2,7 s a menos de 300 ms.
171
+ - **Opciones de búsqueda**: la barra de herramientas ofrece el modo (Normal / Extendido / Regex), `Aa` para distinguir mayúsculas y minúsculas, palabra completa y el ámbito de la conversación actual. El modo y las opciones de mayúsculas/palabra completa se aplican a nombres de archivos y carpetas; el contenido admite Normal/Extendido, mayúsculas y palabra completa, pero **en modo regex el grupo de contenido se pausa** y muestra un aviso (los nombres sí admiten regex), de modo que ninguna pulsación del panel recorre toda la biblioteca.
172
+ - **Ámbito de la conversación actual**: solo busca los mensajes ya indexados de esa sesión (una sesión activa tarda unos 2 minutos en quedar indexada), y los ámbitos de archivos y carpetas se desactivan, pero conservan la marca de verificación. Para recorrer coincidencias en vivo usa la barra de `Ctrl+F` que se describe más abajo.
173
+ - Las consultas de contenido requieren al menos dos caracteres; las consultas vacías o de un carácter no inician la construcción. Mientras construye, el grupo de contenido muestra el progreso y los nombres responden al momento; los ámbitos y las opciones de búsqueda se recuerdan.
174
+ - Teclado: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` mueven, `F3`/`Shift+F3` recorren las filas de resultados en ciclo, `Enter` activa y `Esc` cierra; el diálogo atrapa el foco y lo restaura al cerrar. El texto sigue `navigator.language` (zh/en/es/pt/hi).
171
175
 
176
+ ## Buscar en la conversación (Ctrl+F)
177
+
178
+ En una conversación, pulsa `Ctrl+F` (o el botón `⌕` de la cabecera de la sesión) para abrir una barra de búsqueda no modal en la esquina superior derecha. La barra solo busca en los mensajes **cargados** de la conversación actual, sin depender del índice de contenido ni de su retraso de unos dos minutos:
179
+
180
+ - **Recuento y navegación**: muestra `3/17`; `Enter`/`F3` van a la siguiente coincidencia y `Shift+Enter`/`Shift+F3` a la anterior. El recorrido circular (continuar al inicio) está activo por defecto: al llegar a un extremo, la búsqueda sigue por el otro y lo indica. Todas las coincidencias llevan un resaltado translúcido; la actual es más intensa y va subrayada.
181
+ - **Opciones**: `Aa` distingue mayúsculas y minúsculas, palabra completa (límites ASCII `[A-Za-z0-9_]`; los caracteres CJK cuentan como no palabra), continuar al inicio (`↻`) y búsqueda en sentido inverso (`⇅`, que cambia el sentido de `Enter`); los botones de anterior y siguiente están siempre visibles.
182
+ - **Modos**: Normal (literal), Extendido (`\n` `\r` `\t` `\0` `\xHH` `\\`; las secuencias desconocidas se buscan tal cual) y Regex (JS RegExp en un hilo worker con un límite de 500 ms; un patrón no válido muestra el error en línea). Las coincidencias de longitud cero se omiten en vez de bloquear la interfaz.
183
+ - **Selección**: selecciona texto en la conversación y pulsa `Ctrl+F`; la barra empieza limitada a esa selección y muestra un chip. Las selecciones que cruzan mensajes también funcionan; si la selección caduca, la barra vuelve a toda la conversación.
184
+ - **Ventana cargada**: solo se buscan los mensajes cargados; en conversaciones largas usa «Cargar mensajes anteriores y reintentar» en vez de paginar automáticamente.
185
+ - `Esc` cierra la barra y limpia los resaltados; cambiar de conversación, abrir el panel o desmontar el plugin también limpian. El panel global se encarga de descubrir archivos y sesiones; la barra recorre coincidencias dentro de la conversación actual, y sus resaltados nunca se superponen.
172
186
 
173
187
  ## Herramientas
174
188
 
175
189
  | Herramienta | Qué hace |
176
190
  |---|---|
177
191
  | `locator_search` | Consulta nombres y rutas con filtros `ext:`, `size:`, `dm:`, `path:`, ordenación y paginación. |
178
- | `locator_find` | Busca en cuerpos de archivo y mensajes de sesión; devuelve fragmentos, `sessionId`/`messageId` y el estado del índice de contenido. |
192
+ | `locator_find` | Busca en cuerpos de archivo y mensajes de sesión; devuelve fragmentos, `sessionId`/`messageId`, el estado del índice de contenido y el campo opcional `line` en los aciertos de archivo. |
179
193
  | `locator_status` | Raíces, recuentos del índice de nombres, estado del watcher, directorio de estado y ruta del motor. (El progreso del contenido lo informan `locator_find` y el panel). |
180
194
  | `locator_rebuild` | Sustituye el índice de nombres por un escaneo en segundo plano; las búsquedas usan el índice antiguo hasta que el nuevo esté listo. |
181
195
  | `locator_reindex` | Actualiza o reconstruye el índice de contenido: incremental por defecto, `full: true` lo borra y reconstruye. |
@@ -378,13 +392,24 @@ DeepSeek Harness
378
392
  - macOS usa FSEvents (recursivo) en los binarios publicados; una compilación con `CGO_ENABLED=0` cae a kqueue, limitado a 4.096 directorios, con cambios de contenido dependientes de la reconstrucción periódica.
379
393
  - USN/MFT de Windows es opcional y solo se usa si el proceso puede leer el volumen y el diario está activo; si no, se usa el recorrido portátil.
380
394
 
381
- - Los aciertos en el cuerpo de un archivo se muestran por ahora en el gestor de archivos (la vista por línea dentro de DSH es el siguiente paso); los mensajes del asistente ahora se anclan por su clave de nodo `turn:step`, con frase solo como reserva. Actualizar a 0.8.1 reconstruye una vez la base de contenido por el nuevo campo.
395
+ - Los aciertos en el cuerpo de un archivo se muestran por ahora en el gestor de archivos (la vista por línea dentro de DSH es el siguiente paso; los resultados ya incluyen el campo de número de línea `line`); los mensajes del asistente se anclan por su clave de nodo `turn:step`, con la frase solo como reserva. Actualizar de 0.8.0 a 0.8.1 reconstruye una vez la base de contenido por el nuevo campo de clave de nodo.
396
+ - **La regex de contenido en toda la biblioteca queda fuera del P0**: el modo regex pausa el grupo de contenido (los nombres de archivos y carpetas sí admiten regex) para evitar recorrer una biblioteca de 1 GB y riesgos de ReDoS; la barra de búsqueda dentro de la conversación sí admite regex.
397
+ - El ámbito de la conversación actual solo cubre los mensajes de sesión ya asentados en el índice (una sesión activa tarda unos 2 minutos en indexarse); para buscar en vivo usa `Ctrl+F`. La barra de búsqueda solo cubre la ventana cargada; el historial anterior se carga a mano.
382
398
  - El resaltado dentro de la conversación usa la API CSS Custom Highlight; los navegadores antiguos sin ella caen a un contorno de fila.
383
399
 
384
400
  ## Memoria
385
401
 
386
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.
387
403
 
404
+ ## Notas de actualización 0.10.0
405
+
406
+ - 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.
407
+ - `locator_find` usa **ámbito workspace** por defecto (sesión del llamador y su cwd); para cruzar workspaces pasa `scope: "all"`. Nuevos parámetros: `matchMode`, `caseSensitive`, `wholeWord`, `sessionId`, `count`, `countLimit`, `pathPrefix`.
408
+ - Las rutas HTTP del panel exigen el servicio `connection` de DSH (fail-closed) y POST + JSON + mismo origen; el perfil web estándar no cambia.
409
+ - `locator_export` escribe por defecto en el stateDir del plugin y valida la propiedad antes de sobrescribir; `locator_rebuild` solo acepta subconjuntos de roots/excludes configurados.
410
+ - Los binarios del motor son 0.10.0: guardado de snapshot con debounce, memoria de `sort=path` acotada, watcher con estado degradado/fallback; en macOS el release debe compilarse con cgo/FSEvents (el fallback kqueue de depuración no es publicable).
411
+ - Cliente: clic en resultados conserva teclado/Esc; búsqueda con saltos suaves/`<br>`/CJK corregida; filas gemelas del asistente prefieren la respuesta; regex usa `u` y no cae al hilo principal; avisos/límites/truncado visibles.
412
+
388
413
  ## Seguridad y privacidad
389
414
 
390
415
  - El índice es local: sin llamadas de red, sin telemetría, sin subidas. El plugin nunca modifica, mueve ni borra archivos indexados.
package/README-hi.md CHANGED
@@ -35,6 +35,7 @@ dsh plugin --profile web add dsh-locator
35
35
  - [पहला रन](#पहला-रन)
36
36
  - [दो खोजें](#दो-खोजें)
37
37
  - [वेब पैनल](#वेब-पैनल)
38
+ - [बातचीत में खोज (Ctrl+F)](#बातचीत-में-खोज-ctrlf)
38
39
  - [टूल्स](#टूल्स)
39
40
  - [क्वेरी भाषा](#क्वेरी-भाषा)
40
41
  - [कॉन्फ़िगरेशन](#कॉन्फ़िगरेशन)
@@ -162,12 +163,26 @@ Everything-शैली क्वेरी जो पाथ, आकार, ब
162
163
 
163
164
  ## वेब पैनल
164
165
 
165
- Web GUI में कहीं भी `Ctrl+Shift+F` दबाएँ, या साइडबार के नीचे वाले आवर्धक लेंस पर क्लिक करें। पैनल उसी ओरिजिन के रूट (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`) इस्तेमाल करता है — अलग सर्वर या पोर्ट नहीं चाहिए।
166
+ Web GUI में कहीं भी `Ctrl+Shift+F` दबाएँ, या साइडबार के नीचे वाले आवर्धक लेंस पर क्लिक करें। पैनल उसी ओरिजिन के रूट (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`) इस्तेमाल करता है — अलग सर्वर या पोर्ट नहीं चाहिए। `/combined` `matchMode`, `caseSensitive`, `wholeWord`, `sessionId` और `count` भी स्वीकार करता है; सामग्री समूह `count`/`warnings` लौटाता है और फ़ाइल हिट के साथ `line` (पंक्ति संख्या) भी मिलती है।
166
167
 
167
168
  - **तीनों क्षेत्र डिफ़ॉल्ट रूप से चालू हैं**: सामग्री (बॉडी + सत्र), फ़ाइलें और फ़ोल्डर; किसी को हटाकर दायरा घटाएँ। परिणाम **सामग्री → फ़ाइलें → फ़ोल्डर** में समूहित होते हैं और हर समूह पर गिनती दिखती है; सामग्री प्रासंगिकता से क्रमबद्ध होती है और नाम-समूह क्रम मेन्यू का पालन करते हैं।
168
169
  - **डबल-क्लिक या `Enter` पर परिणाम सक्रिय होता है**: सत्र परिणाम बातचीत खोलकर मिले शब्दों पर पारभासी अंबर हाइलाइट लगाता है जो स्क्रॉल के साथ चलता है, पहुँचने पर केंद्रित होता है और `Esc` से हटता है; फ़ाइल/फ़ोल्डर फ़ाइल मैनेजर में दिखते हैं। `Ctrl+Shift+C` पथ कॉपी करता है, `Ctrl+O` खोलता है, `Ctrl+Enter` `@file` डालता है और `Alt+1–3` क्षेत्र बदलता है।
169
- - सामग्री खोज के लिए कम से कम दो अक्षर चाहिए; खाली या एक-अक्षर की खोज इंडेक्स नहीं बनाती। बनते समय सामग्री-समूह प्रगति दिखाता है और नाम-परिणाम तुरंत आते हैं; क्षेत्र का चयन याद रहता है।
170
- - कीबोर्ड: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` चलते हैं, `Enter` सक्रिय करता है और `Esc` बंद करता है; डायलॉग फ़ोकस रोककर बंद होने पर लौटाता है। टेक्स्ट `navigator.language` का पालन करता है (zh/en/es/pt/hi)।
170
+ - **गिनती**: समूह-हेडर पर मैचों की संख्या दिखती है — जहाँ सस्ता हो वहाँ सटीक अंक, और सीमा लगने पर `≥ N`। पैनल के हेडर में चुनी हुई पंक्ति की स्थिति (`चयनित 3/37`) और फुटर में तीनों समूहों का सार दिखता है। सामग्री का पेज-पाथ अब पहले rank rowid निकालता है, फिर rowid से बॉडी पढ़ता है और स्निपेट/पंक्ति JS में बनाता है — इसलिए सामान्य शब्द ~2.7 सेकंड से घटकर 300 ms से भी कम में लौटते हैं।
171
+ - **खोज विकल्प**: टूलबार में मोड (सामान्य / विस्तृत / रेगेक्स), `Aa` केस, पूरा शब्द और यह बातचीत स्कोप मिलते हैं। मोड और केस/पूरा शब्द फ़ाइल तथा फ़ोल्डर के नामों पर लागू होते हैं; सामग्री सामान्य/विस्तृत/केस/पूरा शब्द सभी संभालती है, पर **रेगेक्स मोड में सामग्री समूह रुक जाता है** और सूचना दिखाता है (फ़ाइल/फ़ोल्डर पर रेगेक्स चलता रहता है) ताकि हर कीस्ट्रोक पूरे कॉर्पस को स्कैन न करे।
172
+ - **यह बातचीत स्कोप**: टिक लगाने पर सिर्फ़ उसी सेशन के इंडेक्स हो चुके संदेश खोजे जाते हैं (सक्रिय सेशन को लगभग दो मिनट में इंडेक्स किया जाता है); फ़ाइल/फ़ोल्डर के टिक बंद (disabled) हो जाते हैं पर लगे रहते हैं। लाइव खोज और एक-एक मैच पर जाने के लिए नीचे बताया `Ctrl+F` फ़ाइंड बार इस्तेमाल करें।
173
+ - सामग्री खोज के लिए कम से कम दो अक्षर चाहिए; खाली या एक-अक्षर की खोज इंडेक्स नहीं बनाती। बनते समय सामग्री-समूह प्रगति दिखाता है और नाम-परिणाम तुरंत आते हैं; क्षेत्र और खोज विकल्प याद रहते हैं।
174
+ - कीबोर्ड: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` चलते हैं, `F3`/`Shift+F3` परिणाम-पंक्तियों में चक्र लगाते हैं, `Enter` सक्रिय करता है और `Esc` बंद करता है; डायलॉग फ़ोकस रोककर बंद होने पर लौटाता है। टेक्स्ट `navigator.language` का पालन करता है (zh/en/es/pt/hi)।
175
+
176
+ ## बातचीत में खोज (Ctrl+F)
177
+
178
+ किसी बातचीत में `Ctrl+F` दबाएँ (या सेशन हेडर में `⌕` पर क्लिक करें): बातचीत के ऊपरी दाएँ कोने में एक नॉन-मोडल फ़ाइंड बार खुलता है जो सिर्फ़ इस बातचीत के **लोड हो चुके** संदेशों में खोजता है — न कंटेंट इंडेक्स चाहिए, न दो मिनट का इंतज़ार।
179
+
180
+ - **गिनती और नेविगेशन**: `3/17` दिखता है; `Enter`/`F3` अगले मैच पर ले जाते हैं और `Shift+Enter`/`Shift+F3` पिछले पर; चक्रीय खोज (wrap) डिफ़ॉल्ट रूप से चालू है — किनारे पर पहुँचने पर दूसरे किनारे से जारी रहती है। सभी मैच हल्के हाइलाइट में रहते हैं, मौजूदा मैच गहरा और रेखांकित होता है।
181
+ - **विकल्प**: `Aa` केस मिलाएँ, पूरा शब्द (ASCII सीमा `[A-Za-z0-9_]`; CJK को गैर-शब्द माना जाता है), चक्र और उल्टी दिशा (जो `Enter` की मुख्य दिशा पलट देती है); पिछला/अगला बटन हमेशा मौजूद रहते हैं।
182
+ - **मोड**: सामान्य (शाब्दिक), विस्तृत (`\n` `\r` `\t` `\0` `\xHH` `\\`; अनजान एस्केप शाब्दिक रहते हैं), रेगेक्स (JS RegExp, Worker में 500 ms टाइमआउट के साथ; गलत पैटर्न पर इनलाइन त्रुटि)। ज़ीरो-चौड़ाई वाले मैच छोड़ दिए जाते हैं, UI ब्लॉक नहीं होता।
183
+ - **चयन में खोज**: बातचीत में टेक्स्ट चुनकर `Ctrl+F` दबाएँ; बार शुरू में सिर्फ़ उसी चयन में खोजता है और चयन चिप दिखाता है। संदेशों के पार जाने वाला चयन भी चलता है; चयन अमान्य हो जाए तो बार पूरी बातचीत पर लौट आता है।
184
+ - **लोडेड विंडो**: सिर्फ़ लोड हो चुके संदेश खोजे जाते हैं; लंबी बातचीत में “पुराने संदेश लोड कर पुन: प्रयास” दबाएँ — अपने आप लगातार पेजिंग नहीं होती।
185
+ - `Esc` बार बंद करता है और हाइलाइट साफ़ करता है; बातचीत बदलने, पैनल खोलने या प्लगइन अनलोड होने पर भी सफ़ाई हो जाती है। ग्लोबल पैनल फ़ाइलों और सेशनों के पार खोजने का काम करता है, फ़ाइंड बार उसी बातचीत में एक-एक मैच पर जाने का; दोनों के हाइलाइट कभी एक-दूसरे पर नहीं चढ़ते।
171
186
 
172
187
 
173
188
  ## टूल्स
@@ -175,7 +190,7 @@ Web GUI में कहीं भी `Ctrl+Shift+F` दबाएँ, या स
175
190
  | टूल | क्या करता है |
176
191
  |---|---|
177
192
  | `locator_search` | नाम और पाथ खोज, `ext:`, `size:`, `dm:`, `path:` फ़िल्टर, क्रम और पेजिंग के साथ। |
178
- | `locator_find` | फ़ाइल बॉडी और सेशन संदेश खोज; स्निपेट, `sessionId`/`messageId` और कंटेंट इंडेक्स की स्थिति लौटाता है। |
193
+ | `locator_find` | फ़ाइल बॉडी और सेशन संदेश खोज; स्निपेट, `sessionId`/`messageId` (फ़ाइल हिट में `line` भी) और कंटेंट इंडेक्स की स्थिति लौटाता है। |
179
194
  | `locator_status` | जड़ें, नाम-इंडेक्स गिनती, watcher स्थिति, स्टेट डायरेक्टरी और इंजन पाथ। (कंटेंट प्रगति `locator_find` और पैनल बताते हैं।) |
180
195
  | `locator_rebuild` | नाम इंडेक्स को बैकग्राउंड स्कैन से बदलता है; नया तैयार होने तक पुराना इंडेक्स खोजता रहता है। |
181
196
  | `locator_reindex` | कंटेंट इंडेक्स रिफ़्रेश/रीबिल्ड: डिफ़ॉल्ट इंक्रीमेंटल, `full: true` पूरा फिर बनाता है। |
@@ -378,13 +393,24 @@ DeepSeek Harness
378
393
  - macOS भेजे गए बाइनरी में FSEvents (रिकर्सिव) इस्तेमाल करता है; `CGO_ENABLED=0` बिल्ड kqueue पर जाता है, 4,096 डायरेक्टरी सीमा के साथ, और कंटेंट बदलाव समय-समय पर रीबिल्ड पर निर्भर रहते हैं।
379
394
  - Windows USN/MFT वैकल्पिक है और केवल तब इस्तेमाल होता है जब प्रोसेस वॉल्यूम पढ़ सके और जर्नल सक्रिय हो; वरना पोर्टेबल वॉक चलता है।
380
395
 
381
- - फ़ाइल-बॉडी परिणाम अभी फ़ाइल मैनेजर में दिखते हैं (DSH के अंदर पंक्ति-स्तरीय पूर्वावलोकन अगला कदम है); असिस्टेंट संदेश अब `turn:step` नोड कुंजी से ठीक-ठीक जुड़ते हैं, वरना फ़्रेज़ fallback। 0.8.1 पर अपग्रेड करने से नए फ़ील्ड के लिए कंटेंट डेटाबेस एक बार फिर बनता है।
396
+ - फ़ाइल-बॉडी परिणाम अभी फ़ाइल मैनेजर में दिखते हैं (DSH के अंदर पंक्ति-स्तरीय पूर्वावलोकन अगला कदम है; फ़ाइल हिट के साथ `line` पंक्ति संख्या भी आती है); असिस्टेंट संदेश `turn:step` नोड कुंजी से ठीक-ठीक जुड़ते हैं, वरना फ़्रेज़ fallback। 0.8.1 पर अपग्रेड करने से नए फ़ील्ड के लिए कंटेंट डेटाबेस एक बार फिर बनता है।
397
+ - **पूरे कॉर्पस पर सामग्री रेगेक्स P0 में नहीं है**: रेगेक्स मोड सामग्री समूह को रोक देता है (फ़ाइल/फ़ोल्डर के नामों पर रेगेक्स चलता रहता है), ताकि 1 GB जैसे कॉर्पस पर स्कैन और ReDoS से बचा जाए; बातचीत के अंदर वाला फ़ाइंड बार रेगेक्स संभालता है।
398
+ - यह बातचीत स्कोप सिर्फ़ इंडेक्स हो चुके, स्थिर सेशन संदेशों तक है (सक्रिय सेशन में लगभग दो मिनट की देरी); लाइव खोज के लिए `Ctrl+F` इस्तेमाल करें। फ़ाइंड बार सिर्फ़ लोडेड विंडो कवर करता है; पुराना इतिहास हाथ से लोड करना होगा।
382
399
  - बातचीत के अंदर हाइलाइट CSS Custom Highlight API पर निर्भर है; पुराने ब्राउज़र में पंक्ति की रूपरेखा (outline) दिखती है।
383
400
 
384
401
  ## मेमोरी
385
402
 
386
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 रही।
387
404
 
405
+ ## 0.10.0 अपग्रेड नोट्स
406
+
407
+ - सामग्री खोज के लिए कम से कम **3 अक्षर** चाहिए; 1–2 अक्षर के लिए `Ctrl+F` उपयोग करें। 256 अक्षर/32 शब्द से बड़ी क्वेरी अस्वीकार होती है।
408
+ - `locator_find` डिफ़ॉल्ट **workspace स्कोप** (कॉलर सत्र और cwd) में चलता है; दूसरे workspace के लिए `scope: "all"` दें। नए पैरामीटर: `matchMode`, `caseSensitive`, `wholeWord`, `sessionId`, `count`, `countLimit`, `pathPrefix`.
409
+ - पैनल HTTP रूट अब DSH `connection` सेवा अनिवार्य करते हैं (fail-closed) और POST + JSON + same-origin जाँचते हैं; stock web profile प्रभावित नहीं।
410
+ - `locator_export` डिफ़ॉल्ट रूप से plugin stateDir में लिखता है और overwrite से पहले ownership जाँचता है; `locator_rebuild` केवल configured roots/excludes के subset लेता है।
411
+ - engine बाइनरी 0.10.0 हैं: snapshot dirty-debounce, `sort=path` सीमित मेमोरी, watcher degraded/fallback; macOS रिलीज़ cgo/FSEvents से बनना चाहिए (debug kqueue fallback प्रकाशन योग्य नहीं)।
412
+ - क्लाइंट: परिणाम-पंक्ति क्लिक के बाद भी कुंजी/Esc काम करते हैं; soft newline/`<br>`/CJK खोज ठीक; assistant twin rows में response प्राथमिक; regex Unicode `u` और worker विफलता पर main-thread fallback नहीं; सामग्री चेतावनी/सीमा/truncation दिखती है।
413
+
388
414
  ## सुरक्षा और गोपनीयता
389
415
 
390
416
  - इंडेक्स पूरी तरह स्थानीय है: कोई नेटवर्क कॉल नहीं, कोई टेलीमेट्री नहीं, कोई अपलोड नहीं। प्लगइन इंडेक्स की गई फ़ाइलों को कभी बदलता, हटाता या स्थानांतरित नहीं करता।
package/README-pt.md CHANGED
@@ -35,6 +35,7 @@ dsh plugin --profile web add dsh-locator
35
35
  - [Primeira execução](#primeira-execução)
36
36
  - [Duas buscas](#duas-buscas)
37
37
  - [Painel web](#painel-web)
38
+ - [Busca na conversa (Ctrl+F)](#busca-na-conversa-ctrlf)
38
39
  - [Ferramentas](#ferramentas)
39
40
  - [Linguagem de consulta](#linguagem-de-consulta)
40
41
  - [Configuração](#configuração)
@@ -162,12 +163,26 @@ A construção roda dentro do processo anfitrião do DSH, mas leituras de arquiv
162
163
 
163
164
  ## Painel web
164
165
 
165
- Pressione `Ctrl+Shift+F` na GUI web, ou clique na lupa no pé da barra lateral. O painel usa rotas de mesma origem (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), sem outro servidor nem outra porta.
166
+ Pressione `Ctrl+Shift+F` na GUI web, ou clique na lupa no pé da barra lateral. O painel usa rotas de mesma origem (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), sem outro servidor nem outra porta. O `/combined` aceita `matchMode`, `caseSensitive`, `wholeWord`, `sessionId` e `count`; o grupo de conteúdo devolve `count`/`warnings`, e os resultados de arquivo trazem `line`.
166
167
 
167
168
  - **Os três escopos vêm ativados por padrão**: conteúdo (corpos + sessões), arquivos e pastas; desmarque qualquer um para restringir. Os resultados são agrupados **conteúdo → arquivos → pastas** com a contagem por grupo; o conteúdo é ordenado por relevância e os grupos de nomes seguem o menu de ordem.
168
169
  - **Duplo clique ou `Enter` ativa um resultado**: uma sessão abre a conversa e pinta as palavras encontradas com destaque âmbar translúcido que acompanha a rolagem, é centralizado ao chegar e é limpo com `Esc`; arquivos e pastas são mostrados no gerenciador de arquivos. `Ctrl+Shift+C` copia o caminho, `Ctrl+O` abre, `Ctrl+Enter` insere `@file` e `Alt+1–3` alterna os escopos.
169
- - Consultas de conteúdo exigem pelo menos dois caracteres; consultas vazias ou de um caractere não iniciam a construção. Durante a construção o grupo de conteúdo mostra o progresso e os nomes respondem na hora; a escolha de escopos é lembrada.
170
- - Teclado: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` movem, `Enter` ativa e `Esc` fecha; o diálogo prende o foco e o restaura ao fechar. O texto segue `navigator.language` (zh/en/es/pt/hi).
170
+ - **Contagem**: os cabeçalhos de grupo mostram quantos resultados há — exato quando dá para contar, `≥ N` quando o total é limitado por um teto; o cabeçalho do painel mostra a posição selecionada (`3/37`) e o rodapé resume os três grupos. A página de conteúdo agora é montada em três passos — rowids do rank, corpo por rowid e trecho/linha em JS —, então palavras comuns caíram de ~2,7 s para menos de 300 ms.
171
+ - **Opções de busca**: a barra de ferramentas oferece modo (Normal / Estendido / Regex), `Aa` para diferenciar maiúsculas, palavra inteira e o escopo da conversa atual. Modo, maiúsculas e palavra inteira valem para nomes de arquivos e pastas; o conteúdo aceita Normal/Estendido/maiúsculas/palavra inteira, e **no modo Regex o escopo de conteúdo pausa** (nomes ainda aceitam regex), para que nenhuma tecla digitada no painel varra o corpus inteiro.
172
+ - **Escopo da conversa atual**: consulta apenas as mensagens já indexadas dessa sessão (uma sessão ativa leva cerca de 2 minutos para entrar no índice); os escopos de arquivos e pastas ficam desabilitados, mas mantêm a marcação. Para navegar ocorrência por ocorrência ao vivo, use a busca na conversa com `Ctrl+F`, logo abaixo.
173
+ - Consultas de conteúdo exigem pelo menos dois caracteres; consultas vazias ou de um caractere não iniciam a construção. Durante a construção o grupo de conteúdo mostra o progresso e os nomes respondem na hora; os escopos e as opções de busca são lembrados.
174
+ - Teclado: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` movem, `F3`/`Shift+F3` percorrem os resultados em ciclo, `Enter` ativa e `Esc` fecha; o diálogo prende o foco e o restaura ao fechar. O texto segue `navigator.language` (zh/en/es/pt/hi).
175
+
176
+ ## Busca na conversa (Ctrl+F)
177
+
178
+ Pressione `Ctrl+F` numa conversa (ou clique em `⌕` no cabeçalho da sessão) para abrir uma barra de busca não modal no canto superior direito da conversa, que pesquisa apenas as mensagens **carregadas** da conversa atual — sem índice de conteúdo e sem a espera de dois minutos:
179
+
180
+ - **Contagem e navegação**: mostra `3/17`; `Enter`/`F3` vão para a próxima ocorrência, `Shift+Enter`/`Shift+F3` para a anterior, e a busca dá a volta por padrão (ao chegar a uma ponta, retoma do outro lado e avisa). Todas as ocorrências ficam com destaque translúcido; a ocorrência atual fica mais escura e sublinhada.
181
+ - **Opções**: `Aa` diferencia maiúsculas, palavra inteira (limites `[A-Za-z0-9_]`; CJK conta como não palavra), continuar do início e buscar para trás (inverte a direção do `Enter`); os botões de anterior e próxima estão sempre disponíveis.
182
+ - **Modos**: Normal (literal), Estendido (`\n` `\r` `\t` `\0` `\xHH` `\\`; escapes desconhecidos ficam literais) e Regex (JS RegExp em uma worker thread, com timeout de 500 ms; padrão inválido mostra o erro na própria barra). Correspondências de largura zero são ignoradas em vez de travar a interface.
183
+ - **Busca na seleção**: selecione texto na conversa e pressione `Ctrl+F`; a barra começa restrita à seleção e mostra um chip com o tamanho da seleção. Seleções que cruzam mensagens também funcionam; se a seleção expirar, a barra volta para a conversa inteira.
184
+ - **Janela carregada**: só as mensagens já carregadas entram na busca; em conversas longas, use “Carregar mensagens anteriores e tentar novamente” em vez de paginação automática.
185
+ - `Esc` fecha a barra e limpa os destaques; trocar de conversa, abrir o painel ou descarregar o plugin também limpam. O painel global cuida da descoberta entre arquivos e sessões; a barra cuida da navegação ocorrência por ocorrência na conversa atual, e os destaques das duas nunca se sobrepõem.
171
186
 
172
187
 
173
188
  ## Ferramentas
@@ -175,7 +190,7 @@ Pressione `Ctrl+Shift+F` na GUI web, ou clique na lupa no pé da barra lateral.
175
190
  | Ferramenta | O que faz |
176
191
  |---|---|
177
192
  | `locator_search` | Consulta nomes e caminhos com filtros `ext:`, `size:`, `dm:`, `path:`, ordenação e paginação. |
178
- | `locator_find` | Busca em corpos de arquivo e mensagens de sessão; devolve trechos, `sessionId`/`messageId` e o estado do índice de conteúdo. |
193
+ | `locator_find` | Busca em corpos de arquivo e mensagens de sessão; devolve trechos, `sessionId`/`messageId` e o estado do índice de conteúdo. Resultados de arquivo podem trazer `line`. |
179
194
  | `locator_status` | Raízes, contagens do índice de nomes, estado do watcher, diretório de estado e caminho do motor. (O progresso do conteúdo é informado pelo `locator_find` e pelo painel.) |
180
195
  | `locator_rebuild` | Substitui o índice de nomes por uma varredura em segundo plano; as buscas usam o índice antigo até o novo ficar pronto. |
181
196
  | `locator_reindex` | Atualiza ou reconstrói o índice de conteúdo: incremental por padrão, `full: true` apaga e reconstrói. |
@@ -378,13 +393,24 @@ DeepSeek Harness
378
393
  - O macOS usa FSEvents (recursivo) nos binários publicados; uma compilação com `CGO_ENABLED=0` cai para kqueue, limitado a 4.096 diretórios, com mudanças de conteúdo dependendo da reconstrução periódica.
379
394
  - USN/MFT do Windows é opcional e só é usado se o processo puder ler o volume e o diário estiver ativo; caso contrário, usa-se a varredura portátil.
380
395
 
381
- - Resultados no corpo de arquivos abrem o gerenciador de arquivos por enquanto (a visualização por linha dentro do DSH é o próximo passo); mensagens do assistente agora são ancoradas pela chave de nó `turn:step`, com frase apenas como reserva. Atualizar para 0.8.1 reconstrói uma vez o banco de conteúdo pelo novo campo.
396
+ - Resultados no corpo de arquivos abrem o gerenciador de arquivos por enquanto (a visualização por linha dentro do DSH é o próximo passo; os resultados já trazem um número de `line`); mensagens do assistente ficam ancoradas pela chave de nó `turn:step`, com frase apenas como reserva. Atualizar de 0.8.0 para 0.8.1 reconstrói uma vez o banco de conteúdo pelo novo campo.
397
+ - **Regex de conteúdo em todo o corpus fica fora do P0**: o modo Regex pausa o grupo de conteúdo (nomes de arquivo e pasta continuam aceitando regex) para evitar varrer um corpus de 1 GB e ReDoS; a busca na conversa aceita regex.
398
+ - O escopo de conversa atual do painel cobre apenas mensagens de sessão já indexadas (uma sessão ativa entra no índice após cerca de 2 minutos de quietude); para busca ao vivo use `Ctrl+F`. A busca na conversa cobre apenas a janela carregada; carregue mensagens anteriores explicitamente.
382
399
  - O destaque dentro da conversa usa a API CSS Custom Highlight; navegadores antigos sem ela caem para um contorno na linha.
383
400
 
384
401
  ## Memória
385
402
 
386
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.
387
404
 
405
+ ## Notas de atualização 0.10.0
406
+
407
+ - 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.
408
+ - `locator_find` usa **escopo workspace** por padrão (sessão do chamador e seu cwd); para cruzar workspaces passe `scope: "all"`. Novos parâmetros: `matchMode`, `caseSensitive`, `wholeWord`, `sessionId`, `count`, `countLimit`, `pathPrefix`.
409
+ - As rotas HTTP do painel exigem o serviço `connection` do DSH (fail-closed) e POST + JSON + mesma origem; o perfil web padrão não muda.
410
+ - `locator_export` grava por padrão no stateDir do plugin e valida a propriedade antes de sobrescrever; `locator_rebuild` aceita apenas subconjuntos dos roots/excludes configurados.
411
+ - Os binários do engine são 0.10.0: snapshot com debounce, memória de `sort=path` limitada, watcher com estado degradado/fallback; no macOS o release precisa ser compilado com cgo/FSEvents (o fallback kqueue de depuração não é publicável).
412
+ - Cliente: clique nos resultados mantém teclado/Esc; busca com quebras suaves/`<br>`/CJK corrigida; linhas gêmeas do assistente preferem a resposta; regex usa `u` e não cai na thread principal; avisos/limites/truncamento visíveis.
413
+
388
414
  ## Segurança e privacidade
389
415
 
390
416
  - O índice é local: sem chamadas de rede, sem telemetria, sem uploads. O plugin nunca modifica, move ou apaga arquivos indexados.
package/README.en.md CHANGED
@@ -35,6 +35,7 @@ dsh plugin --profile web add dsh-locator
35
35
  - [First run](#first-run)
36
36
  - [Two searches](#two-searches)
37
37
  - [Web panel](#web-panel)
38
+ - [Find in the conversation (Ctrl+F)](#find-in-the-conversation-ctrlf)
38
39
  - [Tools](#tools)
39
40
  - [Query language](#query-language)
40
41
  - [Configuration](#configuration)
@@ -162,12 +163,26 @@ The build runs inside the DSH host process, but file reads and zstd decoding are
162
163
 
163
164
  ## Web panel
164
165
 
165
- Press `Ctrl+Shift+F` anywhere in the Web GUI, or click the magnifier at the sidebar foot. The panel uses same-origin routes (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), so it needs no second server and no extra port.
166
+ Press `Ctrl+Shift+F` anywhere in the Web GUI, or click the magnifier at the sidebar foot. The panel uses same-origin routes (`search`, `content`, `content/rebuild`, `combined`, `status`, `reveal`, `open`), so it needs no second server and no extra port. `/combined` accepts `matchMode`, `caseSensitive`, `wholeWord`, `sessionId` and `count`; the content group returns `count`/`warnings` and file hits carry `line`.
166
167
 
167
168
  - **All three scopes are on by default**: content (bodies + sessions), files and folders; uncheck any scope to narrow the search. Results are grouped **content → files → folders** with a count per group; content is ranked by relevance and name groups follow the sort menu.
168
169
  - **Double-click or `Enter` activates a hit**: a session hit opens the conversation and paints the matched words with a translucent amber highlight that follows scrolling, is centered on arrival and clears with `Esc`; file/folder hits are revealed in the file manager. `Ctrl+Shift+C` copies the path, `Ctrl+O` opens, `Ctrl+Enter` inserts `@file`, and `Alt+1–3` toggles the scopes.
169
- - Content queries need at least two characters; empty and one-character queries never start the content build. While it builds the content group shows progress and name results return immediately; the scope choice is remembered.
170
- - Keyboard: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` move, `Enter` activates, `Esc` closes; the dialog traps focus and restores it on close. Panel text follows `navigator.language` (zh/en/es/pt/hi).
170
+ - **Counts**: group headers show the match count; exact when cheap, `≥ N` when capped. The header shows the selected position (`3/37`) and the footer summarises all groups. The content page path now runs rank-rowids → body-by-rowid → JS snippet/line, so common words dropped from about 2.7 s to under 300 ms.
171
+ - **Find options**: the toolbar offers mode (Normal / Extended / Regex), `Aa` match case, whole word and a current-conversation scope. Mode/case/whole-word apply to file and folder names; content supports Normal/Extended/case/whole-word, while **regex pauses the content group** (names still allow regex) so a panel keystroke never scans the whole corpus.
172
+ - **Current conversation scope**: only indexed messages of that session are searched (an active session is indexed after roughly two minutes), and file/folder scopes are disabled but keep their ticks. For live per-match navigation use the `Ctrl+F` find bar below.
173
+ - Content queries need at least three characters; empty, one- and two-character queries never start the content build (use Ctrl+F for short searches). While it builds the content group shows progress and name results return immediately; scopes and find options are remembered.
174
+ - Keyboard: `↑`/`↓`, `Home`/`End`, `PageUp`/`PageDown` move, `F3`/`Shift+F3` cycle result rows, `Enter` activates, `Esc` closes; the dialog traps focus and restores it on close. Panel text follows `navigator.language` (zh/en/es/pt/hi).
175
+
176
+ ## Find in the conversation (Ctrl+F)
177
+
178
+ Press `Ctrl+F` in a conversation (or click `⌕` in the session header) to open a non-modal find bar that searches only the **loaded** messages of the current conversation — no content index, no two-minute delay:
179
+
180
+ - **Count and navigation**: shows `3/17`; `Enter`/`F3` next, `Shift+Enter`/`Shift+F3` previous, wrap around on by default (reaching an edge continues from the other side). All matches are painted with a translucent highlight; the current match is darker and underlined.
181
+ - **Options**: `Aa` match case, whole word (ASCII `[A-Za-z0-9_]` boundaries; CJK is treated as non-word), wrap and reverse (flips the `Enter` direction); explicit previous/next buttons are always available.
182
+ - **Modes**: Normal (literal), Extended (`\n` `\r` `\t` `\0` `\xHH` `\\`, unknown escapes stay literal), Regex (JS RegExp in a worker with a 500 ms timeout; invalid patterns show an inline error). Zero-width matches are skipped instead of freezing the UI.
183
+ - **Selection scope**: select text in the conversation and press `Ctrl+F`; the bar starts scoped to that selection and shows a selection chip. Cross-message selections are supported; if the selection expires the bar falls back to the whole conversation.
184
+ - **Loaded window**: only loaded messages are searched; on long conversations use “Load earlier messages and retry” rather than automatic paging.
185
+ - `Esc` closes the bar and clears highlights; switching conversations, opening the panel or disposing the plugin also cleans up. The global panel handles cross-file/cross-session discovery while the find bar handles per-match navigation in the current conversation; their highlights never stack.
171
186
 
172
187
 
173
188
  ## Tools
@@ -175,7 +190,7 @@ Press `Ctrl+Shift+F` anywhere in the Web GUI, or click the magnifier at the side
175
190
  | Tool | What it does |
176
191
  |---|---|
177
192
  | `locator_search` | Query names and paths, with `ext:`, `size:`, `dm:`, `path:` filters plus sorting and pagination. |
178
- | `locator_find` | Search file bodies and session messages; hits carry snippets and `sessionId`/`messageId`, plus the content-index state. |
193
+ | `locator_find` | Search file bodies and session messages; hits carry snippets, an optional `line` number, `sessionId`/`messageId`, and the content-index state. |
179
194
  | `locator_status` | Roots, name-index counts, watcher state, state directory and engine path. (Content progress is reported by `locator_find` and the panel, not here.) |
180
195
  | `locator_rebuild` | Replace the name index with a fresh background scan; searches keep using the old index until the new one is ready. |
181
196
  | `locator_reindex` | Refresh or rebuild the content index: incremental by default, `full: true` drops and rebuilds it. |
@@ -378,13 +393,24 @@ DeepSeek Harness
378
393
  - macOS uses FSEvents (recursive) in the shipped binaries; a `CGO_ENABLED=0` build falls back to kqueue, capped at 4,096 directories, with content changes relying on the periodic rebuild.
379
394
  - Windows USN/MFT is optional and only used when the process can read the volume and the journal is active; otherwise the portable walk is used.
380
395
 
381
- - File-body hits currently reveal the file in the file manager (line-level preview inside DSH is next); assistant messages now anchor exactly through their `turn:step` node key, with a phrase fallback only when that row is missing. Upgrading to 0.8.1 rebuilds the content database once for the new node-key field.
396
+ - File-body hits currently reveal the file in the file manager (line-level preview inside DSH is next; hits now carry a `line` number); assistant messages anchor exactly through their `turn:step` node key with a phrase fallback. Upgrading from 0.8.0 to 0.8.1 rebuilds the content database once for the node-key field.
397
+ - **Whole-corpus content regex is not in P0**: regex pauses the content group (names still allow regex) to avoid scanning a 1 GB corpus and ReDoS; the in-conversation find bar supports regex.
398
+ - The current-conversation panel scope covers indexed, settled session messages only (roughly a two-minute delay for an active session); use `Ctrl+F` for live search. The find bar covers the loaded window only; load earlier messages explicitly.
382
399
  - In-conversation highlighting uses the CSS Custom Highlight API; older browsers without it fall back to a row outline.
383
400
 
384
401
  ## Memory
385
402
 
386
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.
387
404
 
405
+ ## 0.10.0 upgrade notes
406
+
407
+ - Content search requires at least **3 characters**; use `Ctrl+F` for 1–2 character searches. Queries over 256 characters/32 terms are rejected.
408
+ - `locator_find` defaults to **workspace scope** (session hits: the caller session; file hits: the caller cwd). Pass `scope: "all"` for explicit cross-workspace access. New parameters: `matchMode`, `caseSensitive`, `wholeWord`, `sessionId`, `count`, `countLimit`, `pathPrefix`.
409
+ - Panel HTTP routes now require the DSH `connection` service (fail-closed) and enforce POST + JSON + same-origin Fetch metadata; the stock web profile is unaffected.
410
+ - `locator_export` writes under the plugin state directory by default and validates ownership before overwrite; `locator_rebuild` accepts only configured roots/exclude subsets.
411
+ - Engine binaries are 0.10.0. Snapshot saves are dirty-debounced, `sort=path` memory is bounded, watcher state reports degraded/refresh fallback; macOS release binaries must be built on macOS with cgo/FSEvents (the debug kqueue fallback is not releasable).
412
+ - Client: result-row clicks keep keyboard/Esc working; soft newlines/`<br>`/CJK find fixed; assistant twin rows prefer the response row; regex prefers Unicode `u` and never falls back to the main thread; content warnings/caps/truncation are visible.
413
+
388
414
  ## Security and privacy
389
415
 
390
416
  - The index is local: no network calls, no telemetry, no uploads. The plugin never modifies, moves or deletes indexed files.
package/README.md CHANGED
@@ -35,6 +35,7 @@ dsh plugin --profile web add dsh-locator
35
35
  - [第一次运行](#第一次运行)
36
36
  - [两种搜索](#两种搜索)
37
37
  - [Web 面板](#web-面板)
38
+ - [在会话中查找(Ctrl+F)](#在会话中查找ctrlf)
38
39
  - [工具一览](#工具一览)
39
40
  - [查询语法](#查询语法)
40
41
  - [配置](#配置)
@@ -161,12 +162,26 @@ Everything 风格的查询语法,返回路径、大小、修改时间、扩展
161
162
 
162
163
  ## Web 面板
163
164
 
164
- 在 Web GUI 里按 `Ctrl+Shift+F`,或者点侧栏底部的放大镜。面板通过同源路由工作(`search`、`content`、`content/rebuild`、`combined`、`status`、`reveal`、`open`),不另起服务、不占额外端口。
165
+ 在 Web GUI 里按 `Ctrl+Shift+F`,或者点侧栏底部的放大镜。面板通过同源路由工作(`search`、`content`、`content/rebuild`、`combined`、`status`、`reveal`、`open`),不另起服务、不占额外端口。`/combined` 新增 `matchMode`、`caseSensitive`、`wholeWord`、`sessionId`、`count` 参数,内容组返回 `count`/`warnings`,文件命中带 `line`。
165
166
 
166
167
  - **默认同时搜索三个范围**:内容(正文 + 会话)、文件、目录,三个勾选默认全部打开;取消任一勾选即可缩小范围。结果按“内容 → 文件 → 目录”分组,组头显示数量;内容按相关度排序,文件/目录按排序菜单。
167
168
  - **双击或 `Enter` 激活**:会话命中打开对应会话,并把命中的词用半透明琥珀色高亮(随滚动跟随、自动居中、`Esc` 清除);文件/目录在文件管理器中定位。`Ctrl+Shift+C` 复制路径,`Ctrl+O` 打开,`Ctrl+Enter` 插入 `@file`,`Alt+1–3` 切换范围。
168
- - 内容查询至少需要 2 个字符;空查询和 1 个字符的查询不会启动内容索引构建。构建期间内容组显示进度,文件名/目录结果立即返回;勾选状态会记住。
169
- - 键盘:`↑`/`↓`、`Home`/`End`、`PageUp`/`PageDown` 移动,`Enter` 激活,`Esc` 关闭;对话框有焦点陷阱并在关闭时还原。面板文案跟随 `navigator.language`(中/英/西/葡/印地语)。
169
+ - **计数**:组头显示命中数;可精确时显示数字,受上限保护时显示 `≥ N`;头部显示当前选中位置 `3/37`,底栏汇总三组。内容页面路径已改为“先取 rank rowid、再按 rowid 取正文、JS 生成片段/行号”,常见词从约 2.7 秒降到 300 毫秒以内。
170
+ - **查找选项**:工具栏提供模式(普通 / 扩展 / 正则)、`Aa` 大小写、全词、当前会话范围。模式和大小写/全词对文件、目录名生效;内容支持普通/扩展/大小写/全词,**正则模式下内容组自动暂停**(文件/目录仍可正则),避免全库正则扫描。
171
+ - **当前会话范围**:勾选后只查该会话已落定的索引消息(活跃会话约有 2 分钟索引延迟),文件/目录勾选会禁用但保留;实时逐处查找请用下文的 `Ctrl+F` 会话内查找条。
172
+ - 内容查询至少需要 3 个字符;空查询和 1–2 个字符的查询不会启动内容索引构建。构建期间内容组显示进度,文件名/目录结果立即返回;勾选和查找选项会记住。
173
+ - 键盘:`↑`/`↓`、`Home`/`End`、`PageUp`/`PageDown` 移动,`F3`/`Shift+F3` 在结果行间循环,`Enter` 激活,`Esc` 关闭;对话框有焦点陷阱并在关闭时还原。面板文案跟随 `navigator.language`(中/英/西/葡/印地语)。
174
+
175
+ ## 在会话中查找(Ctrl+F)
176
+
177
+ 在对话里按 `Ctrl+F`(或点会话头部的 `⌕`)打开非模态查找条,只搜索当前会话**已加载**的消息,不依赖内容索引、没有 2 分钟延迟:
178
+
179
+ - **计数与导航**:显示 `3/17`;`Enter`/`F3` 下一个,`Shift+Enter`/`Shift+F3` 上一个,循环查找默认开启,到端点会回到另一端并提示。所有命中半透明高亮,当前命中加深并加下划线。
180
+ - **选项**:`Aa` 区分大小写、全词匹配(ASCII `[A-Za-z0-9_]` 边界,中文按非词字符处理)、循环、反向(改变 `Enter` 主方向);方向按钮始终显式可用。
181
+ - **模式**:普通(字面量)、扩展(支持 `\n` `\r` `\t` `\0` `\xHH` `\\`,未知转义按字面)、正则(JS RegExp,在 Worker 中执行并带 500ms 超时;非法正则内联报错)。正则零宽匹配会跳过,不卡死。
182
+ - **选区查找**:先在会话里选中文本,再按 `Ctrl+F`,查找条默认只在该选区范围内查找,并显示选区 chip;跨消息选区也支持;选区失效会自动回退到整个会话。
183
+ - **已加载窗口**:查找条只覆盖当前已加载的消息;长会话可点“加载更早消息后重试”,不会自动连续翻页。
184
+ - `Esc` 关闭查找条并清除高亮;会话切换、面板打开、插件卸载都会清理。全局面板负责跨文件/跨会话发现,查找条负责当前会话内逐处定位,两者不叠加高亮。
170
185
 
171
186
 
172
187
  ## 工具一览
@@ -174,7 +189,7 @@ Everything 风格的查询语法,返回路径、大小、修改时间、扩展
174
189
  | 工具 | 作用 |
175
190
  |---|---|
176
191
  | `locator_search` | 按文件名/路径搜索,支持 `ext:`、`size:`、`dm:`、`path:` 等过滤与排序分页。 |
177
- | `locator_find` | 按文件正文和会话内容搜索,返回片段与 `sessionId`/`messageId`,并带内容索引状态。 |
192
+ | `locator_find` | 按文件正文和会话内容搜索,返回片段、可选 `line` 行号与 `sessionId`/`messageId`,并带内容索引状态。 |
178
193
  | `locator_status` | 查看根目录、名称索引条目数、监听状态、状态目录和引擎版本(内容索引进度由 `locator_find` / 面板报告)。 |
179
194
  | `locator_rebuild` | 后台重建名称索引;新索引就绪前搜索继续使用旧的。 |
180
195
  | `locator_reindex` | 重建/刷新内容索引:默认增量,`full: true` 全量。 |
@@ -344,9 +359,20 @@ Go 引擎在 `engine/` 下,测试用 `cd engine && go test ./...`。macOS 的
344
359
  - 两个 DSH 进程共享同一个 `stateDir` 时,构建锁只能串行化写入;建议各用各的缓存目录。
345
360
  - macOS 的发布版二进制用 FSEvents;`CGO_ENABLED=0` 构建只有 kqueue,目录上限 4096,且内容变更依赖定时重建。
346
361
 
347
- - 文件正文命中目前只在文件管理器里定位(在 DSH 内按行预览是下一步);assistant 消息通过 `turn:step` 节点键精确定位,找不到时才退回短语匹配。升级到 0.8.1 会因新增节点键字段重建一次内容库。
362
+ - 文件正文命中目前只在文件管理器里定位(在 DSH 内按行预览是下一步;查询结果已带 `line` 行号);assistant 消息通过 `turn:step` 节点键精确定位,找不到时才退回短语匹配。
363
+ - **全库内容正则 P0 不做**:正则模式会暂停内容组(文件/目录名仍可正则),避免 1GB 级全库扫描和 ReDoS;会话内查找条支持正则。
364
+ - 当前会话范围只覆盖已落定索引的会话消息(活跃会话约 2 分钟延迟);实时查找用 `Ctrl+F`。会话内查找条只覆盖已加载窗口,更早历史需手动加载。
348
365
  - 会话内高亮依赖 CSS Custom Highlight API;不支持它的旧浏览器会退化为整行描边。
349
366
 
367
+ ## 0.10.0 升级注意
368
+
369
+ - 内容搜索最短 **3 个字符**;1–2 字符请用 `Ctrl+F` 会话内查找。查询超过 256 字符/32 个词会直接报错。
370
+ - `locator_find` 默认 **workspace 范围**(会话只查调用者当前会话,文件正文只查调用者 cwd);跨工作区需显式传 `scope: "all"`。新增 `matchMode`/`caseSensitive`/`wholeWord`/`sessionId`/`count`/`pathPrefix` 参数。
371
+ - 面板 HTTP 路由现在**硬依赖 DSH `connection` 服务**(缺失则不挂载/503),并强制 POST + JSON + 同源校验;stock web profile 正常。
372
+ - `locator_export` 默认只写插件 stateDir,覆盖前校验是否本工具生成的 SQLite;`locator_rebuild` 只接受配置 roots/excludes 的子集。
373
+ - 引擎二进制版本为 0.10.0;快照保存改为脏数据 debounce、`sort=path` 内存修复、watcher 降级/refresh fallback;macOS 发布版必须由 macOS cgo/FSEvents 构建,debug kqueue fallback 不能发布。
374
+ - 客户端:面板点击结果后键盘/Esc 保持;软换行/`<br>`/CJK 查找修复;assistant 同 nodeKey 双行优先回复行;正则优先 Unicode `u` 且 worker 失败不再回退主线程;内容错误/警告/截断在面板可见。
375
+
350
376
  ## 安全与隐私
351
377
 
352
378
  - 索引完全在本地:不联网、不上传、不埋点;插件不会修改、移动或删除被索引的文件。
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file