UNPKG

@iflow-mcp/promptx

Version:

AI角色创建平台和智能工具开发平台,基于MCP协议提供专业AI能力注入

1 lines 14.2 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["/**\n * @promptx/logger - Unified logging system for PromptX using Pino\n * Features:\n * - Console with pretty print and caller location\n * - File logging with daily rotation\n * - Configurable log levels\n * - Color support for console output\n */\n\nimport pino from 'pino'\nimport path from 'path'\nimport os from 'os'\nimport fs from 'fs'\n\n// Logger configuration interface\nexport interface LoggerConfig {\n level?: string\n console?: boolean\n file?: boolean | {\n dirname?: string\n }\n colors?: boolean\n}\n\n// Default configuration\nconst defaultConfig: LoggerConfig = {\n level: process.env.LOG_LEVEL || 'info',\n console: true,\n file: {\n dirname: path.join(os.homedir(), '.promptx', 'logs')\n },\n colors: true\n}\n\n// Get caller information from stack\nfunction getCallerInfo() {\n const stack = new Error().stack || ''\n const stackLines = stack.split('\\n')\n \n // Find first non-logger stack frame\n for (let i = 2; i < stackLines.length; i++) {\n const line = stackLines[i]\n if (line && \n !line.includes('node_modules/pino') &&\n !line.includes('packages/logger') &&\n !line.includes('@promptx/logger')) {\n \n const match = line.match(/at\\s+(?:.*?\\s+)?\\(?(.*?):(\\d+):(\\d+)\\)?/)\n if (match && match[1] && match[2]) {\n const fullPath = match[1]\n const lineNum = parseInt(match[2], 10)\n \n // Extract package name\n let packageName = 'app'\n const packageMatch = fullPath.match(/packages\\/([^\\/]+)/) || \n fullPath.match(/@promptx\\/([^\\/]+)/)\n if (packageMatch) {\n packageName = `@promptx/${packageMatch[1]}`\n }\n \n // Get filename only\n const filename = path.basename(fullPath)\n \n return {\n package: packageName,\n file: filename,\n line: lineNum\n }\n }\n }\n }\n \n return { package: 'app', file: 'unknown', line: 0 }\n}\n\n// Create logger instance\nexport function createLogger(config: LoggerConfig = {}): pino.Logger {\n const finalConfig = { ...defaultConfig, ...config }\n \n // Ensure log directory exists\n if (finalConfig.file) {\n const fileConfig = typeof finalConfig.file === 'object' ? finalConfig.file : {}\n const logDir = fileConfig.dirname || path.join(os.homedir(), '.promptx', 'logs')\n if (!fs.existsSync(logDir)) {\n fs.mkdirSync(logDir, { recursive: true })\n }\n }\n \n // For Electron desktop app, avoid worker thread issues\n const isElectron = process.versions && process.versions.electron\n \n if (isElectron || process.env.PROMPTX_NO_WORKERS === 'true') {\n // For Electron: use sync mode to avoid worker thread issues\n // Simply disable transports and use basic pino with file destination\n \n if (finalConfig.file) {\n const fileConfig = typeof finalConfig.file === 'object' ? finalConfig.file : {}\n const logDir = fileConfig.dirname || path.join(os.homedir(), '.promptx', 'logs')\n const today = new Date().toISOString().split('T')[0]\n const logPath = path.join(logDir, `promptx-${today}.log`)\n \n // Use pino.destination with sync mode for Electron\n const dest = pino.destination({\n dest: logPath,\n sync: true // Use sync to avoid worker thread issues in Electron\n })\n \n return pino({\n level: finalConfig.level || 'info',\n base: { pid: process.pid },\n mixin: () => getCallerInfo(),\n // Simple formatting without pino-pretty to avoid worker threads\n formatters: {\n level: (label) => {\n return { level: label }\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined\n }\n }\n }\n }, dest)\n } else {\n // Console only mode for Electron without pino-pretty\n return pino({\n level: finalConfig.level || 'info',\n base: { pid: process.pid },\n mixin: () => getCallerInfo(),\n formatters: {\n level: (label) => {\n return { level: label }\n },\n log: (obj) => {\n const { package: pkg, file, line, ...rest } = obj\n return {\n ...rest,\n location: pkg && file ? `${pkg} [${file}:${line}]` : undefined\n }\n }\n }\n })\n }\n } else {\n // Use transports for non-Electron environments (better for servers)\n const targets: any[] = []\n \n // Console transport\n if (finalConfig.console) {\n targets.push({\n target: 'pino-pretty',\n level: finalConfig.level,\n options: {\n // MCP stdio模式下禁用颜色,避免ANSI转义码\n colorize: process.env.MCP_TRANSPORT === 'stdio' ? false : finalConfig.colors,\n translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',\n ignore: 'hostname,pid,package,file,line',\n destination: 2, // 输出到 stderr (fd 2) - MCP官方最佳实践\n messageFormat: '{package} [{file}:{line}] {msg}'\n }\n })\n }\n \n // File transport\n if (finalConfig.file) {\n const fileConfig = typeof finalConfig.file === 'object' ? finalConfig.file : {}\n const logDir = fileConfig.dirname || path.join(os.homedir(), '.promptx', 'logs')\n const today = new Date().toISOString().split('T')[0]\n \n targets.push({\n target: 'pino/file',\n level: finalConfig.level,\n options: {\n destination: path.join(logDir, `promptx-${today}.log`)\n }\n })\n \n // Separate error log\n targets.push({\n target: 'pino/file',\n level: 'error',\n options: {\n destination: path.join(logDir, `promptx-error-${today}.log`)\n }\n })\n }\n \n // Create logger with transports\n if (targets.length > 0) {\n return pino({\n level: finalConfig.level || 'info',\n base: { pid: process.pid },\n mixin: () => getCallerInfo(),\n transport: {\n targets\n }\n })\n }\n }\n \n // Fallback to basic logger\n return pino({\n level: finalConfig.level || 'info',\n base: { pid: process.pid },\n mixin: () => getCallerInfo()\n })\n}\n\n// Default logger instance\nconst logger = createLogger()\n\n// Export convenience methods with flexible API\n// Supports both:\n// - logger.info(msg) - simple message\n// - logger.info(msg, obj) - message + context object (natural order)\n// - logger.info(obj, msg) - Pino native order (backward compatible)\nexport const error = (msgOrObj: string | object, objOrMsg?: object | string) => {\n if (typeof msgOrObj === 'string') {\n // logger.error(msg) or logger.error(msg, obj)\n if (objOrMsg && typeof objOrMsg === 'object') {\n logger.error(objOrMsg, msgOrObj) // Swap to Pino's (obj, msg) order\n } else {\n logger.error(msgOrObj)\n }\n } else {\n // logger.error(obj, msg) - Pino native\n logger.error(msgOrObj, objOrMsg as string || '')\n }\n}\n\nexport const warn = (msgOrObj: string | object, objOrMsg?: object | string) => {\n if (typeof msgOrObj === 'string') {\n if (objOrMsg && typeof objOrMsg === 'object') {\n logger.warn(objOrMsg, msgOrObj)\n } else {\n logger.warn(msgOrObj)\n }\n } else {\n logger.warn(msgOrObj, objOrMsg as string || '')\n }\n}\n\nexport const info = (msgOrObj: string | object, objOrMsg?: object | string) => {\n if (typeof msgOrObj === 'string') {\n if (objOrMsg && typeof objOrMsg === 'object') {\n logger.info(objOrMsg, msgOrObj)\n } else {\n logger.info(msgOrObj)\n }\n } else {\n logger.info(msgOrObj, objOrMsg as string || '')\n }\n}\n\nexport const debug = (msgOrObj: string | object, objOrMsg?: object | string) => {\n if (typeof msgOrObj === 'string') {\n if (objOrMsg && typeof objOrMsg === 'object') {\n logger.debug(objOrMsg, msgOrObj)\n } else {\n logger.debug(msgOrObj)\n }\n } else {\n logger.debug(msgOrObj, objOrMsg as string || '')\n }\n}\n\nexport const verbose = (msgOrObj: string | object, objOrMsg?: object | string) => {\n if (typeof msgOrObj === 'string') {\n if (objOrMsg && typeof objOrMsg === 'object') {\n logger.trace(objOrMsg, msgOrObj)\n } else {\n logger.trace(msgOrObj)\n }\n } else {\n logger.trace(msgOrObj, objOrMsg as string || '')\n }\n}\n\nexport const log = (level: string, msg: string, ...args: any[]) => {\n const method = (logger as any)[level]\n if (typeof method === 'function') {\n method(msg, ...args)\n } else {\n logger.info(msg, ...args)\n }\n}\n\n// Export default logger\nexport default logger\n\n// Re-export pino types\nexport type Logger = pino.Logger\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace'"],"mappings":"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","names":["path","os","fs","pino"]}