UNPKG

@measey/mycoder-agent

Version:

Agent module for mycoder - an AI-powered software development assistant

122 lines 4.21 kB
import chalk from 'chalk'; export var LogLevel; (function (LogLevel) { LogLevel[LogLevel["debug"] = 0] = "debug"; LogLevel[LogLevel["info"] = 1] = "info"; LogLevel[LogLevel["log"] = 2] = "log"; LogLevel[LogLevel["warn"] = 3] = "warn"; LogLevel[LogLevel["error"] = 4] = "error"; })(LogLevel || (LogLevel = {})); export class Logger { prefix; logLevel; logLevelIndex; parent; name; nesting; customPrefix; color; listeners = []; constructor({ name, parent = undefined, logLevel = parent?.logLevel ?? LogLevel.info, customPrefix, color, }) { this.customPrefix = customPrefix; this.name = name; this.parent = parent; this.logLevel = logLevel; this.logLevelIndex = logLevel; // Inherit color from parent if not provided and parent has a color this.color = color ?? parent?.color; // Calculate indent level and offset based on parent chain this.nesting = 0; let offsetSpaces = 0; let currentParent = parent; while (currentParent) { offsetSpaces += 2; this.nesting++; currentParent = currentParent.parent; } this.prefix = ' '.repeat(offsetSpaces); if (parent) { this.listeners.push((logger, logLevel, lines) => { parent.listeners.forEach((listener) => { listener(logger, logLevel, lines); }); }); } } emitMessages(level, messages) { // Allow all messages at the configured log level or higher if (level < this.logLevelIndex) return; const lines = messages .map((message) => typeof message === 'object' ? JSON.stringify(message, null, 2) : String(message)) .join('\n') .split('\n'); this.listeners.forEach((listener) => listener(this, level, lines)); } debug(...messages) { this.emitMessages(LogLevel.debug, messages); } info(...messages) { this.emitMessages(LogLevel.info, messages); } log(...messages) { this.emitMessages(LogLevel.log, messages); } warn(...messages) { this.emitMessages(LogLevel.warn, messages); } error(...messages) { this.emitMessages(LogLevel.error, messages); } } export const consoleOutputLogger = (logger, level, lines) => { const getColor = (level, _nesting = 0) => { // Always use red for errors and yellow for warnings regardless of agent color if (level === LogLevel.error) { return chalk.red; } if (level === LogLevel.warn) { return chalk.yellow; } // Use logger's color if available for log level if (level === LogLevel.log && logger.color) { return logger.color; } // Default colors for different log levels switch (level) { case LogLevel.debug: case LogLevel.info: return chalk.white.dim; case LogLevel.log: return chalk.white; default: throw new Error(`Unknown log level: ${level}`); } }; const formatPrefix = (prefix, level, _nesting = 0) => level === LogLevel.debug || level === LogLevel.info ? chalk.dim(prefix) : prefix; const showPrefix = (_level) => { // Show prefix for all log levels return false; }; // name of enum value const logLevelName = LogLevel[level]; const messageColor = getColor(level, logger.nesting); let combinedPrefix = logger.prefix; if (showPrefix(level)) { const prefix = formatPrefix(`[${logger.name}]`, level, logger.nesting); if (logger.customPrefix) { combinedPrefix = `${logger.prefix}${logger.customPrefix} `; } else { combinedPrefix = `${logger.prefix}${prefix} `; } } const coloredLies = lines.map((line) => `${combinedPrefix}${messageColor(line)}`); const consoleOutput = console[logLevelName]; coloredLies.forEach((line) => consoleOutput(line)); }; //# sourceMappingURL=logger.js.map