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,101 @@
1
+ "use strict";
2
+ /**
3
+ * colorizer.ts
4
+ * Terminal color utilities using chalk.
5
+ * Respects --no-color flag and CI environments.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.colors = void 0;
12
+ exports.colorizeLevel = colorizeLevel;
13
+ exports.applyHighlights = applyHighlights;
14
+ const chalk_1 = __importDefault(require("chalk"));
15
+ exports.colors = {
16
+ // Log levels
17
+ error: chalk_1.default.bold.red,
18
+ warn: chalk_1.default.bold.yellow,
19
+ info: chalk_1.default.bold.cyan,
20
+ debug: chalk_1.default.bold.gray,
21
+ fatal: chalk_1.default.bold.bgRed.white,
22
+ // UI elements
23
+ highlight: chalk_1.default.bold.bgYellow.black,
24
+ lineNumber: chalk_1.default.dim.gray,
25
+ offset: chalk_1.default.dim.cyan,
26
+ separator: chalk_1.default.dim.gray,
27
+ filename: chalk_1.default.bold.white,
28
+ score: chalk_1.default.dim.magenta,
29
+ // Messages
30
+ success: chalk_1.default.bold.green,
31
+ failure: chalk_1.default.bold.red,
32
+ warning: chalk_1.default.bold.yellow,
33
+ muted: chalk_1.default.dim.gray,
34
+ // Headers
35
+ header: chalk_1.default.bold.white,
36
+ subheader: chalk_1.default.dim.white,
37
+ };
38
+ /**
39
+ * Colorize a log level string.
40
+ */
41
+ function colorizeLevel(level) {
42
+ const upper = level.toUpperCase();
43
+ switch (upper) {
44
+ case 'ERROR':
45
+ case 'ERR':
46
+ case 'FATAL':
47
+ case 'CRITICAL':
48
+ return exports.colors.error(upper);
49
+ case 'WARN':
50
+ case 'WARNING':
51
+ return exports.colors.warn(upper);
52
+ case 'INFO':
53
+ return exports.colors.info(upper);
54
+ case 'DEBUG':
55
+ case 'TRACE':
56
+ return exports.colors.debug(upper);
57
+ default:
58
+ return level;
59
+ }
60
+ }
61
+ /**
62
+ * Apply highlight color to specific character ranges in a string.
63
+ * @param text The original string
64
+ * @param ranges Array of [start, end] pairs to highlight
65
+ */
66
+ function applyHighlights(text, ranges) {
67
+ if (ranges.length === 0)
68
+ return text;
69
+ let result = '';
70
+ let lastIdx = 0;
71
+ // Merge overlapping ranges
72
+ const merged = mergeRanges(ranges);
73
+ for (const [start, end] of merged) {
74
+ if (start > lastIdx) {
75
+ result += text.slice(lastIdx, start);
76
+ }
77
+ result += exports.colors.highlight(text.slice(start, end));
78
+ lastIdx = end;
79
+ }
80
+ if (lastIdx < text.length) {
81
+ result += text.slice(lastIdx);
82
+ }
83
+ return result;
84
+ }
85
+ function mergeRanges(ranges) {
86
+ if (ranges.length === 0)
87
+ return [];
88
+ const sorted = [...ranges].sort((a, b) => a[0] - b[0]);
89
+ const merged = [sorted[0]];
90
+ for (let i = 1; i < sorted.length; i++) {
91
+ const last = merged[merged.length - 1];
92
+ if (sorted[i][0] <= last[1]) {
93
+ last[1] = Math.max(last[1], sorted[i][1]);
94
+ }
95
+ else {
96
+ merged.push(sorted[i]);
97
+ }
98
+ }
99
+ return merged;
100
+ }
101
+ //# sourceMappingURL=colorizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorizer.js","sourceRoot":"","sources":["../../../src/cli/output/colorizer.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;AAkCH,sCAmBC;AAOD,0CAsBC;AAhFD,kDAA0B;AAEb,QAAA,MAAM,GAAG;IACpB,aAAa;IACb,KAAK,EAAE,eAAK,CAAC,IAAI,CAAC,GAAG;IACrB,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM;IACvB,IAAI,EAAE,eAAK,CAAC,IAAI,CAAC,IAAI;IACrB,KAAK,EAAE,eAAK,CAAC,IAAI,CAAC,IAAI;IACtB,KAAK,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;IAE7B,cAAc;IACd,SAAS,EAAE,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK;IACpC,UAAU,EAAE,eAAK,CAAC,GAAG,CAAC,IAAI;IAC1B,MAAM,EAAE,eAAK,CAAC,GAAG,CAAC,IAAI;IACtB,SAAS,EAAE,eAAK,CAAC,GAAG,CAAC,IAAI;IACzB,QAAQ,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK;IAC1B,KAAK,EAAE,eAAK,CAAC,GAAG,CAAC,OAAO;IAExB,WAAW;IACX,OAAO,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK;IACzB,OAAO,EAAE,eAAK,CAAC,IAAI,CAAC,GAAG;IACvB,OAAO,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM;IAC1B,KAAK,EAAE,eAAK,CAAC,GAAG,CAAC,IAAI;IAErB,UAAU;IACV,MAAM,EAAE,eAAK,CAAC,IAAI,CAAC,KAAK;IACxB,SAAS,EAAE,eAAK,CAAC,GAAG,CAAC,KAAK;CAC3B,CAAC;AAEF;;GAEG;AACH,SAAgB,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,OAAO,CAAC;QACb,KAAK,UAAU;YACb,OAAO,cAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,cAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,KAAK,MAAM;YACT,OAAO,cAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC5B,KAAK,OAAO,CAAC;QACb,KAAK,OAAO;YACV,OAAO,cAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAgB,eAAe,CAAC,IAAY,EAAE,MAA+B;IAC3E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,2BAA2B;IAC3B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnC,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;QAClC,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,IAAI,cAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACnD,OAAO,GAAG,GAAG,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,WAAW,CAAC,MAA+B;IAClD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAA4B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * formatter.ts
3
+ * Formats and prints search results to stdout.
4
+ * Supports text, JSON, and table output modes.
5
+ */
6
+ import type { SearchResult, SearchStats } from '../../types/SearchTypes';
7
+ export type OutputFormat = 'text' | 'json' | 'table';
8
+ export interface FormatterOptions {
9
+ color?: boolean;
10
+ format?: OutputFormat;
11
+ maxResults?: number;
12
+ }
13
+ export declare class OutputFormatter {
14
+ private useColor;
15
+ private format;
16
+ constructor(options?: FormatterOptions);
17
+ /**
18
+ * Print results and stats to stdout.
19
+ */
20
+ print(results: SearchResult[], stats: SearchStats): void;
21
+ private printText;
22
+ private printTextResult;
23
+ private printStats;
24
+ private printJson;
25
+ private printTable;
26
+ static printHeader(query: string, filePath: string): void;
27
+ static printError(message: string): void;
28
+ static printWarning(message: string): void;
29
+ static printInfo(message: string): void;
30
+ }
31
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../../src/cli/output/formatter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEzE,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,MAAM,CAAe;gBAEjB,OAAO,GAAE,gBAAqB;IAS1C;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAexD,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,UAAU;IAUlB,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAYzD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxC,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI1C,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGxC"}
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ /**
3
+ * formatter.ts
4
+ * Formats and prints search results to stdout.
5
+ * Supports text, JSON, and table output modes.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.OutputFormatter = void 0;
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const colorizer_1 = require("./colorizer");
14
+ const table_1 = require("./table");
15
+ class OutputFormatter {
16
+ useColor;
17
+ format;
18
+ constructor(options = {}) {
19
+ this.useColor = options.color ?? true;
20
+ this.format = options.format ?? 'text';
21
+ if (!this.useColor) {
22
+ chalk_1.default.level = 0;
23
+ }
24
+ }
25
+ /**
26
+ * Print results and stats to stdout.
27
+ */
28
+ print(results, stats) {
29
+ switch (this.format) {
30
+ case 'json':
31
+ this.printJson(results, stats);
32
+ break;
33
+ case 'table':
34
+ this.printTable(results, stats);
35
+ break;
36
+ default:
37
+ this.printText(results, stats);
38
+ }
39
+ }
40
+ // ─── Text Output ─────────────────────────────────────────────────────────
41
+ printText(results, stats) {
42
+ if (results.length === 0) {
43
+ console.log(colorizer_1.colors.muted('\n No results found.\n'));
44
+ this.printStats(stats);
45
+ return;
46
+ }
47
+ console.log('');
48
+ for (const result of results) {
49
+ this.printTextResult(result, stats.query);
50
+ }
51
+ console.log('');
52
+ this.printStats(stats);
53
+ }
54
+ printTextResult(result, query) {
55
+ // Context lines before
56
+ if (result.contextBefore && result.contextBefore.length > 0) {
57
+ for (let i = 0; i < result.contextBefore.length; i++) {
58
+ const lineNum = result.lineNumber - result.contextBefore.length + i;
59
+ console.log(colorizer_1.colors.lineNumber(` ${String(lineNum).padStart(6)} │ `) +
60
+ colorizer_1.colors.muted(result.contextBefore[i]));
61
+ }
62
+ }
63
+ // Main match line
64
+ const lineStr = String(result.lineNumber).padStart(6);
65
+ const highlighted = (0, colorizer_1.applyHighlights)(result.content, result.highlights);
66
+ const levelMatch = result.content.match(/\b(ERROR|WARN|INFO|DEBUG|FATAL|CRITICAL)\b/i);
67
+ const levelColor = levelMatch ? (0, colorizer_1.colorizeLevel)(levelMatch[1]) : null;
68
+ const lineContent = levelColor
69
+ ? result.content.replace(levelMatch[1], levelColor)
70
+ : highlighted;
71
+ console.log(chalk_1.default.bold.cyan(` ${lineStr} `) +
72
+ chalk_1.default.bold.cyan('│ ') +
73
+ lineContent);
74
+ // Context lines after
75
+ if (result.contextAfter && result.contextAfter.length > 0) {
76
+ for (let i = 0; i < result.contextAfter.length; i++) {
77
+ const lineNum = result.lineNumber + i + 1;
78
+ console.log(colorizer_1.colors.lineNumber(` ${String(lineNum).padStart(6)} │ `) +
79
+ colorizer_1.colors.muted(result.contextAfter[i]));
80
+ }
81
+ }
82
+ // Separator between results with context
83
+ if ((result.contextBefore && result.contextBefore.length > 0) ||
84
+ (result.contextAfter && result.contextAfter.length > 0)) {
85
+ console.log(colorizer_1.colors.separator(' ───────'));
86
+ }
87
+ }
88
+ printStats(stats) {
89
+ const timeStr = stats.searchTimeMs < 1
90
+ ? `${(stats.searchTimeMs * 1000).toFixed(0)}μs`
91
+ : `${stats.searchTimeMs.toFixed(1)}ms`;
92
+ console.log(colorizer_1.colors.muted(' ') +
93
+ colorizer_1.colors.success(`✓ ${stats.totalMatches.toLocaleString()} match${stats.totalMatches !== 1 ? 'es' : ''}`) +
94
+ colorizer_1.colors.muted(` in ${timeStr}`) +
95
+ colorizer_1.colors.muted(` — ${stats.filePath}`));
96
+ console.log('');
97
+ }
98
+ // ─── JSON Output ──────────────────────────────────────────────────────────
99
+ printJson(results, stats) {
100
+ const output = {
101
+ query: stats.query,
102
+ filePath: stats.filePath,
103
+ totalMatches: stats.totalMatches,
104
+ searchTimeMs: stats.searchTimeMs,
105
+ results: results.map((r) => ({
106
+ lineNumber: r.lineNumber,
107
+ offset: r.offset,
108
+ content: r.content,
109
+ matchScore: r.matchScore,
110
+ highlights: r.highlights,
111
+ contextBefore: r.contextBefore,
112
+ contextAfter: r.contextAfter,
113
+ })),
114
+ };
115
+ console.log(JSON.stringify(output, null, 2));
116
+ }
117
+ // ─── Table Output ─────────────────────────────────────────────────────────
118
+ printTable(results, stats) {
119
+ const maxWidth = Math.min(process.stdout.columns ?? 120, 120) - 30;
120
+ console.log('');
121
+ console.log((0, table_1.renderTable)(results, { maxContentWidth: maxWidth }));
122
+ console.log('');
123
+ this.printStats(stats);
124
+ }
125
+ // ─── Header/Footer ────────────────────────────────────────────────────────
126
+ static printHeader(query, filePath) {
127
+ console.log('');
128
+ console.log(chalk_1.default.bold(' log-search') +
129
+ chalk_1.default.dim(' ›› ') +
130
+ chalk_1.default.cyan(JSON.stringify(query)) +
131
+ chalk_1.default.dim(' in ') +
132
+ chalk_1.default.white(filePath));
133
+ console.log(colorizer_1.colors.separator(' ' + '─'.repeat(60)));
134
+ }
135
+ static printError(message) {
136
+ console.error(chalk_1.default.bold.red(' ✗ ') + message);
137
+ }
138
+ static printWarning(message) {
139
+ console.warn(chalk_1.default.bold.yellow(' ⚠ ') + message);
140
+ }
141
+ static printInfo(message) {
142
+ console.log(chalk_1.default.bold.cyan(' ℹ ') + message);
143
+ }
144
+ }
145
+ exports.OutputFormatter = OutputFormatter;
146
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../../../src/cli/output/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * table.ts
3
+ * Renders search results as a formatted CLI table using cli-table3.
4
+ */
5
+ import type { SearchResult } from '../../types/SearchTypes';
6
+ export interface TableOptions {
7
+ maxContentWidth?: number;
8
+ showScore?: boolean;
9
+ showOffset?: boolean;
10
+ }
11
+ export declare function renderTable(results: SearchResult[], options?: TableOptions): string;
12
+ //# sourceMappingURL=table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../../src/cli/output/table.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAsCvF"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /**
3
+ * table.ts
4
+ * Renders search results as a formatted CLI table using cli-table3.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.renderTable = renderTable;
11
+ const cli_table3_1 = __importDefault(require("cli-table3"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ function renderTable(results, options = {}) {
14
+ const maxWidth = options.maxContentWidth ?? 80;
15
+ const showScore = options.showScore ?? false;
16
+ const showOffset = options.showOffset ?? false;
17
+ const head = [chalk_1.default.bold('#'), chalk_1.default.bold('Line'), chalk_1.default.bold('Content')];
18
+ if (showOffset)
19
+ head.push(chalk_1.default.bold('Offset'));
20
+ if (showScore)
21
+ head.push(chalk_1.default.bold('Score'));
22
+ const table = new cli_table3_1.default({
23
+ head,
24
+ style: {
25
+ head: [],
26
+ border: ['dim'],
27
+ },
28
+ colWidths: showScore ? [5, 8, maxWidth, 12, 8] : [5, 8, maxWidth + (showOffset ? 0 : 12)],
29
+ wordWrap: true,
30
+ });
31
+ results.forEach((result, i) => {
32
+ const truncated = result.content.length > maxWidth
33
+ ? result.content.slice(0, maxWidth - 3) + '...'
34
+ : result.content;
35
+ const row = [
36
+ i + 1,
37
+ chalk_1.default.dim(String(result.lineNumber)),
38
+ truncated,
39
+ ];
40
+ if (showOffset)
41
+ row.push(chalk_1.default.dim(String(result.offset)));
42
+ if (showScore)
43
+ row.push(result.matchScore.toFixed(2));
44
+ table.push(row);
45
+ });
46
+ return table.toString();
47
+ }
48
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/cli/output/table.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAYH,kCAsCC;AAhDD,4DAA+B;AAC/B,kDAA0B;AAS1B,SAAgB,WAAW,CAAC,OAAuB,EAAE,UAAwB,EAAE;IAC7E,MAAM,QAAQ,GAAG,OAAO,CAAC,eAAe,IAAI,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAC7C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC;IAE/C,MAAM,IAAI,GAAa,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpF,IAAI,UAAU;QAAE,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAChD,IAAI,SAAS;QAAE,IAAI,CAAC,IAAI,CAAC,eAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9C,MAAM,KAAK,GAAG,IAAI,oBAAK,CAAC;QACtB,IAAI;QACJ,KAAK,EAAE;YACL,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,CAAC,KAAK,CAAC;SAChB;QACD,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzF,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC5B,MAAM,SAAS,GACb,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ;YAC9B,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,KAAK;YAC/C,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QAErB,MAAM,GAAG,GAAwB;YAC/B,CAAC,GAAG,CAAC;YACL,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACpC,SAAS;SACV,CAAC;QAEF,IAAI,UAAU;YAAE,GAAG,CAAC,IAAI,CAAC,eAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,SAAS;YAAE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAEtD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * ChunkProcessor.ts
3
+ * Processes a single chunk (byte range) of the log file.
4
+ * Reads the chunk, splits into lines, extracts tokens, and maps offsets.
5
+ * Designed to run inside a Worker thread.
6
+ */
7
+ import type { ChunkResult, IndexConfig } from '../../types/IndexTypes';
8
+ export declare class ChunkProcessor {
9
+ private filePath;
10
+ private config;
11
+ private tokenExtractor;
12
+ constructor(filePath: string, config: IndexConfig);
13
+ /**
14
+ * Process a byte range of the file and return an inverted index for that chunk.
15
+ * @param startByte First byte to read (inclusive)
16
+ * @param endByte Last byte to read (inclusive)
17
+ * @param chunkId Chunk identifier for ordering
18
+ */
19
+ process(startByte: number, endByte: number, chunkId: number): Promise<ChunkResult>;
20
+ }
21
+ //# sourceMappingURL=ChunkProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkProcessor.d.ts","sourceRoot":"","sources":["../../../src/core/indexer/ChunkProcessor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEvE,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,cAAc,CAAiB;gBAE3B,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW;IAUjD;;;;;OAKG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAiFzF"}
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ /**
3
+ * ChunkProcessor.ts
4
+ * Processes a single chunk (byte range) of the log file.
5
+ * Reads the chunk, splits into lines, extracts tokens, and maps offsets.
6
+ * Designed to run inside a Worker thread.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ChunkProcessor = void 0;
10
+ const fs_1 = require("fs");
11
+ const TokenExtractor_1 = require("./TokenExtractor");
12
+ class ChunkProcessor {
13
+ filePath;
14
+ config;
15
+ tokenExtractor;
16
+ constructor(filePath, config) {
17
+ this.filePath = filePath;
18
+ this.config = config;
19
+ this.tokenExtractor = new TokenExtractor_1.TokenExtractor({
20
+ minLength: config.tokenMinLength ?? 2,
21
+ stopWords: config.stopWords ?? [],
22
+ includeTimestamps: config.includeTimestamps ?? true,
23
+ });
24
+ }
25
+ /**
26
+ * Process a byte range of the file and return an inverted index for that chunk.
27
+ * @param startByte First byte to read (inclusive)
28
+ * @param endByte Last byte to read (inclusive)
29
+ * @param chunkId Chunk identifier for ordering
30
+ */
31
+ async process(startByte, endByte, chunkId) {
32
+ const termOffsets = {};
33
+ const lineOffsets = [];
34
+ let lineCount = 0;
35
+ let bytesProcessed = 0;
36
+ let currentOffset = startByte;
37
+ let buffer = '';
38
+ await new Promise((resolve, reject) => {
39
+ const stream = (0, fs_1.createReadStream)(this.filePath, {
40
+ start: startByte,
41
+ end: endByte,
42
+ encoding: 'utf8',
43
+ highWaterMark: 512 * 1024, // 512KB read buffer
44
+ });
45
+ stream.on('data', (chunk) => {
46
+ buffer += chunk;
47
+ const lines = buffer.split('\n');
48
+ // Keep the last incomplete line in the buffer
49
+ buffer = lines.pop() ?? '';
50
+ for (const line of lines) {
51
+ if (line.length === 0) {
52
+ currentOffset += 1; // account for the '\n'
53
+ continue;
54
+ }
55
+ // Record this line's byte offset
56
+ lineOffsets.push(currentOffset);
57
+ lineCount++;
58
+ bytesProcessed += Buffer.byteLength(line, 'utf8') + 1; // +1 for '\n'
59
+ // Extract tokens from this line
60
+ const tokens = this.tokenExtractor.extract(line);
61
+ for (const token of tokens) {
62
+ if (!termOffsets[token]) {
63
+ termOffsets[token] = [];
64
+ }
65
+ // Avoid duplicate offsets for the same line
66
+ const arr = termOffsets[token];
67
+ if (arr.length === 0 || arr[arr.length - 1] !== currentOffset) {
68
+ arr.push(currentOffset);
69
+ }
70
+ }
71
+ currentOffset += Buffer.byteLength(line, 'utf8') + 1;
72
+ }
73
+ });
74
+ stream.on('end', () => {
75
+ // Process the last line if there's no trailing newline
76
+ if (buffer.length > 0) {
77
+ lineOffsets.push(currentOffset);
78
+ lineCount++;
79
+ const tokens = this.tokenExtractor.extract(buffer);
80
+ for (const token of tokens) {
81
+ if (!termOffsets[token]) {
82
+ termOffsets[token] = [];
83
+ }
84
+ const arr = termOffsets[token];
85
+ if (arr.length === 0 || arr[arr.length - 1] !== currentOffset) {
86
+ arr.push(currentOffset);
87
+ }
88
+ }
89
+ bytesProcessed += Buffer.byteLength(buffer, 'utf8');
90
+ }
91
+ resolve();
92
+ });
93
+ stream.on('error', reject);
94
+ });
95
+ return {
96
+ chunkId,
97
+ lineCount,
98
+ bytesProcessed,
99
+ termOffsets,
100
+ lineOffsets,
101
+ };
102
+ }
103
+ }
104
+ exports.ChunkProcessor = ChunkProcessor;
105
+ //# sourceMappingURL=ChunkProcessor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChunkProcessor.js","sourceRoot":"","sources":["../../../src/core/indexer/ChunkProcessor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * IndexBuilder.ts
3
+ * Core engine for building the inverted index from a log file.
4
+ * Splits the file into chunks and processes them in parallel using WorkerPool.
5
+ * Then merges all chunk results into a single InvertedIndex and serializes it.
6
+ */
7
+ import type { IndexConfig, BuildResult } from '../../types/IndexTypes';
8
+ export declare class IndexBuilder {
9
+ private filePath;
10
+ private config;
11
+ private workerPool;
12
+ private serializer;
13
+ constructor(filePath: string, config?: IndexConfig);
14
+ /**
15
+ * Build the full inverted index for this.filePath.
16
+ * Calls onProgress with a percentage 0–100 as work proceeds.
17
+ */
18
+ build(onProgress?: (percent: number) => void): Promise<BuildResult>;
19
+ /**
20
+ * Divide the file into N chunks, each starting and ending exactly at a newline.
21
+ */
22
+ private calculateChunkBoundaries;
23
+ /**
24
+ * Scan forward from `position` until we find a '\n' character.
25
+ * Returns the offset of that '\n'.
26
+ */
27
+ private findNextNewline;
28
+ /**
29
+ * Merge all chunk InvertedIndexes into a single master index.
30
+ */
31
+ private mergeChunkResults;
32
+ /**
33
+ * Compute a quick hash of the file for staleness detection.
34
+ * Only reads the first and last 64KB + file size for speed.
35
+ */
36
+ private computeFileHash;
37
+ /**
38
+ * Resolve the path where the index will be stored.
39
+ * Format: ~/.log-search/indexes/<filename>-<hash>.lsi
40
+ */
41
+ private resolveIndexPath;
42
+ /**
43
+ * Get the index path for this file (without building it).
44
+ */
45
+ getIndexPath(): Promise<string>;
46
+ }
47
+ //# sourceMappingURL=IndexBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IndexBuilder.d.ts","sourceRoot":"","sources":["../../../src/core/indexer/IndexBuilder.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EAIZ,MAAM,wBAAwB,CAAC;AAKhC,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAkB;gBAExB,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,WAAgB;IAetD;;;OAGG;IACG,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,WAAW,CAAC;IAuEzE;;OAEG;YACW,wBAAwB;IAqBtC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAgCvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;;OAGG;YACW,eAAe;IAuB7B;;;OAGG;YACW,gBAAgB;IAc9B;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAGtC"}