logixia 2.0.4 → 2.0.7
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.
- package/README.md +172 -2614
- package/dist/{async-context-B05ArHgM.mjs → async-context-COuvmwsS.mjs} +4 -6
- package/dist/async-context-COuvmwsS.mjs.map +1 -0
- package/dist/{async-context-DTQgi8f7.js → async-context-Dv0bmPC-.js} +4 -6
- package/dist/async-context-Dv0bmPC-.js.map +1 -0
- package/dist/{azure-monitor.transport-DV03Z5P4.d.ts → azure-monitor.transport-Bvf7Xegt.d.ts} +2 -2
- package/dist/{azure-monitor.transport-DV03Z5P4.d.ts.map → azure-monitor.transport-Bvf7Xegt.d.ts.map} +1 -1
- package/dist/{azure-monitor.transport-C7kYyZUW.d.mts → azure-monitor.transport-CbSHOnNX.d.mts} +2 -2
- package/dist/{azure-monitor.transport-C7kYyZUW.d.mts.map → azure-monitor.transport-CbSHOnNX.d.mts.map} +1 -1
- package/dist/{azure-monitor.transport-BPbgjATu.mjs → azure-monitor.transport-Coz5Gesu.mjs} +5 -5
- package/dist/azure-monitor.transport-Coz5Gesu.mjs.map +1 -0
- package/dist/{azure-monitor.transport-CwbOLZHB.js → azure-monitor.transport-D6ryi8rA.js} +5 -5
- package/dist/azure-monitor.transport-D6ryi8rA.js.map +1 -0
- package/dist/azure.d.mts +1 -1
- package/dist/azure.d.ts +1 -1
- package/dist/azure.js +1 -1
- package/dist/azure.mjs +1 -1
- package/dist/{batch-buffer-DT4gdXmf.js → batch-buffer-CFzKnuNZ.js} +3 -3
- package/dist/{batch-buffer-DT4gdXmf.js.map → batch-buffer-CFzKnuNZ.js.map} +1 -1
- package/dist/{batch-buffer-0fgLmIPn.mjs → batch-buffer-CQUWDMYq.mjs} +3 -3
- package/dist/{batch-buffer-0fgLmIPn.mjs.map → batch-buffer-CQUWDMYq.mjs.map} +1 -1
- package/dist/browser.d.mts +5 -5
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.d.ts +5 -5
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +72 -13
- package/dist/browser.js.map +1 -1
- package/dist/browser.mjs +72 -13
- package/dist/browser.mjs.map +1 -1
- package/dist/{builder-D70z6kjj.mjs → builder-C_TgxEOW.mjs} +106 -153
- package/dist/builder-C_TgxEOW.mjs.map +1 -0
- package/dist/{builder-M7NoaugM.js → builder-CzmM_4Ub.js} +110 -180
- package/dist/builder-CzmM_4Ub.js.map +1 -0
- package/dist/cli/index.js +157 -66
- package/dist/cloudwatch.d.mts +1 -1
- package/dist/cloudwatch.d.ts +1 -1
- package/dist/cloudwatch.js +1 -1
- package/dist/cloudwatch.mjs +1 -1
- package/dist/{cloudwatch.transport-Bf7L4I59.d.ts → cloudwatch.transport-CQyT6U91.d.ts} +2 -2
- package/dist/{cloudwatch.transport-Bf7L4I59.d.ts.map → cloudwatch.transport-CQyT6U91.d.ts.map} +1 -1
- package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts → cloudwatch.transport-CjVrI6S4.d.mts} +2 -2
- package/dist/{cloudwatch.transport-Rj4yTpRn.d.mts.map → cloudwatch.transport-CjVrI6S4.d.mts.map} +1 -1
- package/dist/{cloudwatch.transport-BTvYfLs9.mjs → cloudwatch.transport-Cr1aeTGj.mjs} +6 -6
- package/dist/cloudwatch.transport-Cr1aeTGj.mjs.map +1 -0
- package/dist/{cloudwatch.transport-B2wKQFF7.js → cloudwatch.transport-D4G5xYfG.js} +6 -6
- package/dist/cloudwatch.transport-D4G5xYfG.js.map +1 -0
- package/dist/correlation.d.mts +10 -55
- package/dist/correlation.d.mts.map +1 -1
- package/dist/correlation.d.ts +10 -55
- package/dist/correlation.d.ts.map +1 -1
- package/dist/correlation.js +15 -13
- package/dist/correlation.js.map +1 -1
- package/dist/correlation.mjs +15 -13
- package/dist/correlation.mjs.map +1 -1
- package/dist/{entry-fields-RLd1jCoR.js → entry-fields-CVwoQplO.js} +8 -3
- package/dist/entry-fields-CVwoQplO.js.map +1 -0
- package/dist/{entry-fields-CGuvT2R0.mjs → entry-fields-DNTKQxoU.mjs} +8 -3
- package/dist/entry-fields-DNTKQxoU.mjs.map +1 -0
- package/dist/gcp.d.mts +1 -1
- package/dist/gcp.d.ts +1 -1
- package/dist/gcp.js +1 -1
- package/dist/gcp.mjs +1 -1
- package/dist/{gcp.transport-CFQfdAOK.d.ts → gcp.transport-BCIvdFV-.d.ts} +4 -4
- package/dist/{gcp.transport-CFQfdAOK.d.ts.map → gcp.transport-BCIvdFV-.d.ts.map} +1 -1
- package/dist/{gcp.transport-KZe9hCAR.js → gcp.transport-CVuRpchl.js} +20 -16
- package/dist/gcp.transport-CVuRpchl.js.map +1 -0
- package/dist/{gcp.transport-C5D72b1g.d.mts → gcp.transport-D9SdLPwP.d.mts} +4 -4
- package/dist/{gcp.transport-C5D72b1g.d.mts.map → gcp.transport-D9SdLPwP.d.mts.map} +1 -1
- package/dist/{gcp.transport-CGKopAhQ.mjs → gcp.transport-LLK2bw2-.mjs} +20 -16
- package/dist/gcp.transport-LLK2bw2-.mjs.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.mts +32 -0
- package/dist/http-shapes-BnBkJcid.d.mts.map +1 -0
- package/dist/http-shapes-BnBkJcid.d.ts +32 -0
- package/dist/http-shapes-BnBkJcid.d.ts.map +1 -0
- package/dist/{index-xqaJtAZn.d.mts → index-BAkPHp5D.d.mts} +150 -8
- package/dist/index-BAkPHp5D.d.mts.map +1 -0
- package/dist/{index-DwozbmB4.d.ts → index-e7LowmAu.d.ts} +150 -8
- package/dist/index-e7LowmAu.d.ts.map +1 -0
- package/dist/index.d.mts +21 -65
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +21 -65
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -26
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +21 -21
- package/dist/index.mjs.map +1 -1
- package/dist/{internal-log-uCSd1PMc.mjs → internal-log-Cy5nF1ZL.mjs} +2 -81
- package/dist/internal-log-Cy5nF1ZL.mjs.map +1 -0
- package/dist/{internal-log-b0Vp4qrB.js → internal-log-DwqTjhpb.js} +1 -104
- package/dist/internal-log-DwqTjhpb.js.map +1 -0
- package/dist/{logitron-logger-D2B75Oc7.d.ts → logitron-logger-Qh3y9-WH.d.ts} +13 -100
- package/dist/logitron-logger-Qh3y9-WH.d.ts.map +1 -0
- package/dist/{logitron-logger-oEd6wNhf.d.mts → logitron-logger-sYuk8fOb.d.mts} +13 -100
- package/dist/logitron-logger-sYuk8fOb.d.mts.map +1 -0
- package/dist/middleware.d.mts +4 -17
- package/dist/middleware.d.mts.map +1 -1
- package/dist/middleware.d.ts +4 -17
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +9 -39
- package/dist/middleware.js.map +1 -1
- package/dist/middleware.mjs +7 -37
- package/dist/middleware.mjs.map +1 -1
- package/dist/nest.d.mts +24 -8
- package/dist/nest.d.mts.map +1 -1
- package/dist/nest.d.ts +24 -8
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +140 -27
- package/dist/nest.js.map +1 -1
- package/dist/nest.mjs +140 -27
- package/dist/nest.mjs.map +1 -1
- package/dist/{transport.manager-DkcEOlqV.js → otel-ChnVYRLA.js} +214 -23
- package/dist/otel-ChnVYRLA.js.map +1 -0
- package/dist/{transport.manager-eZ_EeC00.mjs → otel-DOuwGPCd.mjs} +173 -24
- package/dist/otel-DOuwGPCd.mjs.map +1 -0
- package/dist/{request-trace-C_fvIDv4.mjs → request-trace-BgNykH9M.mjs} +1 -5
- package/dist/{request-trace-C_fvIDv4.mjs.map → request-trace-BgNykH9M.mjs.map} +1 -1
- package/dist/{request-trace-wTJdKp6-.js → request-trace-ByujsUZk.js} +1 -5
- package/dist/{request-trace-wTJdKp6-.js.map → request-trace-ByujsUZk.js.map} +1 -1
- package/dist/{safe-stringify-BMRl3EX3.mjs → safe-stringify--7gbe95n.mjs} +37 -12
- package/dist/safe-stringify--7gbe95n.mjs.map +1 -0
- package/dist/{safe-stringify-DLz1Kz3o.js → safe-stringify-CN7icp8S.js} +37 -12
- package/dist/safe-stringify-CN7icp8S.js.map +1 -0
- package/dist/{search-DUfWuzFP.js → search-CRjhHxe9.js} +269 -25
- package/dist/search-CRjhHxe9.js.map +1 -0
- package/dist/{search-CazwyX5Z.d.ts → search-D-8HJADE.d.mts} +5 -2
- package/dist/search-D-8HJADE.d.mts.map +1 -0
- package/dist/{search-CWMVYC-R.mjs → search-DAXKE-P9.mjs} +269 -25
- package/dist/search-DAXKE-P9.mjs.map +1 -0
- package/dist/{search-BH33XhuU.d.mts → search-DPwTKPve.d.ts} +5 -2
- package/dist/search-DPwTKPve.d.ts.map +1 -0
- package/dist/search.d.mts +1 -1
- package/dist/search.d.ts +1 -1
- package/dist/search.js +1 -1
- package/dist/search.mjs +1 -1
- package/dist/{secret-config-CBZBs0p1.js → secret-config-BvFl2dC8.js} +7 -7
- package/dist/secret-config-BvFl2dC8.js.map +1 -0
- package/dist/{secret-config-BegMLkYl.mjs → secret-config-ByGq7kJd.mjs} +5 -5
- package/dist/secret-config-ByGq7kJd.mjs.map +1 -0
- package/dist/sensitive-names-CHMowujD.js +276 -0
- package/dist/sensitive-names-CHMowujD.js.map +1 -0
- package/dist/sensitive-names-o__1PUUR.mjs +217 -0
- package/dist/sensitive-names-o__1PUUR.mjs.map +1 -0
- package/dist/{slack.transport-DxHOXlLu.d.mts → slack.transport-BDyENuR0.d.mts} +2 -2
- package/dist/{slack.transport-DxHOXlLu.d.mts.map → slack.transport-BDyENuR0.d.mts.map} +1 -1
- package/dist/{slack.transport-DrirgDNy.d.ts → slack.transport-C6E0l4kw.d.ts} +2 -2
- package/dist/{slack.transport-DrirgDNy.d.ts.map → slack.transport-C6E0l4kw.d.ts.map} +1 -1
- package/dist/{slack.transport-Ce96JBDk.mjs → slack.transport-CSj1j0_X.mjs} +66 -15
- package/dist/slack.transport-CSj1j0_X.mjs.map +1 -0
- package/dist/{slack.transport-Dlx3xvb7.js → slack.transport-zLQ9MGxS.js} +67 -16
- package/dist/slack.transport-zLQ9MGxS.js.map +1 -0
- package/dist/testing.d.mts +11 -4
- package/dist/testing.d.mts.map +1 -1
- package/dist/testing.d.ts +11 -4
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js +38 -3
- package/dist/testing.js.map +1 -1
- package/dist/testing.mjs +38 -3
- package/dist/testing.mjs.map +1 -1
- package/dist/{transport.types-BJVL1QQl.d.ts → transport.types-CzJq4IrF.d.mts} +14 -3
- package/dist/transport.types-CzJq4IrF.d.mts.map +1 -0
- package/dist/{transport.types-BJVL1QQl.d.mts → transport.types-CzJq4IrF.d.ts} +14 -3
- package/dist/transport.types-CzJq4IrF.d.ts.map +1 -0
- package/dist/transports.d.mts +25 -13
- package/dist/transports.d.mts.map +1 -1
- package/dist/transports.d.ts +25 -13
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +15 -15
- package/dist/transports.mjs +6 -6
- package/dist/worker-entry.js +130 -25
- package/dist/worker.d.mts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +1 -1
- package/dist/worker.mjs +1 -1
- package/dist/{worker.transport-BuPwBi3d.d.ts → worker.transport-B9mCQSM1.d.ts} +7 -2
- package/dist/worker.transport-B9mCQSM1.d.ts.map +1 -0
- package/dist/{worker.transport-hJay1wxA.d.mts → worker.transport-Bl8lFRck.d.mts} +7 -2
- package/dist/worker.transport-Bl8lFRck.d.mts.map +1 -0
- package/dist/{worker.transport-DLVA4y2e.mjs → worker.transport-D78xhNhB.mjs} +13 -10
- package/dist/worker.transport-D78xhNhB.mjs.map +1 -0
- package/dist/{worker.transport-C6GNl_r2.js → worker.transport-DQDv1nAJ.js} +13 -10
- package/dist/worker.transport-DQDv1nAJ.js.map +1 -0
- package/package.json +33 -65
- package/dist/async-context-B05ArHgM.mjs.map +0 -1
- package/dist/async-context-DTQgi8f7.js.map +0 -1
- package/dist/azure-monitor.transport-BPbgjATu.mjs.map +0 -1
- package/dist/azure-monitor.transport-CwbOLZHB.js.map +0 -1
- package/dist/builder-D70z6kjj.mjs.map +0 -1
- package/dist/builder-M7NoaugM.js.map +0 -1
- package/dist/cloudwatch.transport-B2wKQFF7.js.map +0 -1
- package/dist/cloudwatch.transport-BTvYfLs9.mjs.map +0 -1
- package/dist/entry-fields-CGuvT2R0.mjs.map +0 -1
- package/dist/entry-fields-RLd1jCoR.js.map +0 -1
- package/dist/gcp.transport-CGKopAhQ.mjs.map +0 -1
- package/dist/gcp.transport-KZe9hCAR.js.map +0 -1
- package/dist/index-DwozbmB4.d.ts.map +0 -1
- package/dist/index-xqaJtAZn.d.mts.map +0 -1
- package/dist/internal-log-b0Vp4qrB.js.map +0 -1
- package/dist/internal-log-uCSd1PMc.mjs.map +0 -1
- package/dist/logitron-logger-D2B75Oc7.d.ts.map +0 -1
- package/dist/logitron-logger-oEd6wNhf.d.mts.map +0 -1
- package/dist/safe-stringify-BMRl3EX3.mjs.map +0 -1
- package/dist/safe-stringify-DLz1Kz3o.js.map +0 -1
- package/dist/search-BH33XhuU.d.mts.map +0 -1
- package/dist/search-CWMVYC-R.mjs.map +0 -1
- package/dist/search-CazwyX5Z.d.ts.map +0 -1
- package/dist/search-DUfWuzFP.js.map +0 -1
- package/dist/secret-config-BegMLkYl.mjs.map +0 -1
- package/dist/secret-config-CBZBs0p1.js.map +0 -1
- package/dist/slack.transport-Ce96JBDk.mjs.map +0 -1
- package/dist/slack.transport-Dlx3xvb7.js.map +0 -1
- package/dist/transport.manager-DkcEOlqV.js.map +0 -1
- package/dist/transport.manager-eZ_EeC00.mjs.map +0 -1
- package/dist/transport.types-BJVL1QQl.d.mts.map +0 -1
- package/dist/transport.types-BJVL1QQl.d.ts.map +0 -1
- package/dist/worker.transport-BuPwBi3d.d.ts.map +0 -1
- package/dist/worker.transport-C6GNl_r2.js.map +0 -1
- package/dist/worker.transport-DLVA4y2e.mjs.map +0 -1
- 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
|
|
270
|
-
const
|
|
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 (
|
|
401
|
-
if (
|
|
402
|
-
if (
|
|
403
|
-
if (levels.length > 0)
|
|
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)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
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 (
|
|
540
|
+
if (range) {
|
|
459
541
|
const logTime = new Date(log.timestamp).getTime();
|
|
460
|
-
if (logTime <
|
|
461
|
-
if (
|
|
462
|
-
|
|
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.
|
|
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 ? require_coerce_utils.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
|
-
|
|
597
|
-
|
|
598
|
-
|
|
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) {
|
|
@@ -1634,4 +1878,4 @@ Object.defineProperty(exports, "SearchManager", {
|
|
|
1634
1878
|
}
|
|
1635
1879
|
});
|
|
1636
1880
|
|
|
1637
|
-
//# sourceMappingURL=search-
|
|
1881
|
+
//# sourceMappingURL=search-CRjhHxe9.js.map
|