import { contextBridge, ipcRenderer, type IpcRendererEvent } from 'electron'; import type { AssistantBridge, ViewMode, ViewportMessage } from './shared'; function subscribe(channel: string, handler: (payload: T) => void): () => void { const listener = (_event: IpcRendererEvent, payload: T): void => handler(payload); ipcRenderer.on(channel, listener); return () => ipcRenderer.removeListener(channel, listener); } const bridge: AssistantBridge = { desktopChrome: { platform: process.platform, titleBar: process.platform === 'darwin' ? 'mac-inset' : 'native', }, get: path => ipcRenderer.invoke('api:get', path), post: (path, body) => ipcRenderer.invoke('api:post', path, body ?? {}), put: (path, body) => ipcRenderer.invoke('api:put', path, body ?? {}), del: path => ipcRenderer.invoke('api:delete', path), openPath: filePath => ipcRenderer.invoke('shell:openPath', filePath), meta: () => ipcRenderer.invoke('app:meta'), browser: { viewport: (message: ViewportMessage) => ipcRenderer.invoke('browser:viewport', message), mode: (taskId: string, mode: ViewMode) => ipcRenderer.invoke('browser:mode', { taskId, mode }), onState: handler => subscribe('browser:state', handler), onReveal: handler => subscribe('browser:reveal', handler), onHide: handler => subscribe('browser:hide', handler), onUserInput: handler => subscribe('browser:user-input', handler), }, }; contextBridge.exposeInMainWorld('assistant', bridge);