81 lines
4.4 KiB
TypeScript
81 lines
4.4 KiB
TypeScript
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<void> => ipcRenderer.invoke('win:minimize'),
|
|
toggleMaximize: (): Promise<void> => ipcRenderer.invoke('win:toggleMaximize'),
|
|
close: (): Promise<void> => 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<void> => ipcRenderer.invoke('agent:send', text, images),
|
|
steer: (text: string): Promise<void> => ipcRenderer.invoke('agent:steer', text),
|
|
stop: (): Promise<void> => ipcRenderer.invoke('agent:stop'),
|
|
getState: (): Promise<SessionState> => ipcRenderer.invoke('agent:state'),
|
|
versions: (): Promise<{ app: string; electron: string; node: string; chrome: string; user: string }> =>
|
|
ipcRenderer.invoke('app:versions'),
|
|
listSessions: (): Promise<SessionMeta[]> => ipcRenderer.invoke('sessions:list'),
|
|
newSession: (): Promise<void> => ipcRenderer.invoke('sessions:new'),
|
|
openSession: (path: string): Promise<void> => ipcRenderer.invoke('sessions:open', path),
|
|
renameSession: (name: string): Promise<void> => ipcRenderer.invoke('sessions:rename', name),
|
|
deleteSession: (path: string): Promise<void> => ipcRenderer.invoke('sessions:delete', path),
|
|
listWorkspaces: (): Promise<WorkspaceMeta[]> => ipcRenderer.invoke('workspaces:list'),
|
|
createWorkspace: (name: string): Promise<WorkspaceMeta> => ipcRenderer.invoke('workspaces:create', name),
|
|
openWorkspace: (path: string): Promise<void> => ipcRenderer.invoke('workspaces:open', path),
|
|
browseWorkspace: (): Promise<string | null> => ipcRenderer.invoke('workspaces:browse'),
|
|
listChatResources: (): Promise<ChatResources> => ipcRenderer.invoke('chat:resources'),
|
|
listResourceDetails: (): Promise<ResourceDetails> => ipcRenderer.invoke('resources:details'),
|
|
openPath: (target: string): Promise<string> => ipcRenderer.invoke('shell:openPath', target),
|
|
openDirectory: (target: string): Promise<void> => ipcRenderer.invoke('shell:openDirectory', target),
|
|
setQueue: (steering: string[], followUp: string[]): Promise<void> =>
|
|
ipcRenderer.invoke('queue:set', steering, followUp),
|
|
setPermissionMode: (mode: PermissionMode): Promise<void> => ipcRenderer.invoke('permissions:set', mode),
|
|
listWorkspaceFiles: (): Promise<WorkspaceFile[]> => ipcRenderer.invoke('files:list'),
|
|
pickAttachments: (): Promise<AttachmentInfo[]> => ipcRenderer.invoke('attachments:pick'),
|
|
getModelCatalog: (): Promise<ModelCatalog> => ipcRenderer.invoke('models:catalog'),
|
|
listCustomProviders: (): Promise<CustomProviderConfig[]> => ipcRenderer.invoke('models:custom:list'),
|
|
saveCustomProvider: (config: CustomProviderConfig): Promise<void> =>
|
|
ipcRenderer.invoke('models:custom:save', config),
|
|
deleteCustomProvider: (id: string): Promise<void> => ipcRenderer.invoke('models:custom:delete', id),
|
|
setModel: (providerId: string, modelId: string): Promise<void> =>
|
|
ipcRenderer.invoke('models:set', providerId, modelId),
|
|
setApiKey: (providerId: string, apiKey: string): Promise<void> =>
|
|
ipcRenderer.invoke('auth:setKey', providerId, apiKey),
|
|
logoutProvider: (providerId: string): Promise<void> => ipcRenderer.invoke('auth:logout', providerId),
|
|
getSettings: (): Promise<AppSettings> => ipcRenderer.invoke('settings:get'),
|
|
setSystemPrompt: (text: string): Promise<void> => ipcRenderer.invoke('settings:setPrompt', text),
|
|
setThemeColor: (id: string): Promise<void> => ipcRenderer.invoke('settings:setTheme', id),
|
|
resolveApproval: (id: string, approved: boolean): Promise<void> =>
|
|
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)
|