adk-typescript
Version:
TypeScript port of Google's Agent Development Kit (ADK)
142 lines (141 loc) • 5.52 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogLevel = void 0;
exports.logToStderr = logToStderr;
exports.logToTmpFolder = logToTmpFolder;
const fs = __importStar(require("fs"));
const os = __importStar(require("os"));
const path = __importStar(require("path"));
const winston = __importStar(require("winston"));
/**
* Format string for logs
*/
const LOGGING_FORMAT = '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s';
/**
* Log levels enum
*/
var LogLevel;
(function (LogLevel) {
LogLevel["ERROR"] = "error";
LogLevel["WARN"] = "warn";
LogLevel["INFO"] = "info";
LogLevel["VERBOSE"] = "verbose";
LogLevel["DEBUG"] = "debug";
LogLevel["SILLY"] = "silly";
})(LogLevel || (exports.LogLevel = LogLevel = {}));
/**
* Configure logging to stderr
*
* @param level The log level (default: info)
* @returns The configured logger
*/
function logToStderr(level = LogLevel.INFO) {
const logger = winston.createLogger({
level: level,
format: winston.format.combine(winston.format.timestamp(), winston.format.printf(info => `${info.timestamp} - ${info.level} - ${info.filename || 'unknown'}:${info.lineno || '?'} - ${info.message}`)),
transports: [
new winston.transports.Console()
]
});
return logger;
}
/**
* Configure logging to a temporary folder
*
* @param level The log level (default: info)
* @param subFolder Subfolder name in the temp directory (default: agents_log)
* @param logFilePrefix Prefix for log file names (default: agent)
* @param logFileTimestamp Timestamp for the log file name (default: current time in YYYYMMdd_HHmmss format)
* @returns The log file path and configured logger
*/
function logToTmpFolder(level = LogLevel.INFO, subFolder = 'agents_log', logFilePrefix = 'agent', logFileTimestamp = getTimestamp()) {
// Create the log directory in the system temp folder
const logDir = path.join(os.tmpdir(), subFolder);
const logFilename = `${logFilePrefix}.${logFileTimestamp}.log`;
const logFilePath = path.join(logDir, logFilename);
// Ensure the log directory exists
if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true });
}
// Create the logger
const logger = winston.createLogger({
level: level,
format: winston.format.combine(winston.format.timestamp(), winston.format.printf(info => `${info.timestamp} - ${info.level} - ${info.filename || 'unknown'}:${info.lineno || '?'} - ${info.message}`)),
transports: [
new winston.transports.File({
filename: logFilePath
})
]
});
console.log(`Log setup complete: ${logFilePath}`);
// Create a symbolic link to the latest log file
const latestLogLink = path.join(logDir, `${logFilePrefix}.latest.log`);
try {
// Remove existing symlink if it exists
if (fs.existsSync(latestLogLink)) {
fs.unlinkSync(latestLogLink);
}
// Create new symlink
if (process.platform === 'win32') {
// On Windows, we need admin rights for symlinks, so just copy the file instead
fs.copyFileSync(logFilePath, latestLogLink);
}
else {
// On Unix systems, create a proper symlink
fs.symlinkSync(logFilePath, latestLogLink);
}
console.log(`To access latest log: tail -F ${latestLogLink}`);
}
catch (error) {
console.warn(`Could not create link to latest log: ${error}`);
}
return { logFilePath, logger };
}
/**
* Get current timestamp in YYYYMMdd_HHmmss format
*
* @returns Formatted timestamp
*/
function getTimestamp() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${year}${month}${day}_${hours}${minutes}${seconds}`;
}