import { contextBridge, ipcRenderer } from 'electron' import type { AgentUiEvent, AppSettings, AttachmentInfo, ChatResources, CustomProviderConfig, ModelCatalog, PermissionMode, ResourceDetails, SendImage, SessionMeta, SessionState, WorkspaceFile, WorkspaceMeta } from '@shared/types' const api = { // 窗口控制(自绘标题栏按钮) minimize: (): Promise => ipcRenderer.invoke('win:minimize'), toggleMaximize: (): Promise => ipcRenderer.invoke('win:toggleMaximize'), close: (): Promise => ipcRenderer.invoke('win:close'), onWindowState: (callback: (maximized: boolean) => void): (() => void) => { const listener = (_e: Electron.IpcRendererEvent, maximized: boolean): void => callback(maximized) ipcRenderer.on('win:state', listener) return () => { ipcRenderer.removeListener('win:state', listener) } }, send: (text: string, images?: SendImage[]): Promise => ipcRenderer.invoke('agent:send', text, images), steer: (text: string): Promise => ipcRenderer.invoke('agent:steer', text), stop: (): Promise => ipcRenderer.invoke('agent:stop'), getState: (): Promise => ipcRenderer.invoke('agent:state'), versions: (): Promise<{ app: string; electron: string; node: string; chrome: string; user: string }> => ipcRenderer.invoke('app:versions'), listSessions: (): Promise => ipcRenderer.invoke('sessions:list'), newSession: (): Promise => ipcRenderer.invoke('sessions:new'), openSession: (path: string): Promise => ipcRenderer.invoke('sessions:open', path), renameSession: (name: string): Promise => ipcRenderer.invoke('sessions:rename', name), deleteSession: (path: string): Promise => ipcRenderer.invoke('sessions:delete', path), listWorkspaces: (): Promise => ipcRenderer.invoke('workspaces:list'), createWorkspace: (name: string): Promise => ipcRenderer.invoke('workspaces:create', name), openWorkspace: (path: string): Promise => ipcRenderer.invoke('workspaces:open', path), browseWorkspace: (): Promise => ipcRenderer.invoke('workspaces:browse'), listChatResources: (): Promise => ipcRenderer.invoke('chat:resources'), listResourceDetails: (): Promise => ipcRenderer.invoke('resources:details'), openPath: (target: string): Promise => ipcRenderer.invoke('shell:openPath', target), openDirectory: (target: string): Promise => ipcRenderer.invoke('shell:openDirectory', target), setQueue: (steering: string[], followUp: string[]): Promise => ipcRenderer.invoke('queue:set', steering, followUp), setPermissionMode: (mode: PermissionMode): Promise => ipcRenderer.invoke('permissions:set', mode), listWorkspaceFiles: (): Promise => ipcRenderer.invoke('files:list'), pickAttachments: (): Promise => ipcRenderer.invoke('attachments:pick'), getModelCatalog: (): Promise => ipcRenderer.invoke('models:catalog'), listCustomProviders: (): Promise => ipcRenderer.invoke('models:custom:list'), saveCustomProvider: (config: CustomProviderConfig): Promise => ipcRenderer.invoke('models:custom:save', config), deleteCustomProvider: (id: string): Promise => ipcRenderer.invoke('models:custom:delete', id), setModel: (providerId: string, modelId: string): Promise => ipcRenderer.invoke('models:set', providerId, modelId), setApiKey: (providerId: string, apiKey: string): Promise => ipcRenderer.invoke('auth:setKey', providerId, apiKey), logoutProvider: (providerId: string): Promise => ipcRenderer.invoke('auth:logout', providerId), getSettings: (): Promise => ipcRenderer.invoke('settings:get'), setSystemPrompt: (text: string): Promise => ipcRenderer.invoke('settings:setPrompt', text), setThemeColor: (id: string): Promise => ipcRenderer.invoke('settings:setTheme', id), resolveApproval: (id: string, approved: boolean): Promise => ipcRenderer.invoke('approval:resolve', id, approved), onEvent: (callback: (event: AgentUiEvent) => void): (() => void) => { const listener = (_e: Electron.IpcRendererEvent, event: AgentUiEvent): void => callback(event) ipcRenderer.on('agent:event', listener) return () => { ipcRenderer.removeListener('agent:event', listener) } } } export type DesktopApi = typeof api contextBridge.exposeInMainWorld('api', api)