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/lib/content.d.ts CHANGED
@@ -15,6 +15,8 @@
15
15
  * alone unless `includeArchived` is set.
16
16
  * @module dsh-locator/content
17
17
  */
18
+ import { Worker } from 'node:worker_threads';
19
+ import { type ContentSearchOptions, type ContentSearchResult } from './content-search.ts';
18
20
  import type { LocatorRuntime } from './runtime.ts';
19
21
  export interface ContentHit {
20
22
  kind: 'file' | 'session';
@@ -25,6 +27,8 @@ export interface ContentHit {
25
27
  messageId?: string;
26
28
  /** Exact `data-chat-node-key` of the rendered row, when the host has one. */
27
29
  nodeKey?: string;
30
+ /** 1-based line of the first match inside the stored body, for file hits. */
31
+ line?: number;
28
32
  score: number;
29
33
  }
30
34
  export interface ContentState {
@@ -34,6 +38,11 @@ export interface ContentState {
34
38
  messages: number;
35
39
  truncated: boolean;
36
40
  error: string;
41
+ /**
42
+ * Non-fatal problems from the last build/refresh: unreadable session logs,
43
+ * a quarantined database, and so on. Empty when everything was read.
44
+ */
45
+ warnings: string[];
37
46
  updatedAt: number;
38
47
  }
39
48
  export interface ContentOptions {
@@ -58,6 +67,16 @@ export interface ContentOptions {
58
67
  * single-threaded.
59
68
  */
60
69
  searchWorker?: boolean;
70
+ /**
71
+ * How long one worker query may run before it is reported as
72
+ * `content-search-timeout`. The query is never re-run on the host thread.
73
+ */
74
+ searchWorkerTimeoutMs?: number;
75
+ /**
76
+ * Test seam: build the search worker instead of spawning the compiled one.
77
+ * Production never sets it.
78
+ */
79
+ searchWorkerFactory?: (workerPath: string) => Worker;
61
80
  }
62
81
  export declare class ContentIndex {
63
82
  private readonly rt;
@@ -73,6 +92,8 @@ export declare class ContentIndex {
73
92
  private workerSeq;
74
93
  private pendingStart;
75
94
  private dbIdentity;
95
+ /** Session id → indexed session log path, for session-scoped content search. */
96
+ private readonly sessionPaths;
76
97
  private readonly pending;
77
98
  constructor(rt: LocatorRuntime, options: ContentOptions);
78
99
  status(): ContentState;
@@ -111,9 +132,36 @@ export declare class ContentIndex {
111
132
  private full;
112
133
  private incremental;
113
134
  private open;
135
+ /**
136
+ * Decide what an existing `content.db` is before touching it:
137
+ * - `foreign`: no dsh-locator table at all — refuse to modify it.
138
+ * - `corrupt`: zero bytes, unreadable, or not a SQLite database.
139
+ * - `incompatible`: has our tables but a different schema version/shape.
140
+ * - `ok`: safe to reuse.
141
+ */
142
+ private classifyDatabase;
143
+ /**
144
+ * Move a broken/outdated database aside instead of destroying it. The
145
+ * timestamped name keeps the bytes around for inspection; if the rename
146
+ * fails (another process still holds it on Windows) a fresh file is still
147
+ * created so content search recovers.
148
+ */
149
+ private quarantineDatabase;
150
+ /** Record one non-fatal build warning (deduplicated, bounded). */
151
+ private addWarning;
114
152
  private reopenWorker;
115
153
  private stopWorker;
154
+ /**
155
+ * Whether a usable search worker exists, creating one when needed.
156
+ * @returns false when the worker cannot be created at all; that is the only
157
+ * case in which an in-process (sync) query is allowed.
158
+ */
116
159
  private ensureWorker;
160
+ /**
161
+ * Resolve one worker reply. A malformed reply is reported as a protocol
162
+ * error; the query is never retried on the host thread.
163
+ */
164
+ private onWorkerMessage;
117
165
  private identityOf;
118
166
  /**
119
167
  * Whether the open handle still points at the file on disk. Another DSH
@@ -127,8 +175,6 @@ export declare class ContentIndex {
127
175
  private recoverExternal;
128
176
  /** Whether the engine is re-scanning, which can move its dump cursor. */
129
177
  private engineRescanning;
130
- /** Whether `path` is a SQLite database this plugin created (has docs_meta). */
131
- private ownedDatabase;
132
178
  private readFlag;
133
179
  private writeFlag;
134
180
  /**
@@ -143,7 +189,15 @@ export declare class ContentIndex {
143
189
  /** True when a session log has been quiet long enough to be read safely. */
144
190
  private settled;
145
191
  private finish;
192
+ /**
193
+ * Rebuild the session id → session log path map from the persisted sources.
194
+ * Runs after `open()` and after every build/refresh, so session-scoped
195
+ * searches work against an existing database before the first refresh ends.
196
+ */
197
+ private refreshSessionPaths;
146
198
  private addDoc;
199
+ /** Body bytes stored for one document key (0 when it is not indexed). */
200
+ private storedBytes;
147
201
  private deleteDoc;
148
202
  private deletePath;
149
203
  private indexFiles;
@@ -153,19 +207,43 @@ export declare class ContentIndex {
153
207
  private readFileDoc;
154
208
  private indexSessions;
155
209
  private refreshSessions;
156
- private indexSessionFile;
210
+ /** Read and decompress one session log completely; no side effects on rows. */
211
+ private readSessionText;
212
+ /** Index one already-decoded session log; the caller owns row replacement. */
213
+ private indexSessionText;
157
214
  /** Session logs to consider, newest first, minus archived ones by default. */
158
215
  private sessionCandidates;
159
216
  sessionRoots(): string[];
160
217
  /**
161
218
  * Search file bodies and session messages. With `searchWorker` enabled the
162
- * query itself runs off the host thread; a failed or wedged worker falls back
163
- * to the in-process query so a result is still produced.
219
+ * query itself runs off the host thread.
220
+ *
221
+ * A worker timeout, crash or malformed reply is a hard error result: the
222
+ * same query is never re-run on the host thread, where a heavy query (for
223
+ * example a whole-word scan) would stall the DSH event loop. Only when the
224
+ * worker cannot be created at all does the query run in-process, and that
225
+ * fallback is budgeted (bounded counts).
226
+ *
227
+ * The two-argument form returns the hit array (legacy callers). The
228
+ * three-argument form returns hits plus count, warnings and an error code,
229
+ * and understands the advanced match options.
164
230
  * @param query - words or a phrase to find.
165
231
  * @param limit - maximum hits.
232
+ * @param options - match mode, case/whole-word flags, session scope, count mode.
166
233
  * @returns matching documents ordered by relevance.
167
234
  */
168
235
  search(query: string, limit: number): Promise<ContentHit[]>;
236
+ search(query: string, limit: number, options: ContentSearchOptions): Promise<ContentSearchResult>;
237
+ private searchDetailed;
238
+ /** Run one query on the worker; timeout/protocol errors are final results. */
239
+ private searchInWorker;
240
+ /** Map a request's sessionId onto the indexed session log path. */
241
+ private resolveSession;
242
+ /**
243
+ * In-process query path. When `degraded` is set (worker creation failed) the
244
+ * options are tightened so this rare path cannot spend an unbounded amount of
245
+ * host-thread time counting matches.
246
+ */
169
247
  private searchSync;
170
248
  }
171
249
  //# sourceMappingURL=content.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content.d.ts","sourceRoot":"","sources":["../src/content.ts"],"names":[],"mappings":"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"}