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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cloudwatch.transport-BTvYfLs9.mjs","names":["path"],"sources":["../src/transports/aws-credentials.ts","../src/transports/aws-sigv4.ts","../src/transports/cloudwatch.transport.ts"],"sourcesContent":["/**\n * AWS credential resolution without the SDK.\n *\n * Order: explicit config, environment variables, shared credentials file,\n * ECS/container credentials, EC2 instance metadata (IMDSv2).\n * Not supported: SSO, assume-role profiles, credential_process, web identity.\n */\n\nimport * as fs from 'node:fs';\nimport * as os from 'node:os';\nimport * as path from 'node:path';\n\nimport { internalWarn } from '../utils/internal-log';\nimport { type AwsCredentials } from './aws-sigv4';\nimport { httpRequest } from './batch-buffer';\nimport { protectSecrets } from './secret-config';\n\nconst REFRESH_MARGIN_MS = 5 * 60 * 1000;\nconst FAILURE_BACKOFF_MS = 30 * 1000;\nconst METADATA_TIMEOUT_MS = 2000;\n\nexport interface AwsCredentialConfig {\n accessKeyId?: string | undefined;\n secretAccessKey?: string | undefined;\n sessionToken?: string | undefined;\n}\n\n/** Parse the sections of an AWS ini file into `{ section: { key: value } }`. */\nexport function parseIni(text: string): Record<string, Record<string, string>> {\n const out: Record<string, Record<string, string>> = {};\n let section: Record<string, string> | undefined;\n for (const raw of text.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (!line || line.startsWith('#') || line.startsWith(';')) continue;\n const header = /^\\[(.+)\\]$/.exec(line);\n if (header) {\n section = out[header[1]!.trim()] = out[header[1]!.trim()] ?? {};\n continue;\n }\n const eq = line.indexOf('=');\n if (eq > 0 && section) section[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();\n }\n return out;\n}\n\nfunction fromEnv(): AwsCredentials | undefined {\n const accessKeyId = process.env['AWS_ACCESS_KEY_ID'];\n const secretAccessKey = process.env['AWS_SECRET_ACCESS_KEY'];\n if (!accessKeyId || !secretAccessKey) return undefined;\n return { accessKeyId, secretAccessKey, sessionToken: process.env['AWS_SESSION_TOKEN'] };\n}\n\nfunction fromSharedFile(): AwsCredentials | undefined {\n const file =\n process.env['AWS_SHARED_CREDENTIALS_FILE'] ?? path.join(os.homedir(), '.aws', 'credentials');\n const profile = process.env['AWS_PROFILE'] ?? 'default';\n let text: string;\n try {\n text = fs.readFileSync(file, 'utf8');\n } catch {\n return undefined;\n }\n const section = parseIni(text)[profile];\n const accessKeyId = section?.['aws_access_key_id'];\n const secretAccessKey = section?.['aws_secret_access_key'];\n if (!accessKeyId || !secretAccessKey) return undefined;\n return { accessKeyId, secretAccessKey, sessionToken: section?.['aws_session_token'] };\n}\n\ninterface CredentialDocument {\n AccessKeyId?: string;\n SecretAccessKey?: string;\n Token?: string;\n Expiration?: string;\n}\n\nfunction fromDocument(raw: string): AwsCredentials | undefined {\n const doc = JSON.parse(raw) as CredentialDocument;\n if (!doc.AccessKeyId || !doc.SecretAccessKey) return undefined;\n const expiresAt = doc.Expiration ? Date.parse(doc.Expiration) : Number.NaN;\n return {\n accessKeyId: doc.AccessKeyId,\n secretAccessKey: doc.SecretAccessKey,\n sessionToken: doc.Token,\n expiresAt: Number.isNaN(expiresAt) ? undefined : expiresAt,\n };\n}\n\nconst CONTAINER_HOSTS = new Set([\n // eslint-disable-next-line sonarjs/no-hardcoded-ip -- fixed ECS credentials endpoint\n '169.254.170.2',\n // eslint-disable-next-line sonarjs/no-hardcoded-ip -- fixed EKS pod identity endpoint\n '169.254.170.23',\n '[fd00:ec2::23]',\n 'localhost',\n '[::1]',\n]);\n\n/** Same rule as the AWS SDKs: never send the container token to an arbitrary http host. */\nfunction isAllowedContainerHost(url: URL): boolean {\n if (url.protocol === 'https:') return true;\n if (url.protocol !== 'http:') return false;\n return CONTAINER_HOSTS.has(url.hostname) || /^127(?:\\.\\d{1,3}){3}$/.test(url.hostname);\n}\n\nasync function fromContainer(): Promise<AwsCredentials | undefined> {\n const relative = process.env['AWS_CONTAINER_CREDENTIALS_RELATIVE_URI'];\n const full = process.env['AWS_CONTAINER_CREDENTIALS_FULL_URI'];\n if (!relative && !full) return undefined;\n const url = new URL(relative ? `http://169.254.170.2${relative}` : (full as string));\n if (!relative && !isAllowedContainerHost(url)) {\n internalWarn(\n `ignoring AWS_CONTAINER_CREDENTIALS_FULL_URI: ${url.host} is not https or a loopback / ECS / EKS address`\n );\n return undefined;\n }\n const headers: Record<string, string> = {};\n const tokenFile = process.env['AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE'];\n const token = tokenFile\n ? fs.readFileSync(tokenFile, 'utf8').trim()\n : process.env['AWS_CONTAINER_AUTHORIZATION_TOKEN'];\n if (token) headers['Authorization'] = token;\n const res = await httpRequest({\n url,\n method: 'GET',\n headers,\n timeoutMs: METADATA_TIMEOUT_MS,\n label: 'AWS container credentials',\n });\n return fromDocument(res.body);\n}\n\nasync function fromInstanceMetadata(): Promise<AwsCredentials | undefined> {\n if (process.env['AWS_EC2_METADATA_DISABLED'] === 'true') return undefined;\n const base = process.env['AWS_EC2_METADATA_SERVICE_ENDPOINT'] ?? 'http://169.254.169.254';\n const get = (p: string, method: string, headers: Record<string, string>) =>\n httpRequest({\n url: new URL(p, base),\n method,\n headers,\n timeoutMs: METADATA_TIMEOUT_MS,\n label: 'EC2 instance metadata',\n });\n const session = await get('/latest/api/token', 'PUT', {\n 'X-aws-ec2-metadata-token-ttl-seconds': '21600',\n });\n const auth = { 'X-aws-ec2-metadata-token': session.body.trim() };\n const roles = await get('/latest/meta-data/iam/security-credentials/', 'GET', auth);\n const role = roles.body.split('\\n')[0]?.trim();\n if (!role) return undefined;\n const creds = await get(\n `/latest/meta-data/iam/security-credentials/${encodeURIComponent(role)}`,\n 'GET',\n auth\n );\n return fromDocument(creds.body);\n}\n\nexport class AwsCredentialProvider {\n private cached: AwsCredentials | undefined;\n private failedAt = 0;\n private readonly explicit: AwsCredentials | undefined;\n\n constructor(config: AwsCredentialConfig) {\n protectSecrets(this, ['cached', 'explicit']);\n if (config.accessKeyId && config.secretAccessKey) {\n this.explicit = {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n sessionToken: config.sessionToken,\n };\n }\n }\n\n /** Throws when no source yields credentials, so the caller keeps its buffer. */\n async get(): Promise<AwsCredentials> {\n if (this.explicit) return this.explicit;\n const env = fromEnv();\n if (env) return env;\n if (this.cached && !this.isExpiring(this.cached)) return this.cached;\n if (Date.now() - this.failedAt < FAILURE_BACKOFF_MS) {\n throw new Error('no AWS credentials found (retrying shortly)');\n }\n\n let found = fromSharedFile();\n for (const source of [fromContainer, fromInstanceMetadata]) {\n if (found) break;\n try {\n found = await source();\n } catch {\n /* source not available here; try the next */\n }\n }\n if (!found) {\n this.failedAt = Date.now();\n throw new Error(\n 'no AWS credentials found: set AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY, a shared credentials file, container credentials, or run on EC2 with an instance role'\n );\n }\n this.cached = found;\n return found;\n }\n\n /** Secret values this provider may hold, for scrubbing error text. */\n secretValues(): (string | undefined)[] {\n const env = process.env;\n return [\n this.explicit?.secretAccessKey,\n this.explicit?.sessionToken,\n this.cached?.secretAccessKey,\n this.cached?.sessionToken,\n env['AWS_SECRET_ACCESS_KEY'],\n env['AWS_SESSION_TOKEN'],\n ];\n }\n\n invalidate(): void {\n this.cached = undefined;\n this.failedAt = 0;\n }\n\n private isExpiring(c: AwsCredentials): boolean {\n return c.expiresAt !== undefined && c.expiresAt - Date.now() < REFRESH_MARGIN_MS;\n }\n}\n","/**\n * AWS Signature Version 4 request signing, dependency-free.\n */\n\nimport * as crypto from 'node:crypto';\n\nexport interface AwsCredentials {\n accessKeyId: string;\n secretAccessKey: string;\n sessionToken?: string | undefined;\n /** Epoch ms after which the credentials are no longer valid. */\n expiresAt?: number | undefined;\n}\n\nexport interface SignV4Options {\n method: string;\n path: string;\n query?: string;\n /** Must include `host`. Names are lowercased before signing. */\n headers: Record<string, string>;\n body: string;\n region: string;\n service: string;\n credentials: AwsCredentials;\n date?: Date;\n}\n\nconst sha256Hex = (data: string): string => crypto.createHash('sha256').update(data).digest('hex');\n\nconst hmac = (key: Buffer | string, msg: string): Buffer =>\n crypto.createHmac('sha256', key).update(msg).digest();\n\n/** Returns the request headers (lowercase names) with `x-amz-date` and `authorization` added. */\nexport function signV4(opts: SignV4Options): Record<string, string> {\n const {\n method,\n path,\n query = '',\n body,\n region,\n service,\n credentials,\n headers: input,\n date,\n } = opts;\n const amzDate = (date ?? new Date()).toISOString().replace(/[:-]|\\.\\d{3}/g, '');\n const dateStamp = amzDate.slice(0, 8);\n\n const headers: Record<string, string> = {};\n for (const [k, v] of Object.entries(input)) headers[k.toLowerCase()] = v;\n headers['x-amz-date'] = amzDate;\n if (credentials.sessionToken) headers['x-amz-security-token'] = credentials.sessionToken;\n\n const names = Object.keys(headers).sort();\n const canonicalHeaders = names\n .map((n) => `${n}:${headers[n]!.trim().replace(/\\s+/g, ' ')}\\n`)\n .join('');\n const signedHeaders = names.join(';');\n\n const canonicalRequest = [\n method,\n path,\n query,\n canonicalHeaders,\n signedHeaders,\n sha256Hex(body),\n ].join('\\n');\n const scope = `${dateStamp}/${region}/${service}/aws4_request`;\n const stringToSign = ['AWS4-HMAC-SHA256', amzDate, scope, sha256Hex(canonicalRequest)].join('\\n');\n\n const signingKey = hmac(\n hmac(hmac(hmac(`AWS4${credentials.secretAccessKey}`, dateStamp), region), service),\n 'aws4_request'\n );\n const signature = crypto.createHmac('sha256', signingKey).update(stringToSign).digest('hex');\n\n headers['authorization'] =\n `AWS4-HMAC-SHA256 Credential=${credentials.accessKeyId}/${scope}, ` +\n `SignedHeaders=${signedHeaders}, Signature=${signature}`;\n return headers;\n}\n","/**\n * logixia — AWS CloudWatch Logs transport\n *\n * Sends log entries to AWS CloudWatch Logs via the PutLogEvents API.\n * Supports EMF (Embedded Metric Format) for automatic metric extraction.\n *\n * Auth, in order: explicit config, environment variables, the shared\n * credentials file (AWS_PROFILE, AWS_SHARED_CREDENTIALS_FILE), ECS container\n * credentials, then EC2 instance metadata (IMDSv2). SSO, assume-role profiles\n * and credential_process are not supported. No SDK dependency — raw HTTPS with\n * AWS Signature Version 4.\n *\n * The log group and stream are created on first use if they do not exist.\n *\n * @example\n * ```ts\n * import { CloudWatchTransport } from 'logixia';\n *\n * const logger = createLogger({\n * transports: {\n * cloudwatch: new CloudWatchTransport({\n * region: 'us-east-1',\n * logGroupName: '/myapp/production',\n * logStreamName: `api-${process.env.HOSTNAME}`,\n * batchSize: 100,\n * flushIntervalMs: 5000,\n * }),\n * },\n * });\n * ```\n */\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalWarn } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport { AwsCredentialProvider } from './aws-credentials';\nimport { signV4 } from './aws-sigv4';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n HttpError,\n httpRequest,\n isPermanentHttpError,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets, urlSecrets } from './secret-config';\n\nexport interface CloudWatchTransportConfig {\n /** AWS region, e.g. `'us-east-1'`. Falls back to `AWS_REGION` env var. */\n region?: string;\n /** CloudWatch Logs group name. Created automatically if it does not exist. */\n logGroupName: string;\n /** CloudWatch Logs stream name. Defaults to hostname + process PID. */\n logStreamName?: string;\n /** Override the Logs endpoint, e.g. for LocalStack. Default: `https://logs.<region>.amazonaws.com`. */\n endpoint?: string;\n /** AWS access key ID. Falls back to the credential chain described above. */\n accessKeyId?: string;\n /** AWS secret access key. Used together with `accessKeyId`. */\n secretAccessKey?: string;\n /** AWS session token for temporary credentials. Used together with `accessKeyId`. */\n sessionToken?: string;\n /**\n * Number of log events to batch before flushing.\n * CloudWatch allows max 10,000 events per PutLogEvents call; larger values are capped.\n * @default 100\n */\n batchSize?: number;\n /**\n * Max ms between flushes even if batchSize is not reached.\n * @default 5000\n */\n flushIntervalMs?: number;\n /**\n * Enable EMF (Embedded Metric Format) — wraps log entries as CloudWatch\n * metric namespaces so numeric fields become CloudWatch Metrics automatically.\n * @default false\n */\n emf?: boolean;\n /** CloudWatch Metrics namespace used by EMF. @default 'Logixia' */\n emfNamespace?: string;\n /**\n * Payload fields published as EMF metrics. When set, only these numeric\n * fields become metrics; when unset every numeric payload field does (up to\n * the EMF limit of 100 per entry).\n */\n emfMetrics?: string[];\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered events; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n /** Minimum log level to forward. */\n level?: string;\n}\n\nconst MAX_EVENTS_PER_PUT = 10_000;\nconst EMF_MAX_METRICS = 100;\n\n/** Error types worth retrying even though CloudWatch reports them as HTTP 400. */\nconst RETRYABLE_TYPES = new Set([\n 'ThrottlingException',\n 'ThrottledException',\n 'LimitExceededException',\n 'ServiceUnavailableException',\n 'ExpiredTokenException',\n 'ResourceNotFoundException',\n]);\n\nfunction awsErrorType(err: unknown): string | undefined {\n if (!(err instanceof HttpError)) return undefined;\n try {\n const type = (JSON.parse(err.body) as { __type?: string }).__type;\n return type?.split('#').pop();\n } catch {\n return undefined;\n }\n}\n\ninterface CwLogEvent {\n timestamp: number;\n message: string;\n}\n\n/**\n * AWS CloudWatch Logs transport with EMF support and batched PutLogEvents calls.\n */\nexport class CloudWatchTransport implements IAsyncTransport {\n public readonly name = 'cloudwatch';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<CwLogEvent>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private readonly credentials: AwsCredentialProvider;\n private readonly endpoint: URL;\n private streamReady = false;\n\n private readonly region: string;\n private readonly logGroupName: string;\n private readonly logStreamName: string;\n private readonly emf: boolean;\n private readonly emfNamespace: string;\n private readonly emfMetrics: ReadonlySet<string> | undefined;\n\n constructor(config: CloudWatchTransportConfig) {\n this.region =\n config.region ??\n process.env['AWS_REGION'] ??\n process.env['AWS_DEFAULT_REGION'] ??\n 'us-east-1';\n this.logGroupName = config.logGroupName;\n this.logStreamName =\n config.logStreamName ?? `${process.env['HOSTNAME'] ?? 'node'}-${process.pid}`;\n this.credentials = new AwsCredentialProvider(config);\n this.endpoint = new URL(config.endpoint ?? `https://logs.${this.region}.amazonaws.com`);\n this.batchSize = Math.min(config.batchSize ?? 100, MAX_EVENTS_PER_PUT);\n this.emfNamespace = config.emfNamespace ?? 'Logixia';\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.emf = config.emf ?? false;\n this.emfMetrics = config.emfMetrics ? new Set(config.emfMetrics) : undefined;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<CwLogEvent>({\n name: 'CloudWatchTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (events) => this.putLogEvents(events),\n secrets: () => [...this.credentials.secretValues(), ...urlSecrets(this.endpoint)],\n shouldRetry: (err) =>\n !isPermanentHttpError(err) || RETRYABLE_TYPES.has(awsErrorType(err) ?? ''),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n protectSecrets(this, ['credentials', 'endpoint']);\n }\n\n write(entry: TransportLogEntry): void {\n const timestamp = entry.timestamp ? new Date(entry.timestamp).getTime() : Date.now();\n const message = this.emf ? this.toEmf(entry) : stringifyForLog(entry);\n this.buffer.push({ timestamp, message });\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining events and stop the interval timer on shutdown. Without this\n * the manager's close() skips the transport (close was undefined) and any\n * buffered events were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private toEmf(entry: TransportLogEntry): string {\n const { level, message, data: payload, timestamp } = entry;\n const fields = mergeCoreFields({ _aws: undefined, level, message }, payload);\n const metricNames: string[] = [];\n for (const [k, v] of Object.entries(fields)) {\n if (k === '_aws' || k === 'level' || k === 'message' || typeof v !== 'number') continue;\n if (this.emfMetrics && !this.emfMetrics.has(k)) continue;\n if (metricNames.length < EMF_MAX_METRICS) metricNames.push(k);\n }\n fields['_aws'] = {\n Timestamp: timestamp ? new Date(timestamp).getTime() : Date.now(),\n CloudWatchMetrics:\n metricNames.length > 0\n ? [\n {\n Namespace: this.emfNamespace,\n Dimensions: [['level']],\n Metrics: metricNames.map((n) => ({ Name: n, Unit: 'None' })),\n },\n ]\n : [],\n };\n return stringifyForLog(fields);\n }\n\n private async putLogEvents(events: CwLogEvent[]): Promise<void> {\n await this.ensureStream();\n const logEvents = [...events].sort((a, b) => a.timestamp - b.timestamp);\n try {\n await this.call('PutLogEvents', {\n logGroupName: this.logGroupName,\n logStreamName: this.logStreamName,\n logEvents,\n });\n } catch (err) {\n const type = awsErrorType(err);\n if (type === 'DataAlreadyAcceptedException') return;\n if (type === 'ResourceNotFoundException') this.streamReady = false;\n if (type === 'ExpiredTokenException') this.credentials.invalidate();\n throw err;\n }\n }\n\n private async ensureStream(): Promise<void> {\n if (this.streamReady) return;\n try {\n await this.call('CreateLogGroup', { logGroupName: this.logGroupName });\n } catch (err) {\n if (awsErrorType(err) === 'ExpiredTokenException') this.credentials.invalidate();\n if (!(err instanceof HttpError)) throw err;\n if (awsErrorType(err) !== 'ResourceAlreadyExistsException') {\n internalWarn(`CloudWatchTransport: CreateLogGroup failed, continuing (${err.message})`);\n }\n }\n try {\n await this.call('CreateLogStream', {\n logGroupName: this.logGroupName,\n logStreamName: this.logStreamName,\n });\n } catch (err) {\n if (awsErrorType(err) !== 'ResourceAlreadyExistsException') throw err;\n }\n this.streamReady = true;\n }\n\n private async call(action: string, payload: Record<string, unknown>): Promise<void> {\n const credentials = await this.credentials.get();\n const body = stringifyForLog(payload);\n const { host } = this.endpoint;\n const headers = signV4({\n method: 'POST',\n path: '/',\n headers: {\n host,\n 'content-type': 'application/x-amz-json-1.1',\n 'x-amz-target': `Logs_20140328.${action}`,\n },\n body,\n region: this.region,\n service: 'logs',\n credentials,\n });\n await httpRequest({\n url: this.endpoint,\n headers,\n body,\n timeoutMs: this.requestTimeoutMs,\n label: `CloudWatch ${action}`,\n secrets: () => [\n ...this.credentials.secretValues(),\n headers['authorization'],\n headers['x-amz-security-token'],\n ...urlSecrets(this.endpoint),\n ],\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAiBA,MAAM,oBAAoB;AAC1B,MAAM,qBAAqB;AAC3B,MAAM,sBAAsB;;AAS5B,SAAgB,SAAS,MAAsD;CAC7E,MAAM,MAA8C,CAAC;CACrD,IAAI;CACJ,KAAK,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG;EACrC,MAAM,OAAO,IAAI,KAAK;EACtB,IAAI,CAAC,QAAQ,KAAK,WAAW,GAAG,KAAK,KAAK,WAAW,GAAG,GAAG;EAC3D,MAAM,SAAS,aAAa,KAAK,IAAI;EACrC,IAAI,QAAQ;GACV,UAAU,IAAI,OAAO,EAAE,CAAE,KAAK,KAAK,IAAI,OAAO,EAAE,CAAE,KAAK,MAAM,CAAC;GAC9D;EACF;EACA,MAAM,KAAK,KAAK,QAAQ,GAAG;EAC3B,IAAI,KAAK,KAAK,SAAS,QAAQ,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,KAAK,KAAK,MAAM,KAAK,CAAC,CAAC,CAAC,KAAK;CACrF;CACA,OAAO;AACT;AAEA,SAAS,UAAsC;CAC7C,MAAM,cAAc,QAAQ,IAAI;CAChC,MAAM,kBAAkB,QAAQ,IAAI;CACpC,IAAI,CAAC,eAAe,CAAC,iBAAiB,OAAO,KAAA;CAC7C,OAAO;EAAE;EAAa;EAAiB,cAAc,QAAQ,IAAI;CAAqB;AACxF;AAEA,SAAS,iBAA6C;CACpD,MAAM,OACJ,QAAQ,IAAI,kCAAkCA,OAAK,KAAK,GAAG,QAAQ,GAAG,QAAQ,aAAa;CAC7F,MAAM,UAAU,QAAQ,IAAI,kBAAkB;CAC9C,IAAI;CACJ,IAAI;EACF,OAAO,GAAG,aAAa,MAAM,MAAM;CACrC,QAAQ;EACN;CACF;CACA,MAAM,UAAU,SAAS,IAAI,CAAC,CAAC;CAC/B,MAAM,cAAA,YAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAc,QAAU;CAC9B,MAAM,kBAAA,YAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAkB,QAAU;CAClC,IAAI,CAAC,eAAe,CAAC,iBAAiB,OAAO,KAAA;CAC7C,OAAO;EAAE;EAAa;EAAiB,cAAA,YAAA,QAAA,YAAA,KAAA,IAAA,KAAA,IAAc,QAAU;CAAqB;AACtF;AASA,SAAS,aAAa,KAAyC;CAC7D,MAAM,MAAM,KAAK,MAAM,GAAG;CAC1B,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,iBAAiB,OAAO,KAAA;CACrD,MAAM,YAAY,IAAI,aAAa,KAAK,MAAM,IAAI,UAAU,IAAI;CAChE,OAAO;EACL,aAAa,IAAI;EACjB,iBAAiB,IAAI;EACrB,cAAc,IAAI;EAClB,WAAW,OAAO,MAAM,SAAS,IAAI,KAAA,IAAY;CACnD;AACF;AAEA,MAAM,kCAAkB,IAAI,IAAI;CAE9B;CAEA;CACA;CACA;CACA;AACF,CAAC;;AAGD,SAAS,uBAAuB,KAAmB;CACjD,IAAI,IAAI,aAAa,UAAU,OAAO;CACtC,IAAI,IAAI,aAAa,SAAS,OAAO;CACrC,OAAO,gBAAgB,IAAI,IAAI,QAAQ,KAAK,wBAAwB,KAAK,IAAI,QAAQ;AACvF;AAEA,eAAe,gBAAqD;CAClE,MAAM,WAAW,QAAQ,IAAI;CAC7B,MAAM,OAAO,QAAQ,IAAI;CACzB,IAAI,CAAC,YAAY,CAAC,MAAM,OAAO,KAAA;CAC/B,MAAM,MAAM,IAAI,IAAI,WAAW,uBAAuB,aAAc,IAAe;CACnF,IAAI,CAAC,YAAY,CAAC,uBAAuB,GAAG,GAAG;EAC7C,aACE,gDAAgD,IAAI,KAAK,gDAC3D;EACA;CACF;CACA,MAAM,UAAkC,CAAC;CACzC,MAAM,YAAY,QAAQ,IAAI;CAC9B,MAAM,QAAQ,YACV,GAAG,aAAa,WAAW,MAAM,CAAC,CAAC,KAAK,IACxC,QAAQ,IAAI;CAChB,IAAI,OAAO,QAAQ,mBAAmB;CAQtC,OAAO,cAAa,MAPF,YAAY;EAC5B;EACA,QAAQ;EACR;EACA,WAAW;EACX,OAAO;CACT,CAAC,EAAA,CACuB,IAAI;AAC9B;AAEA,eAAe,uBAA4D;;CACzE,IAAI,QAAQ,IAAI,iCAAiC,QAAQ,OAAO,KAAA;CAChE,MAAM,OAAO,QAAQ,IAAI,wCAAwC;CACjE,MAAM,OAAO,GAAW,QAAgB,YACtC,YAAY;EACV,KAAK,IAAI,IAAI,GAAG,IAAI;EACpB;EACA;EACA,WAAW;EACX,OAAO;CACT,CAAC;CAIH,MAAM,OAAO,EAAE,6BAA4B,MAHrB,IAAI,qBAAqB,OAAO,EACpD,wCAAwC,QAC1C,CAAC,EAAA,CACkD,KAAK,KAAK,EAAE;CAE/D,MAAM,QAAA,sBAAO,MADO,IAAI,+CAA+C,OAAO,IAAI,EAAA,CAC/D,KAAK,MAAM,IAAI,CAAC,CAAC,QAAA,QAAA,uBAAA,KAAA,IAAA,KAAA,IAAA,mBAAI,KAAK;CAC7C,IAAI,CAAC,MAAM,OAAO,KAAA;CAMlB,OAAO,cAAa,MALA,IAClB,8CAA8C,mBAAmB,IAAI,KACrE,OACA,IACF,EAAA,CAC0B,IAAI;AAChC;AAEA,IAAa,wBAAb,MAAmC;CAKjC,YAAY,QAA6B;EAHtB,KAAA,WAAA;EAIjB,eAAe,MAAM,CAAC,UAAU,UAAU,CAAC;EAC3C,IAAI,OAAO,eAAe,OAAO,iBAC/B,KAAK,WAAW;GACd,aAAa,OAAO;GACpB,iBAAiB,OAAO;GACxB,cAAc,OAAO;EACvB;CAEJ;;CAGA,MAAM,MAA+B;EACnC,IAAI,KAAK,UAAU,OAAO,KAAK;EAC/B,MAAM,MAAM,QAAQ;EACpB,IAAI,KAAK,OAAO;EAChB,IAAI,KAAK,UAAU,CAAC,KAAK,WAAW,KAAK,MAAM,GAAG,OAAO,KAAK;EAC9D,IAAI,KAAK,IAAI,IAAI,KAAK,WAAW,oBAC/B,MAAM,IAAI,MAAM,6CAA6C;EAG/D,IAAI,QAAQ,eAAe;EAC3B,KAAK,MAAM,UAAU,CAAC,eAAe,oBAAoB,GAAG;GAC1D,IAAI,OAAO;GACX,IAAI;IACF,QAAQ,MAAM,OAAO;GACvB,QAAQ,CAER;EACF;EACA,IAAI,CAAC,OAAO;GACV,KAAK,WAAW,KAAK,IAAI;GACzB,MAAM,IAAI,MACR,8JACF;EACF;EACA,KAAK,SAAS;EACd,OAAO;CACT;;CAGA,eAAuC;;EACrC,MAAM,MAAM,QAAQ;EACpB,OAAO;IACL,iBAAA,KAAK,cAAA,QAAA,mBAAA,KAAA,IAAA,KAAA,IAAA,eAAU;IACf,kBAAA,KAAK,cAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAU;IACf,eAAA,KAAK,YAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAQ;IACb,gBAAA,KAAK,YAAA,QAAA,kBAAA,KAAA,IAAA,KAAA,IAAA,cAAQ;GACb,IAAI;GACJ,IAAI;EACN;CACF;CAEA,aAAmB;EACjB,KAAK,SAAS,KAAA;EACd,KAAK,WAAW;CAClB;CAEA,WAAmB,GAA4B;EAC7C,OAAO,EAAE,cAAc,KAAA,KAAa,EAAE,YAAY,KAAK,IAAI,IAAI;CACjE;AACF;;;;;ACrMA,MAAM,aAAa,SAAyB,OAAO,WAAW,QAAQ,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,KAAK;AAEjG,MAAM,QAAQ,KAAsB,QAClC,OAAO,WAAW,UAAU,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO;;AAGtD,SAAgB,OAAO,MAA6C;CAClE,MAAM,EACJ,QACA,MACA,QAAQ,IACR,MACA,QACA,SACA,aACA,SAAS,OACT,SACE;CACJ,MAAM,WAAW,wBAAQ,IAAI,KAAK,EAAA,CAAG,YAAY,CAAC,CAAC,QAAQ,iBAAiB,EAAE;CAC9E,MAAM,YAAY,QAAQ,MAAM,GAAG,CAAC;CAEpC,MAAM,UAAkC,CAAC;CACzC,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,KAAK,GAAG,QAAQ,EAAE,YAAY,KAAK;CACvE,QAAQ,gBAAgB;CACxB,IAAI,YAAY,cAAc,QAAQ,0BAA0B,YAAY;CAE5E,MAAM,QAAQ,OAAO,KAAK,OAAO,CAAC,CAAC,KAAK;CACxC,MAAM,mBAAmB,MACtB,KAAK,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAE,KAAK,CAAC,CAAC,QAAQ,QAAQ,GAAG,EAAE,GAAG,CAAC,CAC/D,KAAK,EAAE;CACV,MAAM,gBAAgB,MAAM,KAAK,GAAG;CAEpC,MAAM,mBAAmB;EACvB;EACA;EACA;EACA;EACA;EACA,UAAU,IAAI;CAChB,CAAC,CAAC,KAAK,IAAI;CACX,MAAM,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ;CAChD,MAAM,eAAe;EAAC;EAAoB;EAAS;EAAO,UAAU,gBAAgB;CAAC,CAAC,CAAC,KAAK,IAAI;CAEhG,MAAM,aAAa,KACjB,KAAK,KAAK,KAAK,OAAO,YAAY,mBAAmB,SAAS,GAAG,MAAM,GAAG,OAAO,GACjF,cACF;CACA,MAAM,YAAY,OAAO,WAAW,UAAU,UAAU,CAAC,CAAC,OAAO,YAAY,CAAC,CAAC,OAAO,KAAK;CAE3F,QAAQ,mBACN,+BAA+B,YAAY,YAAY,GAAG,MAAM,kBAC/C,cAAc,cAAc;CAC/C,OAAO;AACT;;ACgBA,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;;AAGxB,MAAM,kCAAkB,IAAI,IAAI;CAC9B;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAED,SAAS,aAAa,KAAkC;CACtD,IAAI,EAAE,eAAe,YAAY,OAAO,KAAA;CACxC,IAAI;EACF,MAAM,OAAQ,KAAK,MAAM,IAAI,IAAI,CAAC,CAAyB;EAC3D,OAAA,SAAA,QAAA,SAAA,KAAA,IAAA,KAAA,IAAO,KAAM,MAAM,GAAG,CAAC,CAAC,IAAI;CAC9B,QAAQ;EACN;CACF;AACF;;;;AAUA,IAAa,sBAAb,MAA4D;CAoB1D,YAAY,QAAmC;EAnBxB,KAAA,OAAA;EAOqB,KAAA,aAAA;EAGtB,KAAA,cAAA;EAUpB,KAAK,SACH,OAAO,UACP,QAAQ,IAAI,iBACZ,QAAQ,IAAI,yBACZ;EACF,KAAK,eAAe,OAAO;EAC3B,KAAK,gBACH,OAAO,iBAAiB,GAAG,QAAQ,IAAI,eAAe,OAAO,GAAG,QAAQ;EAC1E,KAAK,cAAc,IAAI,sBAAsB,MAAM;EACnD,KAAK,WAAW,IAAI,IAAI,OAAO,YAAY,gBAAgB,KAAK,OAAO,eAAe;EACtF,KAAK,YAAY,KAAK,IAAI,OAAO,aAAa,KAAK,kBAAkB;EACrE,KAAK,eAAe,OAAO,gBAAgB;EAC3C,KAAK,gBAAgB,OAAO,mBAAmB;EAC/C,KAAK,MAAM,OAAO,OAAO;EACzB,KAAK,aAAa,OAAO,aAAa,IAAI,IAAI,OAAO,UAAU,IAAI,KAAA;EACnE,KAAK,QAAQ,OAAO;EACpB,KAAK,mBAAmB,OAAO,oBAAA;EAC/B,KAAK,SAAS,IAAI,YAAwB;GACxC,MAAM;GACN,WAAW,KAAK;GAChB,eAAe,OAAO,iBAAA;GACtB,OAAO,WAAW,KAAK,aAAa,MAAM;GAC1C,eAAe,CAAC,GAAG,KAAK,YAAY,aAAa,GAAG,GAAG,WAAW,KAAK,QAAQ,CAAC;GAChF,cAAc,QACZ,CAAC,qBAAqB,GAAG,KAAK,gBAAgB,IAAI,aAAa,GAAG,KAAK,EAAE;EAC7E,CAAC;EAED,KAAK,aAAa,kBAAkB;GAClC,KAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;EAC7B,GAAG,KAAK,aAAa;EACrB,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM;EACjD,eAAe,MAAM,CAAC,eAAe,UAAU,CAAC;CAClD;CAEA,MAAM,OAAgC;EACpC,MAAM,YAAY,MAAM,YAAY,IAAI,KAAK,MAAM,SAAS,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI;EACnF,MAAM,UAAU,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI,gBAAgB,KAAK;EACpE,KAAK,OAAO,KAAK;GAAE;GAAW;EAAQ,CAAC;EACvC,KAAK,OAAO,YAAY;CAC1B;CAEA,QAAuB;EACrB,OAAO,KAAK,OAAO,MAAM;CAC3B;;;;;;CAOA,MAAM,QAAuB;EAC3B,IAAI,KAAK,YAAY;GACnB,cAAc,KAAK,UAAU;GAC7B,KAAK,aAAa;EACpB;EACA,MAAM,KAAK,OAAO,MAAM;CAC1B;CAEA,MAAc,OAAkC;EAC9C,MAAM,EAAE,OAAO,SAAS,MAAM,SAAS,cAAc;EACrD,MAAM,SAAS,gBAAgB;GAAE,MAAM,KAAA;GAAW;GAAO;EAAQ,GAAG,OAAO;EAC3E,MAAM,cAAwB,CAAC;EAC/B,KAAK,MAAM,CAAC,GAAG,MAAM,OAAO,QAAQ,MAAM,GAAG;GAC3C,IAAI,MAAM,UAAU,MAAM,WAAW,MAAM,aAAa,OAAO,MAAM,UAAU;GAC/E,IAAI,KAAK,cAAc,CAAC,KAAK,WAAW,IAAI,CAAC,GAAG;GAChD,IAAI,YAAY,SAAS,iBAAiB,YAAY,KAAK,CAAC;EAC9D;EACA,OAAO,UAAU;GACf,WAAW,YAAY,IAAI,KAAK,SAAS,CAAC,CAAC,QAAQ,IAAI,KAAK,IAAI;GAChE,mBACE,YAAY,SAAS,IACjB,CACE;IACE,WAAW,KAAK;IAChB,YAAY,CAAC,CAAC,OAAO,CAAC;IACtB,SAAS,YAAY,KAAK,OAAO;KAAE,MAAM;KAAG,MAAM;IAAO,EAAE;GAC7D,CACF,IACA,CAAC;EACT;EACA,OAAO,gBAAgB,MAAM;CAC/B;CAEA,MAAc,aAAa,QAAqC;EAC9D,MAAM,KAAK,aAAa;EACxB,MAAM,YAAY,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;EACtE,IAAI;GACF,MAAM,KAAK,KAAK,gBAAgB;IAC9B,cAAc,KAAK;IACnB,eAAe,KAAK;IACpB;GACF,CAAC;EACH,SAAS,KAAK;GACZ,MAAM,OAAO,aAAa,GAAG;GAC7B,IAAI,SAAS,gCAAgC;GAC7C,IAAI,SAAS,6BAA6B,KAAK,cAAc;GAC7D,IAAI,SAAS,yBAAyB,KAAK,YAAY,WAAW;GAClE,MAAM;EACR;CACF;CAEA,MAAc,eAA8B;EAC1C,IAAI,KAAK,aAAa;EACtB,IAAI;GACF,MAAM,KAAK,KAAK,kBAAkB,EAAE,cAAc,KAAK,aAAa,CAAC;EACvE,SAAS,KAAK;GACZ,IAAI,aAAa,GAAG,MAAM,yBAAyB,KAAK,YAAY,WAAW;GAC/E,IAAI,EAAE,eAAe,YAAY,MAAM;GACvC,IAAI,aAAa,GAAG,MAAM,kCACxB,aAAa,2DAA2D,IAAI,QAAQ,EAAE;EAE1F;EACA,IAAI;GACF,MAAM,KAAK,KAAK,mBAAmB;IACjC,cAAc,KAAK;IACnB,eAAe,KAAK;GACtB,CAAC;EACH,SAAS,KAAK;GACZ,IAAI,aAAa,GAAG,MAAM,kCAAkC,MAAM;EACpE;EACA,KAAK,cAAc;CACrB;CAEA,MAAc,KAAK,QAAgB,SAAiD;EAClF,MAAM,cAAc,MAAM,KAAK,YAAY,IAAI;EAC/C,MAAM,OAAO,gBAAgB,OAAO;EACpC,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,UAAU,OAAO;GACrB,QAAQ;GACR,MAAM;GACN,SAAS;IACP;IACA,gBAAgB;IAChB,gBAAgB,iBAAiB;GACnC;GACA;GACA,QAAQ,KAAK;GACb,SAAS;GACT;EACF,CAAC;EACD,MAAM,YAAY;GAChB,KAAK,KAAK;GACV;GACA;GACA,WAAW,KAAK;GAChB,OAAO,cAAc;GACrB,eAAe;IACb,GAAG,KAAK,YAAY,aAAa;IACjC,QAAQ;IACR,QAAQ;IACR,GAAG,WAAW,KAAK,QAAQ;GAC7B;EACF,CAAC;CACH;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entry-fields-CGuvT2R0.mjs","names":[],"sources":["../src/transports/entry-fields.ts"],"sourcesContent":["const PAYLOAD_PREFIX = 'data_';\nconst UNSAFE_KEYS = new Set(['__proto__']);\n\n/**\n * Copies `core` and then the user payload into one object. The core fields stay\n * authoritative: a payload key that matches a core key (even one whose value is\n * undefined) or a reserved name is kept under a `data_` prefix instead. The\n * prefix is repeated until the name is free of core keys and of every other\n * payload key, so the result does not depend on key order and a payload's own\n * `data_level` stays where it is.\n */\nexport function mergeCoreFields(\n core: Record<string, unknown>,\n data: Record<string, unknown> | undefined,\n extraReserved: readonly string[] = []\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...core };\n if (!data) return merged;\n const reserved = new Set([...Object.keys(core), ...extraReserved]);\n const payloadKeys = new Set(Object.keys(data));\n for (const key of payloadKeys) {\n if (UNSAFE_KEYS.has(key)) continue;\n let target = key;\n if (reserved.has(target)) {\n do {\n target = `${PAYLOAD_PREFIX}${target}`;\n } while (reserved.has(target) || payloadKeys.has(target));\n }\n merged[target] = data[key];\n }\n return merged;\n}\n"],"mappings":";AAAA,MAAM,iBAAiB;AACvB,MAAM,8BAAc,IAAI,IAAI,CAAC,WAAW,CAAC;;;;;;;;;AAUzC,SAAgB,gBACd,MACA,MACA,gBAAmC,CAAC,GACX;CACzB,MAAM,SAAkC,EAAE,GAAG,KAAK;CAClD,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,2BAAW,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,aAAa,CAAC;CACjE,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;CAC7C,KAAK,MAAM,OAAO,aAAa;EAC7B,IAAI,YAAY,IAAI,GAAG,GAAG;EAC1B,IAAI,SAAS;EACb,IAAI,SAAS,IAAI,MAAM,GACrB;GACE,SAAS,GAAG,iBAAiB;SACtB,SAAS,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM;EAEzD,OAAO,UAAU,KAAK;CACxB;CACA,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"entry-fields-RLd1jCoR.js","names":[],"sources":["../src/transports/entry-fields.ts"],"sourcesContent":["const PAYLOAD_PREFIX = 'data_';\nconst UNSAFE_KEYS = new Set(['__proto__']);\n\n/**\n * Copies `core` and then the user payload into one object. The core fields stay\n * authoritative: a payload key that matches a core key (even one whose value is\n * undefined) or a reserved name is kept under a `data_` prefix instead. The\n * prefix is repeated until the name is free of core keys and of every other\n * payload key, so the result does not depend on key order and a payload's own\n * `data_level` stays where it is.\n */\nexport function mergeCoreFields(\n core: Record<string, unknown>,\n data: Record<string, unknown> | undefined,\n extraReserved: readonly string[] = []\n): Record<string, unknown> {\n const merged: Record<string, unknown> = { ...core };\n if (!data) return merged;\n const reserved = new Set([...Object.keys(core), ...extraReserved]);\n const payloadKeys = new Set(Object.keys(data));\n for (const key of payloadKeys) {\n if (UNSAFE_KEYS.has(key)) continue;\n let target = key;\n if (reserved.has(target)) {\n do {\n target = `${PAYLOAD_PREFIX}${target}`;\n } while (reserved.has(target) || payloadKeys.has(target));\n }\n merged[target] = data[key];\n }\n return merged;\n}\n"],"mappings":";AAAA,MAAM,iBAAiB;AACvB,MAAM,8BAAc,IAAI,IAAI,CAAC,WAAW,CAAC;;;;;;;;;AAUzC,SAAgB,gBACd,MACA,MACA,gBAAmC,CAAC,GACX;CACzB,MAAM,SAAkC,EAAE,GAAG,KAAK;CAClD,IAAI,CAAC,MAAM,OAAO;CAClB,MAAM,2BAAW,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,IAAI,GAAG,GAAG,aAAa,CAAC;CACjE,MAAM,cAAc,IAAI,IAAI,OAAO,KAAK,IAAI,CAAC;CAC7C,KAAK,MAAM,OAAO,aAAa;EAC7B,IAAI,YAAY,IAAI,GAAG,GAAG;EAC1B,IAAI,SAAS;EACb,IAAI,SAAS,IAAI,MAAM,GACrB;GACE,SAAS,GAAG,iBAAiB;SACtB,SAAS,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM;EAEzD,OAAO,UAAU,KAAK;CACxB;CACA,OAAO;AACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcp.transport-CGKopAhQ.mjs","names":[],"sources":["../src/transports/gcp.transport.ts"],"sourcesContent":["/**\n * logixia — Google Cloud Logging (Stackdriver) transport\n *\n * Maps logixia log entries to the GCP Logging REST API format:\n * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)\n * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation\n * - Injects `logging.googleapis.com/spanId` and `traceSampled`\n * - Adds `logging.googleapis.com/sourceLocation` when available\n * - Supports structured `jsonPayload` and plain `textPayload`\n *\n * Auth: uses Application Default Credentials (ADC) — the `GOOGLE_APPLICATION_CREDENTIALS`\n * env var pointing to a service-account key file, or the metadata server on GCE/GKE.\n *\n * @example\n * ```ts\n * import { GCPTransport } from 'logixia';\n *\n * const logger = createLogger({\n * transports: {\n * gcp: new GCPTransport({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT,\n * logName: 'projects/my-project/logs/api',\n * resource: { type: 'gce_instance', labels: { instance_id: '123' } },\n * }),\n * },\n * });\n * ```\n */\n\nimport * as https from 'node:https';\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalError } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n httpRequest,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets } from './secret-config';\n\nexport interface GCPMonitoredResource {\n type: string;\n labels?: Record<string, string>;\n}\n\nexport interface GCPTransportConfig {\n /** GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` or `GCLOUD_PROJECT` env vars. */\n projectId?: string;\n /**\n * Full log name, e.g. `'projects/my-project/logs/api'`.\n * If omitted, defaults to `projects/{projectId}/logs/logixia`.\n */\n logName?: string;\n /** Monitored resource descriptor. Defaults to `global`. */\n resource?: GCPMonitoredResource;\n /**\n * Service account key JSON (parsed). If omitted, ADC is used\n * (GOOGLE_APPLICATION_CREDENTIALS env var or metadata server).\n */\n credentials?: {\n client_email: string;\n private_key: string;\n };\n /** Number of entries to batch. @default 200 */\n batchSize?: number;\n /** Flush interval in ms. @default 5000 */\n flushIntervalMs?: number;\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered entries; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n level?: string;\n}\n\ntype GcpSeverity =\n | 'DEFAULT'\n | 'DEBUG'\n | 'INFO'\n | 'NOTICE'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'ALERT'\n | 'EMERGENCY';\n\nfunction toGcpSeverity(level: string): GcpSeverity {\n switch (level.toLowerCase()) {\n case 'trace':\n case 'verbose':\n case 'debug':\n return 'DEBUG';\n case 'info':\n case 'log':\n return 'INFO';\n case 'warn':\n case 'warning':\n return 'WARNING';\n case 'error':\n return 'ERROR';\n case 'critical':\n case 'fatal':\n return 'CRITICAL';\n default:\n return 'DEFAULT';\n }\n}\n\n/**\n * Google Cloud Logging transport with trace correlation and GCP severity mapping.\n */\nexport class GCPTransport implements IAsyncTransport {\n public readonly name = 'gcp';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<TransportLogEntry>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private accessToken: string | null = null;\n private tokenExpiry = 0;\n\n private readonly projectId: string;\n private readonly logName: string;\n private readonly resource: GCPMonitoredResource;\n private readonly credentials: { client_email: string; private_key: string } | undefined;\n\n constructor(config: GCPTransportConfig) {\n protectSecrets(this, ['credentials', 'accessToken']);\n this.projectId =\n config.projectId ??\n process.env['GOOGLE_CLOUD_PROJECT'] ??\n process.env['GCLOUD_PROJECT'] ??\n 'unknown-project';\n this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;\n this.resource = config.resource ?? { type: 'global' };\n this.credentials = config.credentials;\n this.batchSize = config.batchSize ?? 200;\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<TransportLogEntry>({\n name: 'GCPTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (entries) => this.writeEntries(entries),\n secrets: () => this.secretValues(),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n }\n\n write(entry: TransportLogEntry): void {\n this.buffer.push(entry);\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining entries and stop the interval timer on shutdown. Without\n * this the manager's close() skipped the transport (close was undefined) and\n * buffered entries were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private buildLogEntry(entry: TransportLogEntry): Record<string, unknown> {\n const gcpEntry: Record<string, unknown> = {\n logName: this.logName,\n resource: this.resource,\n severity: toGcpSeverity(entry.level),\n timestamp: entry.timestamp ?? new Date().toISOString(),\n jsonPayload: mergeCoreFields(\n { message: entry.message, appName: entry.appName, context: entry.context },\n entry.data\n ),\n };\n\n // GCP Cloud Trace correlation\n if (entry.traceId) {\n gcpEntry['trace'] = `projects/${this.projectId}/traces/${entry.traceId}`;\n gcpEntry['traceSampled'] = true;\n }\n\n return gcpEntry;\n }\n\n private async getAccessToken(): Promise<string | null> {\n if (this.accessToken && Date.now() < this.tokenExpiry) return this.accessToken;\n\n // Try ADC metadata server (GCE/GKE/Cloud Run)\n try {\n const token = await this.fetchFromMetadataServer();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000; // 55 minutes\n return this.accessToken;\n }\n } catch {\n /* fall through to service account */\n }\n\n // Try service account key\n if (this.credentials) {\n try {\n const token = await this.fetchServiceAccountToken();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000;\n return this.accessToken;\n }\n } catch (err) {\n internalError('GCPTransport service account token error', err);\n }\n }\n\n return null;\n }\n\n private fetchFromMetadataServer(): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const req = https.request(\n {\n hostname: 'metadata.google.internal',\n path: '/computeMetadata/v1/instance/service-accounts/default/token',\n headers: { 'Metadata-Flavor': 'Google' },\n timeout: 3000,\n },\n (res) => {\n let raw = '';\n res.on('data', (c: Buffer) => (raw += c.toString()));\n res.on('end', () => {\n if (res.statusCode === 200) {\n try {\n const parsed = JSON.parse(raw) as { access_token?: string };\n resolve(parsed.access_token ?? null);\n } catch {\n resolve(null);\n }\n } else {\n resolve(null);\n }\n });\n }\n );\n req.on('error', reject);\n req.on('timeout', () => {\n req.destroy();\n reject(new Error('metadata timeout'));\n });\n req.end();\n });\n }\n\n private fetchServiceAccountToken(): Promise<string | null> {\n // Minimal JWT creation for service account — only for environments without\n // the full Google Auth Library. For production workloads, prefer ADC.\n if (!this.credentials) return Promise.resolve(null);\n\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + 3600;\n const scope = 'https://www.googleapis.com/auth/logging.write';\n\n const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');\n const payload = Buffer.from(\n JSON.stringify({\n iss: this.credentials.client_email,\n scope,\n aud: 'https://oauth2.googleapis.com/token',\n exp,\n iat,\n })\n ).toString('base64url');\n\n const signingInput = `${header}.${payload}`;\n\n let signature: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sign = require('node:crypto').createSign('RSA-SHA256');\n sign.update(signingInput);\n signature = sign.sign(this.credentials.private_key, 'base64url') as string;\n } catch {\n return Promise.resolve(null);\n }\n\n const jwt = `${signingInput}.${signature}`;\n const body = `grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=${jwt}`;\n\n return httpRequest({\n url: new URL('https://oauth2.googleapis.com/token'),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP token request',\n }).then(\n (res) => (JSON.parse(res.body) as { access_token?: string }).access_token ?? null,\n () => null\n );\n }\n\n private secretValues(token?: string): (string | undefined)[] {\n return [\n ...(this.credentials?.private_key.split('\\n') ?? []),\n this.credentials?.private_key,\n this.accessToken ?? undefined,\n token,\n ];\n }\n\n private async writeEntries(entries: TransportLogEntry[]): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new Error('GCPTransport: no access token available');\n }\n\n const body = stringifyForLog({\n logName: this.logName,\n resource: this.resource,\n entries: entries.map((e) => this.buildLogEntry(e)),\n });\n\n await httpRequest({\n url: new URL('https://logging.googleapis.com/v2/entries:write'),\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP Logging API',\n secrets: () => this.secretValues(token),\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gcp.transport-KZe9hCAR.js","names":["BatchBuffer","mergeCoreFields","https","httpRequest","stringifyForLog"],"sources":["../src/transports/gcp.transport.ts"],"sourcesContent":["/**\n * logixia — Google Cloud Logging (Stackdriver) transport\n *\n * Maps logixia log entries to the GCP Logging REST API format:\n * - Maps `level` → `severity` (INFO, WARNING, ERROR, CRITICAL…)\n * - Injects `logging.googleapis.com/trace` for Cloud Trace correlation\n * - Injects `logging.googleapis.com/spanId` and `traceSampled`\n * - Adds `logging.googleapis.com/sourceLocation` when available\n * - Supports structured `jsonPayload` and plain `textPayload`\n *\n * Auth: uses Application Default Credentials (ADC) — the `GOOGLE_APPLICATION_CREDENTIALS`\n * env var pointing to a service-account key file, or the metadata server on GCE/GKE.\n *\n * @example\n * ```ts\n * import { GCPTransport } from 'logixia';\n *\n * const logger = createLogger({\n * transports: {\n * gcp: new GCPTransport({\n * projectId: process.env.GOOGLE_CLOUD_PROJECT,\n * logName: 'projects/my-project/logs/api',\n * resource: { type: 'gce_instance', labels: { instance_id: '123' } },\n * }),\n * },\n * });\n * ```\n */\n\nimport * as https from 'node:https';\n\nimport type { IAsyncTransport, TransportLogEntry } from '../types/transport.types';\nimport { internalError } from '../utils/internal-log';\nimport { stringifyForLog } from '../utils/safe-stringify';\nimport {\n BatchBuffer,\n DEFAULT_MAX_BUFFER_SIZE,\n DEFAULT_REQUEST_TIMEOUT_MS,\n httpRequest,\n} from './batch-buffer';\nimport { mergeCoreFields } from './entry-fields';\nimport { protectSecrets } from './secret-config';\n\nexport interface GCPMonitoredResource {\n type: string;\n labels?: Record<string, string>;\n}\n\nexport interface GCPTransportConfig {\n /** GCP project ID. Falls back to `GOOGLE_CLOUD_PROJECT` or `GCLOUD_PROJECT` env vars. */\n projectId?: string;\n /**\n * Full log name, e.g. `'projects/my-project/logs/api'`.\n * If omitted, defaults to `projects/{projectId}/logs/logixia`.\n */\n logName?: string;\n /** Monitored resource descriptor. Defaults to `global`. */\n resource?: GCPMonitoredResource;\n /**\n * Service account key JSON (parsed). If omitted, ADC is used\n * (GOOGLE_APPLICATION_CREDENTIALS env var or metadata server).\n */\n credentials?: {\n client_email: string;\n private_key: string;\n };\n /** Number of entries to batch. @default 200 */\n batchSize?: number;\n /** Flush interval in ms. @default 5000 */\n flushIntervalMs?: number;\n /** Abort a request that has not finished after this many ms. @default 10000 */\n requestTimeoutMs?: number;\n /** Max buffered entries; the oldest are dropped past this. @default 10000 */\n maxBufferSize?: number;\n level?: string;\n}\n\ntype GcpSeverity =\n | 'DEFAULT'\n | 'DEBUG'\n | 'INFO'\n | 'NOTICE'\n | 'WARNING'\n | 'ERROR'\n | 'CRITICAL'\n | 'ALERT'\n | 'EMERGENCY';\n\nfunction toGcpSeverity(level: string): GcpSeverity {\n switch (level.toLowerCase()) {\n case 'trace':\n case 'verbose':\n case 'debug':\n return 'DEBUG';\n case 'info':\n case 'log':\n return 'INFO';\n case 'warn':\n case 'warning':\n return 'WARNING';\n case 'error':\n return 'ERROR';\n case 'critical':\n case 'fatal':\n return 'CRITICAL';\n default:\n return 'DEFAULT';\n }\n}\n\n/**\n * Google Cloud Logging transport with trace correlation and GCP severity mapping.\n */\nexport class GCPTransport implements IAsyncTransport {\n public readonly name = 'gcp';\n public readonly batchSize: number;\n public readonly flushInterval: number;\n public readonly level: string | undefined;\n\n private readonly buffer: BatchBuffer<TransportLogEntry>;\n private readonly requestTimeoutMs: number;\n private flushTimer: NodeJS.Timeout | null = null;\n private accessToken: string | null = null;\n private tokenExpiry = 0;\n\n private readonly projectId: string;\n private readonly logName: string;\n private readonly resource: GCPMonitoredResource;\n private readonly credentials: { client_email: string; private_key: string } | undefined;\n\n constructor(config: GCPTransportConfig) {\n protectSecrets(this, ['credentials', 'accessToken']);\n this.projectId =\n config.projectId ??\n process.env['GOOGLE_CLOUD_PROJECT'] ??\n process.env['GCLOUD_PROJECT'] ??\n 'unknown-project';\n this.logName = config.logName ?? `projects/${this.projectId}/logs/logixia`;\n this.resource = config.resource ?? { type: 'global' };\n this.credentials = config.credentials;\n this.batchSize = config.batchSize ?? 200;\n this.flushInterval = config.flushIntervalMs ?? 5000;\n this.level = config.level;\n this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;\n this.buffer = new BatchBuffer<TransportLogEntry>({\n name: 'GCPTransport',\n batchSize: this.batchSize,\n maxBufferSize: config.maxBufferSize ?? DEFAULT_MAX_BUFFER_SIZE,\n send: (entries) => this.writeEntries(entries),\n secrets: () => this.secretValues(),\n });\n\n this.flushTimer = setInterval(() => {\n this.flush().catch(() => {});\n }, this.flushInterval);\n if (this.flushTimer.unref) this.flushTimer.unref();\n }\n\n write(entry: TransportLogEntry): void {\n this.buffer.push(entry);\n this.buffer.flushIfFull();\n }\n\n flush(): Promise<void> {\n return this.buffer.flush();\n }\n\n /**\n * Flush remaining entries and stop the interval timer on shutdown. Without\n * this the manager's close() skipped the transport (close was undefined) and\n * buffered entries were lost on deploy. Waits for any in-flight send first.\n */\n async close(): Promise<void> {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n await this.buffer.close();\n }\n\n private buildLogEntry(entry: TransportLogEntry): Record<string, unknown> {\n const gcpEntry: Record<string, unknown> = {\n logName: this.logName,\n resource: this.resource,\n severity: toGcpSeverity(entry.level),\n timestamp: entry.timestamp ?? new Date().toISOString(),\n jsonPayload: mergeCoreFields(\n { message: entry.message, appName: entry.appName, context: entry.context },\n entry.data\n ),\n };\n\n // GCP Cloud Trace correlation\n if (entry.traceId) {\n gcpEntry['trace'] = `projects/${this.projectId}/traces/${entry.traceId}`;\n gcpEntry['traceSampled'] = true;\n }\n\n return gcpEntry;\n }\n\n private async getAccessToken(): Promise<string | null> {\n if (this.accessToken && Date.now() < this.tokenExpiry) return this.accessToken;\n\n // Try ADC metadata server (GCE/GKE/Cloud Run)\n try {\n const token = await this.fetchFromMetadataServer();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000; // 55 minutes\n return this.accessToken;\n }\n } catch {\n /* fall through to service account */\n }\n\n // Try service account key\n if (this.credentials) {\n try {\n const token = await this.fetchServiceAccountToken();\n if (token) {\n this.accessToken = token;\n this.tokenExpiry = Date.now() + 55 * 60 * 1000;\n return this.accessToken;\n }\n } catch (err) {\n internalError('GCPTransport service account token error', err);\n }\n }\n\n return null;\n }\n\n private fetchFromMetadataServer(): Promise<string | null> {\n return new Promise((resolve, reject) => {\n const req = https.request(\n {\n hostname: 'metadata.google.internal',\n path: '/computeMetadata/v1/instance/service-accounts/default/token',\n headers: { 'Metadata-Flavor': 'Google' },\n timeout: 3000,\n },\n (res) => {\n let raw = '';\n res.on('data', (c: Buffer) => (raw += c.toString()));\n res.on('end', () => {\n if (res.statusCode === 200) {\n try {\n const parsed = JSON.parse(raw) as { access_token?: string };\n resolve(parsed.access_token ?? null);\n } catch {\n resolve(null);\n }\n } else {\n resolve(null);\n }\n });\n }\n );\n req.on('error', reject);\n req.on('timeout', () => {\n req.destroy();\n reject(new Error('metadata timeout'));\n });\n req.end();\n });\n }\n\n private fetchServiceAccountToken(): Promise<string | null> {\n // Minimal JWT creation for service account — only for environments without\n // the full Google Auth Library. For production workloads, prefer ADC.\n if (!this.credentials) return Promise.resolve(null);\n\n const iat = Math.floor(Date.now() / 1000);\n const exp = iat + 3600;\n const scope = 'https://www.googleapis.com/auth/logging.write';\n\n const header = Buffer.from(JSON.stringify({ alg: 'RS256', typ: 'JWT' })).toString('base64url');\n const payload = Buffer.from(\n JSON.stringify({\n iss: this.credentials.client_email,\n scope,\n aud: 'https://oauth2.googleapis.com/token',\n exp,\n iat,\n })\n ).toString('base64url');\n\n const signingInput = `${header}.${payload}`;\n\n let signature: string;\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const sign = require('node:crypto').createSign('RSA-SHA256');\n sign.update(signingInput);\n signature = sign.sign(this.credentials.private_key, 'base64url') as string;\n } catch {\n return Promise.resolve(null);\n }\n\n const jwt = `${signingInput}.${signature}`;\n const body = `grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer&assertion=${jwt}`;\n\n return httpRequest({\n url: new URL('https://oauth2.googleapis.com/token'),\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP token request',\n }).then(\n (res) => (JSON.parse(res.body) as { access_token?: string }).access_token ?? null,\n () => null\n );\n }\n\n private secretValues(token?: string): (string | undefined)[] {\n return [\n ...(this.credentials?.private_key.split('\\n') ?? []),\n this.credentials?.private_key,\n this.accessToken ?? undefined,\n token,\n ];\n }\n\n private async writeEntries(entries: TransportLogEntry[]): Promise<void> {\n const token = await this.getAccessToken();\n if (!token) {\n throw new Error('GCPTransport: no access token available');\n }\n\n const body = stringifyForLog({\n logName: this.logName,\n resource: this.resource,\n entries: entries.map((e) => this.buildLogEntry(e)),\n });\n\n await httpRequest({\n url: new URL('https://logging.googleapis.com/v2/entries:write'),\n headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },\n body,\n timeoutMs: this.requestTimeoutMs,\n label: 'GCP Logging API',\n secrets: () => this.secretValues(token),\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwFA,SAAS,cAAc,OAA4B;CACjD,QAAQ,MAAM,YAAY,GAA1B;EACE,KAAK;EACL,KAAK;EACL,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,OACH,OAAO;EACT,KAAK;EACL,KAAK,WACH,OAAO;EACT,KAAK,SACH,OAAO;EACT,KAAK;EACL,KAAK,SACH,OAAO;EACT,SACE,OAAO;CACX;AACF;;;;AAKA,IAAa,eAAb,MAAqD;CAiBnD,YAAY,QAA4B;EAhBjB,KAAA,OAAA;EAOqB,KAAA,aAAA;EACP,KAAA,cAAA;EACf,KAAA,cAAA;EAQpB,sBAAA,eAAe,MAAM,CAAC,eAAe,aAAa,CAAC;EACnD,KAAK,YACH,OAAO,aACP,QAAQ,IAAI,2BACZ,QAAQ,IAAI,qBACZ;EACF,KAAK,UAAU,OAAO,WAAW,YAAY,KAAK,UAAU;EAC5D,KAAK,WAAW,OAAO,YAAY,EAAE,MAAM,SAAS;EACpD,KAAK,cAAc,OAAO;EAC1B,KAAK,YAAY,OAAO,aAAa;EACrC,KAAK,gBAAgB,OAAO,mBAAmB;EAC/C,KAAK,QAAQ,OAAO;EACpB,KAAK,mBAAmB,OAAO,oBAAA;EAC/B,KAAK,SAAS,IAAIA,qBAAAA,YAA+B;GAC/C,MAAM;GACN,WAAW,KAAK;GAChB,eAAe,OAAO,iBAAA;GACtB,OAAO,YAAY,KAAK,aAAa,OAAO;GAC5C,eAAe,KAAK,aAAa;EACnC,CAAC;EAED,KAAK,aAAa,kBAAkB;GAClC,KAAK,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;EAC7B,GAAG,KAAK,aAAa;EACrB,IAAI,KAAK,WAAW,OAAO,KAAK,WAAW,MAAM;CACnD;CAEA,MAAM,OAAgC;EACpC,KAAK,OAAO,KAAK,KAAK;EACtB,KAAK,OAAO,YAAY;CAC1B;CAEA,QAAuB;EACrB,OAAO,KAAK,OAAO,MAAM;CAC3B;;;;;;CAOA,MAAM,QAAuB;EAC3B,IAAI,KAAK,YAAY;GACnB,cAAc,KAAK,UAAU;GAC7B,KAAK,aAAa;EACpB;EACA,MAAM,KAAK,OAAO,MAAM;CAC1B;CAEA,cAAsB,OAAmD;EACvE,MAAM,WAAoC;GACxC,SAAS,KAAK;GACd,UAAU,KAAK;GACf,UAAU,cAAc,MAAM,KAAK;GACnC,WAAW,MAAM,8BAAa,IAAI,KAAK,EAAA,CAAE,YAAY;GACrD,aAAaC,qBAAAA,gBACX;IAAE,SAAS,MAAM;IAAS,SAAS,MAAM;IAAS,SAAS,MAAM;GAAQ,GACzE,MAAM,IACR;EACF;EAGA,IAAI,MAAM,SAAS;GACjB,SAAS,WAAW,YAAY,KAAK,UAAU,UAAU,MAAM;GAC/D,SAAS,kBAAkB;EAC7B;EAEA,OAAO;CACT;CAEA,MAAc,iBAAyC;EACrD,IAAI,KAAK,eAAe,KAAK,IAAI,IAAI,KAAK,aAAa,OAAO,KAAK;EAGnE,IAAI;GACF,MAAM,QAAQ,MAAM,KAAK,wBAAwB;GACjD,IAAI,OAAO;IACT,KAAK,cAAc;IACnB,KAAK,cAAc,KAAK,IAAI,IAAI;IAChC,OAAO,KAAK;GACd;EACF,QAAQ,CAER;EAGA,IAAI,KAAK,aACP,IAAI;GACF,MAAM,QAAQ,MAAM,KAAK,yBAAyB;GAClD,IAAI,OAAO;IACT,KAAK,cAAc;IACnB,KAAK,cAAc,KAAK,IAAI,IAAI;IAChC,OAAO,KAAK;GACd;EACF,SAAS,KAAK;GACZ,qBAAA,cAAc,4CAA4C,GAAG;EAC/D;EAGF,OAAO;CACT;CAEA,0BAA0D;EACxD,OAAO,IAAI,SAAS,SAAS,WAAW;GACtC,MAAM,MAAMC,WAAM,QAChB;IACE,UAAU;IACV,MAAM;IACN,SAAS,EAAE,mBAAmB,SAAS;IACvC,SAAS;GACX,IACC,QAAQ;IACP,IAAI,MAAM;IACV,IAAI,GAAG,SAAS,MAAe,OAAO,EAAE,SAAS,CAAE;IACnD,IAAI,GAAG,aAAa;KAClB,IAAI,IAAI,eAAe,KACrB,IAAI;MAEF,QADe,KAAK,MAAM,GACb,CAAC,CAAC,gBAAgB,IAAI;KACrC,QAAQ;MACN,QAAQ,IAAI;KACd;UAEA,QAAQ,IAAI;IAEhB,CAAC;GACH,CACF;GACA,IAAI,GAAG,SAAS,MAAM;GACtB,IAAI,GAAG,iBAAiB;IACtB,IAAI,QAAQ;IACZ,uBAAO,IAAI,MAAM,kBAAkB,CAAC;GACtC,CAAC;GACD,IAAI,IAAI;EACV,CAAC;CACH;CAEA,2BAA2D;EAGzD,IAAI,CAAC,KAAK,aAAa,OAAO,QAAQ,QAAQ,IAAI;EAElD,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI;EACxC,MAAM,MAAM,MAAM;EAclB,MAAM,eAAe,GAXN,OAAO,KAAK,KAAK,UAAU;GAAE,KAAK;GAAS,KAAK;EAAM,CAAC,CAAC,CAAC,CAAC,SAAS,WAWrD,EAAE,GAVf,OAAO,KACrB,KAAK,UAAU;GACb,KAAK,KAAK,YAAY;GACtB,OAAA;GACA,KAAK;GACL;GACA;EACF,CAAC,CACH,CAAC,CAAC,SAAS,WAE6B;EAExC,IAAI;EACJ,IAAI;GAEF,MAAM,OAAO,QAAQ,aAAa,CAAC,CAAC,WAAW,YAAY;GAC3D,KAAK,OAAO,YAAY;GACxB,YAAY,KAAK,KAAK,KAAK,YAAY,aAAa,WAAW;EACjE,QAAQ;GACN,OAAO,QAAQ,QAAQ,IAAI;EAC7B;EAGA,MAAM,OAAO,8EAA8E,GAD5E,aAAa,GAAG;EAG/B,OAAOC,qBAAAA,YAAY;GACjB,KAAK,IAAI,IAAI,qCAAqC;GAClD,SAAS,EAAE,gBAAgB,oCAAoC;GAC/D;GACA,WAAW,KAAK;GAChB,OAAO;EACT,CAAC,CAAC,CAAC,MACA,QAAS,KAAK,MAAM,IAAI,IAAI,CAAC,CAA+B,gBAAgB,YACvE,IACR;CACF;CAEA,aAAqB,OAAwC;;EAC3D,OAAO;GACL,KAAA,oBAAI,KAAK,iBAAA,QAAA,sBAAA,KAAA,IAAA,KAAA,IAAA,kBAAa,YAAY,MAAM,IAAI,MAAK,CAAC;IAClD,qBAAA,KAAK,iBAAA,QAAA,uBAAA,KAAA,IAAA,KAAA,IAAA,mBAAa;GAClB,KAAK,eAAe,KAAA;GACpB;EACF;CACF;CAEA,MAAc,aAAa,SAA6C;EACtE,MAAM,QAAQ,MAAM,KAAK,eAAe;EACxC,IAAI,CAAC,OACH,MAAM,IAAI,MAAM,yCAAyC;EAG3D,MAAM,OAAOC,uBAAAA,gBAAgB;GAC3B,SAAS,KAAK;GACd,UAAU,KAAK;GACf,SAAS,QAAQ,KAAK,MAAM,KAAK,cAAc,CAAC,CAAC;EACnD,CAAC;EAED,MAAMD,qBAAAA,YAAY;GAChB,KAAK,IAAI,IAAI,iDAAiD;GAC9D,SAAS;IAAE,eAAe,UAAU;IAAS,gBAAgB;GAAmB;GAChF;GACA,WAAW,KAAK;GAChB,OAAO;GACP,eAAe,KAAK,aAAa,KAAK;EACxC,CAAC;CACH;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DwozbmB4.d.ts","names":[],"sources":["../src/types/http.types.ts","../src/types/index.ts"],"mappings":";;;;UAIiB;EACf;EACA;EACA,SAAS;EACT,QAAQ;EACR,SAAS;EACT;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe,kBAAkB;EACjC;EACA;EACA,UAAU;;UAGK;EACf;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;;UAIa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;cC5CW;;;;;;;;KASD,mBAAmB,uBAAuB;KAC1C,iBAAiB;KAGjB;KAoBA;KAeA;UAGK;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,YAAY;;;;;;;;;;;EAWZ;;UAIe;;;;;EAKf;;;;;;;;;;;;;;EAcA;;;;;EAKA,WAAW;;EAEX;;;;;;;;;;;;;;;;;;EAkBA;;;;;;;;;;;;;;;UAiBe;;;;;EAKf;;;;;;;EAOA,WAAW,QAAQ;;;;;;;EAOnB;;;;;;;;EAQA;;;;;;EAMA;;;;;;;;;;EAUA,WAAW;;UAGI;;;;;;EAMf;;;;;EAKA;;EAEA;;;;;EAKA;;;;;;;;;;;;;;;;KAkBU,kBAAkB,eAAe;UAG5B;;EAEf;;EAEA;;EAEA,UAAU,OAAO;;;;;;EAMjB;;UAGe,aAAa,gBAAgB,yBAAyB;EACrE;EACA,cAAc;EACd,oBAAoB;EACpB;IACE;IACA;IACA;;EAEF;EACA;IAEM,cAAc,UAAU;IACxB,SAAS;IACT,SAAS,QAAQ,aAAa,UAAU,UAAU;;EAGxD,SAAS,QAAQ,OAAO;;;;;EAKxB,SAAS;;;;;;EAMT,kBAAkB;;;;;;EAMlB,6BAA6B;;;;;;EAM7B,WAAW;;EAEX,aAAa;GACZ;;UAIc;EACf,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,OAAO,OAAO,OAAO,0BAA0B;EACrD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,QAAQ,iBAAiB,OAAO,0BAA0B;EAC1D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;EAE1E,KAAK;EACL,QAAQ,gBAAgB;EACxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;EAE3D,SAAS,OAAO;EAChB;EACA,WAAW;EACX;EAGA,YAAY;EACZ,aAAa;EACb,eAAe;EACf,iBAAiB;EACjB;;EAIA;;EAEA;EACA,mBAAmB,qBAAqB;EACxC,mBAAmB;EACnB;EACA;EAEA,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,SAAS;EAKT,IAAI;IAAU;;EACd,MAAM;;KAII,mBAAmB,UAAU,6BACtC,WAAW,KAAK,iBAAiB,OAAO,4BAA4B;KAK3D,QAAQ,gBAAgB,+BAA+B,cACjE,mBAAmB;UAIJ,uBAAuB;KAI5B,iBAAiB,UAAU,qBAAqB;EAC1D,cAAc;IAEZ,UAAU,yBACR,QAAQ,KACR,iBACF;KAGQ,cAAc,KAAK,UAAU,mBAAmB,KAAK,IAAI;UAGpD;EACf;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA,QAAQ;;UAIO;EACf;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;;UAIe;GACd;;UAIc;EACf,OAAO,OAAO;;UAIC;EACf;EACA;EACA;EACA;EACA,SAAS;EACT,WAAW;EACX,QAAQ;EACR;EACA;EACA;EACA;;cAIW;;;;;;;;cASA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-xqaJtAZn.d.mts","names":[],"sources":["../src/types/http.types.ts","../src/types/index.ts"],"mappings":";;;;UAIiB;EACf;EACA;EACA,SAAS;EACT,QAAQ;EACR,SAAS;EACT;EACA;EACA;EACA;;UAGe;EACf;EACA,SAAS;EACT;EACA;EACA;;UAGe,kBAAkB;EACjC;EACA;EACA,UAAU;;UAGK;EACf;EACA;EACA;EACA;IACE;IACA;IACA;IACA;IACA;;;UAIa;EACf;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;cC5CW;;;;;;;;KASD,mBAAmB,uBAAuB;KAC1C,iBAAiB;KAGjB;KAoBA;KAeA;UAGK;EACf;EACA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA,YAAY;;;;;;;;;;;EAWZ;;UAIe;;;;;EAKf;;;;;;;;;;;;;;EAcA;;;;;EAKA,WAAW;;EAEX;;;;;;;;;;;;;;;;;;EAkBA;;;;;;;;;;;;;;;UAiBe;;;;;EAKf;;;;;;;EAOA,WAAW,QAAQ;;;;;;;EAOnB;;;;;;;;EAQA;;;;;;EAMA;;;;;;;;;;EAUA,WAAW;;UAGI;;;;;;EAMf;;;;;EAKA;;EAEA;;;;;EAKA;;;;;;;;;;;;;;;;KAkBU,kBAAkB,eAAe;UAG5B;;EAEf;;EAEA;;EAEA,UAAU,OAAO;;;;;;EAMjB;;UAGe,aAAa,gBAAgB,yBAAyB;EACrE;EACA,cAAc;EACd,oBAAoB;EACpB;IACE;IACA;IACA;;EAEF;EACA;IAEM,cAAc,UAAU;IACxB,SAAS;IACT,SAAS,QAAQ,aAAa,UAAU,UAAU;;EAGxD,SAAS,QAAQ,OAAO;;;;;EAKxB,SAAS;;;;;;EAMT,kBAAkB;;;;;;EAMlB,6BAA6B;;;;;;EAM7B,WAAW;;EAEX,aAAa;GACZ;;UAIc;EACf,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,OAAO,OAAO,OAAO,0BAA0B;EACrD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,KAAK,iBAAiB,OAAO,0BAA0B;EACvD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,QAAQ,iBAAiB,OAAO,0BAA0B;EAC1D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;EAE1E,KAAK;EACL,QAAQ,gBAAgB;EACxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;EAE3D,SAAS,OAAO;EAChB;EACA,WAAW;EACX;EAGA,YAAY;EACZ,aAAa;EACb,eAAe;EACf,iBAAiB;EACjB;;EAIA;;EAEA;EACA,mBAAmB,qBAAqB;EACxC,mBAAmB;EACnB;EACA;EAEA,MAAM,iBAAiB,OAAO,0BAA0B;EACxD,SAAS;EAKT,IAAI;IAAU;;EACd,MAAM;;KAII,mBAAmB,UAAU,6BACtC,WAAW,KAAK,iBAAiB,OAAO,4BAA4B;KAK3D,QAAQ,gBAAgB,+BAA+B,cACjE,mBAAmB;UAIJ,uBAAuB;KAI5B,iBAAiB,UAAU,qBAAqB;EAC1D,cAAc;IAEZ,UAAU,yBACR,QAAQ,KACR,iBACF;KAGQ,cAAc,KAAK,UAAU,mBAAmB,KAAK,IAAI;UAGpD;EACf;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;EACV;EACA,QAAQ;;UAIO;EACf;EACA;EACA;;UAIe;EACf;EACA;EACA;EACA;;UAIe;GACd;;UAIc;EACf,OAAO,OAAO;;UAIC;EACf;EACA;EACA;EACA;EACA,SAAS;EACT,WAAW;EACX,QAAQ;EACR;EACA;EACA;EACA;;cAIW;;;;;;;;cASA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal-log-b0Vp4qrB.js","names":[],"sources":["../src/utils/sensitive-names.ts","../src/utils/internal-log.ts"],"sourcesContent":["/**\n * The one list of sensitive names. Log redaction (redact.utils), the HTTP logger\n * middleware and transport secret handling (transports/secret-config) all read it,\n * so the lists cannot drift. No imports: safe from any module, including browser code.\n */\n\n/** Field names redacted by name, wherever they appear in logged data. */\nexport const SENSITIVE_KEY_NAMES: readonly string[] = [\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'apiKey',\n 'api_key',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n 'authorization',\n 'credentials',\n 'privateKey',\n 'private_key',\n 'clientSecret',\n 'client_secret',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'session',\n 'proxy-authorization',\n 'x-auth-token',\n 'x-access-token',\n 'aws_secret_access_key',\n 'awsSecretAccessKey',\n 'secretAccessKey',\n];\n\n/**\n * Extra names that only mean \"secret\" inside transport configuration, where\n * short words like `key` or `signature` are credentials, not log fields.\n */\nexport const TRANSPORT_CONFIG_SECRET_NAMES: readonly string[] = [\n 'writeKey',\n 'apiSecret',\n 'connectionString',\n 'sessionToken',\n 'passphrase',\n 'signature',\n 'pwd',\n 'pfx',\n 'cert',\n 'key',\n 'auth',\n];\n\n/** Request headers whose values are never logged. */\nexport const DEFAULT_REDACT_HEADERS: readonly string[] = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'proxy-authorization',\n 'x-auth-token',\n 'x-access-token',\n 'x-csrf-token',\n 'x-amz-security-token',\n];\n\n/** Query-string parameters whose values are never logged. */\nexport const DEFAULT_REDACT_QUERY_PARAMS: readonly string[] = [\n 'token',\n 'access_token',\n 'refresh_token',\n 'code',\n 'password',\n 'secret',\n 'api_key',\n 'apikey',\n 'key',\n 'signature',\n 'sig',\n 'auth',\n];\n","/**\n * Internal logging helpers for use within the logixia library itself.\n *\n * These functions write directly to stderr/stdout without going through\n * LogixiaLogger — this avoids circular dependencies and ensures internal\n * diagnostics still surface even when the logger is misconfigured.\n *\n * Library code must NEVER call console.log/warn/error directly. Use these\n * helpers instead so that internal output can be silenced in tests by setting\n * the LOGIXIA_SILENT_INTERNAL=1 environment variable.\n */\n\n/**\n * Read the silence flag on each call rather than caching it at import time, so\n * setting LOGIXIA_SILENT_INTERNAL=1 AFTER the module is first imported (e.g. in\n * a test setup file) still takes effect — the documented test-silencing\n * behavior was previously unreliable because the value was frozen at load.\n */\nfunction isSilent(): boolean {\n if (typeof process !== 'undefined' && process.env?.LOGIXIA_SILENT_INTERNAL === '1') return true;\n const flag = (globalThis as Record<string, unknown>)['LOGIXIA_SILENT_INTERNAL'];\n return flag === '1' || flag === 1 || flag === true;\n}\n\ntype ConsoleMethod = 'log' | 'warn' | 'error';\n\n/**\n * Write a line to stderr, falling back to the matching console method where\n * `process` is unavailable (browsers, Cloudflare Workers, Deno without Node compat).\n */\nfunction writeLine(method: ConsoleMethod, line: string): void {\n if (typeof process !== 'undefined' && typeof process.stderr?.write === 'function') {\n process.stderr.write(`${line}\\n`);\n } else if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n console[method](line);\n }\n}\n\n/**\n * Emit an internal debug/info message to stderr.\n * Use for field-enable/disable notifications that a developer might want to see\n * during development but should not appear in production log streams.\n */\nexport function internalLog(message: string): void {\n if (!isSilent()) {\n writeLine('log', `[logixia] ${message}`);\n }\n}\n\n/**\n * Emit an internal warning to stderr.\n * Use when something is misconfigured but logixia can continue operating.\n */\nexport function internalWarn(message: string): void {\n if (!isSilent()) {\n writeLine('warn', `[logixia:warn] ${message}`);\n }\n}\n\n/**\n * Emit an internal error to stderr.\n * Use when a transport write fails or a serious internal error occurs.\n */\nexport function internalError(message: string, error?: unknown): void {\n if (!isSilent()) {\n let errStr = '';\n if (error instanceof Error) {\n errStr = ` — ${error.message}`;\n } else if (error != null) {\n errStr = ` — ${String(error)}`;\n }\n writeLine('error', `[logixia:error] ${message}${errStr}`);\n }\n}\n"],"mappings":";;;;;;;AAOA,MAAa,sBAAyC;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AAMA,MAAa,gCAAmD;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,yBAA4C;CACvD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,8BAAiD;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;;;;;;;;;;;;AC/DA,SAAS,WAAoB;;CAC3B,IAAI,OAAO,YAAY,iBAAA,eAAe,QAAQ,SAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAK,6BAA4B,KAAK,OAAO;CAC3F,MAAM,OAAQ,WAAuC;CACrD,OAAO,SAAS,OAAO,SAAS,KAAK,SAAS;AAChD;;;;;AAQA,SAAS,UAAU,QAAuB,MAAoB;;CAC5D,IAAI,OAAO,YAAY,eAAe,SAAA,kBAAO,QAAQ,YAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAQ,WAAU,YACrE,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;MAC3B,IAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,YAAY,YACtE,QAAQ,OAAO,CAAC,IAAI;AAExB;;;;;;AAOA,SAAgB,YAAY,SAAuB;CACjD,IAAI,CAAC,SAAS,GACZ,UAAU,OAAO,aAAa,SAAS;AAE3C;;;;;AAMA,SAAgB,aAAa,SAAuB;CAClD,IAAI,CAAC,SAAS,GACZ,UAAU,QAAQ,kBAAkB,SAAS;AAEjD;;;;;AAMA,SAAgB,cAAc,SAAiB,OAAuB;CACpE,IAAI,CAAC,SAAS,GAAG;EACf,IAAI,SAAS;EACb,IAAI,iBAAiB,OACnB,SAAS,MAAM,MAAM;OAChB,IAAI,SAAS,MAClB,SAAS,MAAM,OAAO,KAAK;EAE7B,UAAU,SAAS,mBAAmB,UAAU,QAAQ;CAC1D;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"internal-log-uCSd1PMc.mjs","names":[],"sources":["../src/utils/sensitive-names.ts","../src/utils/internal-log.ts"],"sourcesContent":["/**\n * The one list of sensitive names. Log redaction (redact.utils), the HTTP logger\n * middleware and transport secret handling (transports/secret-config) all read it,\n * so the lists cannot drift. No imports: safe from any module, including browser code.\n */\n\n/** Field names redacted by name, wherever they appear in logged data. */\nexport const SENSITIVE_KEY_NAMES: readonly string[] = [\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'apiKey',\n 'api_key',\n 'accessToken',\n 'access_token',\n 'refreshToken',\n 'refresh_token',\n 'authorization',\n 'credentials',\n 'privateKey',\n 'private_key',\n 'clientSecret',\n 'client_secret',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'session',\n 'proxy-authorization',\n 'x-auth-token',\n 'x-access-token',\n 'aws_secret_access_key',\n 'awsSecretAccessKey',\n 'secretAccessKey',\n];\n\n/**\n * Extra names that only mean \"secret\" inside transport configuration, where\n * short words like `key` or `signature` are credentials, not log fields.\n */\nexport const TRANSPORT_CONFIG_SECRET_NAMES: readonly string[] = [\n 'writeKey',\n 'apiSecret',\n 'connectionString',\n 'sessionToken',\n 'passphrase',\n 'signature',\n 'pwd',\n 'pfx',\n 'cert',\n 'key',\n 'auth',\n];\n\n/** Request headers whose values are never logged. */\nexport const DEFAULT_REDACT_HEADERS: readonly string[] = [\n 'authorization',\n 'cookie',\n 'set-cookie',\n 'x-api-key',\n 'proxy-authorization',\n 'x-auth-token',\n 'x-access-token',\n 'x-csrf-token',\n 'x-amz-security-token',\n];\n\n/** Query-string parameters whose values are never logged. */\nexport const DEFAULT_REDACT_QUERY_PARAMS: readonly string[] = [\n 'token',\n 'access_token',\n 'refresh_token',\n 'code',\n 'password',\n 'secret',\n 'api_key',\n 'apikey',\n 'key',\n 'signature',\n 'sig',\n 'auth',\n];\n","/**\n * Internal logging helpers for use within the logixia library itself.\n *\n * These functions write directly to stderr/stdout without going through\n * LogixiaLogger — this avoids circular dependencies and ensures internal\n * diagnostics still surface even when the logger is misconfigured.\n *\n * Library code must NEVER call console.log/warn/error directly. Use these\n * helpers instead so that internal output can be silenced in tests by setting\n * the LOGIXIA_SILENT_INTERNAL=1 environment variable.\n */\n\n/**\n * Read the silence flag on each call rather than caching it at import time, so\n * setting LOGIXIA_SILENT_INTERNAL=1 AFTER the module is first imported (e.g. in\n * a test setup file) still takes effect — the documented test-silencing\n * behavior was previously unreliable because the value was frozen at load.\n */\nfunction isSilent(): boolean {\n if (typeof process !== 'undefined' && process.env?.LOGIXIA_SILENT_INTERNAL === '1') return true;\n const flag = (globalThis as Record<string, unknown>)['LOGIXIA_SILENT_INTERNAL'];\n return flag === '1' || flag === 1 || flag === true;\n}\n\ntype ConsoleMethod = 'log' | 'warn' | 'error';\n\n/**\n * Write a line to stderr, falling back to the matching console method where\n * `process` is unavailable (browsers, Cloudflare Workers, Deno without Node compat).\n */\nfunction writeLine(method: ConsoleMethod, line: string): void {\n if (typeof process !== 'undefined' && typeof process.stderr?.write === 'function') {\n process.stderr.write(`${line}\\n`);\n } else if (typeof console !== 'undefined' && typeof console[method] === 'function') {\n console[method](line);\n }\n}\n\n/**\n * Emit an internal debug/info message to stderr.\n * Use for field-enable/disable notifications that a developer might want to see\n * during development but should not appear in production log streams.\n */\nexport function internalLog(message: string): void {\n if (!isSilent()) {\n writeLine('log', `[logixia] ${message}`);\n }\n}\n\n/**\n * Emit an internal warning to stderr.\n * Use when something is misconfigured but logixia can continue operating.\n */\nexport function internalWarn(message: string): void {\n if (!isSilent()) {\n writeLine('warn', `[logixia:warn] ${message}`);\n }\n}\n\n/**\n * Emit an internal error to stderr.\n * Use when a transport write fails or a serious internal error occurs.\n */\nexport function internalError(message: string, error?: unknown): void {\n if (!isSilent()) {\n let errStr = '';\n if (error instanceof Error) {\n errStr = ` — ${error.message}`;\n } else if (error != null) {\n errStr = ` — ${String(error)}`;\n }\n writeLine('error', `[logixia:error] ${message}${errStr}`);\n }\n}\n"],"mappings":";;;;;;;AAOA,MAAa,sBAAyC;CACpD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;AAMA,MAAa,gCAAmD;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,yBAA4C;CACvD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,8BAAiD;CAC5D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;;;;;;;;;;;;;;AC/DA,SAAS,WAAoB;;CAC3B,IAAI,OAAO,YAAY,iBAAA,eAAe,QAAQ,SAAA,QAAA,iBAAA,KAAA,IAAA,KAAA,IAAA,aAAK,6BAA4B,KAAK,OAAO;CAC3F,MAAM,OAAQ,WAAuC;CACrD,OAAO,SAAS,OAAO,SAAS,KAAK,SAAS;AAChD;;;;;AAQA,SAAS,UAAU,QAAuB,MAAoB;;CAC5D,IAAI,OAAO,YAAY,eAAe,SAAA,kBAAO,QAAQ,YAAA,QAAA,oBAAA,KAAA,IAAA,KAAA,IAAA,gBAAQ,WAAU,YACrE,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG;MAC3B,IAAI,OAAO,YAAY,eAAe,OAAO,QAAQ,YAAY,YACtE,QAAQ,OAAO,CAAC,IAAI;AAExB;;;;;;AAOA,SAAgB,YAAY,SAAuB;CACjD,IAAI,CAAC,SAAS,GACZ,UAAU,OAAO,aAAa,SAAS;AAE3C;;;;;AAMA,SAAgB,aAAa,SAAuB;CAClD,IAAI,CAAC,SAAS,GACZ,UAAU,QAAQ,kBAAkB,SAAS;AAEjD;;;;;AAMA,SAAgB,cAAc,SAAiB,OAAuB;CACpE,IAAI,CAAC,SAAS,GAAG;EACf,IAAI,SAAS;EACb,IAAI,iBAAiB,OACnB,SAAS,MAAM,MAAM;OAChB,IAAI,SAAS,MAClB,SAAS,MAAM,OAAO,KAAK;EAE7B,UAAU,SAAS,mBAAmB,UAAU,QAAQ;CAC1D;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logitron-logger-D2B75Oc7.d.ts","names":[],"sources":["../src/plugin.ts","../src/core/logitron-logger.ts"],"mappings":";UAkCiB;;;;;;EAMf;;;;;;EAOA,kBAAkB;;;;;;;;;;;;EAalB,OAAO,OAAO,WAAW,kBAAkB,QAAQ;;;;;;EAOnD,SAAS,OAAO,OAAO,QAAQ,kBAAkB;;;;;;EAOjD,sBAAsB;;;;;;;cAUX;mBACM;;;;;EAMjB,SAAS,QAAQ;;EAiBjB,WAAW;;EAMX,IAAI;;MAKA;;;;;;EASE,SAAS,OAAO,WAAW,QAAQ;;;;;EAsBnC,WAAW,OAAO,OAAO,QAAQ,WAAW;;EAiB5C,iBAAiB;;;;;;;;;cA2BZ,sBAAoB;;;;;;;;;;;;;;;;;;iBAmBjB,UAAU,QAAQ;;;;;;;;;;;;;;cC7BrB,cACX,gBAAgB,aAAa,0BAA0B,yBAC5C;GAEV;UAEO;UACA;UACA;UACA;UACA;UACA;;mBAGS;;UAIT;;UAEA;;UAEA;;mBAES;;UAET;;UAEA;;UAEA;;;;;UAKA;;UAEA;;UAEA;;UAEA;;mBAES;;mBAEA;EAEL,YAAA,QAAQ,SAAS,kBAAkB,SAAS,cAAc;UAqG9D;UAiBA;;;;;UAqBA;;;;;;EA2HF,MAAM,yBAAyB,OAAO,OAAO,0BAA0B;;EAYvE,KAAK,iBAAiB,OAAO,0BAA0B;;EAKvD,KAAK,iBAAiB,OAAO,0BAA0B;;EAKvD,MAAM,iBAAiB,OAAO,0BAA0B;;EAKxD,MAAM,iBAAiB,OAAO,0BAA0B;;EAKxD,QAAQ,iBAAiB,OAAO,0BAA0B;;;;;;EAS1D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;;EAOhF,KAAK;;;;;;;;;;;;;EAgBC,QAAQ,gBAAgB;EAmBxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;;;;;;;;;;;;EAyBjE,SAAS,OAAO;;;;;;EAuBhB,YAAY;UAIJ;;;;;UAQA;;;;;;;;;;;;;;;EA8BR,mBAAmB,QAAQ;;EAQ3B,qBAAqB,QAAQ;;EAM7B,sBAAsB;;EAKtB,WAAW;;EAKX;;EAOA,YAAY;;EASZ,aAAa;;EASb,eAAe;;EASf,iBAAiB;;EAmBjB;;EAQA;;EAMA;;EAMA,mBAAmB,qBAAqB;;EAMxC,mBAAmB;EAMnB;;EAMA;;;;;;;;;;;;;EAkBA,MAAM,iBAAiB,OAAO,0BAA0B;;;;;;;;;;;;EA0BxD,IAAI,QAAQ;;;;;EASZ,MAAM;;EAQA,SAAS;;EAKT,eAAe;IAAU;IAAkB,SAAS;;;;;;;;;;;;;;;;EAqBpD,SAAS;UAsBD;;;;;UA0GN;;;;;;;;;;;UAeA;UAwCA;UAgDA;;;;;;;;UAcA;;;UAuBM;;;;;;;;;;;;;;;;;;iBA+BA,aAAa,UAAU,aAAa,yBAClD,QAAQ,GACR,mBACC,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logitron-logger-oEd6wNhf.d.mts","names":[],"sources":["../src/plugin.ts","../src/core/logitron-logger.ts"],"mappings":";UAkCiB;;;;;;EAMf;;;;;;EAOA,kBAAkB;;;;;;;;;;;;EAalB,OAAO,OAAO,WAAW,kBAAkB,QAAQ;;;;;;EAOnD,SAAS,OAAO,OAAO,QAAQ,kBAAkB;;;;;;EAOjD,sBAAsB;;;;;;;cAUX;mBACM;;;;;EAMjB,SAAS,QAAQ;;EAiBjB,WAAW;;EAMX,IAAI;;MAKA;;;;;;EASE,SAAS,OAAO,WAAW,QAAQ;;;;;EAsBnC,WAAW,OAAO,OAAO,QAAQ,WAAW;;EAiB5C,iBAAiB;;;;;;;;;cA2BZ,sBAAoB;;;;;;;;;;;;;;;;;;iBAmBjB,UAAU,QAAQ;;;;;;;;;;;;;;cC7BrB,cACX,gBAAgB,aAAa,0BAA0B,yBAC5C;GAEV;UAEO;UACA;UACA;UACA;UACA;UACA;;mBAGS;;UAIT;;UAEA;;UAEA;;mBAES;;UAET;;UAEA;;UAEA;;;;;UAKA;;UAEA;;UAEA;;UAEA;;mBAES;;mBAEA;EAEL,YAAA,QAAQ,SAAS,kBAAkB,SAAS,cAAc;UAqG9D;UAiBA;;;;;UAqBA;;;;;;EA2HF,MAAM,yBAAyB,OAAO,OAAO,0BAA0B;;EAYvE,KAAK,iBAAiB,OAAO,0BAA0B;;EAKvD,KAAK,iBAAiB,OAAO,0BAA0B;;EAKvD,MAAM,iBAAiB,OAAO,0BAA0B;;EAKxD,MAAM,iBAAiB,OAAO,0BAA0B;;EAKxD,QAAQ,iBAAiB,OAAO,0BAA0B;;;;;;EAS1D,SAAS,eAAe,iBAAiB,OAAO,0BAA0B;;EAOhF,KAAK;;;;;;;;;;;;;EAgBC,QAAQ,gBAAgB;EAmBxB,UAAU,GAAG,eAAe,UAAU,QAAQ,KAAK,QAAQ;;;;;;;;;;;;EAyBjE,SAAS,OAAO;;;;;;EAuBhB,YAAY;UAIJ;;;;;UAQA;;;;;;;;;;;;;;;EA8BR,mBAAmB,QAAQ;;EAQ3B,qBAAqB,QAAQ;;EAM7B,sBAAsB;;EAKtB,WAAW;;EAKX;;EAOA,YAAY;;EASZ,aAAa;;EASb,eAAe;;EASf,iBAAiB;;EAmBjB;;EAQA;;EAMA;;EAMA,mBAAmB,qBAAqB;;EAMxC,mBAAmB;EAMnB;;EAMA;;;;;;;;;;;;;EAkBA,MAAM,iBAAiB,OAAO,0BAA0B;;;;;;;;;;;;EA0BxD,IAAI,QAAQ;;;;;EASZ,MAAM;;EAQA,SAAS;;EAKT,eAAe;IAAU;IAAkB,SAAS;;;;;;;;;;;;;;;;EAqBpD,SAAS;UAsBD;;;;;UA0GN;;;;;;;;;;;UAeA;UAwCA;UAgDA;;;;;;;;UAcA;;;UAuBM;;;;;;;;;;;;;;;;;;iBA+BA,aAAa,UAAU,aAAa,yBAClD,QAAQ,GACR,mBACC,iBAAiB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-stringify-BMRl3EX3.mjs","names":[],"sources":["../src/utils/safe-stringify.ts"],"sourcesContent":["/**\n * logixia — robust JSON serialization for log payloads.\n *\n * Modern Winston/Pino already neutralize circular refs to `[Circular]` (via\n * safe-stable-stringify / fast-safe-stringify), so merely \"surviving cycles\" is\n * not a differentiator. This goes one notch further:\n *\n * - **BigInt** → serialized (as a string by default; JSON.stringify throws on\n * BigInt, which silently breaks logging of e.g. DB bigint ids).\n * - **Deterministic key order** (optional) so identical objects hash/diff equal.\n * - **True decycle** (optional) — replace repeated references with JSONPath\n * `$ref` pointers that round-trip back to the original object graph, instead\n * of the lossy `[Circular]` tag. Useful when you need to reconstruct shared\n * structure downstream.\n *\n * @example\n * ```ts\n * safeStringify({ id: 10n, self: obj }); // → BigInt + cycle safe\n * safeStringify(graph, { decycle: true }); // → round-trippable $ref pointers\n * const back = retrocycle(JSON.parse(json)); // → reconstruct shared refs\n * ```\n */\n\nexport interface SafeStringifyOptions {\n /** Indentation passed to JSON.stringify (number of spaces or a string). */\n indent?: number | string;\n /** Sort object keys for deterministic output. Default: false. */\n deterministic?: boolean;\n /**\n * Use round-trippable `$ref` JSONPath pointers for repeated references instead\n * of the lossy \"[Circular]\" tag. Default: false.\n */\n decycle?: boolean;\n /** How to render BigInt: 'string' (default) or 'number' (may lose precision). */\n bigint?: 'string' | 'number';\n}\n\n/** Build a JSONPath like `$[\"a\"][0][\"b\"]` for a decycle pointer. */\nfunction jsonPath(parts: Array<string | number>): string {\n let path = '$';\n for (const p of parts) {\n path += typeof p === 'number' ? `[${p}]` : `[${JSON.stringify(p)}]`;\n }\n return path;\n}\n\n/**\n * Serialize any value to JSON without throwing on circular references or BigInt.\n * Circular refs become `\"[Circular]\"` (or `{ $ref }` pointers when `decycle`).\n */\nexport function safeStringify(value: unknown, options: SafeStringifyOptions = {}): string {\n const { indent, deterministic = false, decycle = false, bigint = 'string' } = options;\n\n if (decycle) {\n return JSON.stringify(decycleValue(value, bigint), undefined, indent);\n }\n\n const seen = new WeakSet<object>();\n\n const transform = (val: unknown): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return val.toString();\n if (val === null || typeof val !== 'object') return val;\n\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n\n let out: unknown;\n const toJSON = (val as { toJSON?: unknown }).toJSON;\n if (Array.isArray(val)) {\n out = val.map((item) => transform(item));\n } else if (typeof toJSON === 'function') {\n // Dates, URLs, Buffers and classes with their own toJSON print the way\n // JSON.stringify would; a toJSON that returns `this` hits the cycle check.\n out = transform(toJSON.call(val));\n } else {\n const rec = val as Record<string, unknown>;\n const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);\n const obj: Record<string, unknown> = {};\n for (const k of keys) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = transform(rec[k]);\n }\n out = obj;\n }\n // Allow the same object to appear in sibling branches (not a true cycle):\n // remove from `seen` after we finish its subtree.\n seen.delete(val);\n return out;\n };\n\n return JSON.stringify(transform(value), undefined, indent);\n}\n\n/**\n * Replace repeated object references with round-trippable `{ \"$ref\": \"$...\" }`\n * JSONPath pointers (the classic Crockford decycle). Pair with {@link retrocycle}\n * to reconstruct the original shared/circular graph.\n */\nexport function decycleValue(value: unknown, bigint: 'string' | 'number' = 'string'): unknown {\n const paths = new WeakMap<object, string>();\n\n const walk = (val: unknown, path: Array<string | number>): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (val === null || typeof val !== 'object') return val;\n if (val instanceof Date) return val.toISOString();\n\n const existing = paths.get(val);\n if (existing !== undefined) return { $ref: existing };\n paths.set(val, jsonPath(path));\n\n if (Array.isArray(val)) {\n return val.map((item, i) => walk(item, [...path, i]));\n }\n const rec = val as Record<string, unknown>;\n const obj: Record<string, unknown> = {};\n for (const k of Object.keys(rec)) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = walk(rec[k], [...path, k]);\n }\n return obj;\n };\n\n return walk(value, []);\n}\n\n/**\n * Inverse of {@link decycleValue}: resolve `{ \"$ref\": \"$...\" }` pointers back\n * into the live object graph (mutates and returns the parsed input).\n */\nexport function retrocycle<T>(root: T): T {\n const refRe = /^\\$(?:\\[(?:\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\])*$/;\n\n const resolve = (path: string): unknown => {\n // Parse the JSONPath segments back out.\n const segs: Array<string | number> = [];\n const partRe = /\\[(\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\]/g;\n let m: RegExpExecArray | null;\n while ((m = partRe.exec(path)) !== null) {\n const raw = m[1]!;\n segs.push(raw.startsWith('\"') ? (JSON.parse(raw) as string) : Number(raw));\n }\n let node: unknown = root;\n for (const s of segs) {\n node = (node as Record<string | number, unknown>)[s];\n }\n return node;\n };\n\n const walk = (val: unknown): void => {\n if (val === null || typeof val !== 'object') return;\n const rec = val as Record<string, unknown>;\n for (const k of Object.keys(rec)) {\n const child = rec[k];\n if (\n child !== null &&\n typeof child === 'object' &&\n typeof (child as { $ref?: unknown }).$ref === 'string' &&\n refRe.test((child as { $ref: string }).$ref)\n ) {\n rec[k] = resolve((child as { $ref: string }).$ref);\n } else {\n walk(child);\n }\n }\n };\n\n walk(root);\n return root;\n}\n\n/**\n * `JSON.stringify` for log output. Takes the plain fast path first and only\n * falls back to {@link safeStringify} when that throws (a cycle, a BigInt, a\n * throwing `toJSON`), so a bad payload costs nothing until it shows up.\n * Never throws: if even the safe walk fails, the value is replaced by a marker.\n */\nexport function stringifyForLog(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n try {\n return safeStringify(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return JSON.stringify(`[Unserializable: ${reason}]`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"safe-stringify-DLz1Kz3o.js","names":[],"sources":["../src/utils/safe-stringify.ts"],"sourcesContent":["/**\n * logixia — robust JSON serialization for log payloads.\n *\n * Modern Winston/Pino already neutralize circular refs to `[Circular]` (via\n * safe-stable-stringify / fast-safe-stringify), so merely \"surviving cycles\" is\n * not a differentiator. This goes one notch further:\n *\n * - **BigInt** → serialized (as a string by default; JSON.stringify throws on\n * BigInt, which silently breaks logging of e.g. DB bigint ids).\n * - **Deterministic key order** (optional) so identical objects hash/diff equal.\n * - **True decycle** (optional) — replace repeated references with JSONPath\n * `$ref` pointers that round-trip back to the original object graph, instead\n * of the lossy `[Circular]` tag. Useful when you need to reconstruct shared\n * structure downstream.\n *\n * @example\n * ```ts\n * safeStringify({ id: 10n, self: obj }); // → BigInt + cycle safe\n * safeStringify(graph, { decycle: true }); // → round-trippable $ref pointers\n * const back = retrocycle(JSON.parse(json)); // → reconstruct shared refs\n * ```\n */\n\nexport interface SafeStringifyOptions {\n /** Indentation passed to JSON.stringify (number of spaces or a string). */\n indent?: number | string;\n /** Sort object keys for deterministic output. Default: false. */\n deterministic?: boolean;\n /**\n * Use round-trippable `$ref` JSONPath pointers for repeated references instead\n * of the lossy \"[Circular]\" tag. Default: false.\n */\n decycle?: boolean;\n /** How to render BigInt: 'string' (default) or 'number' (may lose precision). */\n bigint?: 'string' | 'number';\n}\n\n/** Build a JSONPath like `$[\"a\"][0][\"b\"]` for a decycle pointer. */\nfunction jsonPath(parts: Array<string | number>): string {\n let path = '$';\n for (const p of parts) {\n path += typeof p === 'number' ? `[${p}]` : `[${JSON.stringify(p)}]`;\n }\n return path;\n}\n\n/**\n * Serialize any value to JSON without throwing on circular references or BigInt.\n * Circular refs become `\"[Circular]\"` (or `{ $ref }` pointers when `decycle`).\n */\nexport function safeStringify(value: unknown, options: SafeStringifyOptions = {}): string {\n const { indent, deterministic = false, decycle = false, bigint = 'string' } = options;\n\n if (decycle) {\n return JSON.stringify(decycleValue(value, bigint), undefined, indent);\n }\n\n const seen = new WeakSet<object>();\n\n const transform = (val: unknown): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (typeof val === 'function') return `[Function: ${val.name || 'anonymous'}]`;\n if (typeof val === 'symbol') return val.toString();\n if (val === null || typeof val !== 'object') return val;\n\n if (seen.has(val)) return '[Circular]';\n seen.add(val);\n\n let out: unknown;\n const toJSON = (val as { toJSON?: unknown }).toJSON;\n if (Array.isArray(val)) {\n out = val.map((item) => transform(item));\n } else if (typeof toJSON === 'function') {\n // Dates, URLs, Buffers and classes with their own toJSON print the way\n // JSON.stringify would; a toJSON that returns `this` hits the cycle check.\n out = transform(toJSON.call(val));\n } else {\n const rec = val as Record<string, unknown>;\n const keys = deterministic ? Object.keys(rec).sort() : Object.keys(rec);\n const obj: Record<string, unknown> = {};\n for (const k of keys) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = transform(rec[k]);\n }\n out = obj;\n }\n // Allow the same object to appear in sibling branches (not a true cycle):\n // remove from `seen` after we finish its subtree.\n seen.delete(val);\n return out;\n };\n\n return JSON.stringify(transform(value), undefined, indent);\n}\n\n/**\n * Replace repeated object references with round-trippable `{ \"$ref\": \"$...\" }`\n * JSONPath pointers (the classic Crockford decycle). Pair with {@link retrocycle}\n * to reconstruct the original shared/circular graph.\n */\nexport function decycleValue(value: unknown, bigint: 'string' | 'number' = 'string'): unknown {\n const paths = new WeakMap<object, string>();\n\n const walk = (val: unknown, path: Array<string | number>): unknown => {\n if (typeof val === 'bigint') return bigint === 'number' ? Number(val) : val.toString();\n if (val === null || typeof val !== 'object') return val;\n if (val instanceof Date) return val.toISOString();\n\n const existing = paths.get(val);\n if (existing !== undefined) return { $ref: existing };\n paths.set(val, jsonPath(path));\n\n if (Array.isArray(val)) {\n return val.map((item, i) => walk(item, [...path, i]));\n }\n const rec = val as Record<string, unknown>;\n const obj: Record<string, unknown> = {};\n for (const k of Object.keys(rec)) {\n if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;\n obj[k] = walk(rec[k], [...path, k]);\n }\n return obj;\n };\n\n return walk(value, []);\n}\n\n/**\n * Inverse of {@link decycleValue}: resolve `{ \"$ref\": \"$...\" }` pointers back\n * into the live object graph (mutates and returns the parsed input).\n */\nexport function retrocycle<T>(root: T): T {\n const refRe = /^\\$(?:\\[(?:\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\])*$/;\n\n const resolve = (path: string): unknown => {\n // Parse the JSONPath segments back out.\n const segs: Array<string | number> = [];\n const partRe = /\\[(\\d+|\"(?:[^\"\\\\]|\\\\.)*\")\\]/g;\n let m: RegExpExecArray | null;\n while ((m = partRe.exec(path)) !== null) {\n const raw = m[1]!;\n segs.push(raw.startsWith('\"') ? (JSON.parse(raw) as string) : Number(raw));\n }\n let node: unknown = root;\n for (const s of segs) {\n node = (node as Record<string | number, unknown>)[s];\n }\n return node;\n };\n\n const walk = (val: unknown): void => {\n if (val === null || typeof val !== 'object') return;\n const rec = val as Record<string, unknown>;\n for (const k of Object.keys(rec)) {\n const child = rec[k];\n if (\n child !== null &&\n typeof child === 'object' &&\n typeof (child as { $ref?: unknown }).$ref === 'string' &&\n refRe.test((child as { $ref: string }).$ref)\n ) {\n rec[k] = resolve((child as { $ref: string }).$ref);\n } else {\n walk(child);\n }\n }\n };\n\n walk(root);\n return root;\n}\n\n/**\n * `JSON.stringify` for log output. Takes the plain fast path first and only\n * falls back to {@link safeStringify} when that throws (a cycle, a BigInt, a\n * throwing `toJSON`), so a bad payload costs nothing until it shows up.\n * Never throws: if even the safe walk fails, the value is replaced by a marker.\n */\nexport function stringifyForLog(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n try {\n return safeStringify(value);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return JSON.stringify(`[Unserializable: ${reason}]`);\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-BH33XhuU.d.mts","names":[],"sources":["../src/search/types/search.types.ts","../src/search/search-manager.ts","../src/search/core/log-indexer.interface.ts","../src/search/core/basic-log-indexer.ts","../src/search/core/search-engine.interface.ts","../src/search/core/basic-search-engine.ts","../src/search/engines/correlation-engine.ts","../src/search/engines/nlp-search-engine.ts","../src/search/engines/pattern-recognition-engine.ts"],"mappings":";;;;UASiB;EACf;EACA;EACA;EACA,YAAY;EACZ;EACA;EACA;EACA;EACA;EACA;EACA,eAAe;;;;;UAMA;EACf,OAAO;EACP,MAAM;EACN,WAAW;;;;;UAMI;EACf;EACA;;;;;UAMe;EACf,KAAK;EACL;EACA,aAAa;EACb,UAAU;EACV,UAAU;EACV,cAAc;;;;;UAMC;EACf;EACA;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;;;;;UAMe;EACf,KAAK;EACL,cAAc;EACd;;;;;KAMU;;;;UAWK;EACf;EACA;EACA,MAAM;EACN,UAAU;EACV,UAAU;;;;;UAMK;EACf,WAAW;EACX,KAAK;EACL;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;EACA;EACA,eAAe;;;;;UAMA;EACf,KAAK;EACL;EACA;EACA;;;;;UAMe;EACf;EACA,UAAU;EACV,UAAU;EACV,WAAW;EACX;;;;;UAMe;EACf;EACA;EACA,SAAS;EACT;EACA;EACA;EACA;EACA;EACA;EACA;;;;;KAMU;;;;UAKK;EACf;EACA,MAAM;EACN;EACA;EACA,WAAW;;;;;KAMD;;;;UAMK;EACf;EACA;EACA;EACA;EACA;;;;;UAMe;EACf;EACA;EACA,aAAa;EACb,aAAa;EACb,WAAW;;;;;UAMI;EACf;EACA;EACA,MAAM;EACN;EACA;EACA;;;;;UAMe;EACf;EACA;EACA,QAAQ;EACR,UAAU;EACV;EACA,UAAU;EACV;EACA;;;;;UAMe;EACf,KAAK;EACL;EACA;EACA;EACA;;;;;UAMe;EACf;EACA,QAAQ;EACR,UAAU;EACV,SAAS;EACT,YAAY;EACZ;;;;;KAMU;;;;UAaK;EACf,MAAM;EACN;EACA;EACA;;;;;KAMU;;;;UAMK;EACf;EACA;EACA;EACA;EACA,SAAS;EACT,SAAS;EACT,WAAW;EACX,WAAW;EACX;EACA;;;;;UAMe;EACf;EACA;EACA;EACA;;;;;UCpRe;EACf;EACA;EACA;EACA;EACA;;;;;cAMW;UACH;UACA;UACA;UACA;UACA;EAEI,YAAA,SAAS;;;;EA8Bf,UAAU,MAAM,aAAa;;;;EAa7B,SAAS,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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-CWMVYC-R.mjs","names":[],"sources":["../src/utils/csv.utils.ts","../src/search/core/basic-log-indexer.ts","../src/search/core/basic-search-engine.ts","../src/search/engines/correlation-engine.ts","../src/search/engines/nlp-search-engine.ts","../src/search/engines/pattern-recognition-engine.ts","../src/search/search-manager.ts"],"sourcesContent":["const CSV_FORMULA_PREFIX = /^[=+\\-@\\t\\r]/;\n\n/**\n * Render one CSV field. String values that a spreadsheet would treat as a\n * formula (leading `=`, `+`, `-`, `@`, tab or CR) are prefixed with `'`.\n * Objects are JSON-encoded. Fields containing a comma, quote, CR or LF are quoted;\n * `alwaysQuote` quotes every field. `null` / `undefined` render as empty.\n */\nexport function csvField(value: unknown, alwaysQuote = false): string {\n if (value === undefined || value === null) return alwaysQuote ? '\"\"' : '';\n let str: string;\n if (typeof value === 'string') {\n str = CSV_FORMULA_PREFIX.test(value) ? `'${value}` : value;\n } else if (typeof value === 'object') {\n str = JSON.stringify(value);\n } else {\n str = String(value);\n }\n if (alwaysQuote || /[\",\\r\\n]/.test(str)) return `\"${str.replace(/\"/g, '\"\"')}\"`;\n return str;\n}\n","/**\n * Basic log indexer implementation for indexing and managing log entries\n */\n\nimport type { LogEntry } from '../../types';\nimport type { LogCluster, SearchQuery, SemanticIndex } from '../types';\nimport type { ILogIndexer } from './log-indexer.interface';\n\n/**\n * Basic log indexer implementation\n */\nexport class BasicLogIndexer implements ILogIndexer {\n private index: Map<string, LogEntry> = new Map();\n private fieldIndices: Map<string, Map<string, Set<string>>> = new Map();\n private semanticIndex: SemanticIndex | undefined;\n private lastOptimized?: Date;\n /**\n * Running estimate of the serialized index size in bytes, maintained\n * incrementally. The previous implementation JSON.stringify'd EVERY log on\n * each getIndexStats() call — O(n) per call, which for the default 1M-entry\n * cap means stringifying a million objects and blocking the event loop.\n * We keep a per-log byte estimate so the lookup is O(1).\n */\n private indexSizeBytes = 0;\n private readonly logSizeById = new Map<string, number>();\n\n constructor(\n private options?: {\n maxIndexSize?: number;\n autoOptimize?: boolean;\n optimizeThreshold?: number;\n }\n ) {\n this.options = {\n maxIndexSize: 1000000,\n autoOptimize: true,\n optimizeThreshold: 10000,\n ...options,\n };\n\n // Initialize field indices\n this.initializeFieldIndices();\n }\n\n /**\n * Index a single log entry\n */\n async indexLog(log: LogEntry): Promise<void> {\n const logId = this.generateLogId(log);\n\n // Add to main index\n this.trackInsert(logId, log);\n\n // Update field indices\n this.updateFieldIndices(logId, log);\n\n // Auto-optimize if threshold reached\n if (\n this.options?.autoOptimize &&\n this.index.size % (this.options.optimizeThreshold || 10000) === 0\n ) {\n await this.optimizeIndex();\n }\n\n // Enforce max size\n if (this.index.size > (this.options?.maxIndexSize || 1000000)) {\n await this.removeOldestLogs(Math.floor((this.options?.maxIndexSize || 1000000) * 0.1));\n }\n }\n\n /**\n * Index multiple log entries in batch\n */\n async indexBatch(logs: LogEntry[]): Promise<void> {\n for (const log of logs) {\n const logId = this.generateLogId(log);\n this.trackInsert(logId, log);\n this.updateFieldIndices(logId, log);\n }\n\n // Optimize after batch\n if (this.options?.autoOptimize) {\n await this.optimizeIndex();\n }\n }\n\n /**\n * Build semantic index for intelligent search\n */\n async buildSemanticIndex(logs: LogEntry[]): Promise<SemanticIndex> {\n // Build clusters based on log patterns\n const clusters = await this.clusterLogs(logs);\n\n this.semanticIndex = {\n version: '1.0.0',\n indexedCount: logs.length,\n lastUpdated: new Date(),\n clusters,\n };\n\n return this.semanticIndex;\n }\n\n /**\n * Update search suggestions based on search history\n */\n async updateSearchSuggestions(searchHistory: SearchQuery[]): Promise<void> {\n // Extract common patterns from search history\n const patterns = new Map<string, number>();\n\n for (const query of searchHistory) {\n const normalizedQuery = query.query.toLowerCase().trim();\n patterns.set(normalizedQuery, (patterns.get(normalizedQuery) || 0) + 1);\n }\n\n // In a real implementation, this would persist top patterns to storage\n // Top patterns (sorted by frequency) would be stored here\n }\n\n /**\n * Optimize the index for better performance\n */\n async optimizeIndex(): Promise<void> {\n // Rebuild field indices\n this.fieldIndices.clear();\n this.initializeFieldIndices();\n\n for (const [logId, log] of this.index.entries()) {\n this.updateFieldIndices(logId, log);\n }\n\n this.lastOptimized = new Date();\n }\n\n /**\n * Clear the index\n */\n async clearIndex(): Promise<void> {\n this.index.clear();\n this.fieldIndices.clear();\n this.semanticIndex = undefined;\n this.indexSizeBytes = 0;\n this.logSizeById.clear();\n this.initializeFieldIndices();\n }\n\n /**\n * Get index statistics\n */\n async getIndexStats(): Promise<{\n totalDocuments: number;\n indexSize: number;\n lastOptimized?: Date;\n }> {\n return {\n totalDocuments: this.index.size,\n indexSize: this.calculateIndexSize(),\n ...(this.lastOptimized !== undefined ? { lastOptimized: this.lastOptimized } : {}),\n };\n }\n\n /**\n * Remove logs older than specified time\n */\n async removeOldLogs(olderThan: Date): Promise<number> {\n const cutoffTime = olderThan.getTime();\n let removedCount = 0;\n\n for (const [logId, log] of this.index.entries()) {\n const logTime = new Date(log.timestamp).getTime();\n if (logTime < cutoffTime) {\n this.trackDelete(logId);\n this.removeFromFieldIndices(logId);\n removedCount++;\n }\n }\n\n return removedCount;\n }\n\n /**\n * Search logs by field\n */\n public searchByField(field: string, value: string): LogEntry[] {\n const fieldIndex = this.fieldIndices.get(field);\n if (!fieldIndex) return [];\n\n const logIds = fieldIndex.get(value.toLowerCase());\n if (!logIds) return [];\n\n return Array.from(logIds)\n .map((id) => this.index.get(id))\n .filter((log): log is LogEntry => log !== undefined);\n }\n\n /**\n * Get all indexed logs\n */\n public getAllLogs(): LogEntry[] {\n return Array.from(this.index.values());\n }\n\n // Private helper methods\n\n private initializeFieldIndices(): void {\n const fields = ['level', 'appName', 'traceId', 'context', 'environment'];\n for (const field of fields) {\n this.fieldIndices.set(field, new Map());\n }\n }\n\n private updateFieldIndices(logId: string, log: LogEntry): void {\n // Index level\n this.addToFieldIndex('level', log.level, logId);\n\n // Index appName\n if (log.appName) {\n this.addToFieldIndex('appName', log.appName, logId);\n }\n\n // Index traceId\n if (log.traceId) {\n this.addToFieldIndex('traceId', log.traceId, logId);\n }\n\n // Index context\n if (log.context) {\n this.addToFieldIndex('context', log.context, logId);\n }\n\n // Index environment\n if (log.environment) {\n this.addToFieldIndex('environment', log.environment, logId);\n }\n }\n\n private addToFieldIndex(field: string, value: string, logId: string): void {\n const fieldIndex = this.fieldIndices.get(field);\n if (!fieldIndex) return;\n\n const normalizedValue = value.toLowerCase();\n if (!fieldIndex.has(normalizedValue)) {\n fieldIndex.set(normalizedValue, new Set());\n }\n fieldIndex.get(normalizedValue)!.add(logId);\n }\n\n private removeFromFieldIndices(logId: string): void {\n for (const fieldIndex of this.fieldIndices.values()) {\n for (const logIds of fieldIndex.values()) {\n logIds.delete(logId);\n }\n }\n }\n\n private generateLogId(log: LogEntry): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security log ID suffix\n return `${log.timestamp}_${log.level}_${Math.random().toString(36).slice(2, 11)}`;\n }\n\n private calculateIndexSize(): number {\n // O(1): return the incrementally-maintained running total instead of\n // re-stringifying every entry on each call.\n return this.indexSizeBytes;\n }\n\n /** Insert into the main index and update the running size estimate. */\n private trackInsert(logId: string, log: LogEntry): void {\n // If this id somehow already exists, subtract its old size first.\n const existing = this.logSizeById.get(logId);\n if (existing !== undefined) this.indexSizeBytes -= existing;\n\n const size = JSON.stringify(log).length;\n this.index.set(logId, log);\n this.logSizeById.set(logId, size);\n this.indexSizeBytes += size;\n }\n\n /** Delete from the main index and update the running size estimate. */\n private trackDelete(logId: string): void {\n const size = this.logSizeById.get(logId);\n if (size !== undefined) {\n this.indexSizeBytes -= size;\n this.logSizeById.delete(logId);\n }\n this.index.delete(logId);\n }\n\n private async removeOldestLogs(count: number): Promise<void> {\n const logs = Array.from(this.index.entries())\n .sort((a, b) => new Date(a[1].timestamp).getTime() - new Date(b[1].timestamp).getTime())\n .slice(0, count);\n\n for (const [logId] of logs) {\n this.trackDelete(logId);\n this.removeFromFieldIndices(logId);\n }\n }\n\n private async clusterLogs(logs: LogEntry[]): Promise<LogCluster[]> {\n // Simple clustering based on log patterns\n const clusters = new Map<string, LogEntry[]>();\n\n for (const log of logs) {\n // Create a pattern key based on level and service\n const patternKey = `${log.level}_${log.appName}`;\n\n if (!clusters.has(patternKey)) {\n clusters.set(patternKey, []);\n }\n clusters.get(patternKey)!.push(log);\n }\n\n // Convert to LogCluster format\n return Array.from(clusters.entries()).map(([pattern, clusterLogs], index) => ({\n id: `cluster_${index}`,\n centroid: [], // Would be calculated in a real implementation\n logs: clusterLogs,\n pattern,\n frequency: clusterLogs.length,\n labels: [pattern],\n }));\n }\n}\n","/**\n * Basic search engine implementation with full-text search and filtering\n */\n\nimport type { LogEntry } from '../../types';\nimport { safeToString } from '../../utils/coerce.utils';\nimport type {\n CorrelatedLogs,\n LogCorrelationSummary,\n ParsedNLQuery,\n SearchFilters,\n SearchHighlight,\n SearchOptions,\n SearchPreset,\n SearchResult,\n SearchStats,\n SearchSuggestion,\n SimilarLog,\n TimelineEvent,\n TimeRange,\n} from '../types';\nimport type { ILogSearchEngine } from './search-engine.interface';\n\n/**\n * Basic search engine implementation\n */\nexport class BasicSearchEngine implements ILogSearchEngine {\n private logs: LogEntry[] = [];\n private presets: Map<string, SearchPreset> = new Map();\n private searchHistory: string[] = [];\n private suggestionCache: Map<string, SearchSuggestion[]> = new Map();\n\n constructor(private options?: { maxHistorySize?: number; cacheSize?: number; maxLogs?: number }) {\n this.options = {\n maxHistorySize: 1000,\n cacheSize: 100,\n maxLogs: 100_000,\n ...options,\n };\n }\n\n /**\n * Add logs to the search index.\n *\n * Bounded to `maxLogs` (default 100k): the buffer previously grew without\n * limit, leaking memory in any long-running process feeding it logs. When the\n * cap is exceeded the oldest entries are dropped (FIFO). We also append with a\n * loop rather than `push(...logs)` to avoid a RangeError from spreading a very\n * large array onto the call stack.\n */\n public addLogs(logs: LogEntry[]): void {\n for (const log of logs) this.logs.push(log);\n\n const maxLogs = this.options?.maxLogs ?? 100_000;\n if (this.logs.length > maxLogs) {\n this.logs.splice(0, this.logs.length - maxLogs);\n }\n }\n\n /**\n * Clear all logs from the index\n */\n public clearLogs(): void {\n this.logs = [];\n }\n\n /**\n * Get all indexed logs\n */\n public getLogs(): LogEntry[] {\n return this.logs;\n }\n\n /**\n * Perform a full-text search across logs\n */\n async search(\n query: string,\n filters?: SearchFilters,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n // Apply filters first\n const filteredLogs = this.applyFilters(this.logs, filters);\n\n // Perform text search\n const results = this.performTextSearch(filteredLogs, query, options);\n\n // Add to search history\n this.addToSearchHistory(query);\n\n // Apply sorting\n const sorted = this.applySorting(results, options?.sortBy, options?.sortOrder);\n\n // Apply pagination\n const paginated = this.applyPagination(sorted, options?.offset, options?.limit);\n\n // Add context if requested\n if (options?.includeContext) {\n await this.enrichWithContext(paginated, options.contextSize);\n }\n\n return paginated;\n }\n\n /**\n * Natural language search (basic implementation)\n */\n async naturalLanguageSearch(query: string): Promise<SearchResult[]> {\n const parsed = await this.parseNaturalLanguageQuery(query);\n return this.search(parsed.originalQuery, parsed.filters, {\n semanticSearch: true,\n includeContext: true,\n });\n }\n\n /**\n * Find logs correlated by trace ID\n */\n async correlateByTraceId(traceId: string): Promise<CorrelatedLogs> {\n const correlatedLogs = this.logs.filter((log) => log.traceId === traceId);\n\n // Sort by timestamp\n correlatedLogs.sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n // Build timeline\n const timeline: TimelineEvent[] = correlatedLogs.map((log) => {\n let eventType: TimelineEvent['eventType'] = 'info';\n\n if (log.level === 'error') eventType = 'error';\n else if (log.message.toLowerCase().includes('start')) eventType = 'start';\n else if (\n log.message.toLowerCase().includes('end') ||\n log.message.toLowerCase().includes('complete')\n )\n eventType = 'end';\n else if (log.message.toLowerCase().includes('milestone')) eventType = 'milestone';\n\n return {\n timestamp: new Date(log.timestamp),\n log,\n eventType,\n };\n });\n\n // Generate summary\n const summary: LogCorrelationSummary = {\n totalLogs: correlatedLogs.length,\n errorCount: correlatedLogs.filter((l) => l.level === 'error').length,\n warningCount: correlatedLogs.filter((l) => l.level === 'warn').length,\n services: [...new Set(correlatedLogs.map((l) => l.appName))],\n };\n\n // Calculate duration if we have start and end\n if (timeline.length > 0) {\n const start = timeline[0]!.timestamp.getTime();\n const end = timeline[timeline.length - 1]!.timestamp.getTime();\n summary.duration = end - start;\n }\n\n return {\n traceId,\n correlationKey: traceId,\n logs: correlatedLogs,\n timeline,\n summary,\n };\n }\n\n /**\n * Find similar logs based on content similarity\n */\n async findSimilarLogs(logEntry: LogEntry, limit: number = 10): Promise<SimilarLog[]> {\n const similarities: SimilarLog[] = [];\n\n for (const log of this.logs) {\n if (log === logEntry) continue;\n\n const similarity = this.calculateSimilarity(logEntry, log);\n if (similarity > 0.3) {\n // Threshold for similarity\n similarities.push({\n log,\n similarity,\n matchedPatterns: this.findMatchedPatterns(logEntry, log),\n reason: this.generateSimilarityReason(logEntry, log, similarity),\n });\n }\n }\n\n // Sort by similarity and return top results\n return similarities.sort((a, b) => b.similarity - a.similarity).slice(0, limit);\n }\n\n /**\n * Get search suggestions\n */\n async getSuggestions(partialQuery: string, limit: number = 10): Promise<SearchSuggestion[]> {\n const cacheKey = partialQuery.toLowerCase();\n\n // Check cache\n if (this.suggestionCache.has(cacheKey)) {\n return this.suggestionCache.get(cacheKey)!.slice(0, limit);\n }\n\n const suggestions: SearchSuggestion[] = [];\n\n // Field suggestions\n const fields = ['level', 'appName', 'traceId', 'message', 'timestamp'];\n for (const field of fields) {\n if (field.toLowerCase().includes(partialQuery.toLowerCase())) {\n suggestions.push({\n text: field,\n type: 'field',\n category: 'field',\n });\n }\n }\n\n // Value suggestions from logs\n const values = new Set<string>();\n for (const log of this.logs.slice(-1000)) {\n // Recent logs only\n if (log.level?.toLowerCase().includes(partialQuery.toLowerCase())) {\n values.add(log.level);\n }\n if (log.appName?.toLowerCase().includes(partialQuery.toLowerCase())) {\n values.add(log.appName);\n }\n }\n\n for (const value of values) {\n suggestions.push({\n text: value,\n type: 'value',\n category: 'value',\n });\n }\n\n // History suggestions\n for (const historyItem of this.searchHistory.slice(-50)) {\n if (historyItem.toLowerCase().includes(partialQuery.toLowerCase())) {\n suggestions.push({\n text: historyItem,\n type: 'query_history',\n category: 'history',\n });\n }\n }\n\n // Cache suggestions\n this.suggestionCache.set(cacheKey, suggestions);\n\n // Trim cache if too large\n if (this.suggestionCache.size > (this.options?.cacheSize || 100)) {\n const firstKey = this.suggestionCache.keys().next().value as string | undefined;\n if (firstKey !== undefined) this.suggestionCache.delete(firstKey);\n }\n\n return suggestions.slice(0, limit);\n }\n\n /**\n * Get search statistics\n */\n async getStats(): Promise<SearchStats> {\n return {\n totalResults: this.logs.length,\n executionTime: 0,\n indexSize: this.logs.length,\n topTerms: this.getTopTerms(),\n };\n }\n\n /**\n * Parse natural language query\n */\n async parseNaturalLanguageQuery(query: string): Promise<ParsedNLQuery> {\n const filters: SearchFilters = {};\n const lowerQuery = query.toLowerCase();\n\n // Extract levels\n const levels: string[] = [];\n if (lowerQuery.includes('error')) levels.push('error');\n if (lowerQuery.includes('warn')) levels.push('warn');\n if (lowerQuery.includes('info')) levels.push('info');\n if (levels.length > 0) filters.levels = levels;\n\n // Extract time range\n const timeRange = this.extractTimeRange(query);\n if (timeRange) filters.timeRange = timeRange;\n\n // Extract service names (basic pattern matching)\n const serviceMatch = query.match(/from\\s+(?:the\\s+)?(\\w+)\\s+service/i);\n if (serviceMatch?.[1]) {\n filters.services = [serviceMatch[1]];\n }\n\n // Extract user ID\n const userMatch = query.match(/user\\s+(?:id\\s+)?(\\w+)/i);\n if (userMatch?.[1]) {\n filters.userIds = [userMatch[1]];\n }\n\n // Determine intent\n let intent: ParsedNLQuery['intent'] = 'general_search';\n if (lowerQuery.includes('error')) intent = 'find_errors';\n if (lowerQuery.includes('trace') || lowerQuery.includes('request')) intent = 'trace_request';\n if (lowerQuery.includes('user')) intent = 'find_user_activity';\n if (lowerQuery.includes('slow') || lowerQuery.includes('performance'))\n intent = 'performance_analysis';\n\n return {\n originalQuery: query,\n intent,\n entities: [],\n filters,\n confidence: 0.7,\n };\n }\n\n /**\n * Save a search preset\n */\n async savePreset(\n preset: Omit<SearchPreset, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<SearchPreset> {\n const id = this.generateId();\n const now = new Date();\n\n const fullPreset: SearchPreset = {\n ...preset,\n id,\n createdAt: now,\n updatedAt: now,\n };\n\n this.presets.set(id, fullPreset);\n return fullPreset;\n }\n\n /**\n * Get saved presets\n */\n async getPresets(userId?: string): Promise<SearchPreset[]> {\n const allPresets = Array.from(this.presets.values());\n\n if (userId) {\n return allPresets.filter((p) => p.userId === userId || p.shared);\n }\n\n return allPresets;\n }\n\n /**\n * Delete a preset\n */\n async deletePreset(presetId: string): Promise<void> {\n this.presets.delete(presetId);\n }\n\n // Private helper methods\n\n private applyFilters(logs: LogEntry[], filters?: SearchFilters): LogEntry[] {\n if (!filters) return logs;\n\n return logs.filter((log) => {\n // Level filter\n if (filters.levels && !filters.levels.includes(log.level)) {\n return false;\n }\n\n // Service filter\n if (filters.services && !filters.services.includes(log.appName)) {\n return false;\n }\n\n // Trace ID filter\n if (filters.traceIds && log.traceId && !filters.traceIds.includes(log.traceId)) {\n return false;\n }\n\n // Time range filter\n if (filters.timeRange) {\n const logTime = new Date(log.timestamp).getTime();\n const start =\n typeof filters.timeRange.start === 'number'\n ? filters.timeRange.start\n : filters.timeRange.start.getTime();\n\n if (logTime < start) return false;\n\n if (filters.timeRange.end) {\n const end =\n typeof filters.timeRange.end === 'number'\n ? filters.timeRange.end\n : filters.timeRange.end.getTime();\n if (logTime > end) return false;\n }\n }\n\n // Error filter\n if (filters.hasError !== undefined) {\n const hasError = log.level === 'error' || !!log.error;\n if (filters.hasError !== hasError) return false;\n }\n\n // Context filter\n if (filters.contexts && log.context && !filters.contexts.includes(log.context)) {\n return false;\n }\n\n return true;\n });\n }\n\n private performTextSearch(\n logs: LogEntry[],\n query: string,\n options?: SearchOptions\n ): SearchResult[] {\n if (!query) {\n return logs.map((log) => ({ log, score: 1 }));\n }\n\n const queryTerms = query.toLowerCase().split(/\\s+/);\n const results: SearchResult[] = [];\n\n for (const log of logs) {\n const searchableText = this.getSearchableText(log).toLowerCase();\n let score = 0;\n const highlights: SearchHighlight[] = [];\n const matchedTerms: string[] = [];\n\n for (const term of queryTerms) {\n if (searchableText.includes(term)) {\n score += 1;\n matchedTerms.push(term);\n }\n }\n\n if (score > 0) {\n // Add highlights if requested\n if (options?.highlightMatches) {\n highlights.push({\n field: 'message',\n fragments: this.getHighlightFragments(log.message, matchedTerms),\n matchedTerms,\n });\n }\n\n const result: { log: typeof log; score: number; highlights?: typeof highlights } = {\n log,\n score: score / queryTerms.length, // Normalize score\n };\n if (highlights.length > 0) result.highlights = highlights;\n results.push(result as Parameters<typeof results.push>[0]);\n }\n }\n\n return results;\n }\n\n private getSearchableText(log: LogEntry): string {\n // safeToString is circular-safe — a stored log with a cyclic payload (an\n // Express req/res, a DB handle) would otherwise make JSON.stringify throw and\n // crash the ENTIRE search, since this runs for every candidate log.\n const payloadText = log.payload ? safeToString(log.payload) : '';\n return [log.message, log.level, log.appName, log.context, payloadText]\n .filter(Boolean)\n .join(' ');\n }\n\n private getHighlightFragments(text: string, terms: string[]): string[] {\n const fragments: string[] = [];\n const lowerText = text.toLowerCase();\n\n for (const term of terms) {\n const index = lowerText.indexOf(term);\n if (index !== -1) {\n const start = Math.max(0, index - 30);\n const end = Math.min(text.length, index + term.length + 30);\n fragments.push(text.slice(start, end));\n }\n }\n\n return fragments;\n }\n\n private applySorting(\n results: SearchResult[],\n sortBy?: string,\n sortOrder: 'asc' | 'desc' = 'desc'\n ): SearchResult[] {\n const sorted = [...results];\n\n sorted.sort((a, b) => {\n let comparison: number;\n\n switch (sortBy) {\n case 'timestamp':\n comparison = new Date(a.log.timestamp).getTime() - new Date(b.log.timestamp).getTime();\n break;\n case 'level':\n comparison = a.log.level.localeCompare(b.log.level);\n break;\n case 'score':\n case 'relevance':\n default:\n comparison = a.score - b.score;\n break;\n }\n\n return sortOrder === 'asc' ? comparison : -comparison;\n });\n\n return sorted;\n }\n\n private applyPagination(\n results: SearchResult[],\n offset: number = 0,\n limit: number = 100\n ): SearchResult[] {\n return results.slice(offset, offset + limit);\n }\n\n private async enrichWithContext(results: SearchResult[], contextSize: number = 5): Promise<void> {\n for (const result of results) {\n const logIndex = this.logs.indexOf(result.log);\n if (logIndex !== -1) {\n const start = Math.max(0, logIndex - contextSize);\n const end = Math.min(this.logs.length, logIndex + contextSize + 1);\n result.context = this.logs.slice(start, end).filter((l) => l !== result.log);\n }\n }\n }\n\n private calculateSimilarity(log1: LogEntry, log2: LogEntry): number {\n let score = 0;\n let factors = 0;\n\n // Same level\n if (log1.level === log2.level) {\n score += 0.3;\n }\n factors++;\n\n // Same service\n if (log1.appName === log2.appName) {\n score += 0.2;\n }\n factors++;\n\n // Same trace\n if (log1.traceId && log1.traceId === log2.traceId) {\n score += 0.3;\n }\n factors++;\n\n // Message similarity\n const messageSimilarity = this.calculateTextSimilarity(log1.message, log2.message);\n score += messageSimilarity * 0.2;\n factors++;\n\n return score / factors;\n }\n\n private calculateTextSimilarity(text1: string, text2: string): number {\n const words1 = new Set(text1.toLowerCase().split(/\\s+/));\n const words2 = new Set(text2.toLowerCase().split(/\\s+/));\n\n const intersection = new Set([...words1].filter((x) => words2.has(x)));\n const union = new Set([...words1, ...words2]);\n\n return union.size > 0 ? intersection.size / union.size : 0;\n }\n\n private findMatchedPatterns(log1: LogEntry, log2: LogEntry): string[] {\n const patterns: string[] = [];\n\n if (log1.level === log2.level) patterns.push('same_level');\n if (log1.appName === log2.appName) patterns.push('same_service');\n if (log1.traceId === log2.traceId) patterns.push('same_trace');\n if (log1.context === log2.context) patterns.push('same_context');\n\n return patterns;\n }\n\n private generateSimilarityReason(log1: LogEntry, log2: LogEntry, similarity: number): string {\n const reasons: string[] = [];\n\n if (log1.level === log2.level) reasons.push('same log level');\n if (log1.appName === log2.appName) reasons.push('same service');\n if (log1.traceId === log2.traceId) reasons.push('same trace ID');\n\n return reasons.length > 0\n ? `Similar because: ${reasons.join(', ')}`\n : `${Math.round(similarity * 100)}% content similarity`;\n }\n\n private extractTimeRange(query: string): TimeRange | undefined {\n const lowerQuery = query.toLowerCase();\n\n // Last hour\n if (lowerQuery.includes('last hour') || lowerQuery.includes('past hour')) {\n return {\n start: new Date(Date.now() - 60 * 60 * 1000),\n };\n }\n\n // Last N hours\n const hoursMatch = query.match(/last\\s+(\\d+)\\s+hours?/i);\n if (hoursMatch) {\n return {\n start: new Date(Date.now() - Number.parseInt(hoursMatch[1] ?? '0') * 60 * 60 * 1000),\n };\n }\n\n // Today\n if (lowerQuery.includes('today')) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return {\n start: today,\n };\n }\n\n return undefined;\n }\n\n private addToSearchHistory(query: string): void {\n this.searchHistory.push(query);\n\n // Trim history if too large\n const maxSize = this.options?.maxHistorySize || 1000;\n if (this.searchHistory.length > maxSize) {\n this.searchHistory = this.searchHistory.slice(-maxSize);\n }\n }\n\n private getTopTerms(): string[] {\n const termCounts = new Map<string, number>();\n\n for (const log of this.logs.slice(-1000)) {\n const words = log.message.toLowerCase().split(/\\s+/);\n for (const word of words) {\n if (word.length > 3) {\n // Ignore short words\n termCounts.set(word, (termCounts.get(word) || 0) + 1);\n }\n }\n }\n\n return Array.from(termCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([term]) => term);\n }\n\n private generateId(): string {\n // eslint-disable-next-line sonarjs/pseudo-random -- non-security preset ID generation\n return `preset_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n }\n}\n","/**\n * Correlation engine for finding relationships between log entries\n */\n\nimport type { LogEntry } from '../../types';\nimport type {\n CorrelatedLogs,\n LogCorrelationSummary,\n RelatedLog,\n RelationshipType,\n TimelineEvent,\n} from '../types';\n\n/**\n * Correlation engine for log analysis\n */\nexport class CorrelationEngine {\n constructor(\n private options?: {\n maxCorrelationDistance?: number;\n temporalWindowMs?: number;\n minSimilarityScore?: number;\n }\n ) {\n this.options = {\n maxCorrelationDistance: 100,\n temporalWindowMs: 5 * 60 * 1000, // 5 minutes\n minSimilarityScore: 0.3,\n ...options,\n };\n }\n\n /**\n * Find logs related to a given log entry\n */\n async findRelatedLogs(\n log: LogEntry,\n allLogs: LogEntry[],\n limit: number = 50\n ): Promise<RelatedLog[]> {\n const related: RelatedLog[] = [];\n\n for (const otherLog of allLogs) {\n if (otherLog === log) continue;\n\n const relationships = this.findRelationships(log, otherLog);\n\n for (const relationship of relationships) {\n const score = this.calculateRelationshipScore(relationship, log, otherLog);\n\n if (score > (this.options?.minSimilarityScore || 0.3)) {\n related.push({\n log: otherLog,\n relationship,\n score,\n });\n }\n }\n }\n\n // Deduplicate and sort by score\n const uniqueRelated = this.deduplicateRelatedLogs(related);\n return uniqueRelated.sort((a, b) => b.score - a.score).slice(0, limit);\n }\n\n /**\n * Correlate logs by multiple criteria\n */\n async correlateByMultipleCriteria(\n logs: LogEntry[],\n criteria: {\n traceId?: boolean;\n userId?: boolean;\n sessionId?: boolean;\n temporal?: boolean;\n errorCascade?: boolean;\n }\n ): Promise<Map<string, CorrelatedLogs>> {\n const correlations = new Map<string, CorrelatedLogs>();\n\n // Correlate by trace ID\n if (criteria.traceId) {\n const traceCorrelations = this.correlateByTraceId(logs);\n for (const [key, value] of traceCorrelations) {\n correlations.set(`trace_${key}`, value);\n }\n }\n\n // Correlate by user ID\n if (criteria.userId) {\n const userCorrelations = this.correlateByUserId(logs);\n for (const [key, value] of userCorrelations) {\n correlations.set(`user_${key}`, value);\n }\n }\n\n // Correlate by session ID\n if (criteria.sessionId) {\n const sessionCorrelations = this.correlateBySessionId(logs);\n for (const [key, value] of sessionCorrelations) {\n correlations.set(`session_${key}`, value);\n }\n }\n\n // Correlate by temporal proximity\n if (criteria.temporal) {\n const temporalCorrelations = this.correlateByTemporalProximity(logs);\n for (const [key, value] of temporalCorrelations) {\n correlations.set(`temporal_${key}`, value);\n }\n }\n\n // Correlate error cascades\n if (criteria.errorCascade) {\n const errorCorrelations = this.correlateErrorCascades(logs);\n for (const [key, value] of errorCorrelations) {\n correlations.set(`error_${key}`, value);\n }\n }\n\n return correlations;\n }\n\n /**\n * Build a timeline from correlated logs\n */\n buildTimeline(logs: LogEntry[]): TimelineEvent[] {\n const timeline: TimelineEvent[] = [];\n\n // Sort logs by timestamp\n const sortedLogs = [...logs].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n for (let i = 0; i < sortedLogs.length; i++) {\n const log = sortedLogs[i] as LogEntry; // noUncheckedIndexedAccess: guarded by loop condition\n const eventType = this.determineEventType(log, sortedLogs, i);\n\n const event: TimelineEvent = {\n timestamp: new Date(log.timestamp),\n log,\n eventType,\n };\n\n // Calculate duration for start/end events\n if (eventType === 'start' && i < sortedLogs.length - 1) {\n const endEvent = sortedLogs\n .slice(i + 1)\n .find((l) => this.determineEventType(l, sortedLogs, sortedLogs.indexOf(l)) === 'end');\n\n if (endEvent) {\n event.duration =\n new Date(endEvent.timestamp).getTime() - new Date(log.timestamp).getTime();\n }\n }\n\n timeline.push(event);\n }\n\n return timeline;\n }\n\n /**\n * Analyze error cascades\n */\n async analyzeErrorCascade(\n logs: LogEntry[]\n ): Promise<{ rootCause?: LogEntry; cascade: LogEntry[]; impactedServices: string[] }> {\n const errors = logs.filter((log) => log.level === 'error');\n\n if (errors.length === 0) {\n return { cascade: [], impactedServices: [] };\n }\n\n // Find root cause (earliest error)\n const rootCause = errors.reduce((earliest, current) =>\n new Date(current.timestamp) < new Date(earliest.timestamp) ? current : earliest\n );\n\n // Build cascade\n const cascade = this.buildErrorCascade(rootCause, errors);\n\n // Get impacted services\n const impactedServices = [...new Set(cascade.map((log) => log.appName))];\n\n return {\n rootCause,\n cascade,\n impactedServices,\n };\n }\n\n // Private methods\n\n private correlateByTraceId(logs: LogEntry[]): Map<string, CorrelatedLogs> {\n const correlations = new Map<string, LogEntry[]>();\n\n for (const log of logs) {\n if (!log.traceId) continue;\n\n if (!correlations.has(log.traceId)) {\n correlations.set(log.traceId, []);\n }\n correlations.get(log.traceId)!.push(log);\n }\n\n return this.convertToCorrelatedLogs(correlations, 'trace');\n }\n\n private correlateByUserId(logs: LogEntry[]): Map<string, CorrelatedLogs> {\n const correlations = new Map<string, LogEntry[]>();\n\n for (const log of logs) {\n const userId = log.payload?.userId as string | undefined;\n if (!userId) continue;\n\n if (!correlations.has(userId)) {\n correlations.set(userId, []);\n }\n correlations.get(userId)!.push(log);\n }\n\n return this.convertToCorrelatedLogs(correlations, 'user');\n }\n\n private correlateBySessionId(logs: LogEntry[]): Map<string, CorrelatedLogs> {\n const correlations = new Map<string, LogEntry[]>();\n\n for (const log of logs) {\n const sessionId = log.payload?.sessionId as string | undefined;\n if (!sessionId) continue;\n\n if (!correlations.has(sessionId)) {\n correlations.set(sessionId, []);\n }\n correlations.get(sessionId)!.push(log);\n }\n\n return this.convertToCorrelatedLogs(correlations, 'session');\n }\n\n private correlateByTemporalProximity(logs: LogEntry[]): Map<string, CorrelatedLogs> {\n const correlations = new Map<string, LogEntry[]>();\n const sortedLogs = [...logs].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n let currentGroup: LogEntry[] = [];\n let groupStartTime: number | null = null;\n\n for (const log of sortedLogs) {\n const logTime = new Date(log.timestamp).getTime();\n\n if (groupStartTime === null) {\n groupStartTime = logTime;\n currentGroup = [log];\n } else if (logTime - groupStartTime <= (this.options?.temporalWindowMs || 300000)) {\n currentGroup.push(log);\n } else {\n // Save current group\n if (currentGroup.length > 1) {\n const groupKey = `${groupStartTime}`;\n correlations.set(groupKey, currentGroup);\n }\n\n // Start new group\n groupStartTime = logTime;\n currentGroup = [log];\n }\n }\n\n // Save last group\n if (currentGroup.length > 1 && groupStartTime !== null) {\n correlations.set(`${groupStartTime}`, currentGroup);\n }\n\n return this.convertToCorrelatedLogs(correlations, 'temporal');\n }\n\n private correlateErrorCascades(logs: LogEntry[]): Map<string, CorrelatedLogs> {\n const correlations = new Map<string, LogEntry[]>();\n const errors = logs.filter((log) => log.level === 'error');\n\n for (const error of errors) {\n const cascade = this.buildErrorCascade(error, logs);\n\n if (cascade.length > 1) {\n const key = `${error.timestamp}_${error.message.slice(0, 20)}`;\n correlations.set(key, cascade);\n }\n }\n\n return this.convertToCorrelatedLogs(correlations, 'error_cascade');\n }\n\n private buildErrorCascade(rootError: LogEntry, allLogs: LogEntry[]): LogEntry[] {\n const cascade: LogEntry[] = [rootError];\n const rootTime = new Date(rootError.timestamp).getTime();\n const windowMs = this.options?.temporalWindowMs || 300000;\n\n // Find related errors within time window\n for (const log of allLogs) {\n if (log === rootError) continue;\n\n const logTime = new Date(log.timestamp).getTime();\n const timeDiff = logTime - rootTime;\n\n if (\n timeDiff > 0 &&\n timeDiff <= windowMs &&\n (log.level === 'error' || log.level === 'warn') &&\n (log.traceId === rootError.traceId || log.appName === rootError.appName)\n ) {\n cascade.push(log);\n }\n }\n\n return cascade.sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n }\n\n private findRelationships(log1: LogEntry, log2: LogEntry): RelationshipType[] {\n const relationships: RelationshipType[] = [];\n\n // Same trace\n if (log1.traceId && log1.traceId === log2.traceId) {\n relationships.push('same_trace');\n }\n\n // Same user\n const user1 = log1.payload?.userId;\n const user2 = log2.payload?.userId;\n if (user1 && user1 === user2) {\n relationships.push('same_user');\n }\n\n // Same session\n const session1 = log1.payload?.sessionId;\n const session2 = log2.payload?.sessionId;\n if (session1 && session1 === session2) {\n relationships.push('same_session');\n }\n\n // Temporal proximity\n const time1 = new Date(log1.timestamp).getTime();\n const time2 = new Date(log2.timestamp).getTime();\n if (Math.abs(time1 - time2) <= (this.options?.temporalWindowMs || 300000)) {\n relationships.push('temporal_proximity');\n }\n\n // Error cascade\n if (\n (log1.level === 'error' || log2.level === 'error') &&\n time2 > time1 &&\n time2 - time1 <= (this.options?.temporalWindowMs || 300000)\n ) {\n relationships.push('error_cascade');\n }\n\n // Similar pattern\n if (this.haveSimilarPattern(log1, log2)) {\n relationships.push('similar_pattern');\n }\n\n return relationships;\n }\n\n private calculateRelationshipScore(\n relationship: RelationshipType,\n log1: LogEntry,\n log2: LogEntry\n ): number {\n const weights: Record<RelationshipType, number> = {\n same_trace: 0.9,\n same_user: 0.7,\n same_session: 0.8,\n temporal_proximity: 0.4,\n error_cascade: 0.8,\n similar_pattern: 0.5,\n };\n\n let score = weights[relationship] || 0.3;\n\n // Boost score for same service\n if (log1.appName === log2.appName) {\n score += 0.1;\n }\n\n return Math.min(score, 1.0);\n }\n\n private haveSimilarPattern(log1: LogEntry, log2: LogEntry): boolean {\n const normalized1 = this.normalizeMessage(log1.message);\n const normalized2 = this.normalizeMessage(log2.message);\n\n return normalized1 === normalized2;\n }\n\n private normalizeMessage(message: string): string {\n return message\n .replace(/\\d+/g, '<NUM>')\n .replace(/[a-f0-9-]{36}/gi, '<UUID>')\n .toLowerCase()\n .trim();\n }\n\n private determineEventType(\n log: LogEntry,\n _allLogs: LogEntry[],\n _index: number\n ): TimelineEvent['eventType'] {\n const message = log.message.toLowerCase();\n\n if (message.includes('start') || message.includes('begin') || message.includes('initiated')) {\n return 'start';\n }\n\n if (message.includes('end') || message.includes('complete') || message.includes('finished')) {\n return 'end';\n }\n\n if (log.level === 'error') {\n return 'error';\n }\n\n if (message.includes('milestone') || message.includes('checkpoint')) {\n return 'milestone';\n }\n\n return 'info';\n }\n\n private deduplicateRelatedLogs(related: RelatedLog[]): RelatedLog[] {\n const seen = new Set<LogEntry>();\n const unique: RelatedLog[] = [];\n\n for (const item of related) {\n if (!seen.has(item.log)) {\n seen.add(item.log);\n unique.push(item);\n }\n }\n\n return unique;\n }\n\n private convertToCorrelatedLogs(\n correlations: Map<string, LogEntry[]>,\n type: string\n ): Map<string, CorrelatedLogs> {\n const result = new Map<string, CorrelatedLogs>();\n\n for (const [key, logs] of correlations.entries()) {\n if (logs.length < 2) continue; // Skip single log entries\n\n const timeline = this.buildTimeline(logs);\n const summary = this.generateSummary(logs);\n\n result.set(key, {\n correlationKey: key,\n ...(type === 'trace' ? { traceId: key } : {}),\n logs,\n timeline,\n summary,\n });\n }\n\n return result;\n }\n\n private generateSummary(logs: LogEntry[]): LogCorrelationSummary {\n const errorCount = logs.filter((l) => l.level === 'error').length;\n const warningCount = logs.filter((l) => l.level === 'warn').length;\n const services = [...new Set(logs.map((l) => l.appName))];\n\n // Calculate duration\n let duration: number | undefined;\n if (logs.length > 1) {\n const sorted = [...logs].sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n const start = new Date((sorted[0] as LogEntry).timestamp).getTime();\n const end = new Date((sorted[sorted.length - 1] as LogEntry).timestamp).getTime();\n duration = end - start;\n }\n\n return {\n totalLogs: logs.length,\n errorCount,\n warningCount,\n services,\n ...(duration !== undefined ? { duration } : {}),\n };\n }\n}\n","/**\n * Advanced search engine with Natural Language Processing capabilities\n */\n\nimport { BasicSearchEngine } from '../core/basic-search-engine';\nimport type {\n EntityType,\n ParsedNLQuery,\n QueryEntity,\n QueryIntent,\n SearchFilters,\n SearchOptions,\n SearchResult,\n TimeRange,\n} from '../types';\n\n/**\n * NLP-enhanced search engine\n */\nexport class NLPSearchEngine extends BasicSearchEngine {\n private intentPatterns!: Map<QueryIntent, RegExp[]>;\n private entityPatterns!: Map<EntityType, RegExp>;\n\n constructor(options?: Record<string, unknown>) {\n super(options);\n this.initializePatterns();\n }\n\n /**\n * Enhanced natural language query parsing\n */\n override async parseNaturalLanguageQuery(query: string): Promise<ParsedNLQuery> {\n const entities: QueryEntity[] = [];\n const filters: SearchFilters = {};\n\n // Detect intent\n const intent = this.detectIntent(query);\n\n // Extract entities\n const extractedEntities = this.extractEntities(query);\n entities.push(...extractedEntities);\n\n // Build filters from entities\n for (const entity of entities) {\n this.applyEntityToFilter(entity, filters);\n }\n\n // Extract time range\n const timeRange = this.extractAdvancedTimeRange(query);\n if (timeRange) {\n filters.timeRange = timeRange;\n }\n\n // Calculate confidence\n const confidence = this.calculateConfidence(intent, entities, query);\n\n return {\n originalQuery: query,\n intent,\n entities,\n filters,\n ...(timeRange !== undefined ? { timeRange } : {}),\n confidence,\n };\n }\n\n /**\n * Enhanced natural language search\n */\n override async naturalLanguageSearch(query: string): Promise<SearchResult[]> {\n const parsed = await this.parseNaturalLanguageQuery(query);\n\n // Adjust search options based on intent\n const options: SearchOptions = this.getOptionsForIntent(parsed.intent);\n\n // Extract clean search query (remove filter terms)\n const cleanQuery = this.extractCleanQuery(query, parsed.entities);\n\n return this.search(cleanQuery, parsed.filters, options);\n }\n\n // Private methods\n\n private initializePatterns(): void {\n // Initialize intent patterns\n this.intentPatterns = new Map([\n [\n 'find_errors',\n [\n /show.*errors?/i,\n /find.*errors?/i,\n /all.*errors?/i,\n /errors?\\s+(?:in|from|for)/i,\n /what.*went wrong/i,\n /failures?/i,\n ],\n ],\n [\n 'trace_request',\n [\n /trace\\s+(?:request|id)/i,\n /follow\\s+request/i,\n /track\\s+request/i,\n /request\\s+(?:flow|path)/i,\n /trace.*across/i,\n ],\n ],\n [\n 'find_user_activity',\n [\n /user\\s+(?:\\w+|id)/i,\n /activity\\s+(?:for|of)\\s+user/i,\n /what\\s+did\\s+user/i,\n /user\\s+journey/i,\n /user\\s+session/i,\n ],\n ],\n [\n 'performance_analysis',\n [\n /slow\\s+(?:queries?|requests?|operations?)/i,\n /performance\\s+issues?/i,\n /latency/i,\n /response\\s+time/i,\n /took\\s+(?:too\\s+)?long/i,\n ],\n ],\n [\n 'time_range_query',\n [\n /(?:in|during|from)\\s+the\\s+last/i,\n /(?:today|yesterday|this\\s+week)/i,\n /between.*and/i,\n /in\\s+the\\s+past/i,\n ],\n ],\n [\n 'correlation',\n [\n /related\\s+to/i,\n /connected\\s+with/i,\n /caused\\s+by/i,\n /before.*happened/i,\n /after.*occurred/i,\n ],\n ],\n ]);\n\n // Initialize entity patterns\n this.entityPatterns = new Map([\n ['level', /(error|warn|warning|info|debug|trace|verbose)/i],\n ['service', /(?:from|in)\\s+(?:the\\s+)?(\\w+)\\s+(?:service|app|application)/i],\n ['user_id', /user\\s+(?:id\\s+)?['\"]?(\\w+)['\"]?/i],\n ['trace_id', /trace\\s+(?:id\\s+)?['\"]?([\\w-]+)['\"]?/i],\n ['time', /(?:last|past|previous)\\s+(\\d+)\\s+(second|minute|hour|day|week)s?/i],\n // eslint-disable-next-line sonarjs/super-linear-regex -- bounded pattern, DoS risk is acceptable for log search\n ['error_type', /(\\w+Error|\\w+Exception)/i],\n ]);\n }\n\n private detectIntent(query: string): QueryIntent {\n let maxScore = 0;\n let detectedIntent: QueryIntent = 'general_search';\n\n for (const [intent, patterns] of this.intentPatterns.entries()) {\n let score = 0;\n for (const pattern of patterns) {\n if (pattern.test(query)) {\n score++;\n }\n }\n\n if (score > maxScore) {\n maxScore = score;\n detectedIntent = intent;\n }\n }\n\n return detectedIntent;\n }\n\n private extractEntities(query: string): QueryEntity[] {\n const entities: QueryEntity[] = [];\n\n for (const [type, pattern] of this.entityPatterns.entries()) {\n const matches = query.matchAll(new RegExp(pattern, 'gi'));\n\n for (const match of matches) {\n const value = match[1] || match[0];\n entities.push({\n type,\n value: value.trim(),\n confidence: 0.8,\n });\n }\n }\n\n return entities;\n }\n\n private applyEntityToFilter(entity: QueryEntity, filters: SearchFilters): void {\n switch (entity.type) {\n case 'level':\n if (!filters.levels) filters.levels = [];\n filters.levels.push(entity.value.toLowerCase());\n break;\n\n case 'service':\n if (!filters.services) filters.services = [];\n filters.services.push(entity.value);\n break;\n\n case 'user_id':\n if (!filters.userIds) filters.userIds = [];\n filters.userIds.push(entity.value);\n break;\n\n case 'trace_id':\n if (!filters.traceIds) filters.traceIds = [];\n filters.traceIds.push(entity.value);\n break;\n\n case 'error_type':\n // Could be used for more specific filtering\n break;\n }\n }\n\n private extractAdvancedTimeRange(query: string): TimeRange | undefined {\n const lowerQuery = query.toLowerCase();\n\n // Relative time patterns\n const relativePatterns = [\n { pattern: /last\\s+(\\d+)\\s+second/i, unit: 'seconds' as const },\n { pattern: /last\\s+(\\d+)\\s+minute/i, unit: 'minutes' as const },\n { pattern: /last\\s+(\\d+)\\s+hour/i, unit: 'hours' as const },\n { pattern: /last\\s+(\\d+)\\s+day/i, unit: 'days' as const },\n ];\n\n for (const { pattern, unit } of relativePatterns) {\n const match = query.match(pattern);\n if (match) {\n const value = Number.parseInt(match[1] ?? '0');\n const multiplier = {\n seconds: 1000,\n minutes: 60 * 1000,\n hours: 60 * 60 * 1000,\n days: 24 * 60 * 60 * 1000,\n }[unit];\n\n return {\n start: new Date(Date.now() - value * multiplier),\n relative: { value, unit },\n };\n }\n }\n\n // Named time ranges\n if (lowerQuery.includes('today')) {\n const today = new Date();\n today.setHours(0, 0, 0, 0);\n return { start: today };\n }\n\n if (lowerQuery.includes('yesterday')) {\n const yesterday = new Date();\n yesterday.setDate(yesterday.getDate() - 1);\n yesterday.setHours(0, 0, 0, 0);\n const endOfYesterday = new Date(yesterday);\n endOfYesterday.setHours(23, 59, 59, 999);\n return { start: yesterday, end: endOfYesterday };\n }\n\n if (lowerQuery.includes('this week')) {\n const now = new Date();\n const startOfWeek = new Date(now);\n startOfWeek.setDate(now.getDate() - now.getDay());\n startOfWeek.setHours(0, 0, 0, 0);\n return { start: startOfWeek };\n }\n\n return undefined;\n }\n\n private calculateConfidence(intent: QueryIntent, entities: QueryEntity[], query: string): number {\n let confidence = 0.5; // Base confidence\n\n // Boost confidence for specific intents\n if (intent !== 'general_search') {\n confidence += 0.2;\n }\n\n // Boost for number of entities found\n confidence += Math.min(entities.length * 0.1, 0.3);\n\n // Reduce confidence for very short or very long queries\n const wordCount = query.split(/\\s+/).length;\n if (wordCount < 3 || wordCount > 20) {\n confidence -= 0.1;\n }\n\n return Math.max(0, Math.min(1, confidence));\n }\n\n private getOptionsForIntent(intent: QueryIntent): SearchOptions {\n const baseOptions: SearchOptions = {\n limit: 100,\n highlightMatches: true,\n };\n\n switch (intent) {\n case 'find_errors':\n return {\n ...baseOptions,\n includeContext: true,\n contextSize: 3,\n findSimilar: true,\n };\n\n case 'trace_request':\n return {\n ...baseOptions,\n includeContext: true,\n contextSize: 10,\n correlate: true,\n sortBy: 'timestamp',\n sortOrder: 'asc',\n };\n\n case 'find_user_activity':\n return {\n ...baseOptions,\n includeContext: true,\n sortBy: 'timestamp',\n sortOrder: 'asc',\n limit: 200,\n };\n\n case 'performance_analysis':\n return {\n ...baseOptions,\n includeContext: true,\n contextSize: 5,\n sortBy: 'timestamp',\n };\n\n case 'correlation':\n return {\n ...baseOptions,\n includeContext: true,\n contextSize: 5,\n correlate: true,\n findSimilar: true,\n };\n\n default:\n return baseOptions;\n }\n }\n\n private extractCleanQuery(query: string, entities: QueryEntity[]): string {\n let cleanQuery = query;\n\n // Remove entity text from query\n for (const entity of entities) {\n // Remove common patterns\n cleanQuery = cleanQuery.replace(new RegExp(`\\\\b${entity.value}\\\\b`, 'gi'), '');\n }\n\n // Remove common filter words\n const filterWords = [\n 'show',\n 'find',\n 'get',\n 'all',\n 'from',\n 'in',\n 'the',\n 'for',\n 'with',\n 'last',\n 'past',\n 'today',\n 'yesterday',\n 'service',\n 'user',\n 'trace',\n 'error',\n 'errors',\n ];\n\n for (const word of filterWords) {\n cleanQuery = cleanQuery.replace(new RegExp(`\\\\b${word}\\\\b`, 'gi'), '');\n }\n\n // Clean up extra whitespace\n cleanQuery = cleanQuery.replace(/\\s+/g, ' ').trim();\n\n return cleanQuery || query; // Fall back to original if nothing left\n }\n}\n","/**\n * Pattern recognition engine for detecting and analyzing log patterns\n */\n\nimport type { LogEntry } from '../../types';\nimport type { AnomalyDetection, LogPattern } from '../types';\n\nconst STACK_FRAME_TAIL = /:\\d+:\\d+\\)?$/;\n\n/** True when any line is a real stack frame, e.g. ` at fn (/app/file.js:10:5)`. */\nfunction hasStackFrame(message: string): boolean {\n return message.split('\\n').some((line) => {\n const t = line.trim();\n return t.startsWith('at ') && STACK_FRAME_TAIL.test(t);\n });\n}\n\n/**\n * Pattern recognition engine for log analysis\n */\nexport class PatternRecognitionEngine {\n private patterns: Map<string, LogPattern> = new Map();\n private patternFrequencies: Map<string, number> = new Map();\n\n constructor(\n private options?: {\n minFrequency?: number;\n maxPatterns?: number;\n anomalyThreshold?: number;\n }\n ) {\n this.options = {\n minFrequency: 3,\n maxPatterns: 1000,\n anomalyThreshold: 0.3,\n ...options,\n };\n }\n\n /**\n * Analyze logs and detect patterns\n */\n async analyzePatterns(logs: LogEntry[]): Promise<LogPattern[]> {\n // Extract patterns from log messages\n const messagePatterns = this.extractMessagePatterns(logs);\n\n // Extract error patterns\n const errorPatterns = this.extractErrorPatterns(logs);\n\n // Extract timing patterns\n const timingPatterns = this.extractTimingPatterns(logs);\n\n // Combine all patterns\n const allPatterns = [...messagePatterns, ...errorPatterns, ...timingPatterns];\n\n // Filter by frequency\n const frequentPatterns = allPatterns.filter(\n (p) => p.frequency >= (this.options?.minFrequency || 3)\n );\n\n // Sort by frequency\n frequentPatterns.sort((a, b) => b.frequency - a.frequency);\n\n // Limit number of patterns\n const limitedPatterns = frequentPatterns.slice(0, this.options?.maxPatterns || 1000);\n\n // Store patterns\n for (const pattern of limitedPatterns) {\n this.patterns.set(pattern.id, pattern);\n }\n\n return limitedPatterns;\n }\n\n /**\n * Detect anomalies in logs\n */\n async detectAnomalies(logs: LogEntry[]): Promise<AnomalyDetection[]> {\n const anomalies: AnomalyDetection[] = [];\n\n for (const log of logs) {\n const anomalyScore = await this.calculateAnomalyScore(log);\n\n if (anomalyScore > (this.options?.anomalyThreshold || 0.3)) {\n anomalies.push({\n log,\n anomalyScore,\n reason: this.generateAnomalyReason(log, anomalyScore),\n deviations: this.findDeviations(log),\n });\n }\n }\n\n return anomalies.sort((a, b) => b.anomalyScore - a.anomalyScore);\n }\n\n /**\n * Find patterns matching a log entry\n */\n findMatchingPatterns(log: LogEntry): LogPattern[] {\n const matching: LogPattern[] = [];\n\n for (const pattern of this.patterns.values()) {\n if (this.doesLogMatchPattern(log, pattern)) {\n matching.push(pattern);\n }\n }\n\n return matching;\n }\n\n /**\n * Get all detected patterns\n */\n getPatterns(): LogPattern[] {\n return Array.from(this.patterns.values());\n }\n\n /**\n * Get pattern by ID\n */\n getPattern(patternId: string): LogPattern | undefined {\n return this.patterns.get(patternId);\n }\n\n // Private methods\n\n private extractMessagePatterns(logs: LogEntry[]): LogPattern[] {\n const patternMap = new Map<string, { examples: LogEntry[]; count: number }>();\n\n for (const log of logs) {\n // Normalize message by replacing numbers and IDs\n const normalizedMessage = this.normalizeMessage(log.message);\n\n if (!patternMap.has(normalizedMessage)) {\n patternMap.set(normalizedMessage, { examples: [], count: 0 });\n }\n\n const pattern = patternMap.get(normalizedMessage)!;\n if (pattern.examples.length < 3) {\n pattern.examples.push(log);\n }\n pattern.count++;\n }\n\n // Convert to LogPattern array\n return Array.from(patternMap.entries()).map(([pattern, data], index) => ({\n id: `msg_pattern_${index}`,\n pattern,\n examples: data.examples,\n frequency: data.count,\n lastSeen: data.examples[data.examples.length - 1]?.timestamp\n ? new Date((data.examples[data.examples.length - 1] as (typeof data.examples)[0]).timestamp)\n : new Date(),\n category: 'message',\n }));\n }\n\n private extractErrorPatterns(logs: LogEntry[]): LogPattern[] {\n const errorLogs = logs.filter((log) => log.level === 'error' || log.error);\n this.patternFrequencies.clear();\n const patternMap = new Map<string, { examples: LogEntry[]; count: number }>();\n\n for (const log of errorLogs) {\n const errorPattern = this.extractErrorPattern(log);\n\n if (!patternMap.has(errorPattern)) {\n patternMap.set(errorPattern, { examples: [], count: 0 });\n }\n\n const pattern = patternMap.get(errorPattern)!;\n if (pattern.examples.length < 3) {\n pattern.examples.push(log);\n }\n pattern.count++;\n this.patternFrequencies.set(errorPattern, pattern.count);\n }\n\n return Array.from(patternMap.entries()).map(([pattern, data], index) => ({\n id: `error_pattern_${index}`,\n pattern,\n examples: data.examples,\n frequency: data.count,\n lastSeen: data.examples[data.examples.length - 1]?.timestamp\n ? new Date((data.examples[data.examples.length - 1] as (typeof data.examples)[0]).timestamp)\n : new Date(),\n category: 'error',\n severity: 'high',\n }));\n }\n\n private extractTimingPatterns(logs: LogEntry[]): LogPattern[] {\n const patterns: LogPattern[] = [];\n const hourCounts = new Map<number, number>();\n\n // Analyze temporal patterns\n for (const log of logs) {\n const hour = new Date(log.timestamp).getHours();\n hourCounts.set(hour, (hourCounts.get(hour) || 0) + 1);\n }\n\n // Find peak hours\n const peakHour = Array.from(hourCounts.entries()).sort((a, b) => b[1] - a[1])[0];\n\n if (peakHour) {\n patterns.push({\n id: 'timing_peak',\n pattern: `Peak activity at hour ${peakHour[0]}`,\n examples: logs.slice(0, 3),\n frequency: peakHour[1],\n lastSeen: new Date(),\n category: 'timing',\n });\n }\n\n return patterns;\n }\n\n private normalizeMessage(message: string): string {\n return message\n .replace(/[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}/gi, '<UUID>') // Replace UUIDs\n .replace(/[a-f0-9]{32}/gi, '<HASH>') // Replace hashes\n .replace(/\\d+/g, '<NUM>') // Replace numbers\n .replace(/\"[^\"]*\"/g, '<STRING>') // Replace quoted strings\n .replace(/\\b\\w+@\\w+\\.\\w+\\b/g, '<EMAIL>') // Replace emails\n .trim();\n }\n\n private extractErrorPattern(log: LogEntry): string {\n if (log.error) {\n return `${log.error.name}: ${this.normalizeMessage(log.error.message || '')}`;\n }\n return this.normalizeMessage(log.message);\n }\n\n private async calculateAnomalyScore(log: LogEntry): Promise<number> {\n let score = 0;\n\n // Check if log matches known patterns\n const matchingPatterns = this.findMatchingPatterns(log);\n if (matchingPatterns.length === 0) {\n score += 0.3; // Unknown pattern\n }\n\n // Check error frequency\n if (log.level === 'error') {\n const errorPattern = this.extractErrorPattern(log);\n const frequency = this.patternFrequencies.get(errorPattern) || 0;\n if (frequency < 2) {\n score += 0.3; // Rare error\n }\n }\n\n // Check time of day\n const hour = new Date(log.timestamp).getHours();\n if (hour < 6 || hour > 22) {\n score += 0.2; // Off-hours activity\n }\n\n return Math.min(score, 1.0);\n }\n\n private generateAnomalyReason(log: LogEntry, score: number): string {\n const reasons: string[] = [];\n\n if (score > 0.7) {\n reasons.push('Highly unusual log entry');\n } else if (score > 0.5) {\n reasons.push('Moderately unusual log entry');\n } else {\n reasons.push('Slightly unusual log entry');\n }\n\n const matchingPatterns = this.findMatchingPatterns(log);\n if (matchingPatterns.length === 0) {\n reasons.push('does not match any known patterns');\n }\n\n if (log.level === 'error') {\n reasons.push('rare error type');\n }\n\n const hour = new Date(log.timestamp).getHours();\n if (hour < 6 || hour > 22) {\n reasons.push('occurred during off-hours');\n }\n\n return reasons.join(', ');\n }\n\n private findDeviations(log: LogEntry): string[] {\n const deviations: string[] = [];\n\n // Check for missing standard fields\n if (!log.traceId) deviations.push('Missing trace ID');\n if (!log.context) deviations.push('Missing context');\n\n // Check for unusual payload\n if (log.payload && Object.keys(log.payload).length > 20) {\n deviations.push('Unusually large payload');\n }\n\n // Check for stack trace in non-error logs\n if (log.level !== 'error' && hasStackFrame(log.message)) {\n deviations.push('Stack trace in non-error log');\n }\n\n return deviations;\n }\n\n private doesLogMatchPattern(log: LogEntry, pattern: LogPattern): boolean {\n const normalizedMessage = this.normalizeMessage(log.message);\n\n if (pattern.regex) {\n return pattern.regex.test(log.message);\n }\n\n return normalizedMessage === pattern.pattern;\n }\n}\n","/**\n * Main search manager that orchestrates all search capabilities\n */\n\nimport type { LogEntry } from '../types';\nimport { csvField } from '../utils/csv.utils';\nimport { BasicLogIndexer } from './core/basic-log-indexer';\nimport { BasicSearchEngine } from './core/basic-search-engine';\nimport { CorrelationEngine } from './engines/correlation-engine';\nimport { NLPSearchEngine } from './engines/nlp-search-engine';\nimport { PatternRecognitionEngine } from './engines/pattern-recognition-engine';\nimport type {\n AnomalyDetection,\n CorrelatedLogs,\n ExportOptions,\n LogPattern,\n ParsedNLQuery,\n RelatedLog,\n SearchFilters,\n SearchOptions,\n SearchPreset,\n SearchResult,\n SearchStats,\n SearchSuggestion,\n SimilarLog,\n} from './types';\n\n/**\n * Configuration for search manager\n */\nexport interface SearchManagerConfig {\n enableNLP?: boolean;\n enablePatternRecognition?: boolean;\n enableCorrelation?: boolean;\n maxIndexSize?: number;\n autoOptimize?: boolean;\n}\n\n/**\n * Main search manager class\n */\nexport class SearchManager {\n private searchEngine: BasicSearchEngine | NLPSearchEngine;\n private indexer: BasicLogIndexer;\n private patternEngine?: PatternRecognitionEngine;\n private correlationEngine?: CorrelationEngine;\n private config: Required<SearchManagerConfig>;\n\n constructor(config?: SearchManagerConfig) {\n this.config = {\n enableNLP: true,\n enablePatternRecognition: true,\n enableCorrelation: true,\n maxIndexSize: 1000000,\n autoOptimize: true,\n ...config,\n };\n\n // Initialize components\n this.searchEngine = this.config.enableNLP ? new NLPSearchEngine() : new BasicSearchEngine();\n\n this.indexer = new BasicLogIndexer({\n maxIndexSize: this.config.maxIndexSize,\n autoOptimize: this.config.autoOptimize,\n });\n\n if (this.config.enablePatternRecognition) {\n this.patternEngine = new PatternRecognitionEngine();\n }\n\n if (this.config.enableCorrelation) {\n this.correlationEngine = new CorrelationEngine();\n }\n }\n\n /**\n * Index new logs\n */\n async indexLogs(logs: LogEntry[]): Promise<void> {\n await this.indexer.indexBatch(logs);\n this.searchEngine.addLogs(logs);\n\n // Analyze patterns if enabled\n if (this.patternEngine && logs.length > 10) {\n await this.patternEngine.analyzePatterns(logs);\n }\n }\n\n /**\n * Add a single log to the index\n */\n async indexLog(log: LogEntry): Promise<void> {\n await this.indexer.indexLog(log);\n this.searchEngine.addLogs([log]);\n }\n\n /**\n * Perform a search\n */\n async search(\n query: string,\n filters?: SearchFilters,\n options?: SearchOptions\n ): Promise<SearchResult[]> {\n return this.searchEngine.search(query, filters, options);\n }\n\n /**\n * Perform a natural language search\n */\n async naturalLanguageSearch(query: string): Promise<SearchResult[]> {\n return this.searchEngine.naturalLanguageSearch(query);\n }\n\n /**\n * Find logs correlated by trace ID\n */\n async correlateByTraceId(traceId: string): Promise<CorrelatedLogs> {\n return this.searchEngine.correlateByTraceId(traceId);\n }\n\n /**\n * Find similar logs\n */\n async findSimilarLogs(logEntry: LogEntry, limit?: number): Promise<SimilarLog[]> {\n return this.searchEngine.findSimilarLogs(logEntry, limit);\n }\n\n /**\n * Find logs related to a given log\n */\n async findRelatedLogs(log: LogEntry, limit?: number): Promise<RelatedLog[]> {\n if (!this.correlationEngine) {\n throw new Error('Correlation engine not enabled');\n }\n\n const allLogs = this.searchEngine.getLogs();\n return this.correlationEngine.findRelatedLogs(log, allLogs, limit);\n }\n\n /**\n * Get search suggestions\n */\n async getSuggestions(partialQuery: string, limit?: number): Promise<SearchSuggestion[]> {\n return this.searchEngine.getSuggestions(partialQuery, limit);\n }\n\n /**\n * Get search statistics\n */\n async getStats(): Promise<SearchStats> {\n return this.searchEngine.getStats();\n }\n\n /**\n * Parse natural language query\n */\n async parseNaturalLanguageQuery(query: string): Promise<ParsedNLQuery> {\n return this.searchEngine.parseNaturalLanguageQuery(query);\n }\n\n /**\n * Save a search preset\n */\n async savePreset(\n preset: Omit<SearchPreset, 'id' | 'createdAt' | 'updatedAt'>\n ): Promise<SearchPreset> {\n return this.searchEngine.savePreset(preset);\n }\n\n /**\n * Get saved presets\n */\n async getPresets(userId?: string): Promise<SearchPreset[]> {\n return this.searchEngine.getPresets(userId);\n }\n\n /**\n * Delete a preset\n */\n async deletePreset(presetId: string): Promise<void> {\n return this.searchEngine.deletePreset(presetId);\n }\n\n /**\n * Detect log patterns\n */\n async detectPatterns(): Promise<LogPattern[]> {\n if (!this.patternEngine) {\n throw new Error('Pattern recognition not enabled');\n }\n\n const allLogs = this.searchEngine.getLogs();\n return this.patternEngine.analyzePatterns(allLogs);\n }\n\n /**\n * Get detected patterns\n */\n getPatterns(): LogPattern[] {\n if (!this.patternEngine) {\n return [];\n }\n\n return this.patternEngine.getPatterns();\n }\n\n /**\n * Detect anomalies in logs\n */\n async detectAnomalies(): Promise<AnomalyDetection[]> {\n if (!this.patternEngine) {\n throw new Error('Pattern recognition not enabled');\n }\n\n const allLogs = this.searchEngine.getLogs();\n return this.patternEngine.detectAnomalies(allLogs);\n }\n\n /**\n * Correlate logs by multiple criteria\n */\n async correlateByMultipleCriteria(criteria: {\n traceId?: boolean;\n userId?: boolean;\n sessionId?: boolean;\n temporal?: boolean;\n errorCascade?: boolean;\n }): Promise<Map<string, CorrelatedLogs>> {\n if (!this.correlationEngine) {\n throw new Error('Correlation engine not enabled');\n }\n\n const allLogs = this.searchEngine.getLogs();\n return this.correlationEngine.correlateByMultipleCriteria(allLogs, criteria);\n }\n\n /**\n * Analyze error cascades\n */\n async analyzeErrorCascade(traceId: string): Promise<{\n rootCause?: LogEntry;\n cascade: LogEntry[];\n impactedServices: string[];\n }> {\n if (!this.correlationEngine) {\n throw new Error('Correlation engine not enabled');\n }\n\n const correlated = await this.correlateByTraceId(traceId);\n return this.correlationEngine.analyzeErrorCascade(correlated.logs);\n }\n\n /**\n * Export search results\n */\n async exportResults(results: SearchResult[], options: ExportOptions): Promise<string> {\n switch (options.format) {\n case 'json':\n return this.exportAsJSON(results, options);\n case 'csv':\n return this.exportAsCSV(results, options);\n case 'text':\n return this.exportAsText(results, options);\n default:\n throw new Error(`Unsupported export format: ${options.format}`);\n }\n }\n\n /**\n * Clear all indexed data\n */\n async clearIndex(): Promise<void> {\n await this.indexer.clearIndex();\n this.searchEngine.clearLogs();\n }\n\n /**\n * Optimize the index\n */\n async optimizeIndex(): Promise<void> {\n await this.indexer.optimizeIndex();\n }\n\n /**\n * Get index statistics\n */\n async getIndexStats(): Promise<{\n totalDocuments: number;\n indexSize: number;\n lastOptimized?: Date;\n }> {\n return this.indexer.getIndexStats();\n }\n\n /**\n * Remove old logs\n */\n async removeOldLogs(olderThan: Date): Promise<number> {\n const removed = await this.indexer.removeOldLogs(olderThan);\n\n // Also remove from search engine\n const allLogs = this.searchEngine.getLogs();\n const filteredLogs = allLogs.filter((log) => new Date(log.timestamp) >= olderThan);\n\n this.searchEngine.clearLogs();\n this.searchEngine.addLogs(filteredLogs);\n\n return removed;\n }\n\n // Private export methods\n\n private exportAsJSON(results: SearchResult[], options: ExportOptions): string {\n const data = options.includeMetadata ? results : results.map((r) => r.log);\n\n if (options.fields) {\n return JSON.stringify(\n data.map((item) => this.filterFields(item, options.fields!)),\n null,\n 2\n );\n }\n\n return JSON.stringify(data, null, 2);\n }\n\n private exportAsCSV(results: SearchResult[], options: ExportOptions): string {\n const logs = results.map((r) => r.log);\n\n if (logs.length === 0) {\n return '';\n }\n\n const fields = options.fields || ['timestamp', 'level', 'appName', 'message'];\n const headers = fields.map((f) => csvField(f)).join(',');\n\n const rows = logs.map((log) => {\n return fields\n .map((field) => {\n const value = (log as unknown as Record<string, unknown>)[field];\n return csvField(value);\n })\n .join(',');\n });\n\n return [headers, ...rows].join('\\n');\n }\n\n private exportAsText(results: SearchResult[], options: ExportOptions): string {\n return results\n .map((result) => {\n const log = result.log;\n let text = `[${log.timestamp}] [${log.level.toUpperCase()}] ${log.appName}: ${log.message}`;\n\n if (options.includeMetadata) {\n text += `\\n Score: ${result.score.toFixed(2)}`;\n if (result.highlights) {\n text += `\\n Matches: ${result.highlights.length}`;\n }\n }\n\n return text;\n })\n .join('\\n\\n');\n }\n\n private filterFields(obj: unknown, fields: string[]): Record<string, unknown> {\n const filtered: Record<string, unknown> = {};\n\n for (const field of fields) {\n if (obj !== null && typeof obj === 'object' && field in obj) {\n filtered[field] = (obj as Record<string, unknown>)[field];\n } else if (field.includes('.')) {\n // Handle nested fields\n const value = this.getNestedValue(obj, field);\n if (value !== undefined) {\n filtered[field] = value;\n }\n }\n }\n\n return filtered;\n }\n\n private getNestedValue(obj: unknown, path: string): unknown {\n return path.split('.').reduce((current: unknown, key) => {\n if (current !== null && typeof current === 'object') {\n return (current as Record<string, unknown>)[key];\n }\n // Not an object — path lookup stops here\n return current;\n }, obj);\n }\n}\n"],"mappings":"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"}
|