Files
inkreach-agent/apps/desktop/src/preload/index.ts
T

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)