Spaces:
Running
Running
| import { consoleStore } from "../stores/console"; | |
| import { agentService } from "./agent"; | |
| type ConsoleMethod = "log" | "warn" | "error" | "info"; | |
| export class ConsoleSyncService { | |
| private isSetup = false; | |
| private originalConsole: Record<ConsoleMethod, (...args: unknown[]) => void> = | |
| {} as Record<ConsoleMethod, (...args: unknown[]) => void>; | |
| setup(): void { | |
| if (this.isSetup) return; | |
| this.originalConsole = { | |
| log: console.log.bind(console), | |
| warn: console.warn.bind(console), | |
| error: console.error.bind(console), | |
| info: console.info.bind(console), | |
| }; | |
| const interceptConsole = (method: ConsoleMethod) => { | |
| const original = this.originalConsole[method]; | |
| console[method] = (...args: unknown[]) => { | |
| original(...args); | |
| const firstArg = args[0]; | |
| if (typeof firstArg === "string") { | |
| if ( | |
| firstArg.includes("[vite]") || | |
| firstArg.includes("[VibeGame] Console forwarding") || | |
| firstArg.includes("[DEBUG]") || | |
| firstArg.includes("hot updated:") || | |
| firstArg.includes( | |
| "using deprecated parameters for the initialization function", | |
| ) | |
| ) { | |
| return; | |
| } | |
| } | |
| const message = args | |
| .map((arg) => { | |
| if (arg instanceof Error) { | |
| return arg.message; | |
| } else if (typeof arg === "object") { | |
| try { | |
| return JSON.stringify(arg, null, 2); | |
| } catch { | |
| return String(arg); | |
| } | |
| } | |
| return String(arg); | |
| }) | |
| .join(" "); | |
| const messageId = `${Date.now()}-${Math.random()}`; | |
| consoleStore.addMessage(method === "log" ? "info" : method, message); | |
| agentService.sendRawMessage({ | |
| type: "console_sync", | |
| payload: { | |
| id: messageId, | |
| type: method === "log" ? "info" : method, | |
| message: message, | |
| timestamp: Date.now(), | |
| }, | |
| timestamp: Date.now(), | |
| }); | |
| }; | |
| }; | |
| (["log", "warn", "error", "info"] as ConsoleMethod[]).forEach( | |
| interceptConsole, | |
| ); | |
| this.isSetup = true; | |
| } | |
| teardown(): void { | |
| if (!this.isSetup) return; | |
| console.log = this.originalConsole.log; | |
| console.warn = this.originalConsole.warn; | |
| console.error = this.originalConsole.error; | |
| console.info = this.originalConsole.info; | |
| this.originalConsole = {} as Record< | |
| ConsoleMethod, | |
| (...args: unknown[]) => void | |
| >; | |
| this.isSetup = false; | |
| } | |
| } | |
| export const consoleSyncService = new ConsoleSyncService(); | |