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,274 @@
1
+ "use strict";
2
+ /**
3
+ * IndexBuilder.ts
4
+ * Core engine for building the inverted index from a log file.
5
+ * Splits the file into chunks and processes them in parallel using WorkerPool.
6
+ * Then merges all chunk results into a single InvertedIndex and serializes it.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.IndexBuilder = void 0;
43
+ const fs_1 = require("fs");
44
+ const promises_1 = require("fs/promises");
45
+ const path = __importStar(require("path"));
46
+ const os = __importStar(require("os"));
47
+ const crypto = __importStar(require("crypto"));
48
+ const IndexSerializer_1 = require("./IndexSerializer");
49
+ const WorkerPool_1 = require("../workers/WorkerPool");
50
+ const DEFAULT_CHUNK_SIZE = 64 * 1024 * 1024; // 64 MB
51
+ const INDEX_VERSION = '1.0.0';
52
+ class IndexBuilder {
53
+ filePath;
54
+ config;
55
+ workerPool;
56
+ serializer;
57
+ constructor(filePath, config = {}) {
58
+ this.filePath = path.resolve(filePath);
59
+ this.config = {
60
+ chunkSize: config.chunkSize ?? DEFAULT_CHUNK_SIZE,
61
+ maxWorkers: config.maxWorkers ?? Math.max(1, os.cpus().length - 1),
62
+ compression: config.compression ?? 'gzip',
63
+ tokenMinLength: config.tokenMinLength ?? 2,
64
+ includeLineNumbers: config.includeLineNumbers ?? true,
65
+ includeTimestamps: config.includeTimestamps ?? true,
66
+ stopWords: config.stopWords ?? [],
67
+ };
68
+ this.workerPool = new WorkerPool_1.WorkerPool(this.config.maxWorkers);
69
+ this.serializer = new IndexSerializer_1.IndexSerializer();
70
+ }
71
+ /**
72
+ * Build the full inverted index for this.filePath.
73
+ * Calls onProgress with a percentage 0–100 as work proceeds.
74
+ */
75
+ async build(onProgress) {
76
+ const startTime = Date.now();
77
+ onProgress?.(0);
78
+ // ── Step 1: File metadata ────────────────────────────────────────────────
79
+ const fileStats = await (0, promises_1.stat)(this.filePath);
80
+ const fileSize = fileStats.size;
81
+ const fileHash = await this.computeFileHash(fileSize);
82
+ onProgress?.(3);
83
+ // ── Step 2: Calculate chunk boundaries (aligned to newlines) ────────────
84
+ const chunks = await this.calculateChunkBoundaries(fileSize);
85
+ onProgress?.(5);
86
+ // ── Step 3: Parallel chunk processing ───────────────────────────────────
87
+ let completedChunks = 0;
88
+ const chunkResults = await Promise.all(chunks.map((chunk) => this.workerPool
89
+ .run({
90
+ task: 'processChunk',
91
+ filePath: this.filePath,
92
+ startByte: chunk.start,
93
+ endByte: chunk.end,
94
+ chunkId: chunk.chunkId,
95
+ config: this.config,
96
+ })
97
+ .then((result) => {
98
+ completedChunks++;
99
+ const progress = 5 + (completedChunks / chunks.length) * 75;
100
+ onProgress?.(Math.round(progress));
101
+ return result;
102
+ })));
103
+ onProgress?.(80);
104
+ // ── Step 4: Merge chunk indexes ──────────────────────────────────────────
105
+ const mergedIndex = this.mergeChunkResults(chunkResults, fileSize, fileHash);
106
+ onProgress?.(90);
107
+ // ── Step 5: Serialize and save ───────────────────────────────────────────
108
+ const indexPath = await this.resolveIndexPath();
109
+ await this.serializer.save(mergedIndex, indexPath, this.config.compression);
110
+ // Update compression ratio
111
+ const indexSize = await this.serializer.getSize(indexPath);
112
+ mergedIndex.metadata.compressionRatio =
113
+ fileSize > 0 ? Math.round((1 - indexSize / fileSize) * 100) / 100 : 0;
114
+ onProgress?.(100);
115
+ await this.workerPool.terminate();
116
+ const elapsed = Date.now() - startTime;
117
+ mergedIndex.metadata.buildTimeMs = elapsed;
118
+ return {
119
+ indexPath,
120
+ fileSize,
121
+ totalLines: mergedIndex.metadata.totalLines,
122
+ uniqueTerms: mergedIndex.metadata.uniqueTerms,
123
+ buildTimeMs: elapsed,
124
+ compressionRatio: mergedIndex.metadata.compressionRatio,
125
+ };
126
+ }
127
+ // ─── Private Helpers ────────────────────────────────────────────────────────
128
+ /**
129
+ * Divide the file into N chunks, each starting and ending exactly at a newline.
130
+ */
131
+ async calculateChunkBoundaries(fileSize) {
132
+ if (fileSize === 0)
133
+ return [{ start: 0, end: 0, chunkId: 0 }];
134
+ const numChunks = Math.max(1, Math.ceil(fileSize / this.config.chunkSize));
135
+ const boundaries = [];
136
+ let position = 0;
137
+ for (let i = 0; i < numChunks; i++) {
138
+ const targetEnd = Math.min(position + this.config.chunkSize, fileSize - 1);
139
+ const actualEnd = i === numChunks - 1 ? fileSize - 1 : await this.findNextNewline(targetEnd);
140
+ boundaries.push({ start: position, end: actualEnd, chunkId: i });
141
+ position = actualEnd + 1;
142
+ if (position >= fileSize)
143
+ break;
144
+ }
145
+ return boundaries;
146
+ }
147
+ /**
148
+ * Scan forward from `position` until we find a '\n' character.
149
+ * Returns the offset of that '\n'.
150
+ */
151
+ findNextNewline(position) {
152
+ return new Promise((resolve) => {
153
+ const stream = (0, fs_1.createReadStream)(this.filePath, {
154
+ start: position,
155
+ end: position + 1024,
156
+ });
157
+ let offset = position;
158
+ let found = false;
159
+ stream.on('data', (chunk) => {
160
+ const newlinePos = chunk.indexOf(0x0a);
161
+ if (newlinePos !== -1 && !found) {
162
+ found = true;
163
+ resolve(offset + newlinePos);
164
+ stream.destroy();
165
+ }
166
+ else {
167
+ offset += chunk.length;
168
+ }
169
+ });
170
+ stream.on('end', () => {
171
+ if (!found)
172
+ resolve(position);
173
+ });
174
+ stream.on('error', () => resolve(position));
175
+ stream.on('close', () => {
176
+ if (!found)
177
+ resolve(position);
178
+ });
179
+ });
180
+ }
181
+ /**
182
+ * Merge all chunk InvertedIndexes into a single master index.
183
+ */
184
+ mergeChunkResults(chunks, fileSize, fileHash) {
185
+ // Sort chunks by their chunk ID to ensure correct line ordering
186
+ const sorted = [...chunks].sort((a, b) => a.chunkId - b.chunkId);
187
+ const masterIndex = new Map();
188
+ const allLineOffsets = [];
189
+ let totalLines = 0;
190
+ for (const chunk of sorted) {
191
+ totalLines += chunk.lineCount;
192
+ // Merge line offsets
193
+ for (const offset of chunk.lineOffsets) {
194
+ allLineOffsets.push(offset);
195
+ }
196
+ // Merge inverted index
197
+ for (const [term, offsets] of Object.entries(chunk.termOffsets)) {
198
+ const existing = masterIndex.get(term);
199
+ if (existing) {
200
+ for (const o of offsets)
201
+ existing.push(o);
202
+ }
203
+ else {
204
+ masterIndex.set(term, [...offsets]);
205
+ }
206
+ }
207
+ }
208
+ // Sort line offsets
209
+ allLineOffsets.sort((a, b) => a - b);
210
+ return {
211
+ invertedIndex: Object.fromEntries(masterIndex),
212
+ lineOffsets: allLineOffsets,
213
+ metadata: {
214
+ totalLines,
215
+ uniqueTerms: masterIndex.size,
216
+ fileSize,
217
+ filePath: this.filePath,
218
+ fileHash,
219
+ builtAt: new Date().toISOString(),
220
+ buildTimeMs: 0, // filled in after
221
+ compressionRatio: 0, // filled in after
222
+ version: INDEX_VERSION,
223
+ },
224
+ };
225
+ }
226
+ /**
227
+ * Compute a quick hash of the file for staleness detection.
228
+ * Only reads the first and last 64KB + file size for speed.
229
+ */
230
+ async computeFileHash(fileSize) {
231
+ return new Promise((resolve) => {
232
+ const hash = crypto.createHash('md5');
233
+ hash.update(String(fileSize));
234
+ const readChunk = (start, end, cb) => {
235
+ const s = (0, fs_1.createReadStream)(this.filePath, { start, end });
236
+ s.on('data', (d) => hash.update(d));
237
+ s.on('end', cb);
238
+ s.on('error', cb);
239
+ };
240
+ const tail = Math.max(0, fileSize - 65536);
241
+ readChunk(0, Math.min(65535, fileSize - 1), () => {
242
+ if (tail > 65536) {
243
+ readChunk(tail, fileSize - 1, () => resolve(hash.digest('hex').slice(0, 16)));
244
+ }
245
+ else {
246
+ resolve(hash.digest('hex').slice(0, 16));
247
+ }
248
+ });
249
+ });
250
+ }
251
+ /**
252
+ * Resolve the path where the index will be stored.
253
+ * Format: ~/.log-search/indexes/<filename>-<hash>.lsi
254
+ */
255
+ async resolveIndexPath() {
256
+ const hash = crypto
257
+ .createHash('md5')
258
+ .update(this.filePath)
259
+ .digest('hex')
260
+ .slice(0, 8);
261
+ const cacheDir = path.join(os.homedir(), '.log-search', 'indexes');
262
+ await (0, promises_1.mkdir)(cacheDir, { recursive: true });
263
+ const basename = path.basename(this.filePath);
264
+ return path.join(cacheDir, `${basename}-${hash}.lsi`);
265
+ }
266
+ /**
267
+ * Get the index path for this file (without building it).
268
+ */
269
+ async getIndexPath() {
270
+ return this.resolveIndexPath();
271
+ }
272
+ }
273
+ exports.IndexBuilder = IndexBuilder;
274
+ //# sourceMappingURL=IndexBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexBuilder.js","sourceRoot":"","sources":["../../../src/core/indexer/IndexBuilder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * IndexSerializer.ts
3
+ * Handles saving and loading the inverted index to/from disk.
4
+ * Uses msgpackr for binary serialization + zlib gzip for compression.
5
+ * Format: [4-byte magic] [1-byte version] [4-byte flags] [msgpack+gzip payload]
6
+ */
7
+ import type { InvertedIndex, CompressionAlgorithm } from '../../types/IndexTypes';
8
+ export declare class IndexSerializer {
9
+ /**
10
+ * Serialize and save an InvertedIndex to disk.
11
+ * @param index The full index object
12
+ * @param outputPath Destination file path (.lsi)
13
+ * @param compression Compression algorithm to use
14
+ */
15
+ save(index: InvertedIndex, outputPath: string, compression?: CompressionAlgorithm): Promise<void>;
16
+ /**
17
+ * Load and deserialize an InvertedIndex from disk.
18
+ * @param indexPath Path to the .lsi file
19
+ */
20
+ load(indexPath: string): Promise<InvertedIndex>;
21
+ /**
22
+ * Get the size of an index file on disk (bytes).
23
+ */
24
+ getSize(indexPath: string): Promise<number>;
25
+ /**
26
+ * Check if an index file exists and is readable.
27
+ */
28
+ exists(indexPath: string): Promise<boolean>;
29
+ }
30
+ //# sourceMappingURL=IndexSerializer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexSerializer.d.ts","sourceRoot":"","sources":["../../../src/core/indexer/IndexSerializer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AASlF,qBAAa,eAAe;IAC1B;;;;;OAKG;IACG,IAAI,CACR,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,oBAA6B,GACzC,OAAO,CAAC,IAAI,CAAC;IAiChB;;;OAGG;IACG,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IA8BrD;;OAEG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASjD;;OAEG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQlD"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ /**
3
+ * IndexSerializer.ts
4
+ * Handles saving and loading the inverted index to/from disk.
5
+ * Uses msgpackr for binary serialization + zlib gzip for compression.
6
+ * Format: [4-byte magic] [1-byte version] [4-byte flags] [msgpack+gzip payload]
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.IndexSerializer = void 0;
43
+ const promises_1 = require("fs/promises");
44
+ const zlib = __importStar(require("zlib"));
45
+ const util_1 = require("util");
46
+ const msgpackr_1 = require("msgpackr");
47
+ const gzip = (0, util_1.promisify)(zlib.gzip);
48
+ const gunzip = (0, util_1.promisify)(zlib.gunzip);
49
+ // Magic bytes: "LSI\x01" = Log Search Index v1
50
+ const MAGIC = Buffer.from([0x4c, 0x53, 0x49, 0x01]);
51
+ const FORMAT_VERSION = 1;
52
+ class IndexSerializer {
53
+ /**
54
+ * Serialize and save an InvertedIndex to disk.
55
+ * @param index The full index object
56
+ * @param outputPath Destination file path (.lsi)
57
+ * @param compression Compression algorithm to use
58
+ */
59
+ async save(index, outputPath, compression = 'gzip') {
60
+ // 1. Serialize with msgpackr (compact binary format)
61
+ const packed = (0, msgpackr_1.pack)(index);
62
+ // 2. Compress
63
+ let payload;
64
+ let compressionFlag = 0;
65
+ if (compression === 'gzip') {
66
+ payload = await gzip(packed, { level: zlib.constants.Z_BEST_SPEED });
67
+ compressionFlag = 1;
68
+ }
69
+ else {
70
+ payload = Buffer.from(packed);
71
+ compressionFlag = 0;
72
+ }
73
+ // 3. Write with header
74
+ const header = Buffer.alloc(10);
75
+ MAGIC.copy(header, 0);
76
+ header.writeUInt8(FORMAT_VERSION, 4);
77
+ header.writeUInt8(compressionFlag, 5);
78
+ header.writeUInt32BE(payload.length, 6);
79
+ const output = Buffer.concat([header, payload]);
80
+ await (0, promises_1.writeFile)(outputPath, output);
81
+ // 4. Update compression ratio in metadata (estimate)
82
+ const originalSize = Buffer.byteLength((0, msgpackr_1.pack)({ ...index, metadata: {} }));
83
+ const compressed = output.length;
84
+ index.metadata.compressionRatio =
85
+ originalSize > 0 ? Math.round((1 - compressed / originalSize) * 100) / 100 : 0;
86
+ }
87
+ /**
88
+ * Load and deserialize an InvertedIndex from disk.
89
+ * @param indexPath Path to the .lsi file
90
+ */
91
+ async load(indexPath) {
92
+ const raw = await (0, promises_1.readFile)(indexPath);
93
+ // Validate magic bytes
94
+ if (raw.slice(0, 4).toString('hex') !== MAGIC.toString('hex')) {
95
+ throw new Error(`Invalid index file format: ${indexPath}`);
96
+ }
97
+ const version = raw.readUInt8(4);
98
+ if (version !== FORMAT_VERSION) {
99
+ throw new Error(`Unsupported index version: ${version}. Expected ${FORMAT_VERSION}.`);
100
+ }
101
+ const compressionFlag = raw.readUInt8(5);
102
+ const payloadLength = raw.readUInt32BE(6);
103
+ const payload = raw.slice(10, 10 + payloadLength);
104
+ // Decompress
105
+ let decompressed;
106
+ if (compressionFlag === 1) {
107
+ decompressed = await gunzip(payload);
108
+ }
109
+ else {
110
+ decompressed = payload;
111
+ }
112
+ // Deserialize
113
+ const index = (0, msgpackr_1.unpack)(decompressed);
114
+ return index;
115
+ }
116
+ /**
117
+ * Get the size of an index file on disk (bytes).
118
+ */
119
+ async getSize(indexPath) {
120
+ try {
121
+ const s = await (0, promises_1.stat)(indexPath);
122
+ return s.size;
123
+ }
124
+ catch {
125
+ return 0;
126
+ }
127
+ }
128
+ /**
129
+ * Check if an index file exists and is readable.
130
+ */
131
+ async exists(indexPath) {
132
+ try {
133
+ await (0, promises_1.stat)(indexPath);
134
+ return true;
135
+ }
136
+ catch {
137
+ return false;
138
+ }
139
+ }
140
+ }
141
+ exports.IndexSerializer = IndexSerializer;
142
+ //# sourceMappingURL=IndexSerializer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexSerializer.js","sourceRoot":"","sources":["../../../src/core/indexer/IndexSerializer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * OffsetMapper.ts
3
+ * Maintains the mapping between line numbers and their byte offsets in the file.
4
+ * This is the core structure that enables O(1) line retrieval by position.
5
+ */
6
+ export declare class OffsetMapper {
7
+ /** Sorted array of byte offsets, index = lineNumber - 1 */
8
+ private lineOffsets;
9
+ constructor(initialOffsets?: number[]);
10
+ /**
11
+ * Record the byte offset of a new line.
12
+ */
13
+ addOffset(byteOffset: number): void;
14
+ /**
15
+ * Bulk add offsets (more efficient than individual adds).
16
+ */
17
+ addOffsets(offsets: number[]): void;
18
+ /**
19
+ * Get the byte offset of a specific line (1-based).
20
+ */
21
+ getOffset(lineNumber: number): number | undefined;
22
+ /**
23
+ * Find the 1-based line number for a given byte offset using binary search.
24
+ * Returns the line number, or -1 if not found.
25
+ */
26
+ findLineNumber(byteOffset: number): number;
27
+ /**
28
+ * Get the total number of lines tracked.
29
+ */
30
+ get totalLines(): number;
31
+ /**
32
+ * Get the raw offsets array (for serialization).
33
+ */
34
+ toArray(): number[];
35
+ /**
36
+ * Merge another OffsetMapper into this one (for combining chunk results).
37
+ * The other mapper's offsets are appended (assumed to come after current ones).
38
+ */
39
+ merge(other: OffsetMapper): void;
40
+ /**
41
+ * Sort offsets (needed after merging multiple chunks).
42
+ */
43
+ sort(): void;
44
+ /**
45
+ * Get a slice of offsets around a given byte offset (for context lines).
46
+ * @param byteOffset The central line's byte offset
47
+ * @param before Number of lines to include before
48
+ * @param after Number of lines to include after
49
+ */
50
+ getContext(byteOffset: number, before: number, after: number): {
51
+ beforeOffsets: number[];
52
+ afterOffsets: number[];
53
+ };
54
+ }
55
+ //# sourceMappingURL=OffsetMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OffsetMapper.d.ts","sourceRoot":"","sources":["../../../src/core/indexer/OffsetMapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,YAAY;IACvB,2DAA2D;IAC3D,OAAO,CAAC,WAAW,CAAgB;gBAEvB,cAAc,GAAE,MAAM,EAAO;IAIzC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAInC;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAMnC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD;;;OAGG;IACH,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAgB1C;;OAEG;IACH,IAAI,UAAU,IAAI,MAAM,CAEvB;IAED;;OAEG;IACH,OAAO,IAAI,MAAM,EAAE;IAInB;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAIhC;;OAEG;IACH,IAAI,IAAI,IAAI;IAIZ;;;;;OAKG;IACH,UAAU,CACR,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ;QAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QAAC,YAAY,EAAE,MAAM,EAAE,CAAA;KAAE;CAYvD"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ /**
3
+ * OffsetMapper.ts
4
+ * Maintains the mapping between line numbers and their byte offsets in the file.
5
+ * This is the core structure that enables O(1) line retrieval by position.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.OffsetMapper = void 0;
9
+ class OffsetMapper {
10
+ /** Sorted array of byte offsets, index = lineNumber - 1 */
11
+ lineOffsets = [];
12
+ constructor(initialOffsets = []) {
13
+ this.lineOffsets = [...initialOffsets];
14
+ }
15
+ /**
16
+ * Record the byte offset of a new line.
17
+ */
18
+ addOffset(byteOffset) {
19
+ this.lineOffsets.push(byteOffset);
20
+ }
21
+ /**
22
+ * Bulk add offsets (more efficient than individual adds).
23
+ */
24
+ addOffsets(offsets) {
25
+ for (const o of offsets) {
26
+ this.lineOffsets.push(o);
27
+ }
28
+ }
29
+ /**
30
+ * Get the byte offset of a specific line (1-based).
31
+ */
32
+ getOffset(lineNumber) {
33
+ return this.lineOffsets[lineNumber - 1];
34
+ }
35
+ /**
36
+ * Find the 1-based line number for a given byte offset using binary search.
37
+ * Returns the line number, or -1 if not found.
38
+ */
39
+ findLineNumber(byteOffset) {
40
+ const arr = this.lineOffsets;
41
+ let lo = 0;
42
+ let hi = arr.length - 1;
43
+ while (lo <= hi) {
44
+ const mid = (lo + hi) >>> 1;
45
+ if (arr[mid] === byteOffset)
46
+ return mid + 1;
47
+ if (arr[mid] < byteOffset)
48
+ lo = mid + 1;
49
+ else
50
+ hi = mid - 1;
51
+ }
52
+ // Return the closest line (lo is the insertion point)
53
+ return Math.min(lo + 1, arr.length);
54
+ }
55
+ /**
56
+ * Get the total number of lines tracked.
57
+ */
58
+ get totalLines() {
59
+ return this.lineOffsets.length;
60
+ }
61
+ /**
62
+ * Get the raw offsets array (for serialization).
63
+ */
64
+ toArray() {
65
+ return [...this.lineOffsets];
66
+ }
67
+ /**
68
+ * Merge another OffsetMapper into this one (for combining chunk results).
69
+ * The other mapper's offsets are appended (assumed to come after current ones).
70
+ */
71
+ merge(other) {
72
+ this.addOffsets(other.toArray());
73
+ }
74
+ /**
75
+ * Sort offsets (needed after merging multiple chunks).
76
+ */
77
+ sort() {
78
+ this.lineOffsets.sort((a, b) => a - b);
79
+ }
80
+ /**
81
+ * Get a slice of offsets around a given byte offset (for context lines).
82
+ * @param byteOffset The central line's byte offset
83
+ * @param before Number of lines to include before
84
+ * @param after Number of lines to include after
85
+ */
86
+ getContext(byteOffset, before, after) {
87
+ const lineIdx = this.findLineNumber(byteOffset) - 1; // 0-based index
88
+ const beforeOffsets = this.lineOffsets.slice(Math.max(0, lineIdx - before), lineIdx);
89
+ const afterOffsets = this.lineOffsets.slice(lineIdx + 1, lineIdx + 1 + after);
90
+ return { beforeOffsets, afterOffsets };
91
+ }
92
+ }
93
+ exports.OffsetMapper = OffsetMapper;
94
+ //# sourceMappingURL=OffsetMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OffsetMapper.js","sourceRoot":"","sources":["../../../src/core/indexer/OffsetMapper.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AAEH,MAAa,YAAY;IACvB,2DAA2D;IACnD,WAAW,GAAa,EAAE,CAAC;IAEnC,YAAY,iBAA2B,EAAE;QACvC,IAAI,CAAC,WAAW,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,UAAkB;QAC1B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAiB;QAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACH,cAAc,CAAC,UAAkB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC,CAAC;QACX,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;QAExB,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC;YAChB,MAAM,GAAG,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YAC5B,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,UAAU;gBAAE,OAAO,GAAG,GAAG,CAAC,CAAC;YAC5C,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU;gBAAE,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;;gBACnC,EAAE,GAAG,GAAG,GAAG,CAAC,CAAC;QACpB,CAAC;QAED,sDAAsD;QACtD,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,OAAO;QACL,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAmB;QACvB,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,IAAI;QACF,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,UAAU,CACR,UAAkB,EAClB,MAAc,EACd,KAAa;QAEb,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,gBAAgB;QACrE,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAC1C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC,EAC7B,OAAO,CACR,CAAC;QACF,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CACzC,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,CAAC,GAAG,KAAK,CACpB,CAAC;QACF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC;IACzC,CAAC;CACF;AAtGD,oCAsGC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * TokenExtractor.ts
3
+ * Extracts normalized tokens (terms) from a log line for indexing.
4
+ * Handles deduplication, normalization, and stop-word filtering.
5
+ */
6
+ export declare class TokenExtractor {
7
+ private minLength;
8
+ private stopWords;
9
+ private includeTimestamps;
10
+ constructor(options?: {
11
+ minLength?: number;
12
+ stopWords?: string[];
13
+ includeTimestamps?: boolean;
14
+ });
15
+ /**
16
+ * Extract all unique tokens from a single line.
17
+ * Returns a Set of normalized lowercase tokens.
18
+ */
19
+ extract(line: string): Set<string>;
20
+ /**
21
+ * Break compound tokens into sub-tokens for better searchability.
22
+ * e.g. "192.168.1.1" → "192", "168"
23
+ * "/api/v2/users" → "api", "v2", "users"
24
+ */
25
+ private addSubTokens;
26
+ }
27
+ //# sourceMappingURL=TokenExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokenExtractor.d.ts","sourceRoot":"","sources":["../../../src/core/indexer/TokenExtractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,iBAAiB,CAAU;gBAEvB,OAAO,GAAE;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QACrB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KACxB;IASN;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;IA4BlC;;;;OAIG;IACH,OAAO,CAAC,YAAY;CAgCrB"}