@essentialai/cogent-bridge
Version:
Cogent Bridge — cross-agent comms for Claude Code, OpenAI Codex and Slack. Codex users: install with `curl -fsSL https://cogent.tools/install.sh | sh`, then start with `cogent-codex` for real-time peer wake.
79 lines • 2.36 kB
JavaScript
import fs from "node:fs";
import path from "node:path";
const LEVELS = {
debug: 0,
info: 1,
warn: 2,
error: 3,
};
export class Logger {
threshold;
textStream = null;
jsonStream = null;
constructor(level, logDir) {
this.threshold = LEVELS[level];
if (logDir) {
fs.mkdirSync(logDir, { recursive: true });
const now = new Date()
.toISOString()
.replace(/:/g, "-")
.replace(/\.\d{3}Z$/, "");
const textFile = `bridge-${now}.log`;
const jsonFile = `bridge-${now}.json.log`;
this.textStream = fs.createWriteStream(path.join(logDir, textFile), {
flags: "a",
});
this.jsonStream = fs.createWriteStream(path.join(logDir, jsonFile), {
flags: "a",
});
}
}
log(level, message, data) {
if (LEVELS[level] < this.threshold)
return;
const timestamp = new Date().toISOString();
const humanLine = `${timestamp} [${level.toUpperCase()}] ${message}\n`;
try {
process.stderr.write(humanLine);
}
catch {
// Ignore EPIPE / broken pipe -- parent process disconnected
}
this.textStream?.write(humanLine);
const entry = { timestamp, level, message };
if (data !== undefined) {
entry.data = data;
}
this.jsonStream?.write(JSON.stringify(entry) + "\n");
}
debug(message, data) {
this.log("debug", message, data);
}
info(message, data) {
this.log("info", message, data);
}
warn(message, data) {
this.log("warn", message, data);
}
error(message, data) {
this.log("error", message, data);
}
close() {
this.textStream?.end();
this.jsonStream?.end();
}
}
export function createLogger(level, logDir) {
return new Logger(level, logDir);
}
/** Pre-config logger: stderr-only at info level. Replaced after startup. */
export let logger = new Logger("info");
/**
* Initialize the fully-configured logger with file outputs.
* Replaces the module-level `logger` export.
*/
export function initLogger(level, logDir) {
logger.close();
logger = new Logger(level, logDir);
}
//# sourceMappingURL=logger.js.map