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,96 @@
1
+ "use strict";
2
+ /**
3
+ * info.ts
4
+ * Display detailed info about a file's index.
5
+ * Usage: log-search info <file>
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.createInfoCommand = createInfoCommand;
45
+ const commander_1 = require("commander");
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const path = __importStar(require("path"));
48
+ const IndexStore_1 = require("../../index-store/IndexStore");
49
+ const formatter_1 = require("../output/formatter");
50
+ function createInfoCommand() {
51
+ return new commander_1.Command('info')
52
+ .description('Show index information for a log file')
53
+ .argument('<file>', 'Path to the log file')
54
+ .option('--json', 'Output info as JSON', false)
55
+ .action(async (file, options) => {
56
+ const filePath = path.resolve(file);
57
+ const store = new IndexStore_1.IndexStore();
58
+ const info = await store.getIndexInfo(filePath);
59
+ if (!info) {
60
+ formatter_1.OutputFormatter.printWarning(`No index found for: ${filePath}`);
61
+ formatter_1.OutputFormatter.printInfo(`Run: log-search index "${filePath}" to build one.`);
62
+ process.exit(1);
63
+ }
64
+ if (options.json) {
65
+ console.log(JSON.stringify(info, null, 2));
66
+ return;
67
+ }
68
+ const compressionPct = (info.compressionRatio * 100).toFixed(0);
69
+ console.log('');
70
+ console.log(chalk_1.default.bold(' 📊 Index Information'));
71
+ console.log(chalk_1.default.dim(' ' + '─'.repeat(50)));
72
+ console.log(` ${chalk_1.default.bold('File:')} ${info.filePath}`);
73
+ console.log(` ${chalk_1.default.bold('Index:')} ${info.indexPath}`);
74
+ console.log(` ${chalk_1.default.bold('File size:')} ${formatBytes(info.fileSize)}`);
75
+ console.log(` ${chalk_1.default.bold('Index size:')} ${formatBytes(info.indexSize)}`);
76
+ console.log(` ${chalk_1.default.bold('Total lines:')} ${info.totalLines.toLocaleString()}`);
77
+ console.log(` ${chalk_1.default.bold('Unique terms:')} ${info.uniqueTerms.toLocaleString()}`);
78
+ console.log(` ${chalk_1.default.bold('Built at:')} ${new Date(info.builtAt).toLocaleString()}`);
79
+ console.log(` ${chalk_1.default.bold('Compression:')} ${compressionPct}% smaller than original`);
80
+ console.log(` ${chalk_1.default.bold('Status:')} ` +
81
+ (info.isStale
82
+ ? chalk_1.default.yellow('⚠ Stale — file has changed since indexing')
83
+ : chalk_1.default.green('✓ Up to date')));
84
+ console.log('');
85
+ });
86
+ }
87
+ function formatBytes(bytes) {
88
+ if (bytes < 1024)
89
+ return `${bytes} B`;
90
+ if (bytes < 1024 * 1024)
91
+ return `${(bytes / 1024).toFixed(1)} KB`;
92
+ if (bytes < 1024 * 1024 * 1024)
93
+ return `${(bytes / 1024 / 1024).toFixed(1)} MB`;
94
+ return `${(bytes / 1024 / 1024 / 1024).toFixed(2)} GB`;
95
+ }
96
+ //# sourceMappingURL=info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/commands/info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * search.ts
3
+ * The main `search` CLI command.
4
+ * Usage: log-search search <file> <query> [options]
5
+ * log-search <file> <query> [options] (shorthand)
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function createSearchCommand(): Command;
9
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,mBAAmB,IAAI,OAAO,CA+F7C"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * search.ts
4
+ * The main `search` CLI command.
5
+ * Usage: log-search search <file> <query> [options]
6
+ * log-search <file> <query> [options] (shorthand)
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
42
+ return (mod && mod.__esModule) ? mod : { "default": mod };
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.createSearchCommand = createSearchCommand;
46
+ const commander_1 = require("commander");
47
+ const ora_1 = __importDefault(require("ora"));
48
+ const chalk_1 = __importDefault(require("chalk"));
49
+ const path = __importStar(require("path"));
50
+ const fs = __importStar(require("fs"));
51
+ const IndexBuilder_1 = require("../../core/indexer/IndexBuilder");
52
+ const IndexSearcher_1 = require("../../core/searcher/IndexSearcher");
53
+ const IndexStore_1 = require("../../index-store/IndexStore");
54
+ const IncrementalUpdater_1 = require("../../index-store/IncrementalUpdater");
55
+ const formatter_1 = require("../output/formatter");
56
+ function createSearchCommand() {
57
+ return new commander_1.Command('search')
58
+ .alias('s')
59
+ .description('Search through a log file at blazing speed')
60
+ .argument('<file>', 'Path to the log file')
61
+ .argument('<query>', 'Search query (supports AND, OR, NOT, phrases, regex, fuzzy)')
62
+ .option('-n, --limit <number>', 'Max number of results to show', '100')
63
+ .option('-c, --context <lines>', 'Show N lines of context around each match', '0')
64
+ .option('-r, --regex', 'Treat query as a regex pattern', false)
65
+ .option('-I, --case-sensitive', 'Case-sensitive search (default: insensitive)', false)
66
+ .option('--json', 'Output results as JSON', false)
67
+ .option('--table', 'Output results as a table', false)
68
+ .option('--no-color', 'Disable colored output')
69
+ .option('--rebuild-index', 'Force rebuild the index even if it exists', false)
70
+ .option('--skip-incremental', 'Skip incremental index update check', false)
71
+ .option('--since <datetime>', 'Only include results after this datetime (ISO format)')
72
+ .option('--until <datetime>', 'Only include results before this datetime (ISO format)')
73
+ .option('--level <level>', 'Filter by log level (ERROR, WARN, INFO, DEBUG, etc.)')
74
+ .option('--sort-by <field>', 'Sort by: line (default) or score', 'line')
75
+ .option('--sort-dir <dir>', 'Sort direction: asc (default) or desc', 'asc')
76
+ .option('--offset <number>', 'Skip N results (pagination)', '0')
77
+ .action(async (file, query, options) => {
78
+ const filePath = path.resolve(file);
79
+ // ── Validate file exists ─────────────────────────────────────────────
80
+ if (!fs.existsSync(filePath)) {
81
+ formatter_1.OutputFormatter.printError(`File not found: ${filePath}`);
82
+ process.exit(1);
83
+ }
84
+ const stat = fs.statSync(filePath);
85
+ if (!stat.isFile()) {
86
+ formatter_1.OutputFormatter.printError(`Not a regular file: ${filePath}`);
87
+ process.exit(1);
88
+ }
89
+ const store = new IndexStore_1.IndexStore();
90
+ const searcher = new IndexSearcher_1.IndexSearcher(filePath);
91
+ let indexPath = null;
92
+ // ── Build / locate index ─────────────────────────────────────────────
93
+ if (!options.rebuildIndex) {
94
+ indexPath = await store.getIndexPath(filePath);
95
+ }
96
+ if (!indexPath || options.rebuildIndex) {
97
+ indexPath = await buildIndex(filePath, store);
98
+ }
99
+ else if (!options.skipIncremental) {
100
+ // Check if file has grown since indexing — do incremental update
101
+ await tryIncrementalUpdate(filePath, indexPath);
102
+ }
103
+ // ── Load index ───────────────────────────────────────────────────────
104
+ await searcher.loadIndex(indexPath);
105
+ // ── Print header ─────────────────────────────────────────────────────
106
+ if (!options.json) {
107
+ formatter_1.OutputFormatter.printHeader(query, filePath);
108
+ }
109
+ // ── Execute search ───────────────────────────────────────────────────
110
+ const t0 = performance.now();
111
+ const results = await searcher.search(query, {
112
+ limit: parseInt(options.limit, 10),
113
+ offset: parseInt(options.offset, 10),
114
+ ignoreCase: !options.caseSensitive,
115
+ isRegex: options.regex,
116
+ context: parseInt(options.context, 10),
117
+ since: options.since,
118
+ until: options.until,
119
+ level: options.level,
120
+ sortBy: options.sortBy,
121
+ sortDir: options.sortDir,
122
+ });
123
+ const searchTimeMs = performance.now() - t0;
124
+ // ── Print results ─────────────────────────────────────────────────────
125
+ const fmt = options.json ? 'json' : options.table ? 'table' : 'text';
126
+ const formatter = new formatter_1.OutputFormatter({
127
+ color: options.color !== false,
128
+ format: fmt,
129
+ });
130
+ formatter.print(results, {
131
+ query,
132
+ filePath,
133
+ totalMatches: results.length,
134
+ searchTimeMs,
135
+ indexLoaded: true,
136
+ });
137
+ process.exit(0);
138
+ });
139
+ }
140
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
141
+ async function buildIndex(filePath, store) {
142
+ const spinner = (0, ora_1.default)({
143
+ text: chalk_1.default.cyan('Building index... (first time only)'),
144
+ spinner: 'dots',
145
+ }).start();
146
+ try {
147
+ const builder = new IndexBuilder_1.IndexBuilder(filePath);
148
+ const result = await builder.build((percent) => {
149
+ spinner.text = chalk_1.default.cyan(`Building index... ${percent}%`);
150
+ });
151
+ spinner.succeed(chalk_1.default.green(`Index built in ${(result.buildTimeMs / 1000).toFixed(1)}s` +
152
+ chalk_1.default.dim(` — ${result.totalLines.toLocaleString()} lines, `) +
153
+ chalk_1.default.dim(`${result.uniqueTerms.toLocaleString()} unique terms, `) +
154
+ chalk_1.default.dim(`${(result.fileSize / 1024 / 1024).toFixed(0)}MB file`)));
155
+ await store.saveIndexPath(filePath, result.indexPath, {
156
+ totalLines: result.totalLines,
157
+ fileSize: result.fileSize,
158
+ });
159
+ return result.indexPath;
160
+ }
161
+ catch (err) {
162
+ spinner.fail(chalk_1.default.red('Index build failed'));
163
+ throw err;
164
+ }
165
+ }
166
+ async function tryIncrementalUpdate(filePath, indexPath) {
167
+ try {
168
+ const updater = new IncrementalUpdater_1.IncrementalUpdater();
169
+ const updated = await updater.update(filePath, indexPath);
170
+ if (updated) {
171
+ formatter_1.OutputFormatter.printInfo(`Index updated (+${updated.metadata.totalLines.toLocaleString()} lines)`);
172
+ }
173
+ }
174
+ catch {
175
+ // Incremental update failure is non-fatal
176
+ }
177
+ }
178
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/cli/commands/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * watch.ts
3
+ * Watch a log file for new content and search/alert in real-time.
4
+ * Usage: log-search watch <file> [query] [options]
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createWatchCommand(): Command;
8
+ //# sourceMappingURL=watch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,kBAAkB,IAAI,OAAO,CAqF5C"}
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ /**
3
+ * watch.ts
4
+ * Watch a log file for new content and search/alert in real-time.
5
+ * Usage: log-search watch <file> [query] [options]
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
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.createWatchCommand = createWatchCommand;
45
+ const commander_1 = require("commander");
46
+ const chalk_1 = __importDefault(require("chalk"));
47
+ const path = __importStar(require("path"));
48
+ const fs = __importStar(require("fs"));
49
+ const FileWatcher_1 = require("../../index-store/FileWatcher");
50
+ const formatter_1 = require("../output/formatter");
51
+ const FileStreamer_1 = require("../../core/streaming/FileStreamer");
52
+ function createWatchCommand() {
53
+ return new commander_1.Command('watch')
54
+ .alias('w')
55
+ .description('Watch a log file for new content and alert in real-time')
56
+ .argument('<file>', 'Path to the log file to watch')
57
+ .argument('[query]', 'Optional filter query — only show matching new lines')
58
+ .option('-t, --tail <lines>', 'Show last N lines on startup', '20')
59
+ .option('--alert <pattern>', 'Alert pattern — print a banner when matched')
60
+ .option('--no-color', 'Disable colored output')
61
+ .option('--timestamps', 'Show timestamps for new lines', false)
62
+ .action(async (file, query, options) => {
63
+ const filePath = path.resolve(file);
64
+ if (!fs.existsSync(filePath)) {
65
+ formatter_1.OutputFormatter.printError(`File not found: ${filePath}`);
66
+ process.exit(1);
67
+ }
68
+ // Show last N lines on startup
69
+ const tailCount = parseInt(options.tail, 10);
70
+ if (tailCount > 0) {
71
+ const lines = await FileStreamer_1.FileStreamer.tail(filePath, tailCount);
72
+ console.log(chalk_1.default.dim(`\n ── Last ${tailCount} lines ──`));
73
+ lines.forEach((line) => console.log(chalk_1.default.dim(' ') + line));
74
+ console.log(chalk_1.default.dim(' ── Watching for new content... (Ctrl+C to stop) ──\n'));
75
+ }
76
+ const watcher = new FileWatcher_1.FileWatcher();
77
+ watcher.watch(filePath);
78
+ watcher.on('change', async (event) => {
79
+ // Read new bytes
80
+ const { filePath: changedPath, previousSize, currentSize } = event;
81
+ const buffer = await readNewBytes(changedPath, previousSize, currentSize);
82
+ const newLines = buffer.split('\n').filter(Boolean);
83
+ for (const line of newLines) {
84
+ if (query) {
85
+ const lower = line.toLowerCase();
86
+ const q = query.toLowerCase();
87
+ if (!lower.includes(q))
88
+ continue;
89
+ }
90
+ const ts = options.timestamps
91
+ ? chalk_1.default.dim(new Date().toISOString() + ' ')
92
+ : '';
93
+ const levelMatch = line.match(/\b(ERROR|WARN|WARNING|INFO|DEBUG|FATAL|CRITICAL)\b/i);
94
+ if (levelMatch) {
95
+ const level = levelMatch[1].toUpperCase();
96
+ if (level === 'ERROR' || level === 'FATAL' || level === 'CRITICAL') {
97
+ console.log(ts + chalk_1.default.bold.red(' [ERROR] ') + line);
98
+ }
99
+ else if (level === 'WARN' || level === 'WARNING') {
100
+ console.log(ts + chalk_1.default.bold.yellow(' [WARN] ') + line);
101
+ }
102
+ else {
103
+ console.log(ts + chalk_1.default.dim(' [INFO] ') + line);
104
+ }
105
+ }
106
+ else {
107
+ console.log(ts + ' ' + line);
108
+ }
109
+ // Alert banner
110
+ if (options.alert) {
111
+ const alertRe = new RegExp(options.alert, 'i');
112
+ if (alertRe.test(line)) {
113
+ console.log('');
114
+ console.log(chalk_1.default.bold.bgRed.white(' ⚠ ALERT TRIGGERED ⚠ '));
115
+ console.log(chalk_1.default.bold.red(` Pattern: ${options.alert}`));
116
+ console.log(chalk_1.default.bold.red(` Line: ${line.slice(0, 200)}`));
117
+ console.log('');
118
+ }
119
+ }
120
+ }
121
+ });
122
+ watcher.on('error', (err) => {
123
+ formatter_1.OutputFormatter.printError(`Watcher error: ${err.message}`);
124
+ });
125
+ process.on('SIGINT', async () => {
126
+ console.log(chalk_1.default.dim('\n Stopped watching.'));
127
+ await watcher.stop();
128
+ process.exit(0);
129
+ });
130
+ });
131
+ }
132
+ function readNewBytes(filePath, start, end) {
133
+ return new Promise((resolve, reject) => {
134
+ const chunks = [];
135
+ const stream = fs.createReadStream(filePath, { start, end: end - 1 });
136
+ stream.on('data', (c) => chunks.push(c));
137
+ stream.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
138
+ stream.on('error', reject);
139
+ });
140
+ }
141
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/cli/commands/watch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * main.ts
3
+ * CLI entry point. Registers all commands and parses argv.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ /**
3
+ * main.ts
4
+ * CLI entry point. Registers all commands and parses argv.
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
+ const commander_1 = require("commander");
11
+ const chalk_1 = __importDefault(require("chalk"));
12
+ const search_1 = require("./commands/search");
13
+ const index_1 = require("./commands/index");
14
+ const info_1 = require("./commands/info");
15
+ const watch_1 = require("./commands/watch");
16
+ const clear_1 = require("./commands/clear");
17
+ const pkg = require('../../package.json');
18
+ const program = new commander_1.Command();
19
+ program
20
+ .name('log-search')
21
+ .aliases(['lsearch'])
22
+ .version(pkg.version, '-v, --version', 'Output the current version')
23
+ .description(chalk_1.default.bold('log-search') +
24
+ ' — Search through 50GB log files in under a second.\n' +
25
+ chalk_1.default.dim(' Indexed search engine for DevOps engineers.'))
26
+ .usage('<command> [options]');
27
+ // ── Commands ──────────────────────────────────────────────────────────────────
28
+ program.addCommand((0, search_1.createSearchCommand)());
29
+ program.addCommand((0, index_1.createIndexCommand)());
30
+ program.addCommand((0, info_1.createInfoCommand)());
31
+ program.addCommand((0, watch_1.createWatchCommand)());
32
+ program.addCommand((0, clear_1.createClearCommand)());
33
+ // ── Default action: if first arg looks like a file, run search directly ───────
34
+ // Allows: log-search <file> <query> (without the "search" subcommand)
35
+ const args = process.argv.slice(2);
36
+ const knownCommands = ['search', 'index', 'info', 'watch', 'clear', 's', 'i', 'w', 'c'];
37
+ const firstArg = args[0];
38
+ if (firstArg && !firstArg.startsWith('-') && !knownCommands.includes(firstArg)) {
39
+ // Looks like a file path — prepend "search" subcommand
40
+ process.argv.splice(2, 0, 'search');
41
+ }
42
+ // ── Global error handling ─────────────────────────────────────────────────────
43
+ program.exitOverride((err) => {
44
+ if (err.code !== 'commander.helpDisplayed' && err.code !== 'commander.version') {
45
+ console.error(chalk_1.default.bold.red('Error:'), err.message);
46
+ process.exit(1);
47
+ }
48
+ process.exit(0);
49
+ });
50
+ // ── Parse ─────────────────────────────────────────────────────────────────────
51
+ program.parseAsync(process.argv).catch((err) => {
52
+ console.error(chalk_1.default.bold.red('Fatal Error:'), err.message);
53
+ if (process.env.DEBUG)
54
+ console.error(err.stack);
55
+ process.exit(1);
56
+ });
57
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAEH,yCAAoC;AACpC,kDAA0B;AAC1B,8CAAwD;AACxD,4CAAsD;AACtD,0CAAoD;AACpD,4CAAsD;AACtD,4CAAsD;AAEtD,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;KACpB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,4BAA4B,CAAC;KACnE,WAAW,CACV,eAAK,CAAC,IAAI,CAAC,YAAY,CAAC;IACxB,uDAAuD;IACvD,eAAK,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAC3D;KACA,KAAK,CAAC,qBAAqB,CAAC,CAAC;AAEhC,iFAAiF;AACjF,OAAO,CAAC,UAAU,CAAC,IAAA,4BAAmB,GAAE,CAAC,CAAC;AAC1C,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,wBAAiB,GAAE,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAkB,GAAE,CAAC,CAAC;AACzC,OAAO,CAAC,UAAU,CAAC,IAAA,0BAAkB,GAAE,CAAC,CAAC;AAEzC,iFAAiF;AACjF,sEAAsE;AACtE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACnC,MAAM,aAAa,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACxF,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AAEzB,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC/E,uDAAuD;IACvD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,iFAAiF;AACjF,OAAO,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,EAAE;IAC3B,IAAI,GAAG,CAAC,IAAI,KAAK,yBAAyB,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QAC/E,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,iFAAiF;AACjF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * colorizer.ts
3
+ * Terminal color utilities using chalk.
4
+ * Respects --no-color flag and CI environments.
5
+ */
6
+ import chalk from 'chalk';
7
+ export declare const colors: {
8
+ error: chalk.Chalk;
9
+ warn: chalk.Chalk;
10
+ info: chalk.Chalk;
11
+ debug: chalk.Chalk;
12
+ fatal: chalk.Chalk;
13
+ highlight: chalk.Chalk;
14
+ lineNumber: chalk.Chalk;
15
+ offset: chalk.Chalk;
16
+ separator: chalk.Chalk;
17
+ filename: chalk.Chalk;
18
+ score: chalk.Chalk;
19
+ success: chalk.Chalk;
20
+ failure: chalk.Chalk;
21
+ warning: chalk.Chalk;
22
+ muted: chalk.Chalk;
23
+ header: chalk.Chalk;
24
+ subheader: chalk.Chalk;
25
+ };
26
+ /**
27
+ * Colorize a log level string.
28
+ */
29
+ export declare function colorizeLevel(level: string): string;
30
+ /**
31
+ * Apply highlight color to specific character ranges in a string.
32
+ * @param text The original string
33
+ * @param ranges Array of [start, end] pairs to highlight
34
+ */
35
+ export declare function applyHighlights(text: string, ranges: Array<[number, number]>): string;
36
+ //# sourceMappingURL=colorizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colorizer.d.ts","sourceRoot":"","sources":["../../../src/cli/output/colorizer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;CAyBlB,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAmBnD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,MAAM,CAsBrF"}