diff --git a/src/preload/index.d.ts b/src/preload/index.d.ts deleted file mode 100644 index 923fbd6bb5..0000000000 --- a/src/preload/index.d.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { ExtractChunkData } from '@cherrystudio/embedjs-interfaces' -import { ElectronAPI } from '@electron-toolkit/preload' -import type { File } from '@google/genai' -import type { GetMCPPromptResponse, MCPPrompt, MCPResource, MCPServer, MCPTool } from '@renderer/types' -import { AppInfo, FileType, KnowledgeBaseParams, KnowledgeItem, LanguageVarious, WebDavConfig } from '@renderer/types' -import type { LoaderReturn } from '@shared/config/types' -import type { OpenDialogOptions } from 'electron' -import type { UpdateInfo } from 'electron-updater' - -interface BackupFile { - fileName: string - modifiedTime: string - size: number -} - -declare global { - interface Window { - electron: ElectronAPI - api: { - getAppInfo: () => Promise - checkForUpdate: () => Promise<{ currentVersion: string; updateInfo: UpdateInfo | null }> - showUpdateDialog: () => Promise - openWebsite: (url: string) => void - setProxy: (proxy: string | undefined) => void - setLanguage: (theme: LanguageVarious) => void - setLaunchOnBoot: (isActive: boolean) => void - setLaunchToTray: (isActive: boolean) => void - setTray: (isActive: boolean) => void - setTrayOnClose: (isActive: boolean) => void - restartTray: () => void - setTheme: (theme: 'light' | 'dark' | 'auto') => void - getTheme: () => Promise<'light' | 'dark' | 'auto'> - setCustomCss: (css: string) => void - setAutoUpdate: (isActive: boolean) => void - reload: () => void - clearCache: () => Promise<{ success: boolean; error?: string }> - system: { - getDeviceType: () => Promise<'mac' | 'windows' | 'linux'> - getHostname: () => Promise - } - zip: { - compress: (text: string) => Promise - decompress: (text: Buffer) => Promise - } - backup: { - backup: (fileName: string, data: string, destinationPath?: string) => Promise - restore: (backupPath: string) => Promise - backupToWebdav: (data: string, webdavConfig: WebDavConfig) => Promise - restoreFromWebdav: (webdavConfig: WebDavConfig) => Promise - listWebdavFiles: (webdavConfig: WebDavConfig) => Promise - checkConnection: (webdavConfig: WebDavConfig) => Promise - createDirectory: (webdavConfig: WebDavConfig, path: string, options?: CreateDirectoryOptions) => Promise - deleteWebdavFile: (fileName: string, webdavConfig: WebDavConfig) => Promise - } - file: { - select: (options?: OpenDialogOptions) => Promise - upload: (file: FileType) => Promise - delete: (fileId: string) => Promise - read: (fileId: string) => Promise - clear: () => Promise - get: (filePath: string) => Promise - selectFolder: () => Promise - create: (fileName: string) => Promise - write: (filePath: string, data: Uint8Array | string) => Promise - open: (options?: OpenDialogOptions) => Promise<{ fileName: string; filePath: string; content: Buffer } | null> - openPath: (path: string) => Promise - save: ( - path: string, - content: string | NodeJS.ArrayBufferView, - options?: SaveDialogOptions - ) => Promise - saveImage: (name: string, data: string) => void - base64Image: (fileId: string) => Promise<{ mime: string; base64: string; data: string }> - download: (url: string) => Promise - copy: (fileId: string, destPath: string) => Promise - binaryFile: (fileId: string) => Promise<{ data: Buffer; mime: string }> - } - fs: { - read: (path: string) => Promise - } - export: { - toWord: (markdown: string, fileName: string) => Promise - } - openPath: (path: string) => Promise - shortcuts: { - update: (shortcuts: Shortcut[]) => Promise - } - knowledgeBase: { - create: (base: KnowledgeBaseParams) => Promise - reset: (base: KnowledgeBaseParams) => Promise - delete: (id: string) => Promise - add: ({ - base, - item, - forceReload = false - }: { - base: KnowledgeBaseParams - item: KnowledgeItem - forceReload?: boolean - }) => Promise - remove: ({ - uniqueId, - uniqueIds, - base - }: { - uniqueId: string - uniqueIds: string[] - base: KnowledgeBaseParams - }) => Promise - search: ({ search, base }: { search: string; base: KnowledgeBaseParams }) => Promise - rerank: ({ - search, - base, - results - }: { - search: string - base: KnowledgeBaseParams - results: ExtractChunkData[] - }) => Promise - } - window: { - setMinimumSize: (width: number, height: number) => Promise - resetMinimumSize: () => Promise - } - gemini: { - uploadFile: (file: FileType, apiKey: string) => Promise - retrieveFile: (file: FileType, apiKey: string) => Promise - base64File: (file: FileType) => Promise<{ data: string; mimeType: string }> - listFiles: (apiKey: string) => Promise - deleteFile: (fileId: string, apiKey: string) => Promise - } - selectionMenu: { - action: (action: string) => Promise - } - config: { - set: (key: string, value: any) => Promise - get: (key: string) => Promise - } - miniWindow: { - show: () => Promise - hide: () => Promise - close: () => Promise - toggle: () => Promise - setPin: (isPinned: boolean) => Promise - } - aes: { - encrypt: (text: string, secretKey: string, iv: string) => Promise<{ iv: string; encryptedData: string }> - decrypt: (encryptedData: string, iv: string, secretKey: string) => Promise - } - shell: { - openExternal: (url: string, options?: OpenExternalOptions) => Promise - } - mcp: { - removeServer: (server: MCPServer) => Promise - restartServer: (server: MCPServer) => Promise - stopServer: (server: MCPServer) => Promise - listTools: (server: MCPServer) => Promise - callTool: ({ - server, - name, - args - }: { - server: MCPServer - name: string - args: any - }) => Promise - listPrompts: (server: MCPServer) => Promise - getPrompt: ({ - server, - name, - args - }: { - server: MCPServer - name: string - args?: Record - }) => Promise - listResources: (server: MCPServer) => Promise - getResource: ({ server, uri }: { server: MCPServer; uri: string }) => Promise - getInstallInfo: () => Promise<{ dir: string; uvPath: string; bunPath: string }> - } - copilot: { - getAuthMessage: ( - headers?: Record - ) => Promise<{ device_code: string; user_code: string; verification_uri: string }> - getCopilotToken: (device_code: string, headers?: Record) => Promise<{ access_token: string }> - saveCopilotToken: (access_token: string) => Promise - getToken: (headers?: Record) => Promise<{ token: string }> - logout: () => Promise - getUser: (token: string) => Promise<{ login: string; avatar: string }> - } - isBinaryExist: (name: string) => Promise - getBinaryPath: (name: string) => Promise - installUVBinary: () => Promise - installBunBinary: () => Promise - protocol: { - onReceiveData: (callback: (data: { url: string; params: any }) => void) => () => void - } - nutstore: { - getSSOUrl: () => Promise - decryptToken: (token: string) => Promise<{ username: string; access_token: string }> - getDirectoryContents: (token: string, path: string) => Promise - } - searchService: { - openSearchWindow: (uid: string) => Promise - closeSearchWindow: (uid: string) => Promise - openUrlInSearchWindow: (uid: string, url: string) => Promise - } - webview: { - setOpenLinkExternal: (webviewId: number, isExternal: boolean) => Promise - } - } - } -} diff --git a/src/preload/index.ts b/src/preload/index.ts index 1671f72cf2..0e3f432f65 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -9,7 +9,7 @@ import { CreateDirectoryOptions } from 'webdav' const api = { getAppInfo: () => ipcRenderer.invoke(IpcChannel.App_Info), reload: () => ipcRenderer.invoke(IpcChannel.App_Reload), - setProxy: (proxy: string) => ipcRenderer.invoke(IpcChannel.App_Proxy, proxy), + setProxy: (proxy: string | undefined) => ipcRenderer.invoke(IpcChannel.App_Proxy, proxy), checkForUpdate: () => ipcRenderer.invoke(IpcChannel.App_CheckForUpdate), showUpdateDialog: () => ipcRenderer.invoke(IpcChannel.App_ShowUpdateDialog), setLanguage: (lang: string) => ipcRenderer.invoke(IpcChannel.App_SetLanguage, lang), @@ -50,16 +50,16 @@ const api = { }, file: { select: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_Select, options), - upload: (filePath: string) => ipcRenderer.invoke(IpcChannel.File_Upload, filePath), + upload: (file: FileType) => ipcRenderer.invoke(IpcChannel.File_Upload, file), delete: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Delete, fileId), read: (fileId: string) => ipcRenderer.invoke(IpcChannel.File_Read, fileId), clear: () => ipcRenderer.invoke(IpcChannel.File_Clear), get: (filePath: string) => ipcRenderer.invoke(IpcChannel.File_Get, filePath), create: (fileName: string) => ipcRenderer.invoke(IpcChannel.File_Create, fileName), write: (filePath: string, data: Uint8Array | string) => ipcRenderer.invoke(IpcChannel.File_Write, filePath, data), - open: (options?: { decompress: boolean }) => ipcRenderer.invoke(IpcChannel.File_Open, options), + open: (options?: OpenDialogOptions) => ipcRenderer.invoke(IpcChannel.File_Open, options), openPath: (path: string) => ipcRenderer.invoke(IpcChannel.File_OpenPath, path), - save: (path: string, content: string, options?: { compress: boolean }) => + save: (path: string, content: string | NodeJS.ArrayBufferView, options?: any) => ipcRenderer.invoke(IpcChannel.File_Save, path, content, options), selectFolder: () => ipcRenderer.invoke(IpcChannel.File_SelectFolder), saveImage: (name: string, data: string) => ipcRenderer.invoke(IpcChannel.File_SaveImage, name, data), @@ -108,7 +108,7 @@ const api = { base64File: (file: FileType) => ipcRenderer.invoke(IpcChannel.Gemini_Base64File, file), retrieveFile: (file: FileType, apiKey: string) => ipcRenderer.invoke(IpcChannel.Gemini_RetrieveFile, file, apiKey), listFiles: (apiKey: string) => ipcRenderer.invoke(IpcChannel.Gemini_ListFiles, apiKey), - deleteFile: (apiKey: string, fileId: string) => ipcRenderer.invoke(IpcChannel.Gemini_DeleteFile, apiKey, fileId) + deleteFile: (fileId: string, apiKey: string) => ipcRenderer.invoke(IpcChannel.Gemini_DeleteFile, fileId, apiKey) }, selectionMenu: { action: (action: string) => ipcRenderer.invoke(IpcChannel.SelectionMenu_Action, action) @@ -135,7 +135,7 @@ const api = { restartServer: (server: MCPServer) => ipcRenderer.invoke(IpcChannel.Mcp_RestartServer, server), stopServer: (server: MCPServer) => ipcRenderer.invoke(IpcChannel.Mcp_StopServer, server), listTools: (server: MCPServer) => ipcRenderer.invoke(IpcChannel.Mcp_ListTools, server), - callTool: ({ server, name, args }: { server: MCPServer; name: string; args?: Record }) => + callTool: ({ server, name, args }: { server: MCPServer; name: string; args: any }) => ipcRenderer.invoke(IpcChannel.Mcp_CallTool, { server, name, args }), listPrompts: (server: MCPServer) => ipcRenderer.invoke(IpcChannel.Mcp_ListPrompts, server), getPrompt: ({ server, name, args }: { server: MCPServer; name: string; args?: Record }) => @@ -146,7 +146,7 @@ const api = { getInstallInfo: () => ipcRenderer.invoke(IpcChannel.Mcp_GetInstallInfo) }, shell: { - openExternal: shell.openExternal + openExternal: (url: string, options?: Electron.OpenExternalOptions) => shell.openExternal(url, options) }, copilot: { getAuthMessage: (headers?: Record) => @@ -213,3 +213,5 @@ if (process.contextIsolated) { // @ts-ignore (define in dts) window.api = api } + +export type WindowApiType = typeof api diff --git a/src/preload/preload.d.ts b/src/preload/preload.d.ts new file mode 100644 index 0000000000..7e46ae82a8 --- /dev/null +++ b/src/preload/preload.d.ts @@ -0,0 +1,11 @@ +import { ElectronAPI } from '@electron-toolkit/preload' + +import type { WindowApiType } from './index' + +/** you don't need to declare this in your code, it's automatically generated */ +declare global { + interface Window { + electron: ElectronAPI + api: WindowApiType + } +} diff --git a/src/renderer/src/store/shortcuts.ts b/src/renderer/src/store/shortcuts.ts index 7fe4f23937..03f7eaee3c 100644 --- a/src/renderer/src/store/shortcuts.ts +++ b/src/renderer/src/store/shortcuts.ts @@ -88,7 +88,8 @@ const getSerializableShortcuts = (shortcuts: Shortcut[]) => { key: shortcut.key, shortcut: [...shortcut.shortcut], enabled: shortcut.enabled, - system: shortcut.system + system: shortcut.system, + editable: shortcut.editable })) } diff --git a/tsconfig.web.json b/tsconfig.web.json index 3ed2c1ec1a..1033af7497 100644 --- a/tsconfig.web.json +++ b/tsconfig.web.json @@ -12,7 +12,8 @@ "baseUrl": ".", "paths": { "@renderer/*": ["src/renderer/src/*"], - "@shared/*": ["packages/shared/*"] + "@shared/*": ["packages/shared/*"], + "@types": ["src/renderer/src/types/index.ts"] } } }