Cleanup function to restore original console methods.
export function installConsoleInterceptor(): () => void {
if (interceptorInstalled) {
return () => {
// no-op cleanup when already installed by another consumer
};
}
if (globalThis.window === undefined) {
return () => {
// no console interception in non-browser environments (Main process, Node.js)
// This is intentional and safe - logging in Main process goes directly to DevTools
};
}
for (const level of LOG_LEVELS) {
const original =
assignableConsole[level]?.bind(console) ?? console.log.bind(console);
originalConsoleMethods.set(level, original);
assignableConsole[level] = (...args: unknown[]) => {
logCollector.addEntry(level, args);
original(...args);
};
}
// Wrap console group methods to track hierarchy
const originalGroupCollapsed = console.groupCollapsed.bind(console);
const originalGroup = console.group.bind(console);
const originalGroupEnd = console.groupEnd.bind(console);
console.groupCollapsed = (...args: unknown[]) => {
// Extract label from first argument
const label = args.length > 0 ? String(args[0]) : "Group";
logCollector.enterGroup(label);
originalGroupCollapsed(...args);
};
console.group = (...args: unknown[]) => {
// Extract label from first argument
const label = args.length > 0 ? String(args[0]) : "Group";
logCollector.enterGroup(label);
originalGroup(...args);
};
console.groupEnd = () => {
logCollector.exitGroup();
originalGroupEnd();
};
interceptorInstalled = true;
return () => {
if (!interceptorInstalled) return;
for (const level of LOG_LEVELS) {
const original = originalConsoleMethods.get(level);
if (original) {
assignableConsole[level] = original;
}
}
// Restore group methods
console.groupCollapsed = originalGroupCollapsed;
console.group = originalGroup;
console.groupEnd = originalGroupEnd;
interceptorInstalled = false;
originalConsoleMethods.clear();
};
}
Installs console interceptors to capture all log output; wraps methods to forward to LogCollector. Preserves normal console output and group hierarchy tracking. No-op if already installed.