Files
deepseek-harness/apps/desktop/src/preload.ts
T

27 lines
1.4 KiB
TypeScript

/** Context-isolated renderer bridge for desktop package and update operations. */
import { contextBridge, ipcRenderer } from 'electron'
import { DESKTOP_IPC, type DshDesktopApi, type DesktopUpdateState } from './ipc.ts'
const api: DshDesktopApi = {
protocolVersion: 1,
locale: () => ipcRenderer.invoke(DESKTOP_IPC.localeGet) as Promise<ReturnType<DshDesktopApi['locale']> extends Promise<infer T> ? T : never>,
plugins: {
list: () => ipcRenderer.invoke(DESKTOP_IPC.pluginsList) as Promise<ReturnType<DshDesktopApi['plugins']['list']> extends Promise<infer T> ? T : never>,
add: spec => ipcRenderer.invoke(DESKTOP_IPC.pluginsAdd, spec) as Promise<void>,
remove: name => ipcRenderer.invoke(DESKTOP_IPC.pluginsRemove, name) as Promise<void>,
update: (name, version) => ipcRenderer.invoke(DESKTOP_IPC.pluginsUpdate, name, version) as Promise<void>,
},
updates: {
check: () => ipcRenderer.invoke(DESKTOP_IPC.updatesCheck) as Promise<DesktopUpdateState>,
install: () => ipcRenderer.invoke(DESKTOP_IPC.updatesInstall) as Promise<void>,
subscribe(listener) {
const handle = (_event: Electron.IpcRendererEvent, state: DesktopUpdateState): void => { listener(state) }
ipcRenderer.on(DESKTOP_IPC.updatesState, handle)
return () => { ipcRenderer.off(DESKTOP_IPC.updatesState, handle) }
},
},
}
contextBridge.exposeInMainWorld('dshDesktop', api)