logixia 2.0.4 → 2.0.6

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 (218) hide show
  1. package/README.md +172 -2614
  2. package/dist/{async-context-B05ArHgM.mjs → async-context-2mbUKhcl.mjs} +4 -6
  3. package/dist/async-context-2mbUKhcl.mjs.map +1 -0
  4. package/dist/{async-context-DTQgi8f7.js → async-context-DUFMDYAr.js} +4 -6
  5. package/dist/async-context-DUFMDYAr.js.map +1 -0
  6. package/dist/{azure-monitor.transport-CwbOLZHB.js → azure-monitor.transport-Bu4S2I2q.js} +5 -5
  7. package/dist/azure-monitor.transport-Bu4S2I2q.js.map +1 -0
  8. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +2 -2
  9. package/dist/{azure-monitor.transport-DV03Z5P4.d.ts.map → azure-monitor.transport-Bvf7Xegt.d.ts.map} +1 -1
  10. package/dist/{azure-monitor.transport-BPbgjATu.mjs → azure-monitor.transport-C1RWAumT.mjs} +5 -5
  11. package/dist/azure-monitor.transport-C1RWAumT.mjs.map +1 -0
  12. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +2 -2
  13. package/dist/{azure-monitor.transport-C7kYyZUW.d.mts.map → azure-monitor.transport-CbSHOnNX.d.mts.map} +1 -1
  14. package/dist/azure.d.mts +1 -1
  15. package/dist/azure.d.ts +1 -1
  16. package/dist/azure.js +1 -1
  17. package/dist/azure.mjs +1 -1
  18. package/dist/{batch-buffer-0fgLmIPn.mjs → batch-buffer-BvXLDPlV.mjs} +3 -3
  19. package/dist/{batch-buffer-0fgLmIPn.mjs.map → batch-buffer-BvXLDPlV.mjs.map} +1 -1
  20. package/dist/{batch-buffer-DT4gdXmf.js → batch-buffer-C7Am4Mw-.js} +3 -3
  21. package/dist/{batch-buffer-DT4gdXmf.js.map → batch-buffer-C7Am4Mw-.js.map} +1 -1
  22. package/dist/browser.d.mts +5 -5
  23. package/dist/browser.d.mts.map +1 -1
  24. package/dist/browser.d.ts +5 -5
  25. package/dist/browser.d.ts.map +1 -1
  26. package/dist/browser.js +47 -12
  27. package/dist/browser.js.map +1 -1
  28. package/dist/browser.mjs +47 -12
  29. package/dist/browser.mjs.map +1 -1
  30. package/dist/{builder-D70z6kjj.mjs → builder-DhNhvOkt.mjs} +106 -153
  31. package/dist/builder-DhNhvOkt.mjs.map +1 -0
  32. package/dist/{builder-M7NoaugM.js → builder-yFvJrz7o.js} +109 -179
  33. package/dist/builder-yFvJrz7o.js.map +1 -0
  34. package/dist/cli/index.js +157 -66
  35. package/dist/cloudwatch.d.mts +1 -1
  36. package/dist/cloudwatch.d.ts +1 -1
  37. package/dist/cloudwatch.js +1 -1
  38. package/dist/cloudwatch.mjs +1 -1
  39. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -2
  40. package/dist/{cloudwatch.transport-Bf7L4I59.d.ts.map → cloudwatch.transport-CQyT6U91.d.ts.map} +1 -1
  41. package/dist/{cloudwatch.transport-B2wKQFF7.js → cloudwatch.transport-Ch1Uae-0.js} +6 -6
  42. package/dist/cloudwatch.transport-Ch1Uae-0.js.map +1 -0
  43. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -2
  44. package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts.map → cloudwatch.transport-CjVrI6S4.d.mts.map} +1 -1
  45. package/dist/{cloudwatch.transport-BTvYfLs9.mjs → cloudwatch.transport-DZqF2xZO.mjs} +6 -6
  46. package/dist/cloudwatch.transport-DZqF2xZO.mjs.map +1 -0
  47. package/dist/correlation.d.mts +4 -55
  48. package/dist/correlation.d.mts.map +1 -1
  49. package/dist/correlation.d.ts +4 -55
  50. package/dist/correlation.d.ts.map +1 -1
  51. package/dist/correlation.js +13 -13
  52. package/dist/correlation.js.map +1 -1
  53. package/dist/correlation.mjs +13 -13
  54. package/dist/correlation.mjs.map +1 -1
  55. package/dist/{entry-fields-RLd1jCoR.js → entry-fields-BSLkzw18.js} +8 -3
  56. package/dist/entry-fields-BSLkzw18.js.map +1 -0
  57. package/dist/{entry-fields-CGuvT2R0.mjs → entry-fields-J1OBi24o.mjs} +8 -3
  58. package/dist/entry-fields-J1OBi24o.mjs.map +1 -0
  59. package/dist/gcp.d.mts +1 -1
  60. package/dist/gcp.d.ts +1 -1
  61. package/dist/gcp.js +1 -1
  62. package/dist/gcp.mjs +1 -1
  63. package/dist/{gcp.transport-CFQfdAOK.d.ts → gcp.transport-BCIvdFV-.d.ts} +4 -4
  64. package/dist/{gcp.transport-CFQfdAOK.d.ts.map → gcp.transport-BCIvdFV-.d.ts.map} +1 -1
  65. package/dist/{gcp.transport-C5D72b1g.d.mts → gcp.transport-D9SdLPwP.d.mts} +4 -4
  66. package/dist/{gcp.transport-C5D72b1g.d.mts.map → gcp.transport-D9SdLPwP.d.mts.map} +1 -1
  67. package/dist/{gcp.transport-CGKopAhQ.mjs → gcp.transport-DVCmnA3b.mjs} +20 -16
  68. package/dist/gcp.transport-DVCmnA3b.mjs.map +1 -0
  69. package/dist/{gcp.transport-KZe9hCAR.js → gcp.transport-Dy2Lf8FI.js} +20 -16
  70. package/dist/gcp.transport-Dy2Lf8FI.js.map +1 -0
  71. package/dist/http-shapes-BnBkJcid.d.mts +32 -0
  72. package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
  73. package/dist/http-shapes-BnBkJcid.d.ts +32 -0
  74. package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
  75. package/dist/{index-xqaJtAZn.d.mts → index-BSTtFcQ6.d.mts} +142 -8
  76. package/dist/index-BSTtFcQ6.d.mts.map +1 -0
  77. package/dist/{index-DwozbmB4.d.ts → index-CFDGkI8n.d.ts} +142 -8
  78. package/dist/index-CFDGkI8n.d.ts.map +1 -0
  79. package/dist/index.d.mts +21 -65
  80. package/dist/index.d.mts.map +1 -1
  81. package/dist/index.d.ts +21 -65
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +26 -26
  84. package/dist/index.js.map +1 -1
  85. package/dist/index.mjs +21 -21
  86. package/dist/index.mjs.map +1 -1
  87. package/dist/{internal-log-uCSd1PMc.mjs → internal-log-Bg4V1cPg.mjs} +30 -2
  88. package/dist/internal-log-Bg4V1cPg.mjs.map +1 -0
  89. package/dist/{internal-log-b0Vp4qrB.js → internal-log-By4Govmu.js} +41 -1
  90. package/dist/internal-log-By4Govmu.js.map +1 -0
  91. package/dist/{logitron-logger-D2B75Oc7.d.ts → logitron-logger-D22Yb61K.d.mts} +13 -100
  92. package/dist/logitron-logger-D22Yb61K.d.mts.map +1 -0
  93. package/dist/{logitron-logger-oEd6wNhf.d.mts → logitron-logger-D_MYYrQt.d.ts} +13 -100
  94. package/dist/logitron-logger-D_MYYrQt.d.ts.map +1 -0
  95. package/dist/middleware.d.mts +4 -17
  96. package/dist/middleware.d.mts.map +1 -1
  97. package/dist/middleware.d.ts +4 -17
  98. package/dist/middleware.d.ts.map +1 -1
  99. package/dist/middleware.js +9 -39
  100. package/dist/middleware.js.map +1 -1
  101. package/dist/middleware.mjs +7 -37
  102. package/dist/middleware.mjs.map +1 -1
  103. package/dist/nest.d.mts +14 -7
  104. package/dist/nest.d.mts.map +1 -1
  105. package/dist/nest.d.ts +14 -7
  106. package/dist/nest.d.ts.map +1 -1
  107. package/dist/nest.js +15 -10
  108. package/dist/nest.js.map +1 -1
  109. package/dist/nest.mjs +15 -10
  110. package/dist/nest.mjs.map +1 -1
  111. package/dist/{transport.manager-eZ_EeC00.mjs → otel-Dt5riXuE.mjs} +173 -24
  112. package/dist/otel-Dt5riXuE.mjs.map +1 -0
  113. package/dist/{transport.manager-DkcEOlqV.js → otel-DyeH6DVR.js} +214 -23
  114. package/dist/otel-DyeH6DVR.js.map +1 -0
  115. package/dist/own-property-BWkibepN.js +40 -0
  116. package/dist/own-property-BWkibepN.js.map +1 -0
  117. package/dist/own-property-CjFw9qwZ.mjs +29 -0
  118. package/dist/own-property-CjFw9qwZ.mjs.map +1 -0
  119. package/dist/{request-trace-C_fvIDv4.mjs → request-trace-BgNykH9M.mjs} +1 -5
  120. package/dist/{request-trace-C_fvIDv4.mjs.map → request-trace-BgNykH9M.mjs.map} +1 -1
  121. package/dist/{request-trace-wTJdKp6-.js → request-trace-ByujsUZk.js} +1 -5
  122. package/dist/{request-trace-wTJdKp6-.js.map → request-trace-ByujsUZk.js.map} +1 -1
  123. package/dist/{safe-stringify-BMRl3EX3.mjs → safe-stringify-B5p5ktFe.mjs} +37 -12
  124. package/dist/safe-stringify-B5p5ktFe.mjs.map +1 -0
  125. package/dist/{safe-stringify-DLz1Kz3o.js → safe-stringify-J3sh-7YM.js} +37 -12
  126. package/dist/safe-stringify-J3sh-7YM.js.map +1 -0
  127. package/dist/{search-DUfWuzFP.js → search-CRjhHxe9.js} +269 -25
  128. package/dist/search-CRjhHxe9.js.map +1 -0
  129. package/dist/{search-CazwyX5Z.d.ts → search-DA3ft3X5.d.mts} +5 -2
  130. package/dist/search-DA3ft3X5.d.mts.map +1 -0
  131. package/dist/{search-CWMVYC-R.mjs → search-DAXKE-P9.mjs} +269 -25
  132. package/dist/search-DAXKE-P9.mjs.map +1 -0
  133. package/dist/{search-BH33XhuU.d.mts → search-DEl3Pe47.d.ts} +5 -2
  134. package/dist/search-DEl3Pe47.d.ts.map +1 -0
  135. package/dist/search.d.mts +1 -1
  136. package/dist/search.d.ts +1 -1
  137. package/dist/search.js +1 -1
  138. package/dist/search.mjs +1 -1
  139. package/dist/{secret-config-CBZBs0p1.js → secret-config-CmK2wVkr.js} +6 -5
  140. package/dist/secret-config-CmK2wVkr.js.map +1 -0
  141. package/dist/{secret-config-BegMLkYl.mjs → secret-config-Dhb6pqTU.mjs} +6 -5
  142. package/dist/secret-config-Dhb6pqTU.mjs.map +1 -0
  143. package/dist/{slack.transport-DxHOXlLu.d.mts → slack.transport-BDyENuR0.d.mts} +2 -2
  144. package/dist/{slack.transport-DxHOXlLu.d.mts.map → slack.transport-BDyENuR0.d.mts.map} +1 -1
  145. package/dist/{slack.transport-Ce96JBDk.mjs → slack.transport-BTEwsREY.mjs} +66 -15
  146. package/dist/slack.transport-BTEwsREY.mjs.map +1 -0
  147. package/dist/{slack.transport-DrirgDNy.d.ts → slack.transport-C6E0l4kw.d.ts} +2 -2
  148. package/dist/{slack.transport-DrirgDNy.d.ts.map → slack.transport-C6E0l4kw.d.ts.map} +1 -1
  149. package/dist/{slack.transport-Dlx3xvb7.js → slack.transport-UbYvOdKx.js} +67 -16
  150. package/dist/slack.transport-UbYvOdKx.js.map +1 -0
  151. package/dist/testing.d.mts +11 -4
  152. package/dist/testing.d.mts.map +1 -1
  153. package/dist/testing.d.ts +11 -4
  154. package/dist/testing.d.ts.map +1 -1
  155. package/dist/testing.js +38 -3
  156. package/dist/testing.js.map +1 -1
  157. package/dist/testing.mjs +38 -3
  158. package/dist/testing.mjs.map +1 -1
  159. package/dist/{transport.types-BJVL1QQl.d.ts → transport.types-CzJq4IrF.d.mts} +14 -3
  160. package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
  161. package/dist/{transport.types-BJVL1QQl.d.mts → transport.types-CzJq4IrF.d.ts} +14 -3
  162. package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
  163. package/dist/transports.d.mts +25 -13
  164. package/dist/transports.d.mts.map +1 -1
  165. package/dist/transports.d.ts +25 -13
  166. package/dist/transports.d.ts.map +1 -1
  167. package/dist/transports.js +15 -15
  168. package/dist/transports.mjs +6 -6
  169. package/dist/worker-entry.js +105 -24
  170. package/dist/worker.d.mts +1 -1
  171. package/dist/worker.d.ts +1 -1
  172. package/dist/worker.js +1 -1
  173. package/dist/worker.mjs +1 -1
  174. package/dist/{worker.transport-BuPwBi3d.d.ts → worker.transport-B9mCQSM1.d.ts} +7 -2
  175. package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
  176. package/dist/{worker.transport-hJay1wxA.d.mts → worker.transport-Bl8lFRck.d.mts} +7 -2
  177. package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
  178. package/dist/{worker.transport-DLVA4y2e.mjs → worker.transport-BmmOKb1-.mjs} +13 -10
  179. package/dist/worker.transport-BmmOKb1-.mjs.map +1 -0
  180. package/dist/{worker.transport-C6GNl_r2.js → worker.transport-DxxbqQCG.js} +13 -10
  181. package/dist/worker.transport-DxxbqQCG.js.map +1 -0
  182. package/package.json +33 -65
  183. package/dist/async-context-B05ArHgM.mjs.map +0 -1
  184. package/dist/async-context-DTQgi8f7.js.map +0 -1
  185. package/dist/azure-monitor.transport-BPbgjATu.mjs.map +0 -1
  186. package/dist/azure-monitor.transport-CwbOLZHB.js.map +0 -1
  187. package/dist/builder-D70z6kjj.mjs.map +0 -1
  188. package/dist/builder-M7NoaugM.js.map +0 -1
  189. package/dist/cloudwatch.transport-B2wKQFF7.js.map +0 -1
  190. package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +0 -1
  191. package/dist/entry-fields-CGuvT2R0.mjs.map +0 -1
  192. package/dist/entry-fields-RLd1jCoR.js.map +0 -1
  193. package/dist/gcp.transport-CGKopAhQ.mjs.map +0 -1
  194. package/dist/gcp.transport-KZe9hCAR.js.map +0 -1
  195. package/dist/index-DwozbmB4.d.ts.map +0 -1
  196. package/dist/index-xqaJtAZn.d.mts.map +0 -1
  197. package/dist/internal-log-b0Vp4qrB.js.map +0 -1
  198. package/dist/internal-log-uCSd1PMc.mjs.map +0 -1
  199. package/dist/logitron-logger-D2B75Oc7.d.ts.map +0 -1
  200. package/dist/logitron-logger-oEd6wNhf.d.mts.map +0 -1
  201. package/dist/safe-stringify-BMRl3EX3.mjs.map +0 -1
  202. package/dist/safe-stringify-DLz1Kz3o.js.map +0 -1
  203. package/dist/search-BH33XhuU.d.mts.map +0 -1
  204. package/dist/search-CWMVYC-R.mjs.map +0 -1
  205. package/dist/search-CazwyX5Z.d.ts.map +0 -1
  206. package/dist/search-DUfWuzFP.js.map +0 -1
  207. package/dist/secret-config-BegMLkYl.mjs.map +0 -1
  208. package/dist/secret-config-CBZBs0p1.js.map +0 -1
  209. package/dist/slack.transport-Ce96JBDk.mjs.map +0 -1
  210. package/dist/slack.transport-Dlx3xvb7.js.map +0 -1
  211. package/dist/transport.manager-DkcEOlqV.js.map +0 -1
  212. package/dist/transport.manager-eZ_EeC00.mjs.map +0 -1
  213. package/dist/transport.types-BJVL1QQl.d.mts.map +0 -1
  214. package/dist/transport.types-BJVL1QQl.d.ts.map +0 -1
  215. package/dist/worker.transport-BuPwBi3d.d.ts.map +0 -1
  216. package/dist/worker.transport-C6GNl_r2.js.map +0 -1
  217. package/dist/worker.transport-DLVA4y2e.mjs.map +0 -1
  218. package/dist/worker.transport-hJay1wxA.d.mts.map +0 -1
@@ -217,6 +217,67 @@ var BasicLogIndexer = class {
217
217
  }));
218
218
  }
219
219
  };
220
+ // src/search/core/user-id.ts
221
+ const STOPWORDS = /* @__PURE__ */ new Set([
222
+ "is",
223
+ "was",
224
+ "are",
225
+ "the",
226
+ "a",
227
+ "an",
228
+ "of",
229
+ "for",
230
+ "do",
231
+ "did",
232
+ "does",
233
+ "in",
234
+ "on",
235
+ "at",
236
+ "with",
237
+ "who",
238
+ "what",
239
+ "from",
240
+ "that",
241
+ "and",
242
+ "or",
243
+ "to",
244
+ "has",
245
+ "have",
246
+ "had",
247
+ "by",
248
+ "as",
249
+ "my",
250
+ "me",
251
+ "all",
252
+ "any",
253
+ "it",
254
+ "be",
255
+ "not",
256
+ "no",
257
+ "when",
258
+ "where",
259
+ "which",
260
+ "logs"
261
+ ]);
262
+ const EXPLICIT = /\buser[\s_]?id(?:\s+is|\s*[:=])?\s*["']?([\w-]+)/i;
263
+ const WITH_DIGIT = /\buser\s+["']?([\w-]*\d[\w-]*)/i;
264
+ /**
265
+ * Extract a user id from natural-language text. An id must either contain a digit
266
+ * or follow explicit "user id" / "userId:" syntax and not be a stopword, so phrases
267
+ * like "what did user do yesterday" never produce a filter.
268
+ */
269
+ function extractUserId(query) {
270
+ const explicit = EXPLICIT.exec(query);
271
+ if ((explicit === null || explicit === void 0 ? void 0 : explicit[1]) && !STOPWORDS.has(explicit[1].toLowerCase())) return {
272
+ id: explicit[1],
273
+ span: explicit[0]
274
+ };
275
+ const digit = WITH_DIGIT.exec(query);
276
+ if (digit === null || digit === void 0 ? void 0 : digit[1]) return {
277
+ id: digit[1],
278
+ span: digit[0]
279
+ };
280
+ }
220
281
  // src/search/core/basic-search-engine.ts
221
282
  /**
222
283
  * Basic search engine implementation
@@ -266,8 +327,9 @@ var BasicSearchEngine = class {
266
327
  * Perform a full-text search across logs
267
328
  */
268
329
  async search(query, filters, options) {
269
- const filteredLogs = this.applyFilters(this.logs, filters);
270
- const results = this.performTextSearch(filteredLogs, query, options);
330
+ const textCache = /* @__PURE__ */ new Map();
331
+ const filteredLogs = this.applyFilters(this.logs, filters, textCache);
332
+ const results = this.performTextSearch(filteredLogs, query, options, textCache);
271
333
  this.addToSearchHistory(query);
272
334
  const sorted = this.applySorting(results, options === null || options === void 0 ? void 0 : options.sortBy, options === null || options === void 0 ? void 0 : options.sortOrder);
273
335
  const paginated = this.applyPagination(sorted, options === null || options === void 0 ? void 0 : options.offset, options === null || options === void 0 ? void 0 : options.limit);
@@ -279,7 +341,7 @@ var BasicSearchEngine = class {
279
341
  */
280
342
  async naturalLanguageSearch(query) {
281
343
  const parsed = await this.parseNaturalLanguageQuery(query);
282
- return this.search(parsed.originalQuery, parsed.filters, {
344
+ return this.search(parsed.textQuery ?? parsed.originalQuery, parsed.filters, {
283
345
  semanticSearch: true,
284
346
  includeContext: true
285
347
  });
@@ -396,17 +458,34 @@ var BasicSearchEngine = class {
396
458
  async parseNaturalLanguageQuery(query) {
397
459
  const filters = {};
398
460
  const lowerQuery = query.toLowerCase();
461
+ let remainder = query;
462
+ const consume = (re) => {
463
+ remainder = remainder.replace(re, " ");
464
+ };
399
465
  const levels = [];
400
- if (lowerQuery.includes("error")) levels.push("error");
401
- if (lowerQuery.includes("warn")) levels.push("warn");
402
- if (lowerQuery.includes("info")) levels.push("info");
403
- if (levels.length > 0) filters.levels = levels;
466
+ if (/\berrors?\b/i.test(query)) levels.push("error");
467
+ if (/\bwarn(?:ing)?s?\b/i.test(query)) levels.push("warn");
468
+ if (/\binfo\b/i.test(query)) levels.push("info");
469
+ if (levels.length > 0) {
470
+ filters.levels = levels;
471
+ consume(/\b(?:errors?|warn(?:ing)?s?|info)\b/gi);
472
+ }
404
473
  const timeRange = this.extractTimeRange(query);
405
- if (timeRange) filters.timeRange = timeRange;
406
- const serviceMatch = query.match(/from\s+(?:the\s+)?(\w+)\s+service/i);
407
- if (serviceMatch === null || serviceMatch === void 0 ? void 0 : serviceMatch[1]) filters.services = [serviceMatch[1]];
408
- const userMatch = query.match(/user\s+(?:id\s+)?(\w+)/i);
409
- if (userMatch === null || userMatch === void 0 ? void 0 : userMatch[1]) filters.userIds = [userMatch[1]];
474
+ if (timeRange) {
475
+ filters.timeRange = timeRange;
476
+ consume(/\b(?:last|past)\s+(?:\d+\s+)?(?:second|minute|hour|day)s?\b/gi);
477
+ consume(/\btoday\b/gi);
478
+ }
479
+ const serviceMatch = query.match(/from\s+(?:the\s+)?([\w-]+)\s+service/i);
480
+ if (serviceMatch === null || serviceMatch === void 0 ? void 0 : serviceMatch[1]) {
481
+ filters.services = [serviceMatch[1]];
482
+ consume(/from\s+(?:the\s+)?[\w-]+\s+service/gi);
483
+ }
484
+ const userMatch = extractUserId(query);
485
+ if (userMatch) {
486
+ filters.userIds = [userMatch.id];
487
+ remainder = remainder.replace(userMatch.span, " ");
488
+ }
410
489
  let intent = "general_search";
411
490
  if (lowerQuery.includes("error")) intent = "find_errors";
412
491
  if (lowerQuery.includes("trace") || lowerQuery.includes("request")) intent = "trace_request";
@@ -414,6 +493,7 @@ var BasicSearchEngine = class {
414
493
  if (lowerQuery.includes("slow") || lowerQuery.includes("performance")) intent = "performance_analysis";
415
494
  return {
416
495
  originalQuery: query,
496
+ textQuery: remainder.split(/\s+/).map(trimPunctuation).filter((w) => w && !NL_FILLER_WORDS.has(w.toLowerCase())).join(" "),
417
497
  intent,
418
498
  entities: [],
419
499
  filters,
@@ -449,18 +529,29 @@ var BasicSearchEngine = class {
449
529
  async deletePreset(presetId) {
450
530
  this.presets.delete(presetId);
451
531
  }
452
- applyFilters(logs, filters) {
532
+ applyFilters(logs, filters, textCache) {
453
533
  if (!filters) return logs;
534
+ const range = filters.timeRange ? resolveTimeRange(filters.timeRange) : void 0;
535
+ const excludes = (filters.excludePatterns ?? []).filter(Boolean).map((p) => p.toLowerCase());
454
536
  return logs.filter((log) => {
455
537
  if (filters.levels && !filters.levels.includes(log.level)) return false;
456
538
  if (filters.services && !filters.services.includes(log.appName)) return false;
457
539
  if (filters.traceIds && log.traceId && !filters.traceIds.includes(log.traceId)) return false;
458
- if (filters.timeRange) {
540
+ if (range) {
459
541
  const logTime = new Date(log.timestamp).getTime();
460
- if (logTime < (typeof filters.timeRange.start === "number" ? filters.timeRange.start : filters.timeRange.start.getTime())) return false;
461
- if (filters.timeRange.end) {
462
- if (logTime > (typeof filters.timeRange.end === "number" ? filters.timeRange.end : filters.timeRange.end.getTime())) return false;
463
- }
542
+ if (logTime < range.start) return false;
543
+ if (range.end !== void 0 && logTime > range.end) return false;
544
+ }
545
+ if (filters.userIds && !matchesAny(extractPayloadId(log, USER_ID_KEYS), filters.userIds)) return false;
546
+ if (filters.sessionIds && !matchesAny(extractPayloadId(log, SESSION_ID_KEYS), filters.sessionIds)) return false;
547
+ if (filters.minSeverity !== void 0 && levelSeverity(log.level) < filters.minSeverity) return false;
548
+ if (excludes.length > 0) {
549
+ const text = this.lowerSearchableText(log, textCache);
550
+ if (excludes.some((p) => text.includes(p))) return false;
551
+ }
552
+ if (filters.customFields) for (const [key, expected] of Object.entries(filters.customFields)) {
553
+ const actual = getPath(log, key);
554
+ if (!fieldMatches(actual === void 0 ? getPath(log.payload, key) : actual, expected)) return false;
464
555
  }
465
556
  if (filters.hasError !== void 0) {
466
557
  const hasError = log.level === "error" || !!log.error;
@@ -470,7 +561,7 @@ var BasicSearchEngine = class {
470
561
  return true;
471
562
  });
472
563
  }
473
- performTextSearch(logs, query, options) {
564
+ performTextSearch(logs, query, options, textCache) {
474
565
  if (!query) return logs.map((log) => ({
475
566
  log,
476
567
  score: 1
@@ -478,7 +569,7 @@ var BasicSearchEngine = class {
478
569
  const queryTerms = query.toLowerCase().split(/\s+/);
479
570
  const results = [];
480
571
  for (const log of logs) {
481
- const searchableText = this.getSearchableText(log).toLowerCase();
572
+ const searchableText = this.lowerSearchableText(log, textCache);
482
573
  let score = 0;
483
574
  const highlights = [];
484
575
  const matchedTerms = [];
@@ -502,6 +593,14 @@ var BasicSearchEngine = class {
502
593
  }
503
594
  return results;
504
595
  }
596
+ lowerSearchableText(log, cache) {
597
+ let text = cache.get(log);
598
+ if (text === void 0) {
599
+ text = this.getSearchableText(log).toLowerCase();
600
+ cache.set(log, text);
601
+ }
602
+ return text;
603
+ }
505
604
  getSearchableText(log) {
506
605
  const payloadText = log.payload ? safeToString(log.payload) : "";
507
606
  return [
@@ -593,9 +692,20 @@ var BasicSearchEngine = class {
593
692
  }
594
693
  extractTimeRange(query) {
595
694
  const lowerQuery = query.toLowerCase();
596
- if (lowerQuery.includes("last hour") || lowerQuery.includes("past hour")) return { start: /* @__PURE__ */ new Date(Date.now() - 36e5) };
597
- const hoursMatch = query.match(/last\s+(\d+)\s+hours?/i);
598
- if (hoursMatch) return { start: /* @__PURE__ */ new Date(Date.now() - Number.parseInt(hoursMatch[1] ?? "0") * 60 * 60 * 1e3) };
695
+ const relativeMatch = lowerQuery.match(/\b(?:last|past)\s+(?:(\d+)\s+)?(seconds?|minutes?|hours?|days?)\b/);
696
+ if (relativeMatch === null || relativeMatch === void 0 ? void 0 : relativeMatch[2]) {
697
+ const relative = {
698
+ value: relativeMatch[1] ? Number.parseInt(relativeMatch[1], 10) : 1,
699
+ unit: `${relativeMatch[2].replace(/s$/, "")}s`
700
+ };
701
+ return {
702
+ start: resolveTimeRange({
703
+ start: 0,
704
+ relative
705
+ }).start,
706
+ relative
707
+ };
708
+ }
599
709
  if (lowerQuery.includes("today")) {
600
710
  const today = /* @__PURE__ */ new Date();
601
711
  today.setHours(0, 0, 0, 0);
@@ -620,6 +730,135 @@ var BasicSearchEngine = class {
620
730
  return `preset_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;
621
731
  }
622
732
  };
733
+ const UNIT_MS = {
734
+ seconds: 1e3,
735
+ minutes: 6e4,
736
+ hours: 36e5,
737
+ days: 864e5
738
+ };
739
+ const LEVEL_SEVERITY = {
740
+ trace: 0,
741
+ verbose: 1,
742
+ debug: 1,
743
+ info: 2,
744
+ log: 2,
745
+ warn: 3,
746
+ warning: 3,
747
+ error: 4,
748
+ fatal: 5,
749
+ critical: 5
750
+ };
751
+ const USER_ID_KEYS = [
752
+ "userId",
753
+ "user_id",
754
+ "userid"
755
+ ];
756
+ const SESSION_ID_KEYS = [
757
+ "sessionId",
758
+ "session_id",
759
+ "sessionid"
760
+ ];
761
+ const NL_FILLER_WORDS = /* @__PURE__ */ new Set([
762
+ "show",
763
+ "me",
764
+ "find",
765
+ "get",
766
+ "list",
767
+ "search",
768
+ "display",
769
+ "all",
770
+ "any",
771
+ "the",
772
+ "a",
773
+ "an",
774
+ "in",
775
+ "of",
776
+ "for",
777
+ "from",
778
+ "with",
779
+ "during",
780
+ "within",
781
+ "over",
782
+ "logs",
783
+ "log",
784
+ "entries",
785
+ "entry",
786
+ "messages",
787
+ "message",
788
+ "events",
789
+ "event",
790
+ "recent",
791
+ "and",
792
+ "only",
793
+ "please",
794
+ "last",
795
+ "past"
796
+ ]);
797
+ /** Strip leading and trailing non-word characters. */
798
+ function trimPunctuation(word) {
799
+ const isWord = (c) => c !== void 0 && /\w/.test(c);
800
+ let start = 0;
801
+ let end = word.length;
802
+ while (start < end && !isWord(word[start])) start++;
803
+ while (end > start && !isWord(word[end - 1])) end--;
804
+ return word.slice(start, end);
805
+ }
806
+ /** Severity rank of a level name; higher is more severe. Unknown levels rank as info. */
807
+ function levelSeverity(level) {
808
+ if (typeof level !== "string") return LEVEL_SEVERITY["info"];
809
+ return LEVEL_SEVERITY[level.toLowerCase()] ?? LEVEL_SEVERITY["info"];
810
+ }
811
+ function resolveTimeRange(range) {
812
+ const toMs = (v) => typeof v === "number" ? v : v.getTime();
813
+ if (range.relative) {
814
+ const { value, unit } = range.relative;
815
+ return {
816
+ start: Date.now() - value * UNIT_MS[unit],
817
+ end: range.end === void 0 ? void 0 : toMs(range.end)
818
+ };
819
+ }
820
+ return {
821
+ start: toMs(range.start),
822
+ end: range.end === void 0 ? void 0 : toMs(range.end)
823
+ };
824
+ }
825
+ function getPath(obj, path) {
826
+ let cur = obj;
827
+ for (const part of path.split(".")) {
828
+ if (cur === null || typeof cur !== "object") return void 0;
829
+ cur = cur[part];
830
+ }
831
+ return cur;
832
+ }
833
+ function deepEqual(a, b) {
834
+ if (a === b) return true;
835
+ if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) return false;
836
+ if (Array.isArray(a) !== Array.isArray(b)) return false;
837
+ const ka = Object.keys(a);
838
+ const kb = Object.keys(b);
839
+ if (ka.length !== kb.length) return false;
840
+ return ka.every((k) => deepEqual(a[k], b[k]));
841
+ }
842
+ /**
843
+ * Type-aware equality: primitives by ===, except a numeric string matches a numeric
844
+ * log value; objects and arrays by deep equality. A missing field never matches.
845
+ */
846
+ function fieldMatches(actual, expected) {
847
+ if (actual === void 0) return false;
848
+ if (typeof actual === "number" && typeof expected === "string" && expected.trim() !== "") return Number(expected) === actual;
849
+ return deepEqual(actual, expected);
850
+ }
851
+ function extractPayloadId(log, keys) {
852
+ const payload = log.payload;
853
+ if (!payload) return void 0;
854
+ for (const key of keys) {
855
+ const v = payload[key];
856
+ if (v !== void 0 && v !== null) return String(v);
857
+ }
858
+ }
859
+ function matchesAny(value, allowed) {
860
+ return value !== void 0 && allowed.includes(value);
861
+ }
623
862
  // src/search/engines/correlation-engine.ts
624
863
  /**
625
864
  * Correlation engine for log analysis
@@ -977,7 +1216,6 @@ var NLPSearchEngine = class extends BasicSearchEngine {
977
1216
  this.entityPatterns = /* @__PURE__ */ new Map([
978
1217
  ["level", /(error|warn|warning|info|debug|trace|verbose)/i],
979
1218
  ["service", /(?:from|in)\s+(?:the\s+)?(\w+)\s+(?:service|app|application)/i],
980
- ["user_id", /user\s+(?:id\s+)?['"]?(\w+)['"]?/i],
981
1219
  ["trace_id", /trace\s+(?:id\s+)?['"]?([\w-]+)['"]?/i],
982
1220
  ["time", /(?:last|past|previous)\s+(\d+)\s+(second|minute|hour|day|week)s?/i],
983
1221
  ["error_type", /(\w+Error|\w+Exception)/i]
@@ -998,6 +1236,12 @@ var NLPSearchEngine = class extends BasicSearchEngine {
998
1236
  }
999
1237
  extractEntities(query) {
1000
1238
  const entities = [];
1239
+ const userId = extractUserId(query);
1240
+ if (userId) entities.push({
1241
+ type: "user_id",
1242
+ value: userId.id,
1243
+ confidence: .8
1244
+ });
1001
1245
  for (const [type, pattern] of this.entityPatterns.entries()) {
1002
1246
  const matches = query.matchAll(new RegExp(pattern, "gi"));
1003
1247
  for (const match of matches) {
@@ -1599,4 +1843,4 @@ var SearchManager = class {
1599
1843
  };
1600
1844
  export { BasicSearchEngine as a, CorrelationEngine as i, PatternRecognitionEngine as n, BasicLogIndexer as o, NLPSearchEngine as r, SearchManager as t };
1601
1845
 
1602
- //# sourceMappingURL=search-CWMVYC-R.mjs.map
1846
+ //# sourceMappingURL=search-DAXKE-P9.mjs.map