From 953615b9816de1a9f01252448fc1588d39212b77 Mon Sep 17 00:00:00 2001 From: Kyle Carberry Date: Sat, 15 Nov 2025 17:19:54 -0500 Subject: [PATCH] Dynamically import Electron to fix the web distribution --- src/services/ipcMain.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/services/ipcMain.ts b/src/services/ipcMain.ts index c1031e40c..6c25321ec 100644 --- a/src/services/ipcMain.ts +++ b/src/services/ipcMain.ts @@ -1,6 +1,5 @@ import assert from "@/utils/assert"; -import { BrowserWindow } from "electron"; -import type { IpcMain as ElectronIpcMain } from "electron"; +import type { IpcMain as ElectronIpcMain, BrowserWindow } from "electron"; import { spawn, spawnSync } from "child_process"; import * as fsPromises from "fs/promises"; import * as path from "path"; @@ -1479,12 +1478,19 @@ export class IpcMain { private registerTerminalHandlers(ipcMain: ElectronIpcMain, mainWindow: BrowserWindow): void { ipcMain.handle(IPC_CHANNELS.TERMINAL_CREATE, async (event, params: TerminalCreateParams) => { try { + let senderWindow: Electron.BrowserWindow | null = null; // Get the window that requested this terminal // In Electron, use the actual sender window. In browser mode, event is null, // so we use the mainWindow (mockWindow) which broadcasts to all WebSocket clients - const senderWindow = event?.sender - ? BrowserWindow.fromWebContents(event.sender) - : mainWindow; + if (event?.sender) { + // We must dynamically import here because the browser distribution + // does not include the electron module. + // eslint-disable-next-line no-restricted-syntax + const { BrowserWindow } = await import("electron"); + senderWindow = BrowserWindow.fromWebContents(event.sender); + } else { + senderWindow = mainWindow; + } if (!senderWindow) { throw new Error("Could not find sender window for terminal creation"); }