log-search 1.0.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 (232) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/bin/log-search.js +45 -0
  4. package/dist/cli/commands/clear.d.ts +9 -0
  5. package/dist/cli/commands/clear.d.ts.map +1 -0
  6. package/dist/cli/commands/clear.js +116 -0
  7. package/dist/cli/commands/clear.js.map +1 -0
  8. package/dist/cli/commands/index.d.ts +8 -0
  9. package/dist/cli/commands/index.d.ts.map +1 -0
  10. package/dist/cli/commands/index.js +118 -0
  11. package/dist/cli/commands/index.js.map +1 -0
  12. package/dist/cli/commands/info.d.ts +8 -0
  13. package/dist/cli/commands/info.d.ts.map +1 -0
  14. package/dist/cli/commands/info.js +96 -0
  15. package/dist/cli/commands/info.js.map +1 -0
  16. package/dist/cli/commands/search.d.ts +9 -0
  17. package/dist/cli/commands/search.d.ts.map +1 -0
  18. package/dist/cli/commands/search.js +178 -0
  19. package/dist/cli/commands/search.js.map +1 -0
  20. package/dist/cli/commands/watch.d.ts +8 -0
  21. package/dist/cli/commands/watch.d.ts.map +1 -0
  22. package/dist/cli/commands/watch.js +141 -0
  23. package/dist/cli/commands/watch.js.map +1 -0
  24. package/dist/cli/main.d.ts +6 -0
  25. package/dist/cli/main.d.ts.map +1 -0
  26. package/dist/cli/main.js +57 -0
  27. package/dist/cli/main.js.map +1 -0
  28. package/dist/cli/output/colorizer.d.ts +36 -0
  29. package/dist/cli/output/colorizer.d.ts.map +1 -0
  30. package/dist/cli/output/colorizer.js +101 -0
  31. package/dist/cli/output/colorizer.js.map +1 -0
  32. package/dist/cli/output/formatter.d.ts +31 -0
  33. package/dist/cli/output/formatter.d.ts.map +1 -0
  34. package/dist/cli/output/formatter.js +146 -0
  35. package/dist/cli/output/formatter.js.map +1 -0
  36. package/dist/cli/output/table.d.ts +12 -0
  37. package/dist/cli/output/table.d.ts.map +1 -0
  38. package/dist/cli/output/table.js +48 -0
  39. package/dist/cli/output/table.js.map +1 -0
  40. package/dist/core/indexer/ChunkProcessor.d.ts +21 -0
  41. package/dist/core/indexer/ChunkProcessor.d.ts.map +1 -0
  42. package/dist/core/indexer/ChunkProcessor.js +105 -0
  43. package/dist/core/indexer/ChunkProcessor.js.map +1 -0
  44. package/dist/core/indexer/IndexBuilder.d.ts +47 -0
  45. package/dist/core/indexer/IndexBuilder.d.ts.map +1 -0
  46. package/dist/core/indexer/IndexBuilder.js +274 -0
  47. package/dist/core/indexer/IndexBuilder.js.map +1 -0
  48. package/dist/core/indexer/IndexSerializer.d.ts +30 -0
  49. package/dist/core/indexer/IndexSerializer.d.ts.map +1 -0
  50. package/dist/core/indexer/IndexSerializer.js +142 -0
  51. package/dist/core/indexer/IndexSerializer.js.map +1 -0
  52. package/dist/core/indexer/OffsetMapper.d.ts +55 -0
  53. package/dist/core/indexer/OffsetMapper.d.ts.map +1 -0
  54. package/dist/core/indexer/OffsetMapper.js +94 -0
  55. package/dist/core/indexer/OffsetMapper.js.map +1 -0
  56. package/dist/core/indexer/TokenExtractor.d.ts +27 -0
  57. package/dist/core/indexer/TokenExtractor.d.ts.map +1 -0
  58. package/dist/core/indexer/TokenExtractor.js +92 -0
  59. package/dist/core/indexer/TokenExtractor.js.map +1 -0
  60. package/dist/core/searcher/IndexSearcher.d.ts +37 -0
  61. package/dist/core/searcher/IndexSearcher.d.ts.map +1 -0
  62. package/dist/core/searcher/IndexSearcher.js +360 -0
  63. package/dist/core/searcher/IndexSearcher.js.map +1 -0
  64. package/dist/core/searcher/RankEngine.d.ts +29 -0
  65. package/dist/core/searcher/RankEngine.d.ts.map +1 -0
  66. package/dist/core/searcher/RankEngine.js +90 -0
  67. package/dist/core/searcher/RankEngine.js.map +1 -0
  68. package/dist/core/searcher/ResultFetcher.d.ts +37 -0
  69. package/dist/core/searcher/ResultFetcher.d.ts.map +1 -0
  70. package/dist/core/searcher/ResultFetcher.js +118 -0
  71. package/dist/core/searcher/ResultFetcher.js.map +1 -0
  72. package/dist/core/streaming/ChunkSplitter.d.ts +25 -0
  73. package/dist/core/streaming/ChunkSplitter.d.ts.map +1 -0
  74. package/dist/core/streaming/ChunkSplitter.js +71 -0
  75. package/dist/core/streaming/ChunkSplitter.js.map +1 -0
  76. package/dist/core/streaming/FileStreamer.d.ts +39 -0
  77. package/dist/core/streaming/FileStreamer.d.ts.map +1 -0
  78. package/dist/core/streaming/FileStreamer.js +138 -0
  79. package/dist/core/streaming/FileStreamer.js.map +1 -0
  80. package/dist/core/streaming/LineBuffer.d.ts +26 -0
  81. package/dist/core/streaming/LineBuffer.d.ts.map +1 -0
  82. package/dist/core/streaming/LineBuffer.js +52 -0
  83. package/dist/core/streaming/LineBuffer.js.map +1 -0
  84. package/dist/core/workers/IndexWorker.d.ts +8 -0
  85. package/dist/core/workers/IndexWorker.d.ts.map +1 -0
  86. package/dist/core/workers/IndexWorker.js +41 -0
  87. package/dist/core/workers/IndexWorker.js.map +1 -0
  88. package/dist/core/workers/SearchWorker.d.ts +7 -0
  89. package/dist/core/workers/SearchWorker.d.ts.map +1 -0
  90. package/dist/core/workers/SearchWorker.js +63 -0
  91. package/dist/core/workers/SearchWorker.js.map +1 -0
  92. package/dist/core/workers/WorkerPool.d.ts +30 -0
  93. package/dist/core/workers/WorkerPool.d.ts.map +1 -0
  94. package/dist/core/workers/WorkerPool.js +132 -0
  95. package/dist/core/workers/WorkerPool.js.map +1 -0
  96. package/dist/formats/LogFormatDetector.d.ts +22 -0
  97. package/dist/formats/LogFormatDetector.d.ts.map +1 -0
  98. package/dist/formats/LogFormatDetector.js +123 -0
  99. package/dist/formats/LogFormatDetector.js.map +1 -0
  100. package/dist/formats/parsers/ApacheParser.d.ts +10 -0
  101. package/dist/formats/parsers/ApacheParser.d.ts.map +1 -0
  102. package/dist/formats/parsers/ApacheParser.js +54 -0
  103. package/dist/formats/parsers/ApacheParser.js.map +1 -0
  104. package/dist/formats/parsers/GenericParser.d.ts +11 -0
  105. package/dist/formats/parsers/GenericParser.d.ts.map +1 -0
  106. package/dist/formats/parsers/GenericParser.js +61 -0
  107. package/dist/formats/parsers/GenericParser.js.map +1 -0
  108. package/dist/formats/parsers/JsonParser.d.ts +12 -0
  109. package/dist/formats/parsers/JsonParser.d.ts.map +1 -0
  110. package/dist/formats/parsers/JsonParser.js +92 -0
  111. package/dist/formats/parsers/JsonParser.js.map +1 -0
  112. package/dist/formats/parsers/NginxParser.d.ts +15 -0
  113. package/dist/formats/parsers/NginxParser.d.ts.map +1 -0
  114. package/dist/formats/parsers/NginxParser.js +78 -0
  115. package/dist/formats/parsers/NginxParser.js.map +1 -0
  116. package/dist/formats/parsers/SyslogParser.d.ts +10 -0
  117. package/dist/formats/parsers/SyslogParser.d.ts.map +1 -0
  118. package/dist/formats/parsers/SyslogParser.js +73 -0
  119. package/dist/formats/parsers/SyslogParser.js.map +1 -0
  120. package/dist/formats/schemas/LogSchema.d.ts +70 -0
  121. package/dist/formats/schemas/LogSchema.d.ts.map +1 -0
  122. package/dist/formats/schemas/LogSchema.js +7 -0
  123. package/dist/formats/schemas/LogSchema.js.map +1 -0
  124. package/dist/index-store/CacheManager.d.ts +45 -0
  125. package/dist/index-store/CacheManager.d.ts.map +1 -0
  126. package/dist/index-store/CacheManager.js +84 -0
  127. package/dist/index-store/CacheManager.js.map +1 -0
  128. package/dist/index-store/FileWatcher.d.ts +39 -0
  129. package/dist/index-store/FileWatcher.d.ts.map +1 -0
  130. package/dist/index-store/FileWatcher.js +121 -0
  131. package/dist/index-store/FileWatcher.js.map +1 -0
  132. package/dist/index-store/IncrementalUpdater.d.ts +19 -0
  133. package/dist/index-store/IncrementalUpdater.d.ts.map +1 -0
  134. package/dist/index-store/IncrementalUpdater.js +62 -0
  135. package/dist/index-store/IncrementalUpdater.js.map +1 -0
  136. package/dist/index-store/IndexStore.d.ts +66 -0
  137. package/dist/index-store/IndexStore.d.ts.map +1 -0
  138. package/dist/index-store/IndexStore.js +183 -0
  139. package/dist/index-store/IndexStore.js.map +1 -0
  140. package/dist/index.d.ts +47 -0
  141. package/dist/index.d.ts.map +1 -0
  142. package/dist/index.js +99 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/pro/alerts/AlertEngine.d.ts +35 -0
  145. package/dist/pro/alerts/AlertEngine.d.ts.map +1 -0
  146. package/dist/pro/alerts/AlertEngine.js +162 -0
  147. package/dist/pro/alerts/AlertEngine.js.map +1 -0
  148. package/dist/pro/alerts/Notifier.d.ts +23 -0
  149. package/dist/pro/alerts/Notifier.d.ts.map +1 -0
  150. package/dist/pro/alerts/Notifier.js +173 -0
  151. package/dist/pro/alerts/Notifier.js.map +1 -0
  152. package/dist/pro/alerts/RuleParser.d.ts +32 -0
  153. package/dist/pro/alerts/RuleParser.d.ts.map +1 -0
  154. package/dist/pro/alerts/RuleParser.js +86 -0
  155. package/dist/pro/alerts/RuleParser.js.map +1 -0
  156. package/dist/pro/auth/LicenseValidator.d.ts +29 -0
  157. package/dist/pro/auth/LicenseValidator.d.ts.map +1 -0
  158. package/dist/pro/auth/LicenseValidator.js +122 -0
  159. package/dist/pro/auth/LicenseValidator.js.map +1 -0
  160. package/dist/pro/auth/TokenManager.d.ts +27 -0
  161. package/dist/pro/auth/TokenManager.d.ts.map +1 -0
  162. package/dist/pro/auth/TokenManager.js +98 -0
  163. package/dist/pro/auth/TokenManager.js.map +1 -0
  164. package/dist/pro/webui/UIServer.d.ts +34 -0
  165. package/dist/pro/webui/UIServer.d.ts.map +1 -0
  166. package/dist/pro/webui/UIServer.js +353 -0
  167. package/dist/pro/webui/UIServer.js.map +1 -0
  168. package/dist/query/QueryEngine.d.ts +34 -0
  169. package/dist/query/QueryEngine.d.ts.map +1 -0
  170. package/dist/query/QueryEngine.js +187 -0
  171. package/dist/query/QueryEngine.js.map +1 -0
  172. package/dist/query/operators/AndOperator.d.ts +18 -0
  173. package/dist/query/operators/AndOperator.d.ts.map +1 -0
  174. package/dist/query/operators/AndOperator.js +55 -0
  175. package/dist/query/operators/AndOperator.js.map +1 -0
  176. package/dist/query/operators/NotOperator.d.ts +19 -0
  177. package/dist/query/operators/NotOperator.d.ts.map +1 -0
  178. package/dist/query/operators/NotOperator.js +43 -0
  179. package/dist/query/operators/NotOperator.js.map +1 -0
  180. package/dist/query/operators/OrOperator.d.ts +17 -0
  181. package/dist/query/operators/OrOperator.d.ts.map +1 -0
  182. package/dist/query/operators/OrOperator.js +54 -0
  183. package/dist/query/operators/OrOperator.js.map +1 -0
  184. package/dist/query/operators/RangeOperator.d.ts +23 -0
  185. package/dist/query/operators/RangeOperator.d.ts.map +1 -0
  186. package/dist/query/operators/RangeOperator.js +63 -0
  187. package/dist/query/operators/RangeOperator.js.map +1 -0
  188. package/dist/query/regex/FuzzyMatcher.d.ts +29 -0
  189. package/dist/query/regex/FuzzyMatcher.d.ts.map +1 -0
  190. package/dist/query/regex/FuzzyMatcher.js +89 -0
  191. package/dist/query/regex/FuzzyMatcher.js.map +1 -0
  192. package/dist/query/regex/RegexMatcher.d.ts +31 -0
  193. package/dist/query/regex/RegexMatcher.d.ts.map +1 -0
  194. package/dist/query/regex/RegexMatcher.js +73 -0
  195. package/dist/query/regex/RegexMatcher.js.map +1 -0
  196. package/dist/types/ConfigTypes.d.ts +78 -0
  197. package/dist/types/ConfigTypes.d.ts.map +1 -0
  198. package/dist/types/ConfigTypes.js +7 -0
  199. package/dist/types/ConfigTypes.js.map +1 -0
  200. package/dist/types/IndexTypes.d.ts +86 -0
  201. package/dist/types/IndexTypes.d.ts.map +1 -0
  202. package/dist/types/IndexTypes.js +7 -0
  203. package/dist/types/IndexTypes.js.map +1 -0
  204. package/dist/types/SearchTypes.d.ts +102 -0
  205. package/dist/types/SearchTypes.d.ts.map +1 -0
  206. package/dist/types/SearchTypes.js +7 -0
  207. package/dist/types/SearchTypes.js.map +1 -0
  208. package/dist/types/index.d.ts +8 -0
  209. package/dist/types/index.d.ts.map +1 -0
  210. package/dist/types/index.js +24 -0
  211. package/dist/types/index.js.map +1 -0
  212. package/dist/utils/fs-helpers.d.ts +9 -0
  213. package/dist/utils/fs-helpers.d.ts.map +1 -0
  214. package/dist/utils/fs-helpers.js +76 -0
  215. package/dist/utils/fs-helpers.js.map +1 -0
  216. package/dist/utils/hash.d.ts +7 -0
  217. package/dist/utils/hash.d.ts.map +1 -0
  218. package/dist/utils/hash.js +49 -0
  219. package/dist/utils/hash.js.map +1 -0
  220. package/dist/utils/logger.d.ts +19 -0
  221. package/dist/utils/logger.d.ts.map +1 -0
  222. package/dist/utils/logger.js +41 -0
  223. package/dist/utils/logger.js.map +1 -0
  224. package/dist/utils/performance.d.ts +14 -0
  225. package/dist/utils/performance.d.ts.map +1 -0
  226. package/dist/utils/performance.js +32 -0
  227. package/dist/utils/performance.js.map +1 -0
  228. package/dist/utils/progress.d.ts +7 -0
  229. package/dist/utils/progress.d.ts.map +1 -0
  230. package/dist/utils/progress.js +22 -0
  231. package/dist/utils/progress.js.map +1 -0
  232. package/package.json +105 -0
@@ -0,0 +1,37 @@
1
+ /**
2
+ * ResultFetcher.ts
3
+ * Fetches the actual line content from the log file given byte offsets.
4
+ * Uses direct seeks (random access) for maximum speed — no full file scan.
5
+ */
6
+ export declare class ResultFetcher {
7
+ private filePath;
8
+ private fileHandle;
9
+ constructor(filePath: string);
10
+ /**
11
+ * Open the file for reading. Call this once before fetchLines().
12
+ */
13
+ open(): Promise<void>;
14
+ /**
15
+ * Close the file handle. Call this when done fetching.
16
+ */
17
+ close(): Promise<void>;
18
+ /**
19
+ * Fetch line content for each given byte offset.
20
+ * Reads from each offset until the next '\n' (or EOF).
21
+ * Processes offsets in sorted order for optimal disk I/O.
22
+ *
23
+ * @param offsets Array of byte offsets (line starts)
24
+ * @returns Array of line strings, same order as input offsets
25
+ */
26
+ fetchLines(offsets: number[]): Promise<string[]>;
27
+ /**
28
+ * Fetch a single line at the given byte offset.
29
+ */
30
+ fetchLine(offset: number): Promise<string>;
31
+ /**
32
+ * Read a line starting at `offset` using the open file handle.
33
+ * Reads in chunks until a newline is found.
34
+ */
35
+ private readLineAt;
36
+ }
37
+ //# sourceMappingURL=ResultFetcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultFetcher.d.ts","sourceRoot":"","sources":["../../../src/core/searcher/ResultFetcher.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAA2B;gBAEjC,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B;;;;;;;OAOG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiCtD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAWhD;;;OAGG;YACW,UAAU;CAkCzB"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * ResultFetcher.ts
4
+ * Fetches the actual line content from the log file given byte offsets.
5
+ * Uses direct seeks (random access) for maximum speed — no full file scan.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ResultFetcher = void 0;
9
+ const promises_1 = require("fs/promises");
10
+ const MAX_LINE_LENGTH = 64 * 1024; // 64KB max line length safety cap
11
+ class ResultFetcher {
12
+ filePath;
13
+ fileHandle = null;
14
+ constructor(filePath) {
15
+ this.filePath = filePath;
16
+ }
17
+ /**
18
+ * Open the file for reading. Call this once before fetchLines().
19
+ */
20
+ async open() {
21
+ if (!this.fileHandle) {
22
+ this.fileHandle = await (0, promises_1.open)(this.filePath, 'r');
23
+ }
24
+ }
25
+ /**
26
+ * Close the file handle. Call this when done fetching.
27
+ */
28
+ async close() {
29
+ if (this.fileHandle) {
30
+ await this.fileHandle.close();
31
+ this.fileHandle = null;
32
+ }
33
+ }
34
+ /**
35
+ * Fetch line content for each given byte offset.
36
+ * Reads from each offset until the next '\n' (or EOF).
37
+ * Processes offsets in sorted order for optimal disk I/O.
38
+ *
39
+ * @param offsets Array of byte offsets (line starts)
40
+ * @returns Array of line strings, same order as input offsets
41
+ */
42
+ async fetchLines(offsets) {
43
+ if (offsets.length === 0)
44
+ return [];
45
+ const wasOpen = this.fileHandle !== null;
46
+ if (!wasOpen)
47
+ await this.open();
48
+ const fh = this.fileHandle;
49
+ // Build a map: offset → index in original array (to preserve order)
50
+ const indexMap = new Map();
51
+ for (let i = 0; i < offsets.length; i++) {
52
+ const arr = indexMap.get(offsets[i]);
53
+ if (arr)
54
+ arr.push(i);
55
+ else
56
+ indexMap.set(offsets[i], [i]);
57
+ }
58
+ // Sort unique offsets for sequential disk reads
59
+ const uniqueOffsets = [...new Set(offsets)].sort((a, b) => a - b);
60
+ const lineMap = new Map();
61
+ // Read each line
62
+ const buffer = Buffer.allocUnsafe(MAX_LINE_LENGTH);
63
+ for (const offset of uniqueOffsets) {
64
+ const line = await this.readLineAt(fh, offset, buffer);
65
+ lineMap.set(offset, line);
66
+ }
67
+ if (!wasOpen)
68
+ await this.close();
69
+ // Reconstruct result in original order
70
+ return offsets.map((o) => lineMap.get(o) ?? '');
71
+ }
72
+ /**
73
+ * Fetch a single line at the given byte offset.
74
+ */
75
+ async fetchLine(offset) {
76
+ const wasOpen = this.fileHandle !== null;
77
+ if (!wasOpen)
78
+ await this.open();
79
+ const buffer = Buffer.allocUnsafe(MAX_LINE_LENGTH);
80
+ const line = await this.readLineAt(this.fileHandle, offset, buffer);
81
+ if (!wasOpen)
82
+ await this.close();
83
+ return line;
84
+ }
85
+ /**
86
+ * Read a line starting at `offset` using the open file handle.
87
+ * Reads in chunks until a newline is found.
88
+ */
89
+ async readLineAt(fh, offset, buffer) {
90
+ let position = offset;
91
+ let lineData = '';
92
+ const chunkSize = 4096;
93
+ while (true) {
94
+ const { bytesRead } = await fh.read(buffer, 0, Math.min(chunkSize, MAX_LINE_LENGTH), position);
95
+ if (bytesRead === 0)
96
+ break;
97
+ const chunk = buffer.slice(0, bytesRead).toString('utf8');
98
+ const newlineIdx = chunk.indexOf('\n');
99
+ if (newlineIdx !== -1) {
100
+ lineData += chunk.slice(0, newlineIdx);
101
+ break;
102
+ }
103
+ else {
104
+ lineData += chunk;
105
+ position += bytesRead;
106
+ // Safety cap
107
+ if (lineData.length >= MAX_LINE_LENGTH) {
108
+ lineData = lineData.slice(0, MAX_LINE_LENGTH);
109
+ break;
110
+ }
111
+ }
112
+ }
113
+ // Strip trailing carriage return (Windows line endings)
114
+ return lineData.replace(/\r$/, '');
115
+ }
116
+ }
117
+ exports.ResultFetcher = ResultFetcher;
118
+ //# sourceMappingURL=ResultFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResultFetcher.js","sourceRoot":"","sources":["../../../src/core/searcher/ResultFetcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * ChunkSplitter.ts
3
+ * Divides a file into N equal byte-range chunks aligned to newline boundaries.
4
+ * Used by IndexBuilder to prepare work for parallel Workers.
5
+ */
6
+ export interface FileChunk {
7
+ chunkId: number;
8
+ startByte: number;
9
+ endByte: number;
10
+ estimatedLines: number;
11
+ }
12
+ export declare class ChunkSplitter {
13
+ /**
14
+ * Split a file into `numChunks` chunks, each starting and ending at a '\n'.
15
+ * @param filePath Path to the file
16
+ * @param numChunks Desired number of chunks (actual may be less for small files)
17
+ */
18
+ static split(filePath: string, numChunks: number): Promise<FileChunk[]>;
19
+ /**
20
+ * Find the byte position of the '\n' at or before `targetPos`.
21
+ * Scans backward from `targetPos`.
22
+ */
23
+ static findNewlineBefore(filePath: string, targetPos: number, minPos: number): Promise<number>;
24
+ }
25
+ //# sourceMappingURL=ChunkSplitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkSplitter.d.ts","sourceRoot":"","sources":["../../../src/core/streaming/ChunkSplitter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB;;;;OAIG;WACU,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA6B7E;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CACtB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC;CA2BnB"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ /**
3
+ * ChunkSplitter.ts
4
+ * Divides a file into N equal byte-range chunks aligned to newline boundaries.
5
+ * Used by IndexBuilder to prepare work for parallel Workers.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ChunkSplitter = void 0;
9
+ const fs_1 = require("fs");
10
+ const promises_1 = require("fs/promises");
11
+ class ChunkSplitter {
12
+ /**
13
+ * Split a file into `numChunks` chunks, each starting and ending at a '\n'.
14
+ * @param filePath Path to the file
15
+ * @param numChunks Desired number of chunks (actual may be less for small files)
16
+ */
17
+ static async split(filePath, numChunks) {
18
+ const { size } = await (0, promises_1.stat)(filePath);
19
+ if (size === 0)
20
+ return [{ chunkId: 0, startByte: 0, endByte: 0, estimatedLines: 0 }];
21
+ const chunkSize = Math.ceil(size / numChunks);
22
+ const chunks = [];
23
+ let position = 0;
24
+ let chunkId = 0;
25
+ while (position < size) {
26
+ const targetEnd = Math.min(position + chunkSize - 1, size - 1);
27
+ const actualEnd = targetEnd === size - 1
28
+ ? size - 1
29
+ : await ChunkSplitter.findNewlineBefore(filePath, targetEnd, position);
30
+ chunks.push({
31
+ chunkId: chunkId++,
32
+ startByte: position,
33
+ endByte: actualEnd,
34
+ estimatedLines: Math.round((actualEnd - position) / 150), // ~150 bytes per line estimate
35
+ });
36
+ position = actualEnd + 1;
37
+ }
38
+ return chunks;
39
+ }
40
+ /**
41
+ * Find the byte position of the '\n' at or before `targetPos`.
42
+ * Scans backward from `targetPos`.
43
+ */
44
+ static findNewlineBefore(filePath, targetPos, minPos) {
45
+ return new Promise((resolve) => {
46
+ const scanSize = Math.min(512, targetPos - minPos);
47
+ if (scanSize <= 0) {
48
+ resolve(targetPos);
49
+ return;
50
+ }
51
+ const start = targetPos - scanSize;
52
+ const stream = (0, fs_1.createReadStream)(filePath, { start, end: targetPos });
53
+ const chunks = [];
54
+ stream.on('data', (chunk) => chunks.push(chunk));
55
+ stream.on('end', () => {
56
+ const data = Buffer.concat(chunks);
57
+ // Search backward for '\n'
58
+ for (let i = data.length - 1; i >= 0; i--) {
59
+ if (data[i] === 0x0a) {
60
+ resolve(start + i);
61
+ return;
62
+ }
63
+ }
64
+ resolve(targetPos);
65
+ });
66
+ stream.on('error', () => resolve(targetPos));
67
+ });
68
+ }
69
+ }
70
+ exports.ChunkSplitter = ChunkSplitter;
71
+ //# sourceMappingURL=ChunkSplitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkSplitter.js","sourceRoot":"","sources":["../../../src/core/streaming/ChunkSplitter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * FileStreamer.ts
3
+ * Streams a large log file line by line with backpressure support.
4
+ * Used for regex fallback searches and format detection.
5
+ */
6
+ import { EventEmitter } from 'events';
7
+ export interface StreamOptions {
8
+ start?: number;
9
+ end?: number;
10
+ encoding?: BufferEncoding;
11
+ highWaterMark?: number;
12
+ }
13
+ export declare class FileStreamer extends EventEmitter {
14
+ private filePath;
15
+ private aborted;
16
+ constructor(filePath: string);
17
+ /**
18
+ * Stream the file line by line.
19
+ * Emits:
20
+ * - 'line' (line: string, offset: number) — for each line
21
+ * - 'end' () — when done
22
+ * - 'error' (err: Error) — on error
23
+ *
24
+ * Returns a Promise that resolves when streaming is complete.
25
+ */
26
+ stream(options?: StreamOptions): Promise<{
27
+ lineCount: number;
28
+ bytesRead: number;
29
+ }>;
30
+ /**
31
+ * Abort the current streaming operation.
32
+ */
33
+ abort(): void;
34
+ /**
35
+ * Read the last N lines of a file efficiently (tail).
36
+ */
37
+ static tail(filePath: string, lineCount?: number): Promise<string[]>;
38
+ }
39
+ //# sourceMappingURL=FileStreamer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStreamer.d.ts","sourceRoot":"","sources":["../../../src/core/streaming/FileStreamer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,cAAc,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAkB;gBAErB,QAAQ,EAAE,MAAM;IAK5B;;;;;;;;OAQG;IACH,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAmDtF;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;WACU,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA6B/E"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ /**
3
+ * FileStreamer.ts
4
+ * Streams a large log file line by line with backpressure support.
5
+ * Used for regex fallback searches and format detection.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.FileStreamer = void 0;
42
+ const fs_1 = require("fs");
43
+ const events_1 = require("events");
44
+ class FileStreamer extends events_1.EventEmitter {
45
+ filePath;
46
+ aborted = false;
47
+ constructor(filePath) {
48
+ super();
49
+ this.filePath = filePath;
50
+ }
51
+ /**
52
+ * Stream the file line by line.
53
+ * Emits:
54
+ * - 'line' (line: string, offset: number) — for each line
55
+ * - 'end' () — when done
56
+ * - 'error' (err: Error) — on error
57
+ *
58
+ * Returns a Promise that resolves when streaming is complete.
59
+ */
60
+ stream(options = {}) {
61
+ return new Promise((resolve, reject) => {
62
+ let buffer = '';
63
+ let currentOffset = options.start ?? 0;
64
+ let lineCount = 0;
65
+ let bytesRead = 0;
66
+ const readStream = (0, fs_1.createReadStream)(this.filePath, {
67
+ start: options.start,
68
+ end: options.end,
69
+ encoding: options.encoding ?? 'utf8',
70
+ highWaterMark: options.highWaterMark ?? 512 * 1024,
71
+ });
72
+ readStream.on('data', (chunk) => {
73
+ if (this.aborted) {
74
+ readStream.destroy();
75
+ return;
76
+ }
77
+ buffer += chunk;
78
+ bytesRead += Buffer.byteLength(chunk, 'utf8');
79
+ const lines = buffer.split('\n');
80
+ buffer = lines.pop() ?? '';
81
+ for (const line of lines) {
82
+ if (this.aborted)
83
+ break;
84
+ this.emit('line', line, currentOffset);
85
+ lineCount++;
86
+ currentOffset += Buffer.byteLength(line, 'utf8') + 1;
87
+ }
88
+ });
89
+ readStream.on('end', () => {
90
+ if (buffer.length > 0 && !this.aborted) {
91
+ this.emit('line', buffer, currentOffset);
92
+ lineCount++;
93
+ bytesRead += Buffer.byteLength(buffer, 'utf8');
94
+ }
95
+ this.emit('end');
96
+ resolve({ lineCount, bytesRead });
97
+ });
98
+ readStream.on('error', (err) => {
99
+ this.emit('error', err);
100
+ reject(err);
101
+ });
102
+ });
103
+ }
104
+ /**
105
+ * Abort the current streaming operation.
106
+ */
107
+ abort() {
108
+ this.aborted = true;
109
+ }
110
+ /**
111
+ * Read the last N lines of a file efficiently (tail).
112
+ */
113
+ static async tail(filePath, lineCount = 50) {
114
+ const { stat } = await Promise.resolve().then(() => __importStar(require('fs/promises')));
115
+ const { size } = await stat(filePath);
116
+ // Start reading from near the end
117
+ const chunkSize = Math.min(lineCount * 500, size); // estimate ~500 bytes/line
118
+ const startPos = Math.max(0, size - chunkSize);
119
+ return new Promise((resolve, reject) => {
120
+ const lines = [];
121
+ let buffer = '';
122
+ const stream = (0, fs_1.createReadStream)(filePath, {
123
+ start: startPos,
124
+ encoding: 'utf8',
125
+ });
126
+ stream.on('data', (chunk) => {
127
+ buffer += chunk;
128
+ });
129
+ stream.on('end', () => {
130
+ const allLines = buffer.split('\n').filter((l) => l.length > 0);
131
+ resolve(allLines.slice(-lineCount));
132
+ });
133
+ stream.on('error', reject);
134
+ });
135
+ }
136
+ }
137
+ exports.FileStreamer = FileStreamer;
138
+ //# sourceMappingURL=FileStreamer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileStreamer.js","sourceRoot":"","sources":["../../../src/core/streaming/FileStreamer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * LineBuffer.ts
3
+ * A buffered line reader that accumulates incoming data chunks
4
+ * and emits complete lines. Handles multi-byte UTF-8 gracefully.
5
+ */
6
+ export declare class LineBuffer {
7
+ private buffer;
8
+ private lineCallback;
9
+ private lineNumber;
10
+ constructor(callback: (line: string, lineNumber: number) => void);
11
+ /**
12
+ * Push a new data chunk into the buffer.
13
+ * Emits complete lines via the callback.
14
+ */
15
+ push(chunk: string): void;
16
+ /**
17
+ * Flush any remaining buffered content as the last line.
18
+ */
19
+ flush(): void;
20
+ /**
21
+ * Reset the buffer and line counter.
22
+ */
23
+ reset(): void;
24
+ get currentLineNumber(): number;
25
+ }
26
+ //# sourceMappingURL=LineBuffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LineBuffer.d.ts","sourceRoot":"","sources":["../../../src/core/streaming/LineBuffer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,UAAU,CAAa;gBAEnB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI;IAIhE;;;OAGG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAYzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAQb;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb,IAAI,iBAAiB,IAAI,MAAM,CAE9B;CACF"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ /**
3
+ * LineBuffer.ts
4
+ * A buffered line reader that accumulates incoming data chunks
5
+ * and emits complete lines. Handles multi-byte UTF-8 gracefully.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LineBuffer = void 0;
9
+ class LineBuffer {
10
+ buffer = '';
11
+ lineCallback;
12
+ lineNumber = 0;
13
+ constructor(callback) {
14
+ this.lineCallback = callback;
15
+ }
16
+ /**
17
+ * Push a new data chunk into the buffer.
18
+ * Emits complete lines via the callback.
19
+ */
20
+ push(chunk) {
21
+ this.buffer += chunk;
22
+ let newlineIdx;
23
+ while ((newlineIdx = this.buffer.indexOf('\n')) !== -1) {
24
+ const line = this.buffer.slice(0, newlineIdx).replace(/\r$/, '');
25
+ this.buffer = this.buffer.slice(newlineIdx + 1);
26
+ this.lineNumber++;
27
+ this.lineCallback(line, this.lineNumber);
28
+ }
29
+ }
30
+ /**
31
+ * Flush any remaining buffered content as the last line.
32
+ */
33
+ flush() {
34
+ if (this.buffer.length > 0) {
35
+ this.lineNumber++;
36
+ this.lineCallback(this.buffer.replace(/\r$/, ''), this.lineNumber);
37
+ this.buffer = '';
38
+ }
39
+ }
40
+ /**
41
+ * Reset the buffer and line counter.
42
+ */
43
+ reset() {
44
+ this.buffer = '';
45
+ this.lineNumber = 0;
46
+ }
47
+ get currentLineNumber() {
48
+ return this.lineNumber;
49
+ }
50
+ }
51
+ exports.LineBuffer = LineBuffer;
52
+ //# sourceMappingURL=LineBuffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LineBuffer.js","sourceRoot":"","sources":["../../../src/core/streaming/LineBuffer.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,MAAa,UAAU;IACb,MAAM,GAAW,EAAE,CAAC;IACpB,YAAY,CAA6C;IACzD,UAAU,GAAW,CAAC,CAAC;IAE/B,YAAY,QAAoD;QAC9D,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QAErB,IAAI,UAAkB,CAAC;QACvB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACnE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AA/CD,gCA+CC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * IndexWorker.ts
3
+ * Worker thread script for processing a file chunk.
4
+ * This file is loaded by WorkerPool as a worker_threads Worker.
5
+ * It runs inside a separate thread and communicates via parentPort.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=IndexWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexWorker.d.ts","sourceRoot":"","sources":["../../../src/core/workers/IndexWorker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ /**
3
+ * IndexWorker.ts
4
+ * Worker thread script for processing a file chunk.
5
+ * This file is loaded by WorkerPool as a worker_threads Worker.
6
+ * It runs inside a separate thread and communicates via parentPort.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ const worker_threads_1 = require("worker_threads");
10
+ const ChunkProcessor_1 = require("../indexer/ChunkProcessor");
11
+ async function run() {
12
+ const task = worker_threads_1.workerData;
13
+ if (!worker_threads_1.parentPort) {
14
+ process.exit(1);
15
+ }
16
+ try {
17
+ const processor = new ChunkProcessor_1.ChunkProcessor(task.filePath, task.config);
18
+ const result = await processor.process(task.startByte, task.endByte, task.chunkId);
19
+ const response = {
20
+ chunkId: task.chunkId,
21
+ result,
22
+ };
23
+ worker_threads_1.parentPort.postMessage(response);
24
+ }
25
+ catch (err) {
26
+ const response = {
27
+ chunkId: task.chunkId,
28
+ result: {
29
+ chunkId: task.chunkId,
30
+ lineCount: 0,
31
+ bytesProcessed: 0,
32
+ termOffsets: {},
33
+ lineOffsets: [],
34
+ },
35
+ error: err instanceof Error ? err.message : String(err),
36
+ };
37
+ worker_threads_1.parentPort.postMessage(response);
38
+ }
39
+ }
40
+ run();
41
+ //# sourceMappingURL=IndexWorker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexWorker.js","sourceRoot":"","sources":["../../../src/core/workers/IndexWorker.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,mDAAwD;AACxD,8DAA2D;AAG3D,KAAK,UAAU,GAAG;IAChB,MAAM,IAAI,GAAG,2BAAwB,CAAC;IAEtC,IAAI,CAAC,2BAAU,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,+BAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QACjE,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnF,MAAM,QAAQ,GAAiB;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;SACP,CAAC;QAEF,2BAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,QAAQ,GAAiB;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE;gBACN,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,CAAC;gBACZ,cAAc,EAAE,CAAC;gBACjB,WAAW,EAAE,EAAE;gBACf,WAAW,EAAE,EAAE;aAChB;YACD,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;QACF,2BAAU,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,GAAG,EAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SearchWorker.ts
3
+ * Worker thread for parallel regex/fuzzy search over file chunks.
4
+ * Used for fallback searches that bypass the index (e.g., pure regex).
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=SearchWorker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchWorker.d.ts","sourceRoot":"","sources":["../../../src/core/workers/SearchWorker.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}