const { contextBridge, ipcRenderer } = require('electron'); contextBridge.exposeInMainWorld('localAI', { isElectron: true, // Binary management getBinaryStatus: () => ipcRenderer.invoke('local-ai:binary-status'), downloadBinary: () => ipcRenderer.invoke('local-ai:download-binary'), // Model management listModels: () => ipcRenderer.invoke('local-ai:list-models'), downloadModel: (modelId) => ipcRenderer.invoke('local-ai:download-model', modelId), downloadAuxiliary: (auxKey) => ipcRenderer.invoke('local-ai:download-auxiliary', auxKey), deleteModel: (modelId) => ipcRenderer.invoke('local-ai:delete-model', modelId), cancelDownload: (modelId) => ipcRenderer.invoke('local-ai:cancel-download', modelId), // Generation generate: (params) => ipcRenderer.invoke('local-ai:generate', params), cancelGeneration: () => ipcRenderer.invoke('local-ai:cancel-generation'), // Progress events — returns an unsubscribe function onProgress: (callback) => { const listener = (_, data) => callback(data); ipcRenderer.on('local-ai:progress', listener); return () => ipcRenderer.removeListener('local-ai:progress', listener); }, onDownloadProgress: (callback) => { const listener = (_, data) => callback(data); ipcRenderer.on('local-ai:download-progress', listener); return () => ipcRenderer.removeListener('local-ai:download-progress', listener); } });