@measey/mycoder-agent
Version:
Agent module for mycoder - an AI-powered software development assistant
122 lines • 4.21 kB
JavaScript
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