{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-JGBZCINX.cjs","../../src/utils/logger.ts"],"names":["timestamp","logger"],"mappings":"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","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-JGBZCINX.cjs","sourcesContent":[null,"import { inspect } from \"node:util\";\nimport winston from \"winston\";\nimport DailyRotateFile from \"winston-daily-rotate-file\";\nimport { getRequestContext } from \"@/utils/request-context\";\n\nconst { combine, timestamp, printf, colorize, errors, json } = winston.format;\n\n// Merges the ambient request context into every log entry so lines from\n// interleaved concurrent requests stay correlatable. Values passed\n// explicitly at the call site win over the ambient ones.\nexport const injectRequestContext = winston.format((info) => {\n\tconst ctx = getRequestContext();\n\tif (!ctx) return info;\n\tinfo.requestId ??= ctx.requestId;\n\tif (ctx.userId !== undefined) info.userId ??= ctx.userId;\n\tif (ctx.threadId !== undefined) info.threadId ??= ctx.threadId;\n\treturn info;\n});\n\n// Error objects passed as meta ({ error }) JSON.stringify to \"{}\" because\n// message/stack are non-enumerable — the log would record nothing. Convert\n// them to their stack string (which starts with \"Error: <message>\").\nexport const serializeErrorValues = winston.format((info) => {\n\tfor (const key of Object.keys(info)) {\n\t\tconst value = info[key];\n\t\tif (value instanceof Error) {\n\t\t\tinfo[key] = value.stack ?? `${value.name}: ${value.message}`;\n\t\t}\n\t}\n\treturn info;\n});\n\nexport const textLogFormat = printf(\n\t({ level, message, timestamp, service, stack, requestId, ...meta }) => {\n\t\tconst reqTag = requestId ? ` [req:${String(requestId).slice(0, 8)}]` : \"\";\n\t\tconst metaStr = Object.keys(meta).length\n\t\t\t? ` | ${JSON.stringify(meta)}`\n\t\t\t: \"\";\n\t\tconst errorStack = stack ? `\\n${stack}` : \"\";\n\t\treturn `${timestamp} [${service}]${reqTag} ${level}: ${message}${metaStr}${errorStack}`;\n\t},\n);\n\nexport type LogOutput = \"file\" | \"console\";\n\n// File output defaults to structured JSON lines (grep/jq/lnav-friendly);\n// the dev console stays human-readable. LOG_FORMAT=json|text overrides both.\nexport const resolveLogFormat = (output: LogOutput): \"json\" | \"text\" => {\n\tconst override = process.env.LOG_FORMAT?.toLowerCase();\n\tif (override === \"json\" || override === \"text\") return override;\n\treturn output === \"file\" ? \"json\" : \"text\";\n};\n\n// Rotated file names get a .jsonl suffix (after the date) when the file\n// output is JSON lines, so new files are recognizable by tools and by eye.\n// Text mode keeps the legacy extension-less names.\nexport const logFileExtension = (logFilePath: string): string => {\n\tif (resolveLogFormat(\"file\") !== \"json\") return \"\";\n\treturn /\\.jsonl?$/.test(logFilePath) ? \"\" : \".jsonl\";\n};\n\nconst buildFormat = (output: LogOutput) => {\n\tif (resolveLogFormat(output) === \"json\") {\n\t\treturn combine(\n\t\t\terrors({ stack: true }),\n\t\t\tserializeErrorValues(),\n\t\t\tinjectRequestContext(),\n\t\t\ttimestamp(),\n\t\t\tjson(),\n\t\t);\n\t}\n\treturn combine(\n\t\terrors({ stack: true }),\n\t\tserializeErrorValues(),\n\t\tinjectRequestContext(),\n\t\t...(output === \"console\" ? [colorize()] : []),\n\t\ttimestamp({\n\t\t\tformat: output === \"file\" ? \"YYYY-MM-DD HH:mm:ss\" : \"HH:mm:ss\",\n\t\t}),\n\t\ttextLogFormat,\n\t);\n};\n\nconst createLogger = (service: string) => {\n\tconst logFilePath = process.env.LOG_FILE_PATH;\n\n\tconst transports: winston.transport[] = logFilePath\n\t\t? [\n\t\t\t\tnew DailyRotateFile({\n\t\t\t\t\tfilename: logFilePath,\n\t\t\t\t\textension: logFileExtension(logFilePath),\n\t\t\t\t\tdatePattern: \"YYYY-MM-DD\",\n\t\t\t\t\tmaxSize: process.env.LOG_MAX_SIZE || \"20m\",\n\t\t\t\t\tmaxFiles: process.env.LOG_MAX_FILES || \"14d\",\n\t\t\t\t\tformat: buildFormat(\"file\"),\n\t\t\t\t}),\n\t\t\t]\n\t\t: [\n\t\t\t\tnew winston.transports.Console({\n\t\t\t\t\tformat: buildFormat(\"console\"),\n\t\t\t\t}),\n\t\t\t];\n\n\tconst logger = winston.createLogger({\n\t\tlevel: (process.env.LOG_LEVEL || \"info\").toLowerCase(),\n\t\tdefaultMeta: { service },\n\t\ttransports,\n\t});\n\n\treturn logger;\n};\n\n// Default logger instance\nexport const logger = createLogger(\"ain-adk\");\n\n// Factory function for creating service-specific loggers\nexport const getLogger = (service: string) => createLogger(service);\n\n// Convenience methods for different components\nexport const loggers = {\n\tagent: getLogger(\"AINAgent\"),\n\tintent: getLogger(\"Intent\"),\n\tintentStream: getLogger(\"IntentStream\"),\n\tmcp: getLogger(\"MCPModule\"),\n\ta2a: getLogger(\"A2AModule\"),\n\tmodel: getLogger(\"Model\"),\n\tserver: getLogger(\"A2AServer\"),\n\tfol: getLogger(\"FOL\"),\n\thttp: getLogger(\"HTTP\"),\n} as const;\n\nconst formatConsoleArgs = (args: unknown[]): string =>\n\targs.map((arg) => (typeof arg === \"string\" ? arg : inspect(arg))).join(\" \");\n\nlet interceptedConsole: Pick<Console, \"log\" | \"warn\" | \"error\"> | undefined;\n\n// Mirrors console.log/warn/error into the log file so server start/stop\n// banners and stray console calls appear in the same .jsonl as everything\n// else. Still prints to stdout; no-op without LOG_FILE_PATH (dev console\n// stays untouched). Idempotent: only the first call patches.\nexport const interceptConsole = (): winston.Logger | undefined => {\n\tconst logFilePath = process.env.LOG_FILE_PATH;\n\tif (!logFilePath || interceptedConsole) return undefined;\n\n\tconst consoleLogger = createLogger(\"console\");\n\tinterceptedConsole = {\n\t\tlog: console.log,\n\t\twarn: console.warn,\n\t\terror: console.error,\n\t};\n\n\t// Re-entrancy guard: winston/transport error handling may itself call\n\t// console.*; mirroring that would recurse until the stack overflows.\n\tlet mirroring = false;\n\tconst mirror = (write: (text: string) => unknown, args: unknown[]) => {\n\t\tif (mirroring) return;\n\t\tmirroring = true;\n\t\ttry {\n\t\t\twrite(formatConsoleArgs(args));\n\t\t} finally {\n\t\t\tmirroring = false;\n\t\t}\n\t};\n\n\tconsole.log = (...args: unknown[]) => {\n\t\tinterceptedConsole?.log(...args);\n\t\tmirror((text) => consoleLogger.info(text), args);\n\t};\n\n\tconsole.warn = (...args: unknown[]) => {\n\t\tinterceptedConsole?.warn(...args);\n\t\tmirror((text) => consoleLogger.warn(text), args);\n\t};\n\n\tconsole.error = (...args: unknown[]) => {\n\t\tinterceptedConsole?.error(...args);\n\t\tmirror((text) => consoleLogger.error(text), args);\n\t};\n\n\treturn consoleLogger;\n};\n\n// Undoes interceptConsole (used by tests; safe to call unpatched).\nexport const restoreConsole = (): void => {\n\tif (!interceptedConsole) return;\n\tconsole.log = interceptedConsole.log;\n\tconsole.warn = interceptedConsole.warn;\n\tconsole.error = interceptedConsole.error;\n\tinterceptedConsole = undefined;\n};\n"]}