import { contextBridge, ipcRenderer } from "electron"; import { IPC_CHANNELS, PRELOAD_FORWARDERS, mapPreloadInvokeArgs, type DesktopApi, type PreloadForwardedApi, } from "@shared/contracts"; import type { DesktopEvent } from "@shared/types"; function createForwardedApi(): PreloadForwardedApi { const forwardedEntries = PRELOAD_FORWARDERS.map(({ api, channel, payload }) => [ api, (...args: unknown[]) => ipcRenderer.invoke( IPC_CHANNELS[channel], ...mapPreloadInvokeArgs(payload, args), ), ]); return Object.fromEntries(forwardedEntries) as PreloadForwardedApi; } const api: DesktopApi = { ...createForwardedApi(), subscribe: (callback: (event: DesktopEvent) => void) => { const listener = (_event: Electron.IpcRendererEvent, payload: DesktopEvent) => callback(payload); ipcRenderer.on(IPC_CHANNELS.rendererEvent, listener); return () => { ipcRenderer.removeListener(IPC_CHANNELS.rendererEvent, listener); }; }, platform: process.platform as "win32" | "darwin" | "linux", windowMinimize: async () => { await ipcRenderer.invoke(IPC_CHANNELS.windowMinimize); }, windowMaximize: async () => { await ipcRenderer.invoke(IPC_CHANNELS.windowMaximize); }, windowClose: async () => { await ipcRenderer.invoke(IPC_CHANNELS.windowClose); }, windowIsMaximized: async () => { const result = (await ipcRenderer.invoke(IPC_CHANNELS.windowIsMaximized)) as { ok: true; data: boolean } | { ok: false }; return result.ok ? result.data : false; }, }; contextBridge.exposeInMainWorld("agentCompany", api);