diff --git a/docs/technical/how-to-use-logger-en.md b/docs/technical/how-to-use-logger-en.md index 4af08d25e..b07985f5d 100644 --- a/docs/technical/how-to-use-logger-en.md +++ b/docs/technical/how-to-use-logger-en.md @@ -38,20 +38,25 @@ const logger = loggerService.withContext('moduleName', CONTEXT) ### Logging -In your code, you can call `logger` at any time to record logs. The supported methods are: `error`, `warn`, `info`, `verbose`, `debug`, `silly`. -For the meaning of each level, please refer to the section below. +In your code, you can call `logger` at any time to record logs. The supported levels are: `error`, `warn`, `info`, `verbose`, `debug`, and `silly`. +For the meaning of each level, please refer to the subsequent sections. -The following examples show how to use `logger.info` and `logger.error`. Other levels are used in the same way: +The following are the supported parameters for logging (using `logger.LEVEL` as an example, where `LEVEL` represents one of the levels mentioned above): ```typescript -logger.info('message', CONTEXT) -logger.info('message %s %d', 'hello', 123, CONTEXT) -logger.error('message', new Error('error message'), CONTEXT) +logger.LEVEL(message) +logger.LEVEL(message, CONTEXT) +logger.LEVEL(message, error) +logger.LEVEL(message, error, CONTEXT) ``` -- `message` is a required string. All other options are optional. -- `CONTEXT` as `{ key: value, ... }` is optional and will be recorded in the log file. -- If an `Error` type is passed, the error stack will be automatically recorded. +**Only the four calling methods above are supported**: + +| Parameter | Type | Description | +| --------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `message` | `string` | Required. This is the core field of the log, containing the main content to be recorded. | +| `CONTEXT` | `object` | Optional. Additional information to be recorded in the log file. It is recommended to use the `{ key: value, ...}` format. | +| `error` | `Error` | Optional. The error stack trace will also be printed.
Note that the `error` caught by `catch(error)` is of the `unknown` type. According to TypeScript best practices, you should first use `instanceof` for type checking. If you are certain it is an `Error` type, you can also use a type assertion like `as Error`. | ### Log Levels diff --git a/docs/technical/how-to-use-logger-zh.md b/docs/technical/how-to-use-logger-zh.md index 04cf80fe0..d9a0861ee 100644 --- a/docs/technical/how-to-use-logger-zh.md +++ b/docs/technical/how-to-use-logger-zh.md @@ -38,20 +38,24 @@ const logger = loggerService.withContext('moduleName', CONTEXT) ### 记录日志 -在代码中,可以随时调用 `logger` 来记录日志,支持的方法有:`error`, `warn`, `info`, `verbose`, `debug`, `silly` -各级别的含义,请参考下面的章节。 +在代码中,可以随时调用 `logger` 来记录日志,支持的级别有:`error`, `warn`, `info`, `verbose`, `debug`, `silly` +各级别的含义,请参考后面的章节。 -以下以 `logger.info` 和 `logger.error` 举例如何使用,其他级别是一样的: +以下支持的记录日志的参数(以 `logger.LEVEL` 举例如何使用,`LEVEL`指代为上述级别): ```typescript -logger.info('message', CONTEXT) -logger.info('message %s %d', 'hello', 123, CONTEXT) -logger.error('message', new Error('error message'), CONTEXT) +logger.LEVEL(message) +logger.LEVEL(message, CONTEXT) +logger.LEVEL(message, error) +logger.LEVEL(message, error, CONTEXT) ``` -- `message` 是必填的,`string`类型,其他选项都是可选的 -- `CONTEXT`为`{ key: value, ...}` 是可选的,会在日志文件中记录 -- 如果传递了`Error`类型,会自动记录错误堆栈 +**只支持上述四种调用方式**: +| 参数 | 类型 | 说明 | +| ----- | ----- | ----- | +| `message` | `string` | 必填项。这是日志的核心字段,记录的重点内容 | +| `CONTEXT` | `object` | 可选。其他需要再日志文件中记录的信息,建议为`{ key: value, ...}`格式 +| `error` | `Error` | 可选。同时会打印错误堆栈信息。
注意`catch(error)`所捕获的`error`是`unknown`类型,按照`Typescript`最佳实践,请先用`instanceof`进行类型判断,如果确信一定是`Error`类型,也可用断言`as Error`。| ### 记录级别 diff --git a/packages/shared/config/logger.ts b/packages/shared/config/logger.ts index 943ecacef..00e93b3e6 100644 --- a/packages/shared/config/logger.ts +++ b/packages/shared/config/logger.ts @@ -5,6 +5,10 @@ export type LogSourceWithContext = { context?: Record } +type NullableObject = object | undefined | null + +export type LogContextData = [] | [Error | NullableObject] | [Error | NullableObject, ...NullableObject[]] + export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'verbose' | 'silly' | 'none' export const LEVEL = { diff --git a/src/main/index.ts b/src/main/index.ts index cca78b851..0f9f21d8e 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -71,7 +71,7 @@ app.on('web-contents-created', (_, webContents) => { // Interrupt execution and collect call stack from unresponsive renderer logger.error('Renderer unresponsive start') const callStack = await webContents.mainFrame.collectJavaScriptCallStack() - logger.error('Renderer unresponsive js call stack\n', callStack) + logger.error(`Renderer unresponsive js call stack\n ${callStack}`) }) }) @@ -84,7 +84,7 @@ if (!isDev) { // handle unhandled rejection process.on('unhandledRejection', (reason, promise) => { - logger.error('Unhandled Rejection at:', promise, 'reason:', reason) + logger.error(`Unhandled Rejection at: ${promise} reason: ${reason}`) }) } @@ -184,7 +184,7 @@ if (!app.requestSingleInstanceLock()) { try { await mcpService.cleanup() } catch (error) { - logger.warn('Error cleaning up MCP service:', error) + logger.warn('Error cleaning up MCP service:', error as Error) } // finish the logger logger.finish() diff --git a/src/main/ipc.ts b/src/main/ipc.ts index afc25dd23..264084dc9 100644 --- a/src/main/ipc.ts +++ b/src/main/ipc.ts @@ -163,7 +163,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { }) ipcMain.handle(IpcChannel.App_SetTestPlan, async (_, isActive: boolean) => { - logger.info('set test plan', isActive) + logger.info(`set test plan: ${isActive}`) if (isActive !== configManager.getTestPlan()) { appUpdater.cancelDownload() configManager.setTestPlan(isActive) @@ -171,7 +171,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { }) ipcMain.handle(IpcChannel.App_SetTestChannel, async (_, channel: UpgradeChannel) => { - logger.info('set test channel', channel) + logger.info(`set test channel: ${channel}`) if (channel !== configManager.getTestChannel()) { appUpdater.cancelDownload() configManager.setTestChannel(channel) @@ -342,7 +342,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { ipcMain.handle(IpcChannel.App_RelaunchApp, (_, options?: Electron.RelaunchOptions) => { // Fix for .AppImage if (isLinux && process.env.APPIMAGE) { - logger.info('Relaunching app with options:', process.env.APPIMAGE, options) + logger.info(`Relaunching app with options: ${process.env.APPIMAGE}`, options) // On Linux, we need to use the APPIMAGE environment variable to relaunch // https://github.com/electron-userland/electron-builder/issues/1727#issuecomment-769896927 options = options || {} @@ -580,7 +580,7 @@ export function registerIpc(mainWindow: BrowserWindow, app: Electron.App) { // Process DXT file using the temporary path return await dxtService.uploadDxt(event, tempPath) } catch (error) { - logger.error('DXT upload error:', error) + logger.error('DXT upload error:', error as Error) return { success: false, error: error instanceof Error ? error.message : 'Failed to upload DXT file' diff --git a/src/main/knowledge/loader/epubLoader.ts b/src/main/knowledge/loader/epubLoader.ts index bd90a9c7f..6100962a8 100644 --- a/src/main/knowledge/loader/epubLoader.ts +++ b/src/main/knowledge/loader/epubLoader.ts @@ -185,7 +185,7 @@ export class EpubLoader extends BaseLoader extends BaseLoader<{ type: string }> { try { this.extractedText = await parseOfficeAsync(this.filePath, this.config) } catch (err) { - logger.error('odLoader error', err) + logger.error('odLoader error', err as Error) throw err } } diff --git a/src/main/knowledge/ocr/MacSysOcrProvider.ts b/src/main/knowledge/ocr/MacSysOcrProvider.ts index 92e95cf71..b18f59eb7 100644 --- a/src/main/knowledge/ocr/MacSysOcrProvider.ts +++ b/src/main/knowledge/ocr/MacSysOcrProvider.ts @@ -23,7 +23,7 @@ export default class MacSysOcrProvider extends BaseOcrProvider { const module = await import('@cherrystudio/mac-system-ocr') this.MacOCR = module.default } catch (error) { - logger.error('Failed to load mac-system-ocr:', error) + logger.error('Failed to load mac-system-ocr:', error as Error) throw error } } @@ -121,7 +121,7 @@ export default class MacSysOcrProvider extends BaseOcrProvider { } } } catch (error) { - logger.error('Error during OCR process:', error) + logger.error('Error during OCR process:', error as Error) throw error } } diff --git a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts index 74fed3de8..171bfb4ad 100644 --- a/src/main/knowledge/preprocess/MineruPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/MineruPreprocessProvider.ts @@ -107,7 +107,7 @@ export default class MineruPreprocessProvider extends BasePreprocessProvider { const response: QuotaResponse = await quota.json() return response.data.user_left_quota } catch (error) { - logger.error('Error checking quota:', error) + logger.error('Error checking quota:', error as Error) throw error } } diff --git a/src/main/knowledge/preprocess/MistralPreprocessProvider.ts b/src/main/knowledge/preprocess/MistralPreprocessProvider.ts index ece371ddb..444e375dc 100644 --- a/src/main/knowledge/preprocess/MistralPreprocessProvider.ts +++ b/src/main/knowledge/preprocess/MistralPreprocessProvider.ts @@ -154,7 +154,7 @@ export default class MistralPreprocessProvider extends BasePreprocessProvider { counter++ } catch (error) { - logger.error(`Failed to save image ${imageFileName}:`, error) + logger.error(`Failed to save image ${imageFileName}:`, error as Error) } } }) diff --git a/src/main/mcpServers/dify-knowledge.ts b/src/main/mcpServers/dify-knowledge.ts index e3f8c84b2..f9a990834 100644 --- a/src/main/mcpServers/dify-knowledge.ts +++ b/src/main/mcpServers/dify-knowledge.ts @@ -166,7 +166,7 @@ class DifyKnowledgeServer { content: [{ type: 'text', text: formattedText }] } } catch (error) { - logger.error('Error fetching knowledge list:', error) + logger.error('Error fetching knowledge list:', error as Error) const errorMessage = error instanceof Error ? error.message : String(error) // 返回包含错误信息的 MCP 响应 return { @@ -245,7 +245,7 @@ class DifyKnowledgeServer { content: [{ type: 'text', text: formattedText }] } } catch (error) { - logger.error('Error searching knowledge:', error) + logger.error('Error searching knowledge:', error as Error) const errorMessage = error instanceof Error ? error.message : String(error) return { content: [{ type: 'text', text: `Search Knowledge Error: ${errorMessage}` }], diff --git a/src/main/mcpServers/memory.ts b/src/main/mcpServers/memory.ts index d69366027..971edea08 100644 --- a/src/main/mcpServers/memory.ts +++ b/src/main/mcpServers/memory.ts @@ -65,7 +65,7 @@ class KnowledgeGraphManager { await fs.writeFile(this.memoryPath, JSON.stringify({ entities: [], relations: [] }, null, 2)) } } catch (error) { - logger.error('Failed to ensure memory path exists:', error) + logger.error('Failed to ensure memory path exists:', error as Error) // Propagate the error or handle it more gracefully depending on requirements throw new McpError( ErrorCode.InternalError, @@ -104,7 +104,7 @@ class KnowledgeGraphManager { this.relations = new Set() await this._persistGraph() } else { - logger.error('Failed to load knowledge graph from disk:', error) + logger.error('Failed to load knowledge graph from disk:', error as Error) throw new McpError( ErrorCode.InternalError, `Failed to load graph: ${error instanceof Error ? error.message : String(error)}` @@ -123,7 +123,7 @@ class KnowledgeGraphManager { } await fs.writeFile(this.memoryPath, JSON.stringify(graphData, null, 2)) } catch (error) { - logger.error('Failed to save knowledge graph:', error) + logger.error('Failed to save knowledge graph:', error as Error) // Decide how to handle write errors - potentially retry or notify throw new McpError( ErrorCode.InternalError, @@ -371,7 +371,7 @@ class MemoryServer { this.knowledgeGraphManager = await KnowledgeGraphManager.create(memoryPath) logger.debug('KnowledgeGraphManager initialized successfully.') } catch (error) { - logger.error('Failed to initialize KnowledgeGraphManager:', error) + logger.error('Failed to initialize KnowledgeGraphManager:', error as Error) // Server might be unusable, consider how to handle this state // Maybe set a flag and return errors for all tool calls? this.knowledgeGraphManager = null // Ensure it's null if init fails @@ -398,7 +398,7 @@ class MemoryServer { await this._getManager() // Wait for initialization before confirming tools are available } catch (error) { // If manager failed to init, maybe return an empty tool list or throw? - logger.error('Cannot list tools, manager initialization failed:', error) + logger.error('Cannot list tools, manager initialization failed:', error as Error) return { tools: [] } // Return empty list if server is not ready } @@ -700,7 +700,7 @@ class MemoryServer { if (error instanceof McpError) { throw error // Re-throw McpErrors directly } - logger.error(`Error executing tool ${name}:`, error) + logger.error(`Error executing tool ${name}:`, error as Error) // Throw a generic internal error for unexpected issues throw new McpError( ErrorCode.InternalError, diff --git a/src/main/mcpServers/python.ts b/src/main/mcpServers/python.ts index b8a420808..0357051ad 100644 --- a/src/main/mcpServers/python.ts +++ b/src/main/mcpServers/python.ts @@ -104,7 +104,7 @@ print('python code here')`, } } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error) - logger.error('Python execution error:', errorMessage) + logger.error(`Python execution error: ${errorMessage}`) throw new McpError(ErrorCode.InternalError, `Python execution failed: ${errorMessage}`) } diff --git a/src/main/services/AppService.ts b/src/main/services/AppService.ts index b95edda56..a7e1fa953 100644 --- a/src/main/services/AppService.ts +++ b/src/main/services/AppService.ts @@ -73,7 +73,7 @@ export class AppService { } } } catch (error) { - logger.error('Failed to set launch on boot for Linux:', error) + logger.error('Failed to set launch on boot for Linux:', error as Error) } } } diff --git a/src/main/services/AppUpdater.ts b/src/main/services/AppUpdater.ts index ed67e5319..6d8a6e68c 100644 --- a/src/main/services/AppUpdater.ts +++ b/src/main/services/AppUpdater.ts @@ -6,7 +6,7 @@ import { FeedUrl, UpgradeChannel } from '@shared/config/constant' import { IpcChannel } from '@shared/IpcChannel' import { CancellationToken, UpdateInfo } from 'builder-util-runtime' import { app, BrowserWindow, dialog } from 'electron' -import { AppUpdater as _AppUpdater, autoUpdater, NsisUpdater, UpdateCheckResult } from 'electron-updater' +import { AppUpdater as _AppUpdater, autoUpdater, Logger, NsisUpdater, UpdateCheckResult } from 'electron-updater' import path from 'path' import icon from '../../../build/icon.png?asset' @@ -21,7 +21,7 @@ export default class AppUpdater { private updateCheckResult: UpdateCheckResult | null = null constructor(mainWindow: BrowserWindow) { - autoUpdater.logger = logger + autoUpdater.logger = logger as Logger autoUpdater.forceDevUpdateConfig = !app.isPackaged autoUpdater.autoDownload = configManager.getAutoUpdate() autoUpdater.autoInstallOnAppQuit = configManager.getAutoUpdate() @@ -71,7 +71,7 @@ export default class AppUpdater { private async _getPreReleaseVersionFromGithub(channel: UpgradeChannel) { try { - logger.info('get pre release version from github', channel) + logger.info(`get pre release version from github: ${channel}`) const responses = await fetch('https://api.github.com/repos/CherryHQ/cherry-studio/releases?per_page=8', { headers: { Accept: 'application/vnd.github+json', @@ -90,10 +90,9 @@ export default class AppUpdater { return null } - logger.info('release info', release.tag_name) return `https://github.com/CherryHQ/cherry-studio/releases/download/${release.tag_name}` } catch (error) { - logger.error('Failed to get latest not draft version from github:', error) + logger.error('Failed to get latest not draft version from github:', error as Error) return null } } @@ -117,7 +116,7 @@ export default class AppUpdater { const data = await ipinfo.json() return data.country || 'CN' } catch (error) { - logger.error('Failed to get ipinfo:', error) + logger.error('Failed to get ipinfo:', error as Error) return 'CN' } } @@ -225,7 +224,7 @@ export default class AppUpdater { updateInfo: this.updateCheckResult?.updateInfo } } catch (error) { - logger.error('Failed to check for update:', error) + logger.error('Failed to check for update:', error as Error) return { currentVersion: app.getVersion(), updateInfo: null diff --git a/src/main/services/BackupManager.ts b/src/main/services/BackupManager.ts index 5e0f12d84..5ec531fe6 100644 --- a/src/main/services/BackupManager.ts +++ b/src/main/services/BackupManager.ts @@ -60,7 +60,7 @@ class BackupManager { // 确保根目录权限 await this.forceSetWritable(dirPath) } catch (error) { - logger.error(`权限设置失败:${dirPath}`, error) + logger.error(`权限设置失败:${dirPath}`, error as Error) throw error } } @@ -83,7 +83,7 @@ class BackupManager { } } catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ENOENT') { - logger.warn(`权限设置警告:${targetPath}`, error) + logger.warn(`权限设置警告:${targetPath}`, error as Error) } } } @@ -124,7 +124,7 @@ class BackupManager { onProgress({ stage: 'writing_data', progress: 20, total: 100 }) - logger.debug('BackupManager IPC', skipBackupFile) + logger.debug(`BackupManager IPC, skipBackupFile: ${skipBackupFile}`) if (!skipBackupFile) { // 复制 Data 目录到临时目录 @@ -181,7 +181,7 @@ class BackupManager { } } catch (error) { // 仅在出错时记录日志 - logger.error('[BackupManager] Error calculating totals:', error) + logger.error('[BackupManager] Error calculating totals:', error as Error) } } @@ -241,7 +241,7 @@ class BackupManager { logger.debug('Backup completed successfully') return backupedFilePath } catch (error) { - logger.error('[BackupManager] Backup failed:', error) + logger.error('[BackupManager] Backup failed:', error as Error) // 确保清理临时目录 await fs.remove(this.tempDir).catch(() => {}) throw error @@ -265,7 +265,7 @@ class BackupManager { await fs.ensureDir(this.tempDir) onProgress({ stage: 'preparing', progress: 0, total: 100 }) - logger.debug('step 1: unzip backup file', this.tempDir) + logger.debug(`step 1: unzip backup file: ${this.tempDir}`) const zip = new StreamZip.async({ file: backupPath }) onProgress({ stage: 'extracting', progress: 15, total: 100 }) @@ -314,7 +314,7 @@ class BackupManager { return data } catch (error) { - logger.error('Restore failed:', error) + logger.error('Restore failed:', error as Error) await fs.remove(this.tempDir).catch(() => {}) throw error } @@ -509,7 +509,7 @@ class BackupManager { const backupedFilePath = await this.backup(_, fileName, data, backupDir, localConfig.skipBackupFile) return backupedFilePath } catch (error) { - logger.error('[BackupManager] Local backup failed:', error) + logger.error('[BackupManager] Local backup failed:', error as Error) throw error } } @@ -535,7 +535,7 @@ class BackupManager { logger.debug(`S3 backup completed successfully: ${filename}`) return result } catch (error) { - logger.error(`[BackupManager] S3 backup failed:`, error) + logger.error(`[BackupManager] S3 backup failed:`, error as Error) await fs.remove(backupedFilePath) throw error } @@ -552,7 +552,7 @@ class BackupManager { return await this.restore(_, backupPath) } catch (error) { - logger.error('[BackupManager] Local restore failed:', error) + logger.error('[BackupManager] Local restore failed:', error as Error) throw error } } @@ -578,7 +578,7 @@ class BackupManager { // Sort by modified time, newest first return result.sort((a, b) => new Date(b.modifiedTime).getTime() - new Date(a.modifiedTime).getTime()) } catch (error) { - logger.error('[BackupManager] List local backup files failed:', error) + logger.error('[BackupManager] List local backup files failed:', error as Error) throw error } } @@ -594,7 +594,7 @@ class BackupManager { await fs.remove(filePath) return true } catch (error) { - logger.error('[BackupManager] Delete local backup file failed:', error) + logger.error('[BackupManager] Delete local backup file failed:', error as Error) throw error } } @@ -605,7 +605,7 @@ class BackupManager { await fs.ensureDir(dirPath) return true } catch (error) { - logger.error('[BackupManager] Set local backup directory failed:', error) + logger.error('[BackupManager] Set local backup directory failed:', error as Error) throw error } } diff --git a/src/main/services/CopilotService.ts b/src/main/services/CopilotService.ts index 56898d7c2..bb54e7493 100644 --- a/src/main/services/CopilotService.ts +++ b/src/main/services/CopilotService.ts @@ -103,7 +103,7 @@ class CopilotService { avatar: response.data.avatar_url } } catch (error) { - logger.error('Failed to get user information:', error) + logger.error('Failed to get user information:', error as Error) throw new CopilotServiceError('无法获取GitHub用户信息', error) } } @@ -129,7 +129,7 @@ class CopilotService { return response.data } catch (error) { - logger.error('Failed to get auth message:', error) + logger.error('Failed to get auth message:', error as Error) throw new CopilotServiceError('无法获取GitHub授权信息', error) } } @@ -171,7 +171,7 @@ class CopilotService { // 仅在最后一次尝试失败时记录详细错误 const isLastAttempt = attempt === CONFIG.POLLING.MAX_ATTEMPTS - 1 if (isLastAttempt) { - logger.error(`Token polling failed after ${CONFIG.POLLING.MAX_ATTEMPTS} attempts:`, error) + logger.error(`Token polling failed after ${CONFIG.POLLING.MAX_ATTEMPTS} attempts:`, error as Error) } } } @@ -187,7 +187,7 @@ class CopilotService { const encryptedToken = safeStorage.encryptString(token) await fs.writeFile(this.tokenFilePath, encryptedToken) } catch (error) { - logger.error('Failed to save token:', error) + logger.error('Failed to save token:', error as Error) throw new CopilotServiceError('无法保存访问令牌', error) } } @@ -216,7 +216,7 @@ class CopilotService { return response.data } catch (error) { - logger.error('Failed to get Copilot token:', error) + logger.error('Failed to get Copilot token:', error as Error) throw new CopilotServiceError('无法获取Copilot令牌,请重新授权', error) } } @@ -235,7 +235,7 @@ class CopilotService { logger.debug('Token file not found, nothing to delete') } } catch (error) { - logger.error('Failed to logout:', error) + logger.error('Failed to logout:', error as Error) throw new CopilotServiceError('无法完成退出登录操作', error) } } diff --git a/src/main/services/DxtService.ts b/src/main/services/DxtService.ts index 22bbfaee3..59521efc6 100644 --- a/src/main/services/DxtService.ts +++ b/src/main/services/DxtService.ts @@ -176,7 +176,7 @@ class DxtService { fs.mkdirSync(this.mcpDir, { recursive: true }) } } catch (error) { - logger.error('Failed to create directories:', error) + logger.error('Failed to create directories:', error as Error) } } @@ -232,7 +232,7 @@ class DxtService { } // Extract the DXT file (which is a ZIP archive) to a temporary directory - logger.debug('Extracting DXT file:', filePath) + logger.debug(`Extracting DXT file: ${filePath}`) const zip = new StreamZip.async({ file: filePath }) await zip.extract(null, tempExtractDir) @@ -278,14 +278,14 @@ class DxtService { // Clean up any existing version of this server if (fs.existsSync(finalExtractDir)) { - logger.debug('Removing existing server directory:', finalExtractDir) + logger.debug(`Removing existing server directory: ${finalExtractDir}`) fs.rmSync(finalExtractDir, { recursive: true, force: true }) } // Move the temporary directory to the final location // Use recursive copy + remove instead of rename to handle cross-filesystem moves await this.moveDirectory(tempExtractDir, finalExtractDir) - logger.debug('DXT server extracted to:', finalExtractDir) + logger.debug(`DXT server extracted to: ${finalExtractDir}`) // Clean up the uploaded DXT file if it's in temp directory if (filePath.startsWith(this.tempDir)) { @@ -307,7 +307,7 @@ class DxtService { } const errorMessage = error instanceof Error ? error.message : 'Failed to process DXT file' - logger.error('DXT upload error:', error) + logger.error('DXT upload error:', error as Error) return { success: false, @@ -324,7 +324,7 @@ class DxtService { // Read the manifest from the DXT server directory const manifestPath = path.join(dxtPath, 'manifest.json') if (!fs.existsSync(manifestPath)) { - logger.error('Manifest not found:', manifestPath) + logger.error(`Manifest not found: ${manifestPath}`) return null } @@ -347,7 +347,7 @@ class DxtService { return resolvedConfig } catch (error) { - logger.error('Failed to resolve MCP config:', error) + logger.error('Failed to resolve MCP config:', error as Error) return null } } @@ -362,7 +362,7 @@ class DxtService { // First try the sanitized path if (fs.existsSync(serverDir)) { - logger.debug('Removing DXT server directory:', serverDir) + logger.debug(`Removing DXT server directory: ${serverDir}`) fs.rmSync(serverDir, { recursive: true, force: true }) return true } @@ -370,15 +370,15 @@ class DxtService { // Fallback: try with original name in case it was stored differently const originalServerDir = path.join(this.mcpDir, `server-${serverName}`) if (fs.existsSync(originalServerDir)) { - logger.debug('Removing DXT server directory:', originalServerDir) + logger.debug(`Removing DXT server directory: ${originalServerDir}`) fs.rmSync(originalServerDir, { recursive: true, force: true }) return true } - logger.warn('Server directory not found:', serverDir) + logger.warn(`Server directory not found: ${serverDir}`) return false } catch (error) { - logger.error('Failed to cleanup DXT server:', error) + logger.error('Failed to cleanup DXT server:', error as Error) return false } } @@ -390,7 +390,7 @@ class DxtService { fs.rmSync(this.tempDir, { recursive: true, force: true }) } } catch (error) { - logger.error('Cleanup error:', error) + logger.error('Cleanup error:', error as Error) } } } diff --git a/src/main/services/ExportService.ts b/src/main/services/ExportService.ts index da6949dce..c31982b60 100644 --- a/src/main/services/ExportService.ts +++ b/src/main/services/ExportService.ts @@ -403,7 +403,7 @@ export class ExportService { logger.debug('Document exported successfully') } } catch (error) { - logger.error('Export to Word failed:', error) + logger.error('Export to Word failed:', error as Error) throw error } } diff --git a/src/main/services/FileStorage.ts b/src/main/services/FileStorage.ts index ee61cd94c..129a87aaa 100644 --- a/src/main/services/FileStorage.ts +++ b/src/main/services/FileStorage.ts @@ -40,7 +40,7 @@ class FileStorage { fs.mkdirSync(this.tempDir, { recursive: true }) } } catch (error) { - logger.error('Failed to initialize storage directories:', error) + logger.error('Failed to initialize storage directories:', error as Error) throw error } } @@ -58,7 +58,7 @@ class FileStorage { findDuplicateFile = async (filePath: string): Promise => { const stats = fs.statSync(filePath) - logger.debug('stats', stats, filePath) + logger.debug(`stats: ${stats}, filePath: ${filePath}`) const fileSize = stats.size const files = await fs.promises.readdir(this.storageDir) @@ -139,9 +139,9 @@ class FileStorage { if (fileSizeInMB > 1) { try { await fs.promises.copyFile(sourcePath, destPath) - logger.debug('Image compressed successfully:', sourcePath) + logger.debug(`Image compressed successfully: ${sourcePath}`) } catch (jimpError) { - logger.error('Image compression failed:', jimpError) + logger.error('Image compression failed:', jimpError as Error) await fs.promises.copyFile(sourcePath, destPath) } } else { @@ -149,7 +149,7 @@ class FileStorage { await fs.promises.copyFile(sourcePath, destPath) } } catch (error) { - logger.error('Image handling failed:', error) + logger.error('Image handling failed:', error as Error) // 错误情况下直接复制原文件 await fs.promises.copyFile(sourcePath, destPath) } @@ -167,7 +167,7 @@ class FileStorage { const ext = path.extname(origin_name).toLowerCase() const destPath = path.join(this.storageDir, uuid + ext) - logger.info('[FileStorage] Uploading file:', file.path) + logger.info(`[FileStorage] Uploading file: ${file.path}`) // 根据文件类型选择处理方式 if (imageExts.includes(ext)) { @@ -191,7 +191,7 @@ class FileStorage { count: 1 } - logger.debug('File uploaded:', fileMetadata) + logger.debug(`File uploaded: ${fileMetadata}`) return fileMetadata } @@ -261,7 +261,7 @@ class FileStorage { return data } catch (error) { chdir(originalCwd) - logger.error('Failed to read file:', error) + logger.error('Failed to read file:', error as Error) throw error } } @@ -273,7 +273,7 @@ class FileStorage { return fs.readFileSync(filePath, 'utf-8') } } catch (error) { - logger.error('Failed to read file:', error) + logger.error('Failed to read file:', error as Error) throw new Error(`Failed to read file: ${filePath}.`) } } @@ -350,7 +350,7 @@ class FileStorage { return fileMetadata } catch (error) { - logger.error('Failed to save base64 image:', error) + logger.error('Failed to save base64 image:', error as Error) throw error } } @@ -419,7 +419,7 @@ class FileStorage { return null } catch (err) { - logger.error('[IPC - Error]', 'An error occurred opening the file:', err) + logger.error('[IPC - Error] An error occurred opening the file:', err as Error) return null } } @@ -437,7 +437,7 @@ class FileStorage { if (fs.existsSync(filePath)) { shell.openPath(filePath).catch((err) => logger.error('[IPC - Error] Failed to open file:', err)) } else { - logger.warn('[IPC - Warning] File does not exist:', filePath) + logger.warn(`[IPC - Warning] File does not exist: ${filePath}`) } } @@ -464,7 +464,7 @@ class FileStorage { return result.filePath } catch (err: any) { - logger.error('[IPC - Error]', 'An error occurred saving the file:', err) + logger.error('[IPC - Error] An error occurred saving the file:', err as Error) return Promise.reject('An error occurred saving the file: ' + err?.message) } } @@ -481,7 +481,7 @@ class FileStorage { fs.writeFileSync(filePath, base64Data, 'base64') } } catch (error) { - logger.error('[IPC - Error]', 'An error occurred saving the image:', error) + logger.error('[IPC - Error] An error occurred saving the image:', error as Error) } } @@ -499,7 +499,7 @@ class FileStorage { return null } catch (err) { - logger.error('[IPC - Error]', 'An error occurred selecting the folder:', err) + logger.error('[IPC - Error] An error occurred selecting the folder:', err as Error) return null } } @@ -564,7 +564,7 @@ class FileStorage { return fileMetadata } catch (error) { - logger.error('Download file error:', error) + logger.error('Download file error:', error as Error) throw error } } @@ -601,9 +601,9 @@ class FileStorage { // 复制文件 await fs.promises.copyFile(sourcePath, destPath) - logger.debug('File copied successfully:', { from: sourcePath, to: destPath }) + logger.debug(`File copied successfully: ${sourcePath} to ${destPath}`) } catch (error) { - logger.error('Copy file failed:', error) + logger.error('Copy file failed:', error as Error) throw error } } @@ -611,18 +611,18 @@ class FileStorage { public writeFileWithId = async (_: Electron.IpcMainInvokeEvent, id: string, content: string): Promise => { try { const filePath = path.join(this.storageDir, id) - logger.debug('Writing file:', filePath) + logger.debug(`Writing file: ${filePath}`) // 确保目录存在 if (!fs.existsSync(this.storageDir)) { - logger.debug('Creating storage directory:', this.storageDir) + logger.debug(`Creating storage directory: ${this.storageDir}`) fs.mkdirSync(this.storageDir, { recursive: true }) } await fs.promises.writeFile(filePath, content, 'utf8') - logger.debug('File written successfully:', filePath) + logger.debug(`File written successfully: ${filePath}`) } catch (error) { - logger.error('Failed to write file:', error) + logger.error('Failed to write file:', error as Error) throw error } } diff --git a/src/main/services/KnowledgeService.ts b/src/main/services/KnowledgeService.ts index 2b7cecc41..59ff2a049 100644 --- a/src/main/services/KnowledgeService.ts +++ b/src/main/services/KnowledgeService.ts @@ -144,7 +144,7 @@ class KnowledgeService { logger.debug(`Removed database instance reference for id: ${id}`) } } catch (error) { - logger.warn(`Failed to cleanup resources for id: ${id}`, error) + logger.warn(`Failed to cleanup resources for id: ${id}`, error as Error) } } @@ -176,7 +176,7 @@ class KnowledgeService { return JSON.parse(fs.readFileSync(this.pendingDeleteFile, 'utf-8')) as string[] } } catch (error) { - logger.warn('Failed to load pending delete IDs:', error) + logger.warn('Failed to load pending delete IDs:', error as Error) } return [] }, @@ -186,7 +186,7 @@ class KnowledgeService { fs.writeFileSync(this.pendingDeleteFile, JSON.stringify(ids, null, 2)) logger.debug(`Total ${ids.length} knowledge bases pending delete`) } catch (error) { - logger.warn('Failed to save pending delete IDs:', error) + logger.warn('Failed to save pending delete IDs:', error as Error) } }, @@ -202,7 +202,7 @@ class KnowledgeService { fs.unlinkSync(this.pendingDeleteFile) } } catch (error) { - logger.warn('Failed to clear pending delete file:', error) + logger.warn('Failed to clear pending delete file:', error as Error) } } } @@ -257,7 +257,7 @@ class KnowledgeService { .build() this.ragApplications.set(id, ragApplication) } catch (e) { - logger.error('Failed to create RAGApplication:', e) + logger.error('Failed to create RAGApplication:', e as Error) throw new Error(`Failed to create RAGApplication: ${e}`) } @@ -274,7 +274,7 @@ class KnowledgeService { } public async delete(_: Electron.IpcMainInvokeEvent, id: string): Promise { - logger.debug('delete id', id) + logger.debug(`delete id: ${id}`) await this.cleanupKnowledgeResources(id) diff --git a/src/main/services/LoggerService.ts b/src/main/services/LoggerService.ts index 338af503b..b48c601cd 100644 --- a/src/main/services/LoggerService.ts +++ b/src/main/services/LoggerService.ts @@ -1,4 +1,5 @@ -import type { LogLevel, LogSourceWithContext } from '@shared/config/logger' +/* eslint-disable no-restricted-syntax */ +import type { LogContextData, LogLevel, LogSourceWithContext } from '@shared/config/logger' import { LEVEL, LEVEL_MAP } from '@shared/config/logger' import { IpcChannel } from '@shared/IpcChannel' import { app, ipcMain } from 'electron' @@ -37,7 +38,7 @@ const SYSTEM_INFO = { os: `${os.platform()}-${os.arch()} / ${os.version()}`, hw: `${os.cpus()[0]?.model || 'Unknown CPU'} / ${(os.totalmem() / 1024 / 1024 / 1024).toFixed(2)}GB` } -const APP_VERSION = `v${app?.getVersion?.() || 'unknown'}` +const APP_VERSION = `${app?.getVersion?.() || 'unknown'}` const DEFAULT_LEVEL = isDev ? LEVEL.SILLY : LEVEL.INFO @@ -77,7 +78,7 @@ class LoggerService { Object.values(LEVEL).includes(process.env.CSLOGGER_MAIN_LEVEL as LogLevel) ) { this.envLevel = process.env.CSLOGGER_MAIN_LEVEL as LogLevel - // eslint-disable-next-line no-restricted-syntax + console.log(colorText(`[LoggerService] env CSLOGGER_MAIN_LEVEL loaded: ${this.envLevel}`, 'BLUE')) } @@ -88,7 +89,7 @@ class LoggerService { .filter((module) => module !== '') if (showModules.length > 0) { this.envShowModules = showModules - // eslint-disable-next-line no-restricted-syntax + console.log( colorText(`[LoggerService] env CSLOGGER_MAIN_SHOW_MODULES loaded: ${this.envShowModules.join(' ')}`, 'BLUE') ) @@ -125,7 +126,6 @@ class LoggerService { // Development: all levels, Production: info and above level: DEFAULT_LEVEL, format: winston.format.combine( - winston.format.splat(), winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), @@ -138,7 +138,6 @@ class LoggerService { // Handle transport events this.logger.on('error', (error) => { - // eslint-disable-next-line no-restricted-syntax console.error('LoggerService fatal error:', error) }) @@ -218,39 +217,33 @@ class LoggerService { switch (level) { case LEVEL.ERROR: - // eslint-disable-next-line no-restricted-syntax console.error( `${datetimeColored} ${colorText(colorText('', 'RED'), 'BOLD')}${moduleString}${message}`, ...meta ) break case LEVEL.WARN: - // eslint-disable-next-line no-restricted-syntax console.warn( `${datetimeColored} ${colorText(colorText('', 'YELLOW'), 'BOLD')}${moduleString}${message}`, ...meta ) break case LEVEL.INFO: - // eslint-disable-next-line no-restricted-syntax console.info( `${datetimeColored} ${colorText(colorText('', 'GREEN'), 'BOLD')}${moduleString}${message}`, ...meta ) break case LEVEL.DEBUG: - // eslint-disable-next-line no-restricted-syntax console.debug( `${datetimeColored} ${colorText(colorText('', 'BLUE'), 'BOLD')}${moduleString}${message}`, ...meta ) break case LEVEL.VERBOSE: - // eslint-disable-next-line no-restricted-syntax console.log(`${datetimeColored} ${colorText('', 'BOLD')}${moduleString}${message}`, ...meta) break case LEVEL.SILLY: - // eslint-disable-next-line no-restricted-syntax console.log(`${datetimeColored} ${colorText('', 'BOLD')}${moduleString}${message}`, ...meta) break } @@ -283,42 +276,42 @@ class LoggerService { /** * Log error message */ - public error(message: string, ...data: any[]): void { + public error(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.ERROR, message, data) } /** * Log warning message */ - public warn(message: string, ...data: any[]): void { + public warn(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.WARN, message, data) } /** * Log info message */ - public info(message: string, ...data: any[]): void { + public info(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.INFO, message, data) } /** * Log verbose message */ - public verbose(message: string, ...data: any[]): void { + public verbose(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.VERBOSE, message, data) } /** * Log debug message */ - public debug(message: string, ...data: any[]): void { + public debug(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.DEBUG, message, data) } /** * Log silly level message */ - public silly(message: string, ...data: any[]): void { + public silly(message: string, ...data: LogContextData): void { this.processMainLog(LEVEL.SILLY, message, data) } diff --git a/src/main/services/MCPService.ts b/src/main/services/MCPService.ts index 347dfff0d..e2f1ce6f1 100644 --- a/src/main/services/MCPService.ts +++ b/src/main/services/MCPService.ts @@ -206,7 +206,7 @@ class McpService { headers['Authorization'] = `Bearer ${tokens.access_token}` } } catch (error) { - logger.error('Failed to fetch tokens:', error) + logger.error('Failed to fetch tokens:', error as Error) } } @@ -348,7 +348,7 @@ class McpService { logger.debug(`Successfully authenticated with server: ${server.name}`) } catch (oauthError) { - logger.error(`OAuth authentication failed for server ${server.name}:`, oauthError) + logger.error(`OAuth authentication failed for server ${server.name}:`, oauthError as Error) throw new Error( `OAuth authentication failed: ${oauthError instanceof Error ? oauthError.message : String(oauthError)}` ) @@ -454,7 +454,7 @@ class McpService { logger.debug(`Set up notification handlers for server: ${server.name}`) } catch (error) { - logger.error(`Failed to set up notification handlers for server ${server.name}:`, error) + logger.error(`Failed to set up notification handlers for server ${server.name}:`, error as Error) } } @@ -510,7 +510,7 @@ class McpService { logger.debug(`Cleaned up DXT server directory for: ${server.name}`) } } catch (error) { - logger.error(`Failed to cleanup DXT server: ${server.name}`, error) + logger.error(`Failed to cleanup DXT server: ${server.name}`, error as Error) } } } @@ -552,7 +552,7 @@ class McpService { logger.debug(`Connectivity check successful for server: ${server.name}`) return true } catch (error) { - logger.error(`Connectivity check failed for server: ${server.name}`, error) + logger.error(`Connectivity check failed for server: ${server.name}`, error as Error) // Close the client if connectivity check fails to ensure a clean state for the next attempt const serverKey = this.getServerKey(server) await this.closeClient(serverKey) @@ -614,7 +614,7 @@ class McpService { const callToolFunc = async ({ server, name, args }: CallToolArgs) => { try { - logger.debug('Calling:', server.name, name, args, 'callId:', toolCallId) + logger.debug(`Calling: ${server.name} ${name} ${JSON.stringify(args)} callId: ${toolCallId}`) if (typeof args === 'string') { try { args = JSON.parse(args) @@ -633,7 +633,7 @@ class McpService { }) return result as MCPCallToolResponse } catch (error) { - logger.error(`Error calling tool ${name} on ${server.name}:`, error) + logger.error(`Error calling tool ${name} on ${server.name}:`, error as Error) throw error } finally { this.activeToolCalls.delete(toolCallId) @@ -820,7 +820,7 @@ class McpService { logger.debug('Successfully fetched login shell environment variables:') return loginEnv } catch (error) { - logger.error('Failed to fetch login shell environment variables:', error) + logger.error('Failed to fetch login shell environment variables:', error as Error) return {} } }) diff --git a/src/main/services/NutstoreService.ts b/src/main/services/NutstoreService.ts index ac8cb3b70..4422ea8a0 100644 --- a/src/main/services/NutstoreService.ts +++ b/src/main/services/NutstoreService.ts @@ -48,7 +48,7 @@ export async function decryptToken(token: string) { }) return JSON.parse(decrypted) as OAuthResponse } catch (error) { - logger.error('Failed to decrypt token:', error) + logger.error('Failed to decrypt token:', error as Error) return null } } diff --git a/src/main/services/ObsidianVaultService.ts b/src/main/services/ObsidianVaultService.ts index 894bdc886..93c5421ee 100644 --- a/src/main/services/ObsidianVaultService.ts +++ b/src/main/services/ObsidianVaultService.ts @@ -57,7 +57,7 @@ class ObsidianVaultService { name: vault.name || path.basename(vault.path) })) } catch (error) { - logger.error('Failed to get Obsidian Vault:', error) + logger.error('Failed to get Obsidian Vault:', error as Error) return [] } } @@ -71,20 +71,20 @@ class ObsidianVaultService { try { // 检查vault路径是否存在 if (!fs.existsSync(vaultPath)) { - logger.error('Vault path does not exist:', vaultPath) + logger.error(`Vault path does not exist: ${vaultPath}`) return [] } // 检查是否是目录 const stats = fs.statSync(vaultPath) if (!stats.isDirectory()) { - logger.error('Vault path is not a directory:', vaultPath) + logger.error(`Vault path is not a directory: ${vaultPath}`) return [] } this.traverseDirectory(vaultPath, '', results) } catch (error) { - logger.error('Failed to read Vault folder structure:', error) + logger.error('Failed to read Vault folder structure:', error as Error) } return results @@ -106,7 +106,7 @@ class ObsidianVaultService { // 确保目录存在且可访问 if (!fs.existsSync(dirPath)) { - logger.error('Directory does not exist:', dirPath) + logger.error(`Directory does not exist: ${dirPath}`) return } @@ -114,7 +114,7 @@ class ObsidianVaultService { try { items = fs.readdirSync(dirPath, { withFileTypes: true }) } catch (err) { - logger.error(`Failed to read directory ${dirPath}:`, err) + logger.error(`Failed to read directory ${dirPath}:`, err as Error) return } @@ -139,7 +139,7 @@ class ObsidianVaultService { } } } catch (error) { - logger.error(`Failed to traverse directory ${dirPath}:`, error) + logger.error(`Failed to traverse directory ${dirPath}:`, error as Error) } } @@ -153,14 +153,14 @@ class ObsidianVaultService { const vault = vaults.find((v) => v.name === vaultName) if (!vault) { - logger.error('Vault not found:', vaultName) + logger.error(`Vault not found: ${vaultName}`) return [] } - logger.debug('Get Vault file structure:', vault.name, vault.path) + logger.debug(`Get Vault file structure: ${vault.name} ${vault.path}`) return this.getVaultStructure(vault.path) } catch (error) { - logger.error('Failed to get Vault file structure:', error) + logger.error('Failed to get Vault file structure:', error as Error) return [] } } diff --git a/src/main/services/ProtocolClient.ts b/src/main/services/ProtocolClient.ts index 086f51b15..48bbf2176 100644 --- a/src/main/services/ProtocolClient.ts +++ b/src/main/services/ProtocolClient.ts @@ -109,12 +109,12 @@ NoDisplay=true logger.debug(`update-desktop-database stdout: ${stdout}`) logger.debug('Desktop database updated successfully.') } catch (updateError) { - logger.error('Failed to update desktop database:', updateError) + logger.error('Failed to update desktop database:', updateError as Error) // Continue even if update fails, as the file is still created. } } catch (error) { // Log the error but don't prevent the app from starting - logger.error('Failed to setup AppImage deep link:', error) + logger.error('Failed to setup AppImage deep link:', error as Error) } } diff --git a/src/main/services/ProxyManager.ts b/src/main/services/ProxyManager.ts index a04a727e4..1374b8776 100644 --- a/src/main/services/ProxyManager.ts +++ b/src/main/services/ProxyManager.ts @@ -57,7 +57,7 @@ export class ProxyManager { } async configureProxy(config: ProxyConfig): Promise { - logger.debug('configureProxy: %s %s', config?.mode, config?.proxyRules) + logger.debug(`configureProxy: ${config?.mode} ${config?.proxyRules}`) if (this.isSettingProxy) { return } @@ -75,7 +75,7 @@ export class ProxyManager { if (config.mode === 'system') { const currentProxy = await getSystemProxy() if (currentProxy) { - logger.info('current system proxy: %s', currentProxy.proxyUrl) + logger.info(`current system proxy: ${currentProxy.proxyUrl}`) this.config.proxyRules = currentProxy.proxyUrl.toLowerCase() } this.monitorSystemProxy() @@ -83,7 +83,7 @@ export class ProxyManager { this.setGlobalProxy() } catch (error) { - logger.error('Failed to config proxy:', error) + logger.error('Failed to config proxy:', error as Error) throw error } finally { this.isSettingProxy = false diff --git a/src/main/services/ReduxService.ts b/src/main/services/ReduxService.ts index 44ff02c0d..04b579284 100644 --- a/src/main/services/ReduxService.ts +++ b/src/main/services/ReduxService.ts @@ -68,7 +68,7 @@ export class ReduxService extends EventEmitter { const selectorFn = new Function('state', `return ${selector}`) return selectorFn(this.stateCache) } catch (error) { - logger.error('Failed to select from cache:', error) + logger.error('Failed to select from cache:', error as Error) return undefined } } @@ -97,7 +97,7 @@ export class ReduxService extends EventEmitter { })() `) } catch (error) { - logger.error('Failed to select store value:', error) + logger.error('Failed to select store value:', error as Error) throw error } } @@ -114,7 +114,7 @@ export class ReduxService extends EventEmitter { window.store.dispatch(${JSON.stringify(action)}) `) } catch (error) { - logger.error('Failed to dispatch action:', error) + logger.error('Failed to dispatch action:', error as Error) throw error } } @@ -152,7 +152,7 @@ export class ReduxService extends EventEmitter { const newValue = await this.select(selector) callback(newValue) } catch (error) { - logger.error('Error in subscription handler:', error) + logger.error('Error in subscription handler:', error as Error) } } @@ -174,7 +174,7 @@ export class ReduxService extends EventEmitter { window.store.getState() `) } catch (error) { - logger.error('Failed to get state:', error) + logger.error('Failed to get state:', error as Error) throw error } } diff --git a/src/main/services/S3Storage.ts b/src/main/services/S3Storage.ts index 6ce9cb6e2..1ac8bb0ff 100644 --- a/src/main/services/S3Storage.ts +++ b/src/main/services/S3Storage.ts @@ -52,7 +52,7 @@ export default class S3Storage { const isInWhiteList = VIRTUAL_HOST_SUFFIXES.some((suffix) => hostname.endsWith(suffix)) return !isInWhiteList } catch (e) { - logger.warn('[S3Storage] Failed to parse endpoint, fallback to Path-Style:', endpoint, e) + logger.warn(`[S3Storage] Failed to parse endpoint, fallback to Path-Style: ${endpoint}`, e as Error) return true } })() @@ -98,7 +98,7 @@ export default class S3Storage { }) ) } catch (error) { - logger.error('[S3Storage] Error putting object:', error) + logger.error('[S3Storage] Error putting object:', error as Error) throw error } } @@ -111,7 +111,7 @@ export default class S3Storage { } return await streamToBuffer(res.Body as Readable) } catch (error) { - logger.error('[S3Storage] Error getting object:', error) + logger.error('[S3Storage] Error getting object:', error as Error) throw error } } @@ -128,7 +128,7 @@ export default class S3Storage { } } } catch (error) { - logger.error('[S3Storage] Error deleting object:', error) + logger.error('[S3Storage] Error deleting object:', error as Error) throw error } } @@ -165,7 +165,7 @@ export default class S3Storage { return files } catch (error) { - logger.error('[S3Storage] Error listing objects:', error) + logger.error('[S3Storage] Error listing objects:', error as Error) throw error } } @@ -178,7 +178,7 @@ export default class S3Storage { await this.client.send(new HeadBucketCommand({ Bucket: this.bucket })) return true } catch (error) { - logger.error('[S3Storage] Error checking connection:', error) + logger.error('[S3Storage] Error checking connection:', error as Error) throw error } } diff --git a/src/main/services/SelectionService.ts b/src/main/services/SelectionService.ts index f20dc067d..bfee69da8 100644 --- a/src/main/services/SelectionService.ts +++ b/src/main/services/SelectionService.ts @@ -27,7 +27,7 @@ try { SelectionHook = require('selection-hook') } } catch (error) { - logger.error('Failed to load selection-hook:', error) + logger.error('Failed to load selection-hook:', error as Error) } // Type definitions @@ -243,7 +243,7 @@ export class SelectionService { } if (!this.selectionHook.setGlobalFilterMode(modeMap[combinedMode], combinedList)) { - this.logError(new Error('Failed to set selection-hook global filter mode')) + this.logError('Failed to set selection-hook global filter mode') } } @@ -274,17 +274,17 @@ export class SelectionService { */ public start(): boolean { if (!isSupportedOS) { - this.logError(new Error('SelectionService start(): not supported on this OS')) + this.logError('SelectionService start(): not supported on this OS') return false } if (!this.selectionHook) { - this.logError(new Error('SelectionService start(): instance is null')) + this.logError('SelectionService start(): instance is null') return false } if (this.started) { - this.logError(new Error('SelectionService start(): already started')) + this.logError('SelectionService start(): already started') return false } @@ -292,9 +292,7 @@ export class SelectionService { if (isMac) { if (!systemPreferences.isTrustedAccessibilityClient(false)) { this.logError( - new Error( - 'SelectionSerice not started: process is not trusted on macOS, please turn on the Accessibility permission' - ) + 'SelectionSerice not started: process is not trusted on macOS, please turn on the Accessibility permission' ) return false } @@ -325,7 +323,7 @@ export class SelectionService { return true } - this.logError(new Error('Failed to start text selection hook.')) + this.logError('Failed to start text selection hook.') return false } catch (error) { this.logError('Failed to set up text selection hook:', error as Error) @@ -1510,8 +1508,8 @@ export class SelectionService { } } - private logError(...args: [...string[], Error]): void { - logger.error('[SelectionService] Error: ', ...args) + private logError(message: string, error?: Error): void { + logger.error(message, error) } } diff --git a/src/main/services/SpanCacheService.ts b/src/main/services/SpanCacheService.ts index 9ebd9adf7..98ff36d29 100644 --- a/src/main/services/SpanCacheService.ts +++ b/src/main/services/SpanCacheService.ts @@ -214,7 +214,7 @@ class SpanCacheService implements TraceCache { try { await fs.rm(filePath, { recursive: true }) } catch (error) { - logger.error('Error cleaning local data:', error) + logger.error('Error cleaning local data:', error as Error) } } } @@ -359,7 +359,7 @@ class SpanCacheService implements TraceCache { try { yield JSON.parse(trimmed) as SpanEntity } catch (e) { - logger.error(`JSON解析失败: ${trimmed}`, e) + logger.error(`JSON解析失败: ${trimmed}`, e as Error) } } } @@ -369,7 +369,7 @@ class SpanCacheService implements TraceCache { .filter((span) => span.topicId === topicId && span.traceId === traceId && span.modelName) .filter((span) => !modelName || span.modelName === modelName) } catch (err) { - logger.error('Error parsing JSON:', err) + logger.error('Error parsing JSON:', err as Error) throw err } } @@ -387,7 +387,7 @@ class SpanCacheService implements TraceCache { await fs.access(filePath) return true } catch (err) { - logger.error('delete trace file error:', err) + logger.error('delete trace file error:', err as Error) return false } } diff --git a/src/main/services/WebDav.ts b/src/main/services/WebDav.ts index f055d16fb..11a2d7ebf 100644 --- a/src/main/services/WebDav.ts +++ b/src/main/services/WebDav.ts @@ -53,7 +53,7 @@ export default class WebDav { }) } } catch (error) { - logger.error('Error creating directory on WebDAV:', error) + logger.error('Error creating directory on WebDAV:', error as Error) throw error } @@ -62,7 +62,7 @@ export default class WebDav { try { return await this.instance.putFileContents(remoteFilePath, data, options) } catch (error) { - logger.error('Error putting file contents on WebDAV:', error) + logger.error('Error putting file contents on WebDAV:', error as Error) throw error } } @@ -77,7 +77,7 @@ export default class WebDav { try { return await this.instance.getFileContents(remoteFilePath, options) } catch (error) { - logger.error('Error getting file contents on WebDAV:', error) + logger.error('Error getting file contents on WebDAV:', error as Error) throw error } } @@ -90,7 +90,7 @@ export default class WebDav { try { return await this.instance.getDirectoryContents(this.webdavPath) } catch (error) { - logger.error('Error getting directory contents on WebDAV:', error) + logger.error('Error getting directory contents on WebDAV:', error as Error) throw error } } @@ -103,7 +103,7 @@ export default class WebDav { try { return await this.instance.exists('/') } catch (error) { - logger.error('Error checking connection:', error) + logger.error('Error checking connection:', error as Error) throw error } } @@ -116,7 +116,7 @@ export default class WebDav { try { return await this.instance.createDirectory(path, options) } catch (error) { - logger.error('Error creating directory on WebDAV:', error) + logger.error('Error creating directory on WebDAV:', error as Error) throw error } } @@ -131,7 +131,7 @@ export default class WebDav { try { return await this.instance.deleteFile(remoteFilePath) } catch (error) { - logger.error('Error deleting file on WebDAV:', error) + logger.error('Error deleting file on WebDAV:', error as Error) throw error } } diff --git a/src/main/services/mcp/oauth/callback.ts b/src/main/services/mcp/oauth/callback.ts index 71a4460fa..22d5b4c6b 100644 --- a/src/main/services/mcp/oauth/callback.ts +++ b/src/main/services/mcp/oauth/callback.ts @@ -30,7 +30,7 @@ export class CallBackServer { this.events.emit('auth-code-received', code) } } catch (error) { - logger.error('Error processing OAuth callback:', error) + logger.error('Error processing OAuth callback:', error as Error) res.writeHead(500, { 'Content-Type': 'text/plain' }) res.end('Internal Server Error') } @@ -43,7 +43,7 @@ export class CallBackServer { // Handle server errors server.on('error', (error) => { - logger.error('OAuth callback server error:', error) + logger.error('OAuth callback server error:', error as Error) }) return new Promise((resolve, reject) => { diff --git a/src/main/services/mcp/oauth/storage.ts b/src/main/services/mcp/oauth/storage.ts index 95223119d..d2dbb589c 100644 --- a/src/main/services/mcp/oauth/storage.ts +++ b/src/main/services/mcp/oauth/storage.ts @@ -40,7 +40,7 @@ export class JsonFileStorage implements IOAuthStorage { await this.writeStorage(initial) return initial } - logger.error('Error reading OAuth storage:', error) + logger.error('Error reading OAuth storage:', error as Error) throw new Error(`Failed to read OAuth storage: ${error instanceof Error ? error.message : String(error)}`) } } @@ -61,7 +61,7 @@ export class JsonFileStorage implements IOAuthStorage { // Update cache this.cache = data } catch (error) { - logger.error('Error writing OAuth storage:', error) + logger.error('Error writing OAuth storage:', error as Error) throw new Error(`Failed to write OAuth storage: ${error instanceof Error ? error.message : String(error)}`) } } @@ -114,7 +114,7 @@ export class JsonFileStorage implements IOAuthStorage { this.cache = null } catch (error) { if (error instanceof Error && 'code' in error && error.code !== 'ENOENT') { - logger.error('Error clearing OAuth storage:', error) + logger.error('Error clearing OAuth storage:', error as Error) throw new Error(`Failed to clear OAuth storage: ${error instanceof Error ? error.message : String(error)}`) } } diff --git a/src/main/services/mcp/shell-env.ts b/src/main/services/mcp/shell-env.ts index e5de39c2e..831cb76b6 100644 --- a/src/main/services/mcp/shell-env.ts +++ b/src/main/services/mcp/shell-env.ts @@ -109,7 +109,7 @@ function getLoginShellEnvironment(): Promise> { logger.warn( 'Parsed environment is empty or output was very short. This might indicate an issue with shell execution or environment variable retrieval.' ) - logger.warn('Raw output from shell:\n', output) + logger.warn(`Raw output from shell:\n${output}`) } env.PATH = env.Path || env.PATH || '' diff --git a/src/main/services/memory/MemoryService.ts b/src/main/services/memory/MemoryService.ts index 3b2e55730..aba341391 100644 --- a/src/main/services/memory/MemoryService.ts +++ b/src/main/services/memory/MemoryService.ts @@ -92,7 +92,7 @@ export class MemoryService { this.isInitialized = true logger.debug('Memory database initialized successfully') } catch (error) { - logger.error('Failed to initialize memory database:', error) + logger.error('Failed to initialize memory database:', error as Error) throw new Error( `Memory database initialization failed: ${error instanceof Error ? error.message : 'Unknown error'}` ) @@ -120,7 +120,7 @@ export class MemoryService { await this.db.execute(MemoryQueries.createIndexes.vector) } catch (error) { // Vector index might not be supported in all versions - logger.warn('Failed to create vector index, falling back to non-indexed search:', error) + logger.warn('Failed to create vector index, falling back to non-indexed search:', error as Error) } } @@ -175,7 +175,7 @@ export class MemoryService { `Generated embedding for restored memory with dimension: ${embedding.length} (target: ${this.config?.embedderDimensions || MemoryService.UNIFIED_DIMENSION})` ) } catch (error) { - logger.error('Failed to generate embedding for restored memory:', error) + logger.error('Failed to generate embedding for restored memory:', error as Error) } } @@ -237,7 +237,7 @@ export class MemoryService { } } } catch (error) { - logger.error('Failed to generate embedding:', error) + logger.error('Failed to generate embedding:', error as Error) } } @@ -279,7 +279,7 @@ export class MemoryService { count: addedMemories.length } } catch (error) { - logger.error('Failed to add memories:', error) + logger.error('Failed to add memories:', error as Error) return { memories: [], count: 0, @@ -304,7 +304,7 @@ export class MemoryService { const queryEmbedding = await this.generateEmbedding(query) return await this.hybridSearch(query, queryEmbedding, { limit, userId, agentId, filters }) } catch (error) { - logger.error('Vector search failed, falling back to text search:', error) + logger.error('Vector search failed, falling back to text search:', error as Error) } } @@ -359,7 +359,7 @@ export class MemoryService { count: memories.length } } catch (error) { - logger.error('Search failed:', error) + logger.error('Search failed:', error as Error) return { memories: [], count: 0, @@ -424,7 +424,7 @@ export class MemoryService { count: totalCount } } catch (error) { - logger.error('List failed:', error) + logger.error('List failed:', error as Error) return { memories: [], count: 0, @@ -464,7 +464,7 @@ export class MemoryService { logger.debug(`Memory deleted: ${id}`) } catch (error) { - logger.error('Delete failed:', error) + logger.error('Delete failed:', error as Error) throw new Error(`Failed to delete memory: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -503,7 +503,7 @@ export class MemoryService { `Updated embedding with dimension: ${embedding.length} (target: ${this.config?.embedderDimensions || MemoryService.UNIFIED_DIMENSION})` ) } catch (error) { - logger.error('Failed to generate embedding for update:', error) + logger.error('Failed to generate embedding for update:', error as Error) } } @@ -528,7 +528,7 @@ export class MemoryService { logger.debug(`Memory updated: ${id}`) } catch (error) { - logger.error('Update failed:', error) + logger.error('Update failed:', error as Error) throw new Error(`Failed to update memory: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -557,7 +557,7 @@ export class MemoryService { isDeleted: row.is_deleted === 1 })) } catch (error) { - logger.error('Get history failed:', error) + logger.error('Get history failed:', error as Error) throw new Error(`Failed to get memory history: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -595,7 +595,7 @@ export class MemoryService { logger.debug(`Reset all memories for user ${userId} (${totalCount} memories deleted)`) } catch (error) { - logger.error('Reset user memories failed:', error) + logger.error('Reset user memories failed:', error as Error) throw new Error(`Failed to reset user memories: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -637,7 +637,7 @@ export class MemoryService { logger.debug(`Deleted user ${userId} and ${totalCount} memories`) } catch (error) { - logger.error('Delete user failed:', error) + logger.error('Delete user failed:', error as Error) throw new Error(`Failed to delete user: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -661,7 +661,7 @@ export class MemoryService { lastMemoryDate: row.last_memory_date as string })) } catch (error) { - logger.error('Get users list failed:', error) + logger.error('Get users list failed:', error as Error) throw new Error(`Failed to get users list: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -732,7 +732,7 @@ export class MemoryService { // Normalize to unified dimension return this.normalizeEmbedding(embedding) } catch (error) { - logger.error('Embedding generation failed:', error) + logger.error('Embedding generation failed:', error as Error) throw new Error(`Failed to generate embedding: ${error instanceof Error ? error.message : 'Unknown error'}`) } } @@ -802,7 +802,7 @@ export class MemoryService { count: memories.length } } catch (error) { - logger.error('Hybrid search failed:', error) + logger.error('Hybrid search failed:', error as Error) throw new Error(`Hybrid search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } diff --git a/src/main/services/remotefile/GeminiService.ts b/src/main/services/remotefile/GeminiService.ts index 05838d8a6..b05909442 100644 --- a/src/main/services/remotefile/GeminiService.ts +++ b/src/main/services/remotefile/GeminiService.ts @@ -71,7 +71,7 @@ export class GeminiService extends BaseFileService { return response } catch (error) { - logger.error('Error uploading file to Gemini:', error) + logger.error('Error uploading file to Gemini:', error as Error) return { fileId: '', displayName: file.origin_name, @@ -117,7 +117,7 @@ export class GeminiService extends BaseFileService { originalFile: undefined } } catch (error) { - logger.error('Error retrieving file from Gemini:', error) + logger.error('Error retrieving file from Gemini:', error as Error) return { fileId: fileId, displayName: '', @@ -175,7 +175,7 @@ export class GeminiService extends BaseFileService { CacheService.set(GeminiService.FILE_LIST_CACHE_KEY, fileList, GeminiService.LIST_CACHE_DURATION) return fileList } catch (error) { - logger.error('Error listing files from Gemini:', error) + logger.error('Error listing files from Gemini:', error as Error) return { files: [] } } } @@ -185,7 +185,7 @@ export class GeminiService extends BaseFileService { await this.fileManager.delete({ name: fileId }) logger.debug(`File ${fileId} deleted from Gemini`) } catch (error) { - logger.error('Error deleting file from Gemini:', error) + logger.error('Error deleting file from Gemini:', error as Error) throw error } } diff --git a/src/main/services/remotefile/MistralService.ts b/src/main/services/remotefile/MistralService.ts index b70ca84d6..05bbf7581 100644 --- a/src/main/services/remotefile/MistralService.ts +++ b/src/main/services/remotefile/MistralService.ts @@ -40,7 +40,7 @@ export class MistralService extends BaseFileService { } } } catch (error) { - logger.error('Error uploading file:', error) + logger.error('Error uploading file:', error as Error) return { fileId: '', displayName: file.origin_name, @@ -65,7 +65,7 @@ export class MistralService extends BaseFileService { })) } } catch (error) { - logger.error('Error listing files:', error) + logger.error('Error listing files:', error as Error) return { files: [] } } } @@ -77,7 +77,7 @@ export class MistralService extends BaseFileService { }) logger.debug(`File ${fileId} deleted`) } catch (error) { - logger.error('Error deleting file:', error) + logger.error('Error deleting file:', error as Error) throw error } } @@ -94,7 +94,7 @@ export class MistralService extends BaseFileService { status: 'success' // Retrieved files are always processed } } catch (error) { - logger.error('Error retrieving file:', error) + logger.error('Error retrieving file:', error as Error) return { fileId: fileId, displayName: '', diff --git a/src/main/services/urlschema/handle-providers.ts b/src/main/services/urlschema/handle-providers.ts index f57b6403e..16df90d35 100644 --- a/src/main/services/urlschema/handle-providers.ts +++ b/src/main/services/urlschema/handle-providers.ts @@ -12,7 +12,7 @@ function ParseData(data: string) { return JSON.stringify(result) } catch (error) { - logger.error('ParseData error:', error) + logger.error('ParseData error:', error as Error) return null } } diff --git a/src/main/services/urlschema/mcp-install.ts b/src/main/services/urlschema/mcp-install.ts index 5db183ef8..ceb2e41ec 100644 --- a/src/main/services/urlschema/mcp-install.ts +++ b/src/main/services/urlschema/mcp-install.ts @@ -51,9 +51,9 @@ export function handleMcpProtocolUrl(url: URL) { if (data) { const stringify = Buffer.from(data, 'base64').toString('utf8') - logger.debug('install MCP servers from urlschema: ', stringify) + logger.debug(`install MCP servers from urlschema: ${stringify}`) const jsonConfig = JSON.parse(stringify) - logger.debug('install MCP servers from urlschema: ', jsonConfig) + logger.debug(`install MCP servers from urlschema: ${JSON.stringify(jsonConfig)}`) // support both {mcpServers: [servers]}, [servers] and {server} if (jsonConfig.mcpServers) { diff --git a/src/main/utils/zip.ts b/src/main/utils/zip.ts index 95e759504..435a5973e 100644 --- a/src/main/utils/zip.ts +++ b/src/main/utils/zip.ts @@ -19,7 +19,7 @@ export async function compress(str: string): Promise { const buffer = Buffer.from(str, 'utf-8') return await gzipPromise(buffer) } catch (error) { - logger.error('Compression failed:', error) + logger.error('Compression failed:', error as Error) throw error } } @@ -34,7 +34,7 @@ export async function decompress(compressedBuffer: Buffer): Promise { const buffer = await gunzipPromise(compressedBuffer) return buffer.toString('utf-8') } catch (error) { - logger.error('Decompression failed:', error) + logger.error('Decompression failed:', error as Error) throw error } } diff --git a/src/preload/index.ts b/src/preload/index.ts index 1d5d05de3..b827bc182 100644 --- a/src/preload/index.ts +++ b/src/preload/index.ts @@ -401,7 +401,7 @@ if (process.contextIsolated) { contextBridge.exposeInMainWorld('api', api) } catch (error) { // eslint-disable-next-line no-restricted-syntax - console.error(error) + console.error('[Preload]Failed to expose APIs:', error as Error) } } else { // @ts-ignore (define in dts) diff --git a/src/renderer/src/aiCore/clients/NewAPIClient.ts b/src/renderer/src/aiCore/clients/NewAPIClient.ts index f029ce2c3..5df64faee 100644 --- a/src/renderer/src/aiCore/clients/NewAPIClient.ts +++ b/src/renderer/src/aiCore/clients/NewAPIClient.ts @@ -179,7 +179,7 @@ export class NewAPIClient extends BaseApiClient { return models.filter(isSupportedModel) } catch (error) { - logger.error('Error listing models:', error) + logger.error('Error listing models:', error as Error) return [] } } diff --git a/src/renderer/src/aiCore/clients/anthropic/AnthropicAPIClient.ts b/src/renderer/src/aiCore/clients/anthropic/AnthropicAPIClient.ts index de50955fa..0e17d4d00 100644 --- a/src/renderer/src/aiCore/clients/anthropic/AnthropicAPIClient.ts +++ b/src/renderer/src/aiCore/clients/anthropic/AnthropicAPIClient.ts @@ -687,7 +687,7 @@ export class AnthropicAPIClient extends BaseApiClient< tool_calls: [toolCall] } as MCPToolCreatedChunk) } catch (error) { - logger.error(`Error parsing tool call input: ${error}`) + logger.error('Error parsing tool call input:', error as Error) } } break diff --git a/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts b/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts index dc1bf08c2..9d8d32b08 100644 --- a/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts +++ b/src/renderer/src/aiCore/clients/gemini/GeminiAPIClient.ts @@ -142,7 +142,7 @@ export class GeminiAPIClient extends BaseApiClient< // console.log(response?.generatedImages?.[0]?.image?.imageBytes); return images } catch (error) { - logger.error('[generateImage] error:', error) + logger.error('[generateImage] error:', error as Error) throw error } } diff --git a/src/renderer/src/aiCore/clients/openai/OpenAIBaseClient.ts b/src/renderer/src/aiCore/clients/openai/OpenAIBaseClient.ts index 74ae7f39b..144dea130 100644 --- a/src/renderer/src/aiCore/clients/openai/OpenAIBaseClient.ts +++ b/src/renderer/src/aiCore/clients/openai/OpenAIBaseClient.ts @@ -128,7 +128,7 @@ export abstract class OpenAIBaseClient< return models.filter(isSupportedModel) } catch (error) { - logger.error('Error listing models:', error) + logger.error('Error listing models:', error as Error) return [] } } diff --git a/src/renderer/src/aiCore/clients/ppio/PPIOAPIClient.ts b/src/renderer/src/aiCore/clients/ppio/PPIOAPIClient.ts index c881357ec..706ab8987 100644 --- a/src/renderer/src/aiCore/clients/ppio/PPIOAPIClient.ts +++ b/src/renderer/src/aiCore/clients/ppio/PPIOAPIClient.ts @@ -60,7 +60,7 @@ export class PPIOAPIClient extends OpenAIAPIClient { return processedModels.filter(isSupportedModel) } catch (error) { - logger.error('Error listing PPIO models:', error) + logger.error('Error listing PPIO models:', error as Error) return [] } } diff --git a/src/renderer/src/aiCore/index.ts b/src/renderer/src/aiCore/index.ts index f0e3e88f4..f96a78a3c 100644 --- a/src/renderer/src/aiCore/index.ts +++ b/src/renderer/src/aiCore/index.ts @@ -160,7 +160,7 @@ export default class AiProvider { const dimensions = await this.apiClient.getEmbeddingDimensions(model) return dimensions } catch (error) { - logger.error('Error getting embedding dimensions:', error) + logger.error('Error getting embedding dimensions:', error as Error) throw error } } diff --git a/src/renderer/src/aiCore/middleware/common/FinalChunkConsumerMiddleware.ts b/src/renderer/src/aiCore/middleware/common/FinalChunkConsumerMiddleware.ts index cffbd4e11..e36e45807 100644 --- a/src/renderer/src/aiCore/middleware/common/FinalChunkConsumerMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/common/FinalChunkConsumerMiddleware.ts @@ -86,7 +86,7 @@ const FinalChunkConsumerMiddleware: CompletionsMiddleware = } } } catch (error) { - logger.error(`Error consuming stream:`, error) + logger.error(`Error consuming stream:`, error as Error) throw error } finally { if (params.onChunk && !isRecursiveCall) { @@ -160,7 +160,7 @@ function extractAndAccumulateUsageMetrics(ctx: CompletionsContext, chunk: Generi ) } } catch (error) { - logger.error(`Error extracting usage/metrics from chunk:`, error) + logger.error('Error extracting usage/metrics from chunk:', error as Error) } } diff --git a/src/renderer/src/aiCore/middleware/common/LoggingMiddleware.ts b/src/renderer/src/aiCore/middleware/common/LoggingMiddleware.ts index f391e08c3..dd79ef457 100644 --- a/src/renderer/src/aiCore/middleware/common/LoggingMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/common/LoggingMiddleware.ts @@ -48,7 +48,7 @@ export const createGenericLoggingMiddleware: () => MethodMiddleware = () => { return (_: MiddlewareAPI) => (next) => async (ctx, args) => { const methodName = ctx.methodName const logPrefix = `[${middlewareName} (${methodName})]` - logger.debug(`${logPrefix} Initiating. Args:`, stringifyArgsForLogging(args)) + logger.debug(`${logPrefix} Initiating. Args: ${stringifyArgsForLogging(args)}`) const startTime = Date.now() try { const result = await next(ctx, args) @@ -61,7 +61,7 @@ export const createGenericLoggingMiddleware: () => MethodMiddleware = () => { const duration = Date.now() - startTime // Log failure of the method call with duration and error information. / // 记录方法调用失败及其持续时间和错误信息。 - logger.error(`${logPrefix} Failed. Duration: ${duration}ms`, error) + logger.error(`${logPrefix} Failed. Duration: ${duration}ms`, error as Error) throw error // Re-throw the error to be handled by subsequent layers or the caller / 重新抛出错误,由后续层或调用者处理 } } diff --git a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts index 5110564f5..9e7c102bb 100644 --- a/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/core/McpToolChunkMiddleware.ts @@ -134,7 +134,7 @@ function createToolHandlingTransform( executedToolResults.push(...result.toolResults) executedToolCalls.push(...result.confirmedToolCalls) } catch (error) { - logger.error(`Error executing tool call asynchronously:`, error) + logger.error(`Error executing tool call asynchronously:`, error as Error) } })() @@ -162,7 +162,7 @@ function createToolHandlingTransform( // 缓存执行结果 executedToolResults.push(...result.toolResults) } catch (error) { - logger.error(`Error executing tool use response asynchronously:`, error) + logger.error(`Error executing tool use response asynchronously:`, error as Error) // 错误时不影响其他工具的执行 } })() @@ -174,7 +174,7 @@ function createToolHandlingTransform( controller.enqueue(chunk) } } catch (error) { - logger.error(`Error processing chunk:`, error) + logger.error(`Error processing chunk:`, error as Error) controller.error(error) } }, @@ -206,7 +206,7 @@ function createToolHandlingTransform( await executeWithToolHandling(newParams, depth + 1) } } catch (error) { - logger.error(`Error in tool processing:`, error) + logger.error(`Error in tool processing:`, error as Error) controller.error(error) } finally { hasToolCalls = false @@ -341,7 +341,7 @@ function buildParamsWithToolResults( ctx._internal.observer.usage.total_tokens += additionalTokens } } catch (error) { - logger.error(`Error estimating token usage for new messages:`, error) + logger.error(`Error estimating token usage for new messages:`, error as Error) } } @@ -509,7 +509,7 @@ export async function parseAndCallTools( toolResults.push(convertedMessage) } } catch (error) { - logger.error(`Error executing tool ${toolResponse.id}:`, error) + logger.error(`Error executing tool ${toolResponse.id}:`, error as Error) // 更新为错误状态 upsertMCPToolResponse( allToolResponses, @@ -551,7 +551,7 @@ export async function parseAndCallTools( } }) .catch((error) => { - logger.error(`Error waiting for tool confirmation ${toolResponse.id}:`, error) + logger.error(`Error waiting for tool confirmation ${toolResponse.id}:`, error as Error) // 立即更新为cancelled状态 upsertMCPToolResponse( allToolResponses, diff --git a/src/renderer/src/aiCore/middleware/core/ResponseTransformMiddleware.ts b/src/renderer/src/aiCore/middleware/core/ResponseTransformMiddleware.ts index e0cd2f0d8..850da8306 100644 --- a/src/renderer/src/aiCore/middleware/core/ResponseTransformMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/core/ResponseTransformMiddleware.ts @@ -77,7 +77,7 @@ export const ResponseTransformMiddleware: CompletionsMiddleware = stream: genericChunkTransformStream } } catch (error) { - logger.error(`Error during chunk transformation:`, error) + logger.error('Error during chunk transformation:', error as Error) throw error } } diff --git a/src/renderer/src/aiCore/middleware/core/TransformCoreToSdkParamsMiddleware.ts b/src/renderer/src/aiCore/middleware/core/TransformCoreToSdkParamsMiddleware.ts index 51471ba1d..71831a3ef 100644 --- a/src/renderer/src/aiCore/middleware/core/TransformCoreToSdkParamsMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/core/TransformCoreToSdkParamsMiddleware.ts @@ -74,7 +74,7 @@ export const TransformCoreToSdkParamsMiddleware: CompletionsMiddleware = } return next(ctx, params) } catch (error) { - logger.error(`Error during request transformation:`, error) + logger.error('Error during request transformation:', error as Error) // 让错误向上传播,或者可以在这里进行特定的错误处理 throw error } diff --git a/src/renderer/src/aiCore/middleware/feat/ToolUseExtractionMiddleware.ts b/src/renderer/src/aiCore/middleware/feat/ToolUseExtractionMiddleware.ts index 2f361b2a2..1f559bf5a 100644 --- a/src/renderer/src/aiCore/middleware/feat/ToolUseExtractionMiddleware.ts +++ b/src/renderer/src/aiCore/middleware/feat/ToolUseExtractionMiddleware.ts @@ -110,7 +110,7 @@ function createToolUseExtractionTransform( // 转发其他所有chunk controller.enqueue(chunk) } catch (error) { - logger.error(`Error processing chunk:`, error) + logger.error('Error processing chunk:', error as Error) controller.error(error) } }, diff --git a/src/renderer/src/components/CodeEditor/hooks.ts b/src/renderer/src/components/CodeEditor/hooks.ts index 12117332c..53ea6f4a2 100644 --- a/src/renderer/src/components/CodeEditor/hooks.ts +++ b/src/renderer/src/components/CodeEditor/hooks.ts @@ -42,7 +42,7 @@ async function loadLanguageExtension(language: string, languageMap: Record try { return await loader() } catch (error) { - logger.debug(`Failed to load linter for ${language}`, error) + logger.debug(`Failed to load linter for ${language}`, error as Error) return null } } @@ -108,7 +108,7 @@ export const useLanguageExtensions = (language: string, lint?: boolean) => { setExtensions(results) } catch (error) { if (!cancelled) { - logger.debug('Failed to load language extensions:', error) + logger.debug('Failed to load language extensions:', error as Error) setExtensions([]) } } diff --git a/src/renderer/src/components/CodeToolbar/usePreviewTools.tsx b/src/renderer/src/components/CodeToolbar/usePreviewTools.tsx index 73aabe4aa..8914862e4 100644 --- a/src/renderer/src/components/CodeToolbar/usePreviewTools.tsx +++ b/src/renderer/src/components/CodeToolbar/usePreviewTools.tsx @@ -208,7 +208,7 @@ export const usePreviewToolHandlers = ( } img.src = svgBase64 } catch (error) { - logger.error('Copy failed:', error) + logger.error('Copy failed:', error as Error) window.message.error(t('message.copy.failed')) } }, [getImgElement, t]) @@ -268,7 +268,7 @@ export const usePreviewToolHandlers = ( img.src = svgBase64 } } catch (error) { - logger.error('Download failed:', error) + logger.error('Download failed:', error as Error) } }, [getImgElement, prefix, customDownloader] diff --git a/src/renderer/src/components/ImageViewer.tsx b/src/renderer/src/components/ImageViewer.tsx index a64379543..ddb28a4d5 100644 --- a/src/renderer/src/components/ImageViewer.tsx +++ b/src/renderer/src/components/ImageViewer.tsx @@ -62,7 +62,7 @@ const ImageViewer: React.FC = ({ src, style, ...props }) => { window.message.success(t('message.copy.success')) } catch (error) { - logger.error('复制图片失败:', error) + logger.error('复制图片失败:', error as Error) window.message.error(t('message.copy.failed')) } } diff --git a/src/renderer/src/components/LocalBackupModals.tsx b/src/renderer/src/components/LocalBackupModals.tsx index aa2848eaa..d5c7972a1 100644 --- a/src/renderer/src/components/LocalBackupModals.tsx +++ b/src/renderer/src/components/LocalBackupModals.tsx @@ -83,7 +83,7 @@ export function useLocalBackupModal(localBackupDir: string | undefined) { }) setIsModalVisible(false) } catch (error) { - logger.error('Backup failed:', error) + logger.error('Backup failed:', error as Error) } finally { setBackuping(false) } diff --git a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx index 0d4680b7b..b39f4964b 100644 --- a/src/renderer/src/components/MinApp/MinappPopupContainer.tsx +++ b/src/renderer/src/components/MinApp/MinappPopupContainer.tsx @@ -299,7 +299,7 @@ const MinappPopupContainer: React.FC = () => { const handleWebviewNavigate = (appid: string, url: string) => { // 记录当前URL,用于GoogleLoginTip判断 if (appid === currentMinappId) { - logger.debug('URL changed:', url) + logger.debug(`URL changed: ${url}`) setCurrentUrl(url) } } diff --git a/src/renderer/src/components/ModelList/EditModelsPopup.tsx b/src/renderer/src/components/ModelList/EditModelsPopup.tsx index 9431a9c2e..03aca4d62 100644 --- a/src/renderer/src/components/ModelList/EditModelsPopup.tsx +++ b/src/renderer/src/components/ModelList/EditModelsPopup.tsx @@ -184,7 +184,7 @@ const PopupContainer: React.FC = ({ provider: _provider, resolve }) => { .filter((model) => !isEmpty(model.name)) ) } catch (error) { - logger.error('Failed to fetch models', error) + logger.error('Failed to fetch models', error as Error) } finally { setTimeout(() => setLoading(false), 300) } diff --git a/src/renderer/src/components/NutstorePathSelector.tsx b/src/renderer/src/components/NutstorePathSelector.tsx index b25b76a0c..4576aa002 100644 --- a/src/renderer/src/components/NutstorePathSelector.tsx +++ b/src/renderer/src/components/NutstorePathSelector.tsx @@ -98,7 +98,7 @@ function FileList(props: FileListProps) { setFiles(items) } catch (error) { if (error instanceof Error) { - logger.error('Error fetching files:', error) + logger.error('Error fetching files:', error as Error) window.modal.error({ content: error.message, centered: true diff --git a/src/renderer/src/components/ObsidianExportDialog.tsx b/src/renderer/src/components/ObsidianExportDialog.tsx index 355153ae8..fba858763 100644 --- a/src/renderer/src/components/ObsidianExportDialog.tsx +++ b/src/renderer/src/components/ObsidianExportDialog.tsx @@ -195,7 +195,7 @@ const PopupContainer: React.FC = ({ setFiles(filesData) } } catch (error) { - logger.error('获取Obsidian Vault失败:', error) + logger.error('获取Obsidian Vault失败:', error as Error) setError(i18n.t('chat.topics.export.obsidian_fetch_error')) } finally { setLoading(false) @@ -213,7 +213,7 @@ const PopupContainer: React.FC = ({ const filesData = await window.api.obsidian.getFiles(selectedVault) setFiles(filesData) } catch (error) { - logger.error('获取Obsidian文件失败:', error) + logger.error('获取Obsidian文件失败:', error as Error) setError(i18n.t('chat.topics.export.obsidian_fetch_folders_error')) } finally { setLoading(false) diff --git a/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts b/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts index ef12f6afd..541dd2f15 100644 --- a/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts +++ b/src/renderer/src/components/Popups/ApiKeyListPopup/hook.ts @@ -306,7 +306,7 @@ async function getModelForCheck(provider: Provider, t: TFunction): Promise = ({ resolve }) => { }, []) const onOk = async () => { - logger.debug('skipBackupFile', skipBackupFile) + logger.debug(`skipBackupFile: ${skipBackupFile}`) await backup(skipBackupFile) setOpen(false) } diff --git a/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx b/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx index c7738cd96..3997135f7 100644 --- a/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx +++ b/src/renderer/src/components/Popups/SaveToKnowledgePopup.tsx @@ -203,7 +203,7 @@ const PopupContainer: React.FC = ({ message, title, resolve }) => { setOpen(false) resolve({ success: true, savedCount }) } catch (error) { - logger.error('save failed:', error) + logger.error('save failed:', error as Error) window.message.error(t('chat.save.knowledge.error.save_failed')) setLoading(false) } diff --git a/src/renderer/src/components/Popups/TextEditPopup.tsx b/src/renderer/src/components/Popups/TextEditPopup.tsx index 1edd35215..1a57205ed 100644 --- a/src/renderer/src/components/Popups/TextEditPopup.tsx +++ b/src/renderer/src/components/Popups/TextEditPopup.tsx @@ -121,7 +121,7 @@ const PopupContainer: React.FC = ({ setTextValue(translatedText) } } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) window.message.error({ content: t('translate.error.failed'), key: 'translate-message' diff --git a/src/renderer/src/components/TranslateButton.tsx b/src/renderer/src/components/TranslateButton.tsx index 516b8057b..c158d42a2 100644 --- a/src/renderer/src/components/TranslateButton.tsx +++ b/src/renderer/src/components/TranslateButton.tsx @@ -62,7 +62,7 @@ const TranslateButton: FC = ({ text, onTranslated, disabled, style, isLoa const translatedText = await fetchTranslate({ content: text, assistant }) onTranslated(translatedText) } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) window.message.error({ content: t('translate.error.failed'), key: 'translate-message' diff --git a/src/renderer/src/config/minapps.ts b/src/renderer/src/config/minapps.ts index b363eac9e..e20ce187f 100644 --- a/src/renderer/src/config/minapps.ts +++ b/src/renderer/src/config/minapps.ts @@ -82,7 +82,7 @@ const loadCustomMiniApp = async (): Promise => { addTime: app.addTime || now })) } catch (error) { - logger.error('Failed to load custom mini apps:', error) + logger.error('Failed to load custom mini apps:', error as Error) return [] } } diff --git a/src/renderer/src/databases/upgrades.ts b/src/renderer/src/databases/upgrades.ts index f94d45e05..2585c26f7 100644 --- a/src/renderer/src/databases/upgrades.ts +++ b/src/renderer/src/databases/upgrades.ts @@ -381,7 +381,7 @@ export async function upgradeToV8(tx: Transaction): Promise { targetLanguage: langMap[history.targetLanguage] }) } catch (error) { - logger.error('Error upgrading history:', error) + logger.error('Error upgrading history:', error as Error) } } logger.info('DB migration to version 8 finished.') diff --git a/src/renderer/src/hooks/useChatContext.ts b/src/renderer/src/hooks/useChatContext.ts index 43577972f..3513f0241 100644 --- a/src/renderer/src/hooks/useChatContext.ts +++ b/src/renderer/src/hooks/useChatContext.ts @@ -118,7 +118,7 @@ export const useChatContext = (activeTopic: Topic) => { window.message.success(t('message.delete.success')) handleToggleMultiSelectMode(false) } catch (error) { - logger.error('Failed to delete messages:', error) + logger.error('Failed to delete messages:', error as Error) window.message.error(t('message.delete.failed')) } } diff --git a/src/renderer/src/hooks/useMessageOperations.ts b/src/renderer/src/hooks/useMessageOperations.ts index 615b830e6..f4c7d51c8 100644 --- a/src/renderer/src/hooks/useMessageOperations.ts +++ b/src/renderer/src/hooks/useMessageOperations.ts @@ -220,7 +220,7 @@ export function useMessageOperations(topic: Topic) { const state = store.getState() const message = state.messages.entities[messageId] if (!message) { - logger.error('[getTranslationUpdater] cannot find message:', messageId) + logger.error(`[getTranslationUpdater] cannot find message: ${messageId}`) return null } @@ -305,7 +305,7 @@ export function useMessageOperations(topic: Topic) { const state = store.getState() const message = state.messages.entities[messageId] if (!message) { - logger.error('[editMessageBlocks] Message not found:', messageId) + logger.error(`[editMessageBlocks] Message not found: ${messageId}`) return } @@ -369,7 +369,7 @@ export function useMessageOperations(topic: Topic) { await dispatch(removeBlocksThunk(topic.id, messageId, blockIdsToRemove)) } } catch (error) { - logger.error('[editMessageBlocks] Failed to update message blocks:', error) + logger.error('[editMessageBlocks] Failed to update message blocks:', error as Error) } }, [dispatch, topic?.id] @@ -426,7 +426,7 @@ export function useMessageOperations(topic: Topic) { const state = store.getState() const message = state.messages.entities[messageId] if (!message || !message.blocks) { - logger.error('[removeMessageBlock] Message not found or has no blocks:', messageId) + logger.error(`[removeMessageBlock] Message not found or has no blocks: ${messageId}`) return } diff --git a/src/renderer/src/hooks/useNutstoreSSO.ts b/src/renderer/src/hooks/useNutstoreSSO.ts index 8be86257a..f5b3d03a6 100644 --- a/src/renderer/src/hooks/useNutstoreSSO.ts +++ b/src/renderer/src/hooks/useNutstoreSSO.ts @@ -14,7 +14,7 @@ export function useNutstoreSSO() { if (!encryptedToken) return reject(null) resolve(encryptedToken) } catch (error) { - logger.error('解析URL失败:', error) + logger.error('解析URL失败:', error as Error) reject(null) } finally { removeListener() diff --git a/src/renderer/src/hooks/usePinnedModels.ts b/src/renderer/src/hooks/usePinnedModels.ts index ae513f2fd..2e145b70d 100644 --- a/src/renderer/src/hooks/usePinnedModels.ts +++ b/src/renderer/src/hooks/usePinnedModels.ts @@ -56,7 +56,7 @@ export const usePinnedModels = () => { : [...pinnedModels, modelId] await updatePinnedModels(newPinnedModels) } catch (error) { - logger.error('Failed to toggle pinned model', error) + logger.error('Failed to toggle pinned model', error as Error) } }, [pinnedModels, updatePinnedModels] diff --git a/src/renderer/src/pages/agents/components/AddAgentPopup.tsx b/src/renderer/src/pages/agents/components/AddAgentPopup.tsx index a4184d3c9..04e18f3d6 100644 --- a/src/renderer/src/pages/agents/components/AddAgentPopup.tsx +++ b/src/renderer/src/pages/agents/components/AddAgentPopup.tsx @@ -143,7 +143,7 @@ const PopupContainer: React.FC = ({ resolve }) => { setOriginalPrompt(content) setHasUnsavedChanges(true) } catch (error) { - logger.error('Error fetching data:', error) + logger.error('Error fetching data:', error as Error) } setLoading(false) diff --git a/src/renderer/src/pages/agents/index.ts b/src/renderer/src/pages/agents/index.ts index f83b90370..23b415b9c 100644 --- a/src/renderer/src/pages/agents/index.ts +++ b/src/renderer/src/pages/agents/index.ts @@ -44,7 +44,7 @@ export function useSystemAgents() { setAgents(agentsData) return } catch (error) { - logger.error('Failed to load remote agents:', error) + logger.error('Failed to load remote agents:', error as Error) // 远程加载失败,继续尝试加载本地数据 } } @@ -69,7 +69,7 @@ export function useSystemAgents() { setAgents(_agents) } catch (error) { - logger.error('Failed to load agents:', error) + logger.error('Failed to load agents:', error as Error) // 发生错误时使用已加载的本地 agents setAgents(_agents) } diff --git a/src/renderer/src/pages/apps/App.tsx b/src/renderer/src/pages/apps/App.tsx index a56baa3b2..78c124679 100644 --- a/src/renderer/src/pages/apps/App.tsx +++ b/src/renderer/src/pages/apps/App.tsx @@ -72,7 +72,7 @@ const App: FC = ({ app, onClick, size = 60, isLast }) => { updateDisabledMinapps(disabled.filter((item) => item.id !== app.id)) } catch (error) { window.message.error(t('settings.miniapps.custom.remove_error')) - logger.error('Failed to remove custom mini app:', error) + logger.error('Failed to remove custom mini app:', error as Error) } } } diff --git a/src/renderer/src/pages/apps/NewAppButton.tsx b/src/renderer/src/pages/apps/NewAppButton.tsx index d63cf8b1e..f1454432a 100644 --- a/src/renderer/src/pages/apps/NewAppButton.tsx +++ b/src/renderer/src/pages/apps/NewAppButton.tsx @@ -63,7 +63,7 @@ const NewAppButton: FC = ({ size = 60 }) => { updateMinapps([...minapps, newApp]) } catch (error) { window.message.error(t('settings.miniapps.custom.save_error')) - logger.error('Failed to save custom mini app:', error) + logger.error('Failed to save custom mini app:', error as Error) } } @@ -83,7 +83,7 @@ const NewAppButton: FC = ({ size = 60 }) => { } reader.readAsDataURL(file) } catch (error) { - logger.error('Failed to read file:', error) + logger.error('Failed to read file:', error as Error) window.message.error(t('settings.miniapps.custom.logo_upload_error')) } } diff --git a/src/renderer/src/pages/home/Chat.tsx b/src/renderer/src/pages/home/Chat.tsx index 3aca1f856..0860440b6 100644 --- a/src/renderer/src/pages/home/Chat.tsx +++ b/src/renderer/src/pages/home/Chat.tsx @@ -54,7 +54,7 @@ const Chat: FC = (props) => { const selectedText = window.getSelection()?.toString().trim() contentSearchRef.current?.enable(selectedText) } catch (error) { - logger.error('Error enabling content search:', error) + logger.error('Error enabling content search:', error as Error) } }) diff --git a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx index 7ff3c3ead..7641bbd54 100644 --- a/src/renderer/src/pages/home/Inputbar/Inputbar.tsx +++ b/src/renderer/src/pages/home/Inputbar/Inputbar.tsx @@ -251,7 +251,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic, topic }) = setTimeout(() => resizeTextArea(true), 0) setExpend(false) } catch (error) { - logger.warn('Failed to send message:', error) + logger.warn('Failed to send message:', error as Error) parent?.recordException(error as Error) } }, [assistant, dispatch, files, inputEmpty, loading, mentionedModels, resizeTextArea, text, topic]) @@ -267,7 +267,7 @@ const Inputbar: FC = ({ assistant: _assistant, setActiveTopic, topic }) = translatedText && setText(translatedText) setTimeout(() => resizeTextArea(), 0) } catch (error) { - logger.warn('Translation failed:', error) + logger.warn('Translation failed:', error as Error) } finally { setIsTranslating(false) } diff --git a/src/renderer/src/pages/home/Messages/Message.tsx b/src/renderer/src/pages/home/Messages/Message.tsx index 06fc7c33b..a2e6633f7 100644 --- a/src/renderer/src/pages/home/Messages/Message.tsx +++ b/src/renderer/src/pages/home/Messages/Message.tsx @@ -73,7 +73,7 @@ const MessageItem: FC = ({ editMessage(message.id, { usage: usage }) stopEditing() } catch (error) { - logger.error('Failed to save message blocks:', error) + logger.error('Failed to save message blocks:', error as Error) } }, [message, editMessageBlocks, stopEditing, editMessage] @@ -88,7 +88,7 @@ const MessageItem: FC = ({ await resendUserMessageWithEdit(message, blocks, assistantWithTopicPrompt) stopEditing() } catch (error) { - logger.error('Failed to resend message:', error) + logger.error('Failed to resend message:', error as Error) } }, [message, resendUserMessageWithEdit, assistant, stopEditing, topic.prompt] diff --git a/src/renderer/src/pages/home/Messages/MessageImage.tsx b/src/renderer/src/pages/home/Messages/MessageImage.tsx index 692b13495..a0faf46d0 100644 --- a/src/renderer/src/pages/home/Messages/MessageImage.tsx +++ b/src/renderer/src/pages/home/Messages/MessageImage.tsx @@ -34,7 +34,7 @@ const MessageImage: FC = ({ block }) => { document.body.removeChild(link) window.message.success(t('message.download.success')) } catch (error) { - logger.error('下载图片失败:', error) + logger.error('下载图片失败:', error as Error) window.message.error(t('message.download.failed')) } } @@ -86,7 +86,7 @@ const MessageImage: FC = ({ block }) => { window.message.success(t('message.copy.success')) } catch (error) { - logger.error('复制图片失败:', error) + logger.error('复制图片失败:', error as Error) window.message.error(t('message.copy.failed')) } } diff --git a/src/renderer/src/pages/home/Messages/MessageTools.tsx b/src/renderer/src/pages/home/Messages/MessageTools.tsx index 5db7def43..dcf55057c 100644 --- a/src/renderer/src/pages/home/Messages/MessageTools.tsx +++ b/src/renderer/src/pages/home/Messages/MessageTools.tsx @@ -44,7 +44,7 @@ const MessageTools: FC = ({ block }) => { if (countdown > 0) { timer.current = setTimeout(() => { - logger.debug('countdown', countdown) + logger.debug(`countdown: ${countdown}`) setCountdown((prev) => prev - 1) }, 1000) } else if (countdown === 0) { @@ -121,7 +121,7 @@ const MessageTools: FC = ({ block }) => { message.error({ content: t('message.tools.abort_failed'), key: 'abort-tool' }) } } catch (error) { - logger.error('Failed to abort tool:', error) + logger.error('Failed to abort tool:', error as Error) message.error({ content: t('message.tools.abort_failed'), key: 'abort-tool' }) } } @@ -294,7 +294,7 @@ const MessageTools: FC = ({ block }) => { return } } catch (e) { - logger.error('failed to render the preview of mcp results:', e) + logger.error('failed to render the preview of mcp results:', e as Error) return } } diff --git a/src/renderer/src/pages/home/Messages/Messages.tsx b/src/renderer/src/pages/home/Messages/Messages.tsx index aef377f94..968c4152d 100644 --- a/src/renderer/src/pages/home/Messages/Messages.tsx +++ b/src/renderer/src/pages/home/Messages/Messages.tsx @@ -225,7 +225,10 @@ const Messages: React.FC = ({ assistant, topic, setActiveTopic, o window.message.success({ content: t('code_block.edit.save.success'), key: 'save-code' }) } catch (error) { - logger.error(`Failed to save code block ${codeBlockId} content to message block ${msgBlockId}:`, error) + logger.error( + `Failed to save code block ${codeBlockId} content to message block ${msgBlockId}:`, + error as Error + ) window.message.error({ content: t('code_block.edit.save.failed'), key: 'save-code-failed' }) } } else { diff --git a/src/renderer/src/pages/knowledge/components/AddKnowledgePopup.tsx b/src/renderer/src/pages/knowledge/components/AddKnowledgePopup.tsx index b152529f1..c476e543d 100644 --- a/src/renderer/src/pages/knowledge/components/AddKnowledgePopup.tsx +++ b/src/renderer/src/pages/knowledge/components/AddKnowledgePopup.tsx @@ -114,7 +114,7 @@ const PopupContainer: React.FC = ({ title, resolve }) => { setDimensions(finalDimensions) } catch (error) { - logger.error('Error getting embedding dimensions:', error) + logger.error('Error getting embedding dimensions:', error as Error) window.message.error(t('message.error.get_embedding_dimensions') + '\n' + getErrorMessage(error)) setLoading(false) return @@ -144,7 +144,7 @@ const PopupContainer: React.FC = ({ title, resolve }) => { resolve(_newBase) } } catch (error) { - logger.error('Validation failed:', error) + logger.error('Validation failed:', error as Error) } } const onCancel = () => { diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx index ac05b4c9e..aed69b509 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSearchPopup.tsx @@ -44,7 +44,7 @@ const PopupContainer: React.FC = ({ base, resolve }) => { const searchResults = await searchKnowledgeBase(value, base) setResults(searchResults) } catch (error) { - logger.error(`Failed to search knowledge base ${base.name}:`, error) + logger.error(`Failed to search knowledge base ${base.name}:`, error as Error) setResults([]) } finally { setLoading(false) @@ -82,7 +82,7 @@ const PopupContainer: React.FC = ({ base, resolve }) => { await navigator.clipboard.writeText(text) message.success(t('message.copied')) } catch (error) { - logger.error('Failed to copy text:', error) + logger.error('Failed to copy text:', error as Error) window.message.error(t('message.copyError') || 'Failed to copy text') } } diff --git a/src/renderer/src/pages/knowledge/components/KnowledgeSettings.tsx b/src/renderer/src/pages/knowledge/components/KnowledgeSettings.tsx index 44692c5c4..6075dbe24 100644 --- a/src/renderer/src/pages/knowledge/components/KnowledgeSettings.tsx +++ b/src/renderer/src/pages/knowledge/components/KnowledgeSettings.tsx @@ -72,7 +72,7 @@ const PopupContainer: React.FC = ({ base: _base, resolve }) => { setOpen(false) resolve(newBase) } catch (error) { - logger.error('Validation failed:', error) + logger.error('Validation failed:', error as Error) } } diff --git a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx index 4edd67df3..8eb8868e9 100644 --- a/src/renderer/src/pages/knowledge/components/QuotaTag.tsx +++ b/src/renderer/src/pages/knowledge/components/QuotaTag.tsx @@ -37,7 +37,7 @@ const QuotaTag: FC<{ base: KnowledgeBase; providerId: string; quota?: number }> }) setQuota(response) } catch (error) { - logger.error('[KnowledgeContent] Error checking quota:', error) + logger.error('[KnowledgeContent] Error checking quota:', error as Error) } } } diff --git a/src/renderer/src/pages/knowledge/components/StatusIcon.tsx b/src/renderer/src/pages/knowledge/components/StatusIcon.tsx index b9ae3bafc..cfe21d50c 100644 --- a/src/renderer/src/pages/knowledge/components/StatusIcon.tsx +++ b/src/renderer/src/pages/knowledge/components/StatusIcon.tsx @@ -28,7 +28,7 @@ const StatusIcon: FC = ({ const status = getProcessingStatus(sourceId) const item = base.items.find((item) => item.id === sourceId) const errorText = item?.processingError - logger.debug('[StatusIcon] Rendering for item:', item?.id, 'Status:', status, 'Progress:', progress) + logger.debug(`[StatusIcon] Rendering for item: ${item?.id} Status: ${status} Progress: ${progress}`) return useMemo(() => { if (!status) { diff --git a/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx b/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx index a7e8a0480..2197ea261 100644 --- a/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx +++ b/src/renderer/src/pages/knowledge/items/KnowledgeSitemaps.tsx @@ -74,7 +74,7 @@ const KnowledgeSitemaps: FC = ({ selectedBase }) => { } addSitemap(url) } catch (e) { - logger.error('Invalid Sitemap URL:', url) + logger.error(`Invalid Sitemap URL: ${url}`) } } } diff --git a/src/renderer/src/pages/memory/index.tsx b/src/renderer/src/pages/memory/index.tsx index eb7939884..72a7bf70a 100644 --- a/src/renderer/src/pages/memory/index.tsx +++ b/src/renderer/src/pages/memory/index.tsx @@ -330,7 +330,7 @@ const MemoriesPage = () => { const users = usersList.map((user) => user.userId) setUniqueUsers(users) } catch (error) { - logger.error('Failed to load users list:', error) + logger.error('Failed to load users list:', error as Error) } }, [memoryService]) @@ -338,7 +338,7 @@ const MemoriesPage = () => { const loadMemories = useCallback( async (userId?: string) => { const targetUser = userId || currentUser - logger.debug('Loading all memories for user:', targetUser) + logger.debug(`Loading all memories for user: ${targetUser}`) setLoading(true) try { // First, ensure the memory service is using the correct user @@ -349,10 +349,10 @@ const MemoriesPage = () => { // Get all memories for current user context (load up to 10000) const result = await memoryService.list({ limit: 10000, offset: 0 }) - logger.debug('Loaded memories for user:', targetUser, 'count:', result.results?.length || 0) + logger.debug(`Loaded memories for user: ${targetUser} count: ${result.results?.length || 0}`) setAllMemories(result.results || []) } catch (error) { - logger.error('Failed to load memories:', error) + logger.error('Failed to load memories:', error as Error) window.message.error(t('memory.load_failed')) } finally { setLoading(false) @@ -363,7 +363,7 @@ const MemoriesPage = () => { // Sync memoryService with Redux store on mount and when currentUser changes useEffect(() => { - logger.debug('useEffect triggered for currentUser:', currentUser) + logger.debug(`useEffect triggered for currentUser: ${currentUser}`) // Reset to first page when user changes setCurrentPage(1) loadMemories(currentUser) @@ -418,7 +418,7 @@ const MemoriesPage = () => { setCurrentPage(1) await loadMemories(currentUser) } catch (error) { - logger.error('Failed to add memory:', error) + logger.error('Failed to add memory:', error as Error) window.message.error(t('memory.add_failed')) } } @@ -430,7 +430,7 @@ const MemoriesPage = () => { // Reload all memories await loadMemories(currentUser) } catch (error) { - logger.error('Failed to delete memory:', error) + logger.error('Failed to delete memory:', error as Error) window.message.error(t('memory.delete_failed')) } } @@ -447,13 +447,13 @@ const MemoriesPage = () => { // Reload all memories await loadMemories(currentUser) } catch (error) { - logger.error('Failed to update memory:', error) + logger.error('Failed to update memory:', error as Error) window.message.error(t('memory.update_failed')) } } const handleUserSwitch = async (userId: string) => { - logger.debug('Switching to user:', userId) + logger.debug(`Switching to user: ${userId}`) // First update Redux state dispatch(setCurrentUserId(userId)) @@ -472,7 +472,7 @@ const MemoriesPage = () => { t('memory.user_switched', { user: userId === DEFAULT_USER_ID ? t('memory.default_user') : userId }) ) } catch (error) { - logger.error('Failed to switch user:', error) + logger.error('Failed to switch user:', error as Error) window.message.error(t('memory.user_switch_failed')) } } @@ -492,7 +492,7 @@ const MemoriesPage = () => { window.message.success(t('memory.user_created', { user: userId })) setAddUserModalVisible(false) } catch (error) { - logger.error('Failed to add user:', error) + logger.error('Failed to add user:', error as Error) window.message.error(t('memory.add_user_failed')) } } @@ -524,7 +524,7 @@ const MemoriesPage = () => { // Reload memories to show the empty state await loadMemories(currentUser) } catch (error) { - logger.error('Failed to reset memories:', error) + logger.error('Failed to reset memories:', error as Error) window.message.error(t('memory.reset_memories_failed')) } } @@ -558,7 +558,6 @@ const MemoriesPage = () => { await loadMemories(currentUser) } } catch (error) { - logger.error('Failed to delete user:', error) window.message.error(t('memory.delete_user_failed')) } } diff --git a/src/renderer/src/pages/memory/settings-modal.tsx b/src/renderer/src/pages/memory/settings-modal.tsx index 59e196e36..dbd199db1 100644 --- a/src/renderer/src/pages/memory/settings-modal.tsx +++ b/src/renderer/src/pages/memory/settings-modal.tsx @@ -86,7 +86,7 @@ const MemoriesSettingsModal: FC = ({ visible, onSubm const aiProvider = new AiProvider(provider) finalDimensions = await aiProvider.getEmbeddingDimensions(embedderModel) } catch (error) { - logger.error('Error getting embedding dimensions:', error) + logger.error('Error getting embedding dimensions:', error as Error) window.message.error(t('message.error.get_embedding_dimensions') + '\n' + getErrorMessage(error)) setLoading(false) return @@ -125,7 +125,7 @@ const MemoriesSettingsModal: FC = ({ visible, onSubm setLoading(false) } } catch (error) { - logger.error('Error submitting form:', error) + logger.error('Error submitting form:', error as Error) setLoading(false) } } diff --git a/src/renderer/src/pages/paintings/AihubmixPage.tsx b/src/renderer/src/pages/paintings/AihubmixPage.tsx index 9e968dce0..d2ef782c2 100644 --- a/src/renderer/src/pages/paintings/AihubmixPage.tsx +++ b/src/renderer/src/pages/paintings/AihubmixPage.tsx @@ -116,7 +116,7 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { } return await window.api.file.download(url) } catch (error) { - logger.error('下载图像失败:', error) + logger.error('下载图像失败:', error as Error) if ( error instanceof Error && (error.message.includes('Failed to parse URL') || error.message.includes('Invalid URL')) @@ -550,7 +550,7 @@ const AihubmixPage: FC<{ Options: string[] }> = ({ Options }) => { const translatedText = await translateText(painting.prompt, LanguagesEnum.enUS) updatePaintingState({ prompt: translatedText }) } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) } finally { setIsTranslating(false) } diff --git a/src/renderer/src/pages/paintings/NewApiPage.tsx b/src/renderer/src/pages/paintings/NewApiPage.tsx index 5d6a8561b..672e40a6c 100644 --- a/src/renderer/src/pages/paintings/NewApiPage.tsx +++ b/src/renderer/src/pages/paintings/NewApiPage.tsx @@ -183,7 +183,7 @@ const NewApiPage: FC<{ Options: string[] }> = ({ Options }) => { } return await window.api.file.download(url) } catch (error) { - logger.error('下载图像失败:', error) + logger.error('下载图像失败:', error as Error) if ( error instanceof Error && (error.message.includes('Failed to parse URL') || error.message.includes('Invalid URL')) @@ -396,7 +396,7 @@ const NewApiPage: FC<{ Options: string[] }> = ({ Options }) => { const translatedText = await translateText(painting.prompt, LanguagesEnum.enUS) updatePaintingState({ prompt: translatedText }) } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) } finally { setIsTranslating(false) } diff --git a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx index dc92c158c..0de582065 100644 --- a/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx +++ b/src/renderer/src/pages/paintings/PaintingsRoutePage.tsx @@ -21,7 +21,7 @@ const PaintingsRoutePage: FC = () => { const dispatch = useAppDispatch() useEffect(() => { - logger.debug('defaultPaintingProvider', provider) + logger.debug(`defaultPaintingProvider: ${provider}`) if (provider && Options.includes(provider)) { dispatch(setDefaultPaintingProvider(provider as PaintingProvider)) } diff --git a/src/renderer/src/pages/paintings/SiliconPage.tsx b/src/renderer/src/pages/paintings/SiliconPage.tsx index bf4f1fb5b..1fc3a3063 100644 --- a/src/renderer/src/pages/paintings/SiliconPage.tsx +++ b/src/renderer/src/pages/paintings/SiliconPage.tsx @@ -218,7 +218,7 @@ const SiliconPage: FC<{ Options: string[] }> = ({ Options }) => { } return await window.api.file.download(url) } catch (error) { - logger.error('Failed to download image:', error) + logger.error('Failed to download image:', error as Error) if ( error instanceof Error && (error.message.includes('Failed to parse URL') || error.message.includes('Invalid URL')) @@ -309,7 +309,7 @@ const SiliconPage: FC<{ Options: string[] }> = ({ Options }) => { const translatedText = await translateText(painting.prompt, LanguagesEnum.enUS) updatePaintingState({ prompt: translatedText }) } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) } finally { setIsTranslating(false) } diff --git a/src/renderer/src/pages/paintings/TokenFluxPage.tsx b/src/renderer/src/pages/paintings/TokenFluxPage.tsx index 0f40556a3..e31b9827f 100644 --- a/src/renderer/src/pages/paintings/TokenFluxPage.tsx +++ b/src/renderer/src/pages/paintings/TokenFluxPage.tsx @@ -262,7 +262,7 @@ const TokenFluxPage: FC<{ Options: string[] }> = ({ Options }) => { const translatedText = await translateText(painting.prompt, LanguagesEnum.enUS) updatePaintingState({ prompt: translatedText }) } catch (error) { - logger.error('Translation failed:', error) + logger.error('Translation failed:', error as Error) } finally { setIsTranslating(false) } diff --git a/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx b/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx index 03fe70ec4..6c2feab30 100644 --- a/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx +++ b/src/renderer/src/pages/paintings/components/DynamicFormRender.tsx @@ -46,7 +46,7 @@ export const DynamicFormRender: React.FC = ({ } } } catch (error) { - logger.error('Error processing image:', error) + logger.error('Error processing image:', error as Error) } }, [] diff --git a/src/renderer/src/pages/paintings/utils/TokenFluxService.ts b/src/renderer/src/pages/paintings/utils/TokenFluxService.ts index c3b94717e..d770427f5 100644 --- a/src/renderer/src/pages/paintings/utils/TokenFluxService.ts +++ b/src/renderer/src/pages/paintings/utils/TokenFluxService.ts @@ -174,7 +174,7 @@ export class TokenFluxService { // Continue polling for other statuses (processing, queued, etc.) setTimeout(poll, intervalMs) } catch (error) { - logger.error('Polling error:', error) + logger.error('Polling error:', error as Error) retryCount++ if (retryCount >= maxRetries) { @@ -227,7 +227,7 @@ export class TokenFluxService { } return await window.api.file.download(url) } catch (error) { - logger.error('Failed to download image:', error) + logger.error('Failed to download image:', error as Error) return null } }) diff --git a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx index c5d70e8b3..5ec4d7acb 100644 --- a/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx +++ b/src/renderer/src/pages/settings/AssistantSettings/AssistantMemorySettings.tsx @@ -47,7 +47,7 @@ const AssistantMemorySettings: React.FC = ({ assistant, updateAssistant, }) setMemoryStats({ count: result.results.length, loading: false }) } catch (error) { - logger.error('Failed to load memory stats:', error) + logger.error('Failed to load memory stats:', error as Error) setMemoryStats({ count: 0, loading: false }) } }, [assistant.id, memoryService]) diff --git a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx index 6ae3a5990..4f3e0d5d2 100644 --- a/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/LocalBackupSettings.tsx @@ -136,7 +136,7 @@ const LocalBackupSettings: React.FC = () => { handleLocalBackupDirChange(newLocalBackupDir) } catch (error) { - logger.error('Failed to select directory:', error) + logger.error('Failed to select directory:', error as Error) } } diff --git a/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx b/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx index d98ebc495..a232fc799 100644 --- a/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/ObsidianSettings.tsx @@ -43,7 +43,7 @@ const ObsidianSettings: FC = () => { dispatch(setDefaultObsidianVault(vaultsData[0].name)) } } catch (error) { - logger.error('获取Obsidian Vault失败:', error) + logger.error('获取Obsidian Vault失败:', error as Error) setError(t('settings.data.obsidian.default_vault_fetch_error')) } finally { setLoading(false) diff --git a/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx b/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx index 7b5edbba1..7feeaeda3 100644 --- a/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx +++ b/src/renderer/src/pages/settings/DataSettings/SiyuanSettings.tsx @@ -78,7 +78,7 @@ const SiyuanSettings: FC = () => { window.message.success(t('settings.data.siyuan.check.success')) } catch (error) { - logger.error('Check Siyuan connection failed:', error) + logger.error('Check Siyuan connection failed:', error as Error) window.message.error(t('settings.data.siyuan.check.error')) } } diff --git a/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx b/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx index aaf7fd359..b3638e177 100644 --- a/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/AddMcpServerModal.tsx @@ -175,7 +175,7 @@ const AddMcpServerModal: FC = ({ }) }, 1000) // Delay to ensure server is properly added to store } catch (error) { - logger.error('DXT processing error:', error) + logger.error('DXT processing error:', error as Error) window.message.error({ content: t('settings.mcp.addServer.importFrom.dxtProcessFailed'), key: 'mcp-dxt-error' diff --git a/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx b/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx index 3328aeb51..6f3ce7de0 100644 --- a/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx +++ b/src/renderer/src/pages/settings/MCPSettings/EditMcpJsonPopup.tsx @@ -43,7 +43,7 @@ const PopupContainer: React.FC = ({ resolve }) => { setJsonConfig(formattedJson) setJsonError('') } catch (error) { - logger.error('Failed to format JSON:', error) + logger.error('Failed to format JSON:', error as Error) setJsonError(t('settings.mcp.jsonFormatError')) } finally { setIsLoading(false) diff --git a/src/renderer/src/pages/settings/MCPSettings/modelscopeSyncUtils.ts b/src/renderer/src/pages/settings/MCPSettings/modelscopeSyncUtils.ts index dc9a34768..00a58e3f2 100644 --- a/src/renderer/src/pages/settings/MCPSettings/modelscopeSyncUtils.ts +++ b/src/renderer/src/pages/settings/MCPSettings/modelscopeSyncUtils.ts @@ -117,7 +117,7 @@ export const syncModelScopeServers = async ( addedServers.push(mcpServer) } catch (err) { - logger.error('Error processing ModelScope server:', err) + logger.error('Error processing ModelScope server:', err as Error) } } @@ -127,7 +127,7 @@ export const syncModelScopeServers = async ( addedServers } } catch (error) { - logger.error('ModelScope sync error:', error) + logger.error('ModelScope sync error:', error as Error) return { success: false, message: t('settings.mcp.sync.error'), diff --git a/src/renderer/src/pages/settings/MCPSettings/providers/302ai.ts b/src/renderer/src/pages/settings/MCPSettings/providers/302ai.ts index 856b2d6d8..4fbb23c7e 100644 --- a/src/renderer/src/pages/settings/MCPSettings/providers/302ai.ts +++ b/src/renderer/src/pages/settings/MCPSettings/providers/302ai.ts @@ -100,7 +100,7 @@ export const syncAi302Servers = async (token: string, existingServers: MCPServer addedServers.push(mcpServer) } catch (err) { - logger.error('Error processing 302ai server:', err) + logger.error('Error processing 302ai server:', err as Error) } } @@ -110,7 +110,7 @@ export const syncAi302Servers = async (token: string, existingServers: MCPServer addedServers } } catch (error) { - logger.error('302ai sync error:', error) + logger.error('302ai sync error:', error as Error) return { success: false, message: t('settings.mcp.sync.error'), diff --git a/src/renderer/src/pages/settings/MCPSettings/providers/lanyun.ts b/src/renderer/src/pages/settings/MCPSettings/providers/lanyun.ts index 7c773c550..77f6541b9 100644 --- a/src/renderer/src/pages/settings/MCPSettings/providers/lanyun.ts +++ b/src/renderer/src/pages/settings/MCPSettings/providers/lanyun.ts @@ -160,7 +160,7 @@ export const syncTokenLanYunServers = async ( addedServers.push(mcpServer) } catch (err) { - logger.error('Error processing LanYun server:', err) + logger.error('Error processing LanYun server:', err as Error) } } @@ -170,7 +170,7 @@ export const syncTokenLanYunServers = async ( addedServers } } catch (error) { - logger.error('TokenLanyun sync error:', error) + logger.error('TokenLanyun sync error:', error as Error) return { success: false, message: t('settings.mcp.sync.error'), diff --git a/src/renderer/src/pages/settings/MCPSettings/providers/tokenflux.ts b/src/renderer/src/pages/settings/MCPSettings/providers/tokenflux.ts index 3bf9636e6..384ae1728 100644 --- a/src/renderer/src/pages/settings/MCPSettings/providers/tokenflux.ts +++ b/src/renderer/src/pages/settings/MCPSettings/providers/tokenflux.ts @@ -128,7 +128,7 @@ export const syncTokenFluxServers = async ( addedServers.push(mcpServer) } catch (err) { - logger.error('Error processing TokenFlux server:', err) + logger.error('Error processing TokenFlux server:', err as Error) } } @@ -138,7 +138,7 @@ export const syncTokenFluxServers = async ( addedServers } } catch (error) { - logger.error('TokenFlux sync error:', error) + logger.error('TokenFlux sync error:', error as Error) return { success: false, message: t('settings.mcp.sync.error'), diff --git a/src/renderer/src/pages/settings/MemorySettings/MemoriesSettingsModal.tsx b/src/renderer/src/pages/settings/MemorySettings/MemoriesSettingsModal.tsx index f9227f575..d5f9f82b8 100644 --- a/src/renderer/src/pages/settings/MemorySettings/MemoriesSettingsModal.tsx +++ b/src/renderer/src/pages/settings/MemorySettings/MemoriesSettingsModal.tsx @@ -84,7 +84,7 @@ const MemoriesSettingsModal: FC = ({ visible, onSubm const aiProvider = new AiProvider(provider) finalDimensions = await aiProvider.getEmbeddingDimensions(embedderModel) } catch (error) { - logger.error('Error getting embedding dimensions:', error) + logger.error('Error getting embedding dimensions:', error as Error) window.message.error(t('message.error.get_embedding_dimensions') + '\n' + getErrorMessage(error)) setLoading(false) return @@ -121,7 +121,7 @@ const MemoriesSettingsModal: FC = ({ visible, onSubm setLoading(false) } } catch (error) { - logger.error('Error submitting form:', error) + logger.error('Error submitting form:', error as Error) setLoading(false) } } diff --git a/src/renderer/src/pages/settings/MemorySettings/MemorySettings.tsx b/src/renderer/src/pages/settings/MemorySettings/MemorySettings.tsx index 4e0fdcf7e..3189747ab 100644 --- a/src/renderer/src/pages/settings/MemorySettings/MemorySettings.tsx +++ b/src/renderer/src/pages/settings/MemorySettings/MemorySettings.tsx @@ -334,7 +334,7 @@ const MemorySettings = () => { const users = usersList.map((user) => user.userId) setUniqueUsers(users) } catch (error) { - logger.error('Failed to load users list:', error) + logger.error('Failed to load users list:', error as Error) } }, [memoryService]) @@ -342,7 +342,7 @@ const MemorySettings = () => { const loadMemories = useCallback( async (userId?: string) => { const targetUser = userId || currentUser - logger.debug('Loading all memories for user:', targetUser) + logger.debug(`Loading all memories for user: ${targetUser}`) setLoading(true) try { // First, ensure the memory service is using the correct user @@ -353,10 +353,10 @@ const MemorySettings = () => { // Get all memories for current user context (load up to 10000) const result = await memoryService.list({ limit: 10000, offset: 0 }) - logger.verbose('Loaded memories for user:', targetUser, 'count:', result.results?.length || 0) + logger.verbose(`Loaded memories for user: ${targetUser}, count: ${result.results?.length || 0}`) setAllMemories(result.results || []) } catch (error) { - logger.error('Failed to load memories:', error) + logger.error('Failed to load memories:', error as Error) window.message.error(t('memory.load_failed')) } finally { setLoading(false) @@ -367,7 +367,7 @@ const MemorySettings = () => { // Sync memoryService with Redux store on mount and when currentUser changes useEffect(() => { - logger.verbose('useEffect triggered for currentUser:', currentUser) + logger.verbose(`useEffect triggered for currentUser: ${currentUser}`) // Reset to first page when user changes setCurrentPage(1) loadMemories(currentUser) @@ -422,7 +422,7 @@ const MemorySettings = () => { setCurrentPage(1) await loadMemories(currentUser) } catch (error) { - logger.error('Failed to add memory:', error) + logger.error('Failed to add memory:', error as Error) window.message.error(t('memory.add_failed')) } } @@ -434,7 +434,7 @@ const MemorySettings = () => { // Reload all memories await loadMemories(currentUser) } catch (error) { - logger.error('Failed to delete memory:', error) + logger.error('Failed to delete memory:', error as Error) window.message.error(t('memory.delete_failed')) } } @@ -451,13 +451,13 @@ const MemorySettings = () => { // Reload all memories await loadMemories(currentUser) } catch (error) { - logger.error('Failed to update memory:', error) + logger.error('Failed to update memory:', error as Error) window.message.error(t('memory.update_failed')) } } const handleUserSwitch = async (userId: string) => { - logger.verbose('Switching to user:', userId) + logger.verbose(`Switching to user: ${userId}`) // First update Redux state dispatch(setCurrentUserId(userId)) @@ -476,7 +476,7 @@ const MemorySettings = () => { t('memory.user_switched', { user: userId === DEFAULT_USER_ID ? t('memory.default_user') : userId }) ) } catch (error) { - logger.error('Failed to switch user:', error) + logger.error('Failed to switch user:', error as Error) window.message.error(t('memory.user_switch_failed')) } } @@ -496,7 +496,7 @@ const MemorySettings = () => { window.message.success(t('memory.user_created', { user: userId })) setAddUserModalVisible(false) } catch (error) { - logger.error('Failed to add user:', error) + logger.error('Failed to add user:', error as Error) window.message.error(t('memory.add_user_failed')) } } @@ -533,7 +533,7 @@ const MemorySettings = () => { // Reload memories to show the empty state await loadMemories(currentUser) } catch (error) { - logger.error('Failed to reset memories:', error) + logger.error('Failed to reset memories:', error as Error) window.message.error(t('memory.reset_memories_failed')) } } @@ -567,7 +567,7 @@ const MemorySettings = () => { await loadMemories(currentUser) } } catch (error) { - logger.error('Failed to delete user:', error) + logger.error('Failed to delete user:', error as Error) window.message.error(t('memory.delete_user_failed')) } } diff --git a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx index 16961c749..9d2fad5e2 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/AddProviderPopup.tsx @@ -33,7 +33,7 @@ const PopupContainer: React.FC = ({ provider, resolve }) => { setLogo(logoData) } } catch (error) { - logger.error('Failed to load logo', error) + logger.error('Failed to load logo', error as Error) } } loadLogo() diff --git a/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx b/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx index b106f7a73..3c50758f4 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/GithubCopilotSettings.tsx @@ -69,10 +69,10 @@ const GithubCopilotSettings: FC = ({ providerId }) = await navigator.clipboard.writeText(user_code) window.message.success(t('settings.provider.copilot.code_copied')) } catch (error) { - logger.error('Failed to copy to clipboard:', error) + logger.error('Failed to copy to clipboard:', error as Error) } } catch (error) { - logger.error('Failed to get device code:', error) + logger.error('Failed to get device code:', error as Error) window.message.error(t('settings.provider.copilot.code_failed')) setCurrentStep(0) } finally { @@ -98,7 +98,7 @@ const GithubCopilotSettings: FC = ({ providerId }) = window.message.success(t('settings.provider.copilot.auth_success')) } } catch (error) { - logger.error('Failed to get token:', error) + logger.error('Failed to get token:', error as Error) window.message.error(t('settings.provider.copilot.auth_failed')) setCurrentStep(2) } finally { @@ -127,7 +127,7 @@ const GithubCopilotSettings: FC = ({ providerId }) = window.message.success(t('settings.provider.copilot.logout_success')) } catch (error) { - logger.error('Failed to logout:', error) + logger.error('Failed to logout:', error as Error) window.message.error(t('settings.provider.copilot.logout_failed')) // 如果登出失败,重置登出状态 updateProvider({ ...provider, apiKey: '', isAuthed: false }) @@ -142,7 +142,7 @@ const GithubCopilotSettings: FC = ({ providerId }) = await navigator.clipboard.writeText(userCode) window.message.success(t('common.copied')) } catch (error) { - logger.error('Failed to copy to clipboard:', error) + logger.error('Failed to copy to clipboard:', error as Error) window.message.error(t('common.copy_failed')) } }, [userCode, t]) diff --git a/src/renderer/src/pages/settings/ProviderSettings/index.tsx b/src/renderer/src/pages/settings/ProviderSettings/index.tsx index 7c85f83e1..3d72d2fb6 100644 --- a/src/renderer/src/pages/settings/ProviderSettings/index.tsx +++ b/src/renderer/src/pages/settings/ProviderSettings/index.tsx @@ -50,7 +50,7 @@ const ProvidersList: FC = () => { logos[provider.id] = logoData } } catch (error) { - logger.error(`Failed to load logo for provider ${provider.id}`, error) + logger.error(`Failed to load logo for provider ${provider.id}`, error as Error) } } } @@ -302,7 +302,7 @@ const ProvidersList: FC = () => { } setProviderLogos(updatedLogos) } catch (error) { - logger.error('Failed to save logo', error) + logger.error('Failed to save logo', error as Error) window.message.error('保存Provider Logo失败') } } @@ -337,7 +337,7 @@ const ProvidersList: FC = () => { [provider.id]: logo })) } catch (error) { - logger.error('Failed to save logo', error) + logger.error('Failed to save logo', error as Error) window.message.error('更新Provider Logo失败') } } else if (logo === undefined && logoFile === undefined) { @@ -349,7 +349,7 @@ const ProvidersList: FC = () => { return newLogos }) } catch (error) { - logger.error('Failed to reset logo', error) + logger.error('Failed to reset logo', error as Error) } } } @@ -380,7 +380,7 @@ const ProvidersList: FC = () => { return newLogos }) } catch (error) { - logger.error('Failed to delete logo', error) + logger.error('Failed to delete logo', error as Error) } } diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx index f6609bf3d..97c3ef8c2 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/components/SelectionActionSearchModal.tsx @@ -127,7 +127,7 @@ const SelectionActionSearchModal: FC = ({ onOk(searchEngine) } catch (error) { - logger.debug('Validation failed:', error) + logger.debug('Validation failed:', error as Error) } } diff --git a/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts b/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts index 3ffe45359..eaaa55806 100644 --- a/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts +++ b/src/renderer/src/pages/settings/SelectionAssistantSettings/hooks/useSettingsActionsList.ts @@ -52,7 +52,7 @@ export const useActionItems = ( const currentItems = initialItems || [] setActionItems([...currentItems, actionItem]) } catch (error) { - logger.debug('Error adding item:', error) + logger.debug('Error adding item:', error as Error) } } setIsUserModalOpen(false) diff --git a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/BlacklistSettings.tsx b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/BlacklistSettings.tsx index 91c8e0985..78189506b 100644 --- a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/BlacklistSettings.tsx +++ b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/BlacklistSettings.tsx @@ -130,7 +130,7 @@ const BlacklistSettings: FC = () => { }) } } catch (error) { - logger.error(`Error updating subscribe source ${source.url}:`, error) + logger.error(`Error updating subscribe source ${source.url}:`, error as Error) // 显示具体源更新失败的消息 window.message.warning({ content: t('settings.tool.websearch.subscribe_source_update_failed', { url: source.url }), @@ -154,7 +154,7 @@ const BlacklistSettings: FC = () => { throw new Error('No valid sources updated') } } catch (error) { - logger.error('Error updating subscribes:', error) + logger.error('Error updating subscribes:', error as Error) window.message.error({ content: t('settings.tool.websearch.subscribe_update_failed'), duration: 2 @@ -213,7 +213,7 @@ const BlacklistSettings: FC = () => { // 清空选中状态 setSelectedRowKeys([]) } catch (error) { - logger.error('Error deleting subscribes:', error) + logger.error('Error deleting subscribes:', error as Error) } } diff --git a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/CompressionSettings/RagSettings.tsx b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/CompressionSettings/RagSettings.tsx index cae7e2dff..0977392d1 100644 --- a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/CompressionSettings/RagSettings.tsx +++ b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/CompressionSettings/RagSettings.tsx @@ -78,7 +78,7 @@ const RagSettings = () => { window.message.success(t('settings.tool.websearch.compression.info.dimensions_auto_success', { dimensions })) } catch (error) { - logger.error('handleAutoGetDimensions: failed to get embedding dimensions', error) + logger.error('handleAutoGetDimensions: failed to get embedding dimensions', error as Error) window.message.error(t('settings.tool.websearch.compression.error.dimensions_auto_failed')) } finally { setLoadingDimensions(false) diff --git a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/WebSearchProviderSetting.tsx b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/WebSearchProviderSetting.tsx index d12a4f22f..dcec4d913 100644 --- a/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/WebSearchProviderSetting.tsx +++ b/src/renderer/src/pages/settings/ToolSettings/WebSearchSettings/WebSearchProviderSetting.tsx @@ -118,7 +118,7 @@ const WebSearchProviderSetting: FC = ({ providerId }) => { setApiValid(valid) } catch (err) { - logger.error('Check search error:', err) + logger.error('Check search error:', err as Error) setApiValid(false) window.message.error({ key: 'check-search-error', diff --git a/src/renderer/src/pages/translate/TranslatePage.tsx b/src/renderer/src/pages/translate/TranslatePage.tsx index ef60b9921..cf930285b 100644 --- a/src/renderer/src/pages/translate/TranslatePage.tsx +++ b/src/renderer/src/pages/translate/TranslatePage.tsx @@ -408,7 +408,7 @@ const TranslatePage: FC = () => { await saveTranslateHistory(text, translatedText, actualSourceLanguage.langCode, actualTargetLanguage.langCode) setLoading(false) } catch (error) { - logger.error('Translation error:', error) + logger.error('Translation error:', error as Error) window.message.error({ content: String(error), key: 'translate-message' @@ -525,7 +525,7 @@ const TranslatePage: FC = () => { ) } } catch (error) { - logger.error('Error getting language display:', error) + logger.error('Error getting language display:', error as Error) setBidirectionalPair([LanguagesEnum.enUS, LanguagesEnum.zhCN]) } diff --git a/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts b/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts index 71df56a7f..81d85df5d 100644 --- a/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/BochaProvider.ts @@ -65,7 +65,7 @@ export default class BochaProvider extends BaseWebSearchProvider { })) } } catch (error) { - logger.error('Bocha search failed:', error) + logger.error('Bocha search failed:', error as Error) throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } diff --git a/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts b/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts index 87907bd21..a01ba9354 100644 --- a/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/ExaProvider.ts @@ -45,7 +45,7 @@ export default class ExaProvider extends BaseWebSearchProvider { }) } } catch (error) { - logger.error('Exa search failed:', error) + logger.error('Exa search failed:', error as Error) throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } diff --git a/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts index 86845134d..47972e080 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalBaiduProvider.ts @@ -24,7 +24,7 @@ export default class LocalBaiduProvider extends LocalSearchProvider { } }) } catch (error) { - logger.error('Failed to parse Baidu search HTML:', error) + logger.error('Failed to parse Baidu search HTML:', error as Error) } logger.info('Parsed Baidu search results:', results) return results diff --git a/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts index 62b626ee0..0d6c9db51 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalBingProvider.ts @@ -24,7 +24,7 @@ export default class LocalBingProvider extends LocalSearchProvider { } }) } catch (error) { - logger.error('Failed to parse Bing search HTML:', error) + logger.error('Failed to parse Bing search HTML:', error as Error) } return results } diff --git a/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts index cbfb42f03..834f11655 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalGoogleProvider.ts @@ -25,7 +25,7 @@ export default class LocalGoogleProvider extends LocalSearchProvider { } }) } catch (error) { - logger.error('Failed to parse Google search HTML:', error) + logger.error('Failed to parse Google search HTML:', error as Error) } return results } diff --git a/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts b/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts index c87964459..10ea77336 100644 --- a/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/LocalSearchProvider.ts @@ -72,7 +72,7 @@ export default class LocalSearchProvider extends BaseWebSearchProvider { if (isAbortError(error)) { throw error } - logger.error('Local search failed:', error) + logger.error('Local search failed:', error as Error) throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } finally { await window.api.searchService.closeSearchWindow(uid) diff --git a/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts b/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts index d2205b056..cf3a75f84 100644 --- a/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/SearxngProvider.ts @@ -90,7 +90,7 @@ export default class SearxngProvider extends BaseWebSearchProvider { } catch (err) { this.isInitialized = false - logger.error('Failed to fetch SearxNG engine configuration:', err) + logger.error('Failed to fetch SearxNG engine configuration:', err as Error) throw new Error(`Failed to initialize SearxNG: ${err}`) } } @@ -135,7 +135,7 @@ export default class SearxngProvider extends BaseWebSearchProvider { results: results.filter((result) => result.content != noContent) } } catch (error) { - logger.error('Searxng search failed:', error) + logger.error('Searxng search failed:', error as Error) throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } diff --git a/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts b/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts index a4cbe6987..3ca9b0676 100644 --- a/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts +++ b/src/renderer/src/providers/WebSearchProvider/TavilyProvider.ts @@ -41,7 +41,7 @@ export default class TavilyProvider extends BaseWebSearchProvider { }) } } catch (error) { - logger.error('Tavily search failed:', error) + logger.error('Tavily search failed:', error as Error) throw new Error(`Search failed: ${error instanceof Error ? error.message : 'Unknown error'}`) } } diff --git a/src/renderer/src/queue/KnowledgeQueue.ts b/src/renderer/src/queue/KnowledgeQueue.ts index 912483ad0..3be945ff6 100644 --- a/src/renderer/src/queue/KnowledgeQueue.ts +++ b/src/renderer/src/queue/KnowledgeQueue.ts @@ -203,7 +203,7 @@ class KnowledgeQueue { store.dispatch(clearCompletedProcessing({ baseId })) } catch (error) { - logger.error(`Error processing item ${item.id}: `, error) + logger.error(`Error processing item ${item.id}: `, error as Error) notificationService.send({ id: uuid(), type: 'error', diff --git a/src/renderer/src/services/ApiService.ts b/src/renderer/src/services/ApiService.ts index 000febadf..da9b54775 100644 --- a/src/renderer/src/services/ApiService.ts +++ b/src/renderer/src/services/ApiService.ts @@ -202,7 +202,7 @@ async function fetchExternalTool( } } catch (error) { if (isAbortError(error)) throw error - logger.error('Web search failed:', error) + logger.error('Web search failed:', error as Error) return } } @@ -221,7 +221,7 @@ async function fetchExternalTool( const currentUserId = selectCurrentUserId(store.getState()) // Search for relevant memories const processorConfig = MemoryProcessor.getProcessorConfig(memoryConfig, assistant.id, currentUserId) - logger.info('Searching for relevant memories with content:', content) + logger.info(`Searching for relevant memories with content: ${content}`) const memoryProcessor = new MemoryProcessor() const relevantMemories = await memoryProcessor.searchRelevantMemories( content, @@ -240,7 +240,7 @@ async function fetchExternalTool( return [] } } catch (error) { - logger.error('Error processing memory search:', error) + logger.error('Error processing memory search:', error as Error) // Continue with conversation even if memory processing fails return [] } @@ -289,7 +289,7 @@ async function fetchExternalTool( modelName ) } catch (error) { - logger.error('Knowledge base search failed:', error) + logger.error('Knowledge base search failed:', error as Error) return } } @@ -360,7 +360,7 @@ async function fetchExternalTool( const tools = await window.api.mcp.listTools(mcpServer, spanContext) return tools.filter((tool: any) => !mcpServer.disabledTools?.includes(tool.name)) } catch (error) { - logger.error(`Error fetching tools from MCP server ${mcpServer.name}:`, error) + logger.error(`Error fetching tools from MCP server ${mcpServer.name}:`, error as Error) return [] } }) @@ -370,14 +370,14 @@ async function fetchExternalTool( .map((result) => result.value) .flat() } catch (toolError) { - logger.error('Error fetching MCP tools:', toolError) + logger.error('Error fetching MCP tools:', toolError as Error) } } return { mcpTools } } catch (error) { if (isAbortError(error)) throw error - logger.error('Tool execution failed:', error) + logger.error('Tool execution failed:', error as Error) // 发送错误状态 const wasAnyToolEnabled = shouldWebSearch || shouldKnowledgeSearch || shouldSearchMemory @@ -567,10 +567,10 @@ async function processConversationMemory(messages: Message[], assistant: Assista } }) .catch((error) => { - logger.error('Background memory processing failed:', error) + logger.error('Background memory processing failed:', error as Error) }) } catch (error) { - logger.error('Error in post-conversation memory processing:', error) + logger.error('Error in post-conversation memory processing:', error as Error) } } diff --git a/src/renderer/src/services/BackupService.ts b/src/renderer/src/services/BackupService.ts index 7f66ea378..419f870f9 100644 --- a/src/renderer/src/services/BackupService.ts +++ b/src/renderer/src/services/BackupService.ts @@ -100,7 +100,7 @@ export async function restore() { channel: 'system' }) } catch (error) { - logger.error('restore: Error restoring backup file:', error) + logger.error('restore: Error restoring backup file:', error as Error) window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' }) } } @@ -171,7 +171,7 @@ export async function backupToWebdav({ deviceType = (await window.api.system.getDeviceType()) || 'unknown' hostname = (await window.api.system.getHostname()) || 'unknown' } catch (error) { - logger.error('Failed to get device type or hostname:', error) + logger.error('Failed to get device type or hostname:', error as Error) } const timestamp = dayjs().format('YYYYMMDDHHmmss') const backupFileName = customFileName || `cherry-studio.${timestamp}.${hostname}.${deviceType}.zip` @@ -248,7 +248,7 @@ export async function backupToWebdav({ } } } catch (error) { - logger.error('Failed to clean up old backup files:', error) + logger.error('Failed to clean up old backup files:', error as Error) } } } else { @@ -310,7 +310,7 @@ export async function restoreFromWebdav(fileName?: string) { try { await handleData(JSON.parse(data)) } catch (error) { - logger.error('[Backup] Error downloading file from WebDAV:', error) + logger.error('[Backup] Error downloading file from WebDAV:', error as Error) window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' }) } } @@ -341,7 +341,7 @@ export async function backupToS3({ deviceType = (await window.api.system.getDeviceType()) || 'unknown' hostname = (await window.api.system.getHostname()) || 'unknown' } catch (error) { - logger.error('Failed to get device type or hostname:', error) + logger.error('Failed to get device type or hostname:', error as Error) } const timestamp = dayjs().format('YYYYMMDDHHmmss') const backupFileName = customFileName || `cherry-studio.${timestamp}.${hostname}.${deviceType}.zip` @@ -401,7 +401,7 @@ export async function backupToS3({ } } } catch (error) { - logger.error('Failed to clean up old backup files:', error) + logger.error('Failed to clean up old backup files:', error as Error) } } } else { @@ -924,7 +924,7 @@ export async function backupToLocal({ deviceType = (await window.api.system.getDeviceType()) || 'unknown' hostname = (await window.api.system.getHostname()) || 'unknown' } catch (error) { - logger.error('Failed to get device type or hostname:', error) + logger.error('Failed to get device type or hostname:', error as Error) } const timestamp = dayjs().format('YYYYMMDDHHmmss') const backupFileName = customFileName || `cherry-studio.${timestamp}.${hostname}.${deviceType}.zip` @@ -981,7 +981,7 @@ export async function backupToLocal({ } } } catch (error) { - logger.error('[LocalBackup] Failed to clean up old backups:', error) + logger.error('[LocalBackup] Failed to clean up old backups:', error as Error) } } } else { @@ -1048,7 +1048,7 @@ export async function restoreFromLocal(fileName: string) { return true } catch (error) { - logger.error('[LocalBackup] Restore failed:', error) + logger.error('[LocalBackup] Restore failed:', error as Error) window.message.error({ content: i18n.t('error.backup.file_format'), key: 'restore' }) throw error } diff --git a/src/renderer/src/services/FileAction.ts b/src/renderer/src/services/FileAction.ts index d9f14a563..09423a026 100644 --- a/src/renderer/src/services/FileAction.ts +++ b/src/renderer/src/services/FileAction.ts @@ -84,7 +84,7 @@ export async function handleDelete(fileId: string, t: (key: string) => string) { }) logger.info(`Deleted ${blockIdsToDelete.length} blocks for file ${fileId}`) } catch (err) { - logger.error(`Error removing file blocks for ${fileId}:`, err) + logger.error(`Error removing file blocks for ${fileId}:`, err as Error) window.modal.error({ content: t('files.delete.db_error'), centered: true }) } } diff --git a/src/renderer/src/services/FileManager.ts b/src/renderer/src/services/FileManager.ts index 75b59f3bc..d7a7acc81 100644 --- a/src/renderer/src/services/FileManager.ts +++ b/src/renderer/src/services/FileManager.ts @@ -115,7 +115,7 @@ class FileManager { try { await window.api.file.delete(id + file.ext) } catch (error) { - logger.error('Failed to delete file:', error) + logger.error('Failed to delete file:', error as Error) } } diff --git a/src/renderer/src/services/HealthCheckService.ts b/src/renderer/src/services/HealthCheckService.ts index b4234b6ae..000a67861 100644 --- a/src/renderer/src/services/HealthCheckService.ts +++ b/src/renderer/src/services/HealthCheckService.ts @@ -85,7 +85,7 @@ export async function checkModelsHealth( } } } catch (error) { - logger.error('[HealthCheckService] Model health check failed:', error) + logger.error('[HealthCheckService] Model health check failed:', error as Error) } return results diff --git a/src/renderer/src/services/ImageStorage.ts b/src/renderer/src/services/ImageStorage.ts index 457970d70..ac31db541 100644 --- a/src/renderer/src/services/ImageStorage.ts +++ b/src/renderer/src/services/ImageStorage.ts @@ -29,7 +29,7 @@ export default class ImageStorage { } } } catch (error) { - logger.error('Error storing the image', error) + logger.error('Error storing the image', error as Error) } } @@ -46,7 +46,7 @@ export default class ImageStorage { await db.settings.delete(id) } } catch (error) { - logger.error('Error removing the image', error) + logger.error('Error removing the image', error as Error) throw error } } diff --git a/src/renderer/src/services/KnowledgeService.ts b/src/renderer/src/services/KnowledgeService.ts index 070a91a64..3e646648a 100644 --- a/src/renderer/src/services/KnowledgeService.ts +++ b/src/renderer/src/services/KnowledgeService.ts @@ -63,7 +63,7 @@ export const getKnowledgeBaseParams = (base: KnowledgeBase): KnowledgeBaseParams } export const getFileFromUrl = async (url: string): Promise => { - logger.debug('getFileFromUrl', url) + logger.debug(`getFileFromUrl: ${url}`) let fileName = '' if (url && url.includes('CherryStudio')) { @@ -75,10 +75,10 @@ export const getFileFromUrl = async (url: string): Promise fileName = url.split('\\Data\\Files\\')[1] } } - logger.debug('fileName', fileName) + logger.debug(`fileName: ${fileName}`) if (fileName) { const actualFileName = fileName.split(/[/\\]/).pop() || fileName - logger.debug('actualFileName', actualFileName) + logger.debug(`actualFileName: ${actualFileName}`) const fileId = actualFileName.split('.')[0] const file = await FileManager.getFile(fileId) if (file) { @@ -162,7 +162,7 @@ export const searchKnowledgeBase = async ( const result = await Promise.all( limitedResults.map(async (item) => { const file = await getFileFromUrl(item.metadata.source) - logger.debug('Knowledge search item:', item, 'File:', file) + logger.debug(`Knowledge search item: ${JSON.stringify(item)} File: ${JSON.stringify(file)}`) return { ...item, file } }) ) @@ -176,7 +176,7 @@ export const searchKnowledgeBase = async ( } return result } catch (error) { - logger.error(`Error searching knowledge base ${base.name}:`, error) + logger.error(`Error searching knowledge base ${base.name}:`, error as Error) if (topicId) { endSpan({ topicId, diff --git a/src/renderer/src/services/LoggerService.ts b/src/renderer/src/services/LoggerService.ts index 849b3feed..b0aa7f4b6 100644 --- a/src/renderer/src/services/LoggerService.ts +++ b/src/renderer/src/services/LoggerService.ts @@ -1,4 +1,5 @@ -import type { LogLevel, LogSourceWithContext } from '@shared/config/logger' +/* eslint-disable no-restricted-syntax */ +import type { LogContextData, LogLevel, LogSourceWithContext } from '@shared/config/logger' import { LEVEL, LEVEL_MAP } from '@shared/config/logger' // check if the current process is a worker @@ -38,7 +39,7 @@ class LoggerService { Object.values(LEVEL).includes(window.electron?.process?.env?.CSLOGGER_RENDERER_LEVEL as LogLevel) ) { this.envLevel = window.electron?.process?.env?.CSLOGGER_RENDERER_LEVEL as LogLevel - // eslint-disable-next-line no-restricted-syntax + console.log( `%c[LoggerService] env CSLOGGER_RENDERER_LEVEL loaded: ${this.envLevel}`, 'color: blue; font-weight: bold' @@ -51,7 +52,7 @@ class LoggerService { .filter((module) => module !== '') if (showModules.length > 0) { this.envShowModules = showModules - // eslint-disable-next-line no-restricted-syntax + console.log( `%c[LoggerService] env CSLOGGER_RENDERER_SHOW_MODULES loaded: ${this.envShowModules.join(' ')}`, 'color: blue; font-weight: bold' @@ -78,7 +79,6 @@ class LoggerService { */ public initWindowSource(window: string): LoggerService { if (this.window) { - // eslint-disable-next-line no-restricted-syntax console.warn( '[LoggerService] window source already initialized, current: %s, want to set: %s', this.window, @@ -114,7 +114,6 @@ class LoggerService { */ private processLog(level: LogLevel, message: string, data: any[]): void { if (!this.window) { - // eslint-disable-next-line no-restricted-syntax console.error('[LoggerService] window source not initialized, please initialize window source first') return } @@ -140,28 +139,22 @@ class LoggerService { switch (level) { case LEVEL.ERROR: - // eslint-disable-next-line no-restricted-syntax - console.error(logMessage, ...data) + console.error('%c', 'color: red; font-weight: bold', logMessage, ...data) break case LEVEL.WARN: - // eslint-disable-next-line no-restricted-syntax - console.warn(logMessage, ...data) + console.warn('%c', 'color: #FFA500; font-weight: bold', logMessage, ...data) break case LEVEL.INFO: - // eslint-disable-next-line no-restricted-syntax - console.info(logMessage, ...data) + console.info('%c', 'color: #32CD32; font-weight: bold', logMessage, ...data) break case LEVEL.VERBOSE: - // eslint-disable-next-line no-restricted-syntax - console.log(logMessage, ...data) + console.debug('%c', 'color: #808080', logMessage, ...data) break case LEVEL.DEBUG: - // eslint-disable-next-line no-restricted-syntax - console.debug(logMessage, ...data) + console.debug('%c', 'color: #7B68EE', logMessage, ...data) break case LEVEL.SILLY: - // eslint-disable-next-line no-restricted-syntax - console.log(logMessage, ...data) + console.debug('%c', 'color: #808080', logMessage, ...data) break } @@ -196,42 +189,42 @@ class LoggerService { /** * Log error message */ - public error(message: string, ...data: any[]): void { + public error(message: string, ...data: LogContextData): void { this.processLog(LEVEL.ERROR, message, data) } /** * Log warning message */ - public warn(message: string, ...data: any[]): void { + public warn(message: string, ...data: LogContextData): void { this.processLog(LEVEL.WARN, message, data) } /** * Log info message */ - public info(message: string, ...data: any[]): void { + public info(message: string, ...data: LogContextData): void { this.processLog(LEVEL.INFO, message, data) } /** * Log verbose message */ - public verbose(message: string, ...data: any[]): void { + public verbose(message: string, ...data: LogContextData): void { this.processLog(LEVEL.VERBOSE, message, data) } /** * Log debug message */ - public debug(message: string, ...data: any[]): void { + public debug(message: string, ...data: LogContextData): void { this.processLog(LEVEL.DEBUG, message, data) } /** * Log silly level message */ - public silly(message: string, ...data: any[]): void { + public silly(message: string, ...data: LogContextData): void { this.processLog(LEVEL.SILLY, message, data) } diff --git a/src/renderer/src/services/MemoryProcessor.ts b/src/renderer/src/services/MemoryProcessor.ts index 20be0d3b4..ef7833494 100644 --- a/src/renderer/src/services/MemoryProcessor.ts +++ b/src/renderer/src/services/MemoryProcessor.ts @@ -61,7 +61,7 @@ export class MemoryProcessor { // Parse response using Zod schema try { - logger.debug('Response content for extraction:', responseContent) + logger.debug(`Response content for extraction: ${responseContent}`) const jsonParsed = jaison(responseContent) // Handle both expected format and potential variations let dataToValidate = jsonParsed @@ -75,11 +75,11 @@ export class MemoryProcessor { const parsed = FactRetrievalSchema.parse(dataToValidate) return parsed.facts } catch (error) { - logger.error('Failed to parse fact extraction response:', error, 'responseContent: ', responseContent) + logger.error(`Failed to parse fact extraction response: responseContent: ${responseContent}`, error as Error) return [] } } catch (error) { - logger.error('Error extracting facts:', error) + logger.error('Error extracting facts:', error as Error) return [] } } @@ -131,13 +131,13 @@ export class MemoryProcessor { } try { - logger.debug('Response content for memory update:', responseContent) + logger.debug(`Response content for memory update: ${responseContent}`) const jsonParsed = jaison(responseContent) // Handle both direct array and wrapped object format const dataToValidate = Array.isArray(jsonParsed) ? jsonParsed : jsonParsed.memory parsed = MemoryUpdateSchema.parse(dataToValidate) } catch (error) { - logger.error('Failed to parse memory update response:', error, 'responseContent: ', responseContent) + logger.error(`Failed to parse memory update response: responseContent: ${responseContent}`, error as Error) return [] } } @@ -152,7 +152,7 @@ export class MemoryProcessor { }) operations.push({ action: 'ADD', memory: memoryOp.text, result }) } catch (error) { - logger.error('Failed to add memory:', error) + logger.error('Failed to add memory:', error as Error) } break @@ -174,7 +174,7 @@ export class MemoryProcessor { }) } } catch (error) { - logger.error('Failed to update memory:', error) + logger.error('Failed to update memory:', error as Error) } break @@ -183,7 +183,7 @@ export class MemoryProcessor { await this.memoryService.delete(memoryOp.id) operations.push({ action: 'DELETE', id: memoryOp.id, memory: memoryOp.text }) } catch (error) { - logger.error('Failed to delete memory:', error) + logger.error('Failed to delete memory:', error as Error) } break @@ -216,7 +216,7 @@ export class MemoryProcessor { return { facts, operations } } catch (error) { - logger.error('Error processing conversation:', error) + logger.error('Error processing conversation:', error as Error) return { facts: [], operations: [] } } } @@ -239,18 +239,11 @@ export class MemoryProcessor { }) logger.debug( - 'Searching memories with query:', - query, - 'for user:', - userId, - 'and assistant:', - assistantId, - 'result: ', - result + `Searching memories with query: ${query} for user: ${userId} and assistant: ${assistantId} result: ${result}` ) return result.results } catch (error) { - logger.error('Error searching memories:', error) + logger.error('Error searching memories:', error as Error) return [] } } diff --git a/src/renderer/src/services/MemoryService.ts b/src/renderer/src/services/MemoryService.ts index 563992144..4307060aa 100644 --- a/src/renderer/src/services/MemoryService.ts +++ b/src/renderer/src/services/MemoryService.ts @@ -84,7 +84,7 @@ class MemoryService { // Handle error responses from main process if (result.error) { - logger.error('Memory service error:', result.error) + logger.error(`Memory service error: ${result.error}`) throw new Error(result.error) } @@ -94,7 +94,7 @@ class MemoryService { relations: [] } } catch (error) { - logger.error('Failed to list memories:', error) + logger.error('Failed to list memories:', error as Error) // Return empty result on error to prevent UI crashes return { results: [], @@ -214,7 +214,7 @@ class MemoryService { return window.api.memory.setConfig(configWithProviders) } catch (error) { - logger.warn('Failed to update memory config:', error) + logger.warn('Failed to update memory config:', error as Error) return } } diff --git a/src/renderer/src/services/MessagesService.ts b/src/renderer/src/services/MessagesService.ts index b60dde49c..c73f22b5d 100644 --- a/src/renderer/src/services/MessagesService.ts +++ b/src/renderer/src/services/MessagesService.ts @@ -235,7 +235,7 @@ export async function getMessageTitle(message: Message, length = 30): Promise { - logger.error('Failed to cleanup worker tokenizer:', error) + logger.error('Failed to cleanup worker tokenizer:', error as Error) }) } @@ -525,7 +525,7 @@ class ShikiStreamService { dispose() { if (this.worker) { this.sendWorkerMessage({ type: 'dispose' }).catch((error) => { - logger.warn('Failed to dispose worker:', error) + logger.warn('Failed to dispose worker:', error as Error) }) this.worker.terminate() this.worker = null diff --git a/src/renderer/src/services/StoreSyncService.ts b/src/renderer/src/services/StoreSyncService.ts index cd207aed1..30def3a97 100644 --- a/src/renderer/src/services/StoreSyncService.ts +++ b/src/renderer/src/services/StoreSyncService.ts @@ -105,7 +105,7 @@ export class StoreSyncService { window.store.dispatch(action) } } catch (error) { - logger.error('Error dispatching synced action:', error) + logger.error('Error dispatching synced action:', error as Error) } } ) diff --git a/src/renderer/src/services/StreamProcessingService.ts b/src/renderer/src/services/StreamProcessingService.ts index adbea1dfb..3288a67c7 100644 --- a/src/renderer/src/services/StreamProcessingService.ts +++ b/src/renderer/src/services/StreamProcessingService.ts @@ -142,7 +142,7 @@ export function createStreamProcessor(callbacks: StreamProcessorCallbacks = {}) } } } catch (error) { - logger.error('Error processing stream chunk:', error) + logger.error('Error processing stream chunk:', error as Error) callbacks.onError?.(error) } } diff --git a/src/renderer/src/services/WebSearchService.ts b/src/renderer/src/services/WebSearchService.ts index e09aacad0..062d4e4ee 100644 --- a/src/renderer/src/services/WebSearchService.ts +++ b/src/renderer/src/services/WebSearchService.ts @@ -538,7 +538,7 @@ class WebSearchService { 1000 ) } catch (error) { - logger.warn('RAG compression failed, will return empty results:', error) + logger.warn('RAG compression failed, will return empty results:', error as Error) window.message.error({ key: 'websearch-rag-failed', duration: 10, diff --git a/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts b/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts index 82a70a315..56d068083 100644 --- a/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts +++ b/src/renderer/src/services/messageStreaming/callbacks/citationCallbacks.ts @@ -24,7 +24,7 @@ export const createCitationCallbacks = (deps: CitationCallbacksDependencies) => onExternalToolInProgress: async () => { // 避免创建重复的引用块 if (citationBlockId) { - logger.warn('[onExternalToolInProgress] Citation block already exists:', citationBlockId) + logger.warn(`[onExternalToolInProgress] Citation block already exists: ${citationBlockId}`) return } const citationBlock = createCitationBlock(assistantMsgId, {}, { status: MessageBlockStatus.PROCESSING }) @@ -48,14 +48,14 @@ export const createCitationCallbacks = (deps: CitationCallbacksDependencies) => onLLMWebSearchInProgress: async () => { // 避免创建重复的引用块 if (citationBlockId) { - logger.warn('[onLLMWebSearchInProgress] Citation block already exists:', citationBlockId) + logger.warn(`[onLLMWebSearchInProgress] Citation block already exists: ${citationBlockId}`) return } if (blockManager.hasInitialPlaceholder) { // blockManager.lastBlockType = MessageBlockType.CITATION - logger.debug('blockManager.initialPlaceholderBlockId', blockManager.initialPlaceholderBlockId) + logger.debug(`blockManager.initialPlaceholderBlockId: ${blockManager.initialPlaceholderBlockId}`) citationBlockId = blockManager.initialPlaceholderBlockId! - logger.debug('citationBlockId', citationBlockId) + logger.debug(`citationBlockId: ${citationBlockId}`) const changes = { type: MessageBlockType.CITATION, diff --git a/src/renderer/src/store/migrate.ts b/src/renderer/src/store/migrate.ts index a2b5d3d83..8deeec32f 100644 --- a/src/renderer/src/store/migrate.ts +++ b/src/renderer/src/store/migrate.ts @@ -1156,7 +1156,7 @@ const migrateConfig = { state.settings.trayOnClose = true return state } catch (error) { - logger.error('migrate 83 error', error) + logger.error('migrate 83 error', error as Error) return state } }, @@ -1165,7 +1165,7 @@ const migrateConfig = { addProvider(state, 'voyageai') return state } catch (error) { - logger.error('migrate 84 error', error) + logger.error('migrate 84 error', error as Error) return state } }, @@ -1386,7 +1386,7 @@ const migrateConfig = { }) return state } catch (error) { - logger.error('migrate 100 error', error) + logger.error('migrate 100 error', error as Error) return state } }, @@ -1414,7 +1414,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 101 error', error) + logger.error('migrate 101 error', error as Error) return state } }, @@ -1449,7 +1449,7 @@ const migrateConfig = { delete state.settings.codeCacheThreshold return state } catch (error) { - logger.error('migrate 102 error', error) + logger.error('migrate 102 error', error as Error) return state } }, @@ -1478,7 +1478,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 103 error', error) + logger.error('migrate 103 error', error as Error) return state } }, @@ -1488,7 +1488,7 @@ const migrateConfig = { state.llm.providers = moveProvider(state.llm.providers, 'burncloud', 10) return state } catch (error) { - logger.error('migrate 104 error', error) + logger.error('migrate 104 error', error as Error) return state } }, @@ -1504,7 +1504,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 105 error', error) + logger.error('migrate 105 error', error as Error) return state } }, @@ -1514,7 +1514,7 @@ const migrateConfig = { state.llm.providers = moveProvider(state.llm.providers, 'tokenflux', 15) return state } catch (error) { - logger.error('migrate 106 error', error) + logger.error('migrate 106 error', error as Error) return state } }, @@ -1525,7 +1525,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 107 error', error) + logger.error('migrate 107 error', error as Error) return state } }, @@ -1535,7 +1535,7 @@ const migrateConfig = { state.inputTools.isCollapsed = false return state } catch (error) { - logger.error('migrate 108 error', error) + logger.error('migrate 108 error', error as Error) return state } }, @@ -1544,7 +1544,7 @@ const migrateConfig = { state.settings.userTheme = settingsInitialState.userTheme return state } catch (error) { - logger.error('migrate 109 error', error) + logger.error('migrate 109 error', error as Error) return state } }, @@ -1557,7 +1557,7 @@ const migrateConfig = { state.settings.testPlan = false return state } catch (error) { - logger.error('migrate 110 error', error) + logger.error('migrate 110 error', error as Error) return state } }, @@ -1576,7 +1576,7 @@ const migrateConfig = { return state } catch (error) { - logger.error('migrate 111 error', error) + logger.error('migrate 111 error', error as Error) return state } }, @@ -1590,7 +1590,7 @@ const migrateConfig = { state.llm.providers = moveProvider(state.llm.providers, 'lanyun', 15) return state } catch (error) { - logger.error('migrate 112 error', error) + logger.error('migrate 112 error', error as Error) return state } }, @@ -1608,7 +1608,7 @@ const migrateConfig = { }) return state } catch (error) { - logger.error('migrate 113 error', error) + logger.error('migrate 113 error', error as Error) return state } }, @@ -1625,7 +1625,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 114 error', error) + logger.error('migrate 114 error', error as Error) return state } }, @@ -1646,7 +1646,7 @@ const migrateConfig = { }) return state } catch (error) { - logger.error('migrate 115 error', error) + logger.error('migrate 115 error', error as Error) return state } }, @@ -1675,7 +1675,7 @@ const migrateConfig = { return state } catch (error) { - logger.error('migrate 116 error', error) + logger.error('migrate 116 error', error as Error) return state } }, @@ -1713,7 +1713,7 @@ const migrateConfig = { }) return state } catch (error) { - logger.error('migrate 117 error', error) + logger.error('migrate 117 error', error as Error) return state } }, @@ -1734,7 +1734,7 @@ const migrateConfig = { return state } catch (error) { - logger.error('migrate 118 error', error) + logger.error('migrate 118 error', error as Error) return state } }, @@ -1752,7 +1752,7 @@ const migrateConfig = { } return state } catch (error) { - logger.error('migrate 119 error', error) + logger.error('migrate 119 error', error as Error) return state } }, @@ -1800,7 +1800,7 @@ const migrateConfig = { state.settings.localBackupSyncInterval = 0 return state } catch (error) { - logger.error('migrate 120 error', error) + logger.error('migrate 120 error', error as Error) return state } }, @@ -1832,7 +1832,7 @@ const migrateConfig = { return state } catch (error) { - logger.error('migrate 121 error', error) + logger.error('migrate 121 error', error as Error) return state } } diff --git a/src/renderer/src/store/thunk/messageThunk.ts b/src/renderer/src/store/thunk/messageThunk.ts index 989f0bbe1..415523a6e 100644 --- a/src/renderer/src/store/thunk/messageThunk.ts +++ b/src/renderer/src/store/thunk/messageThunk.ts @@ -59,7 +59,7 @@ export const saveMessageAndBlocksToDB = async (message: Message, blocks: Message logger.error(`[saveMessageAndBlocksToDB] Topic ${message.topicId} not found.`) } } catch (error) { - logger.error(`[saveMessageAndBlocksToDB] Failed to save message ${message.id}:`, error) + logger.error(`[saveMessageAndBlocksToDB] Failed to save message ${message.id}:`, error as Error) } } @@ -99,7 +99,7 @@ const updateExistingMessageAndBlocksInDB = async ( } }) } catch (error) { - logger.error(`[updateExistingMsg] Failed to update message ${updatedMessage.id}:`, error) + logger.error(`[updateExistingMsg] Failed to update message ${updatedMessage.id}:`, error as Error) } } @@ -217,7 +217,7 @@ const saveUpdatesToDB = async ( } await updateExistingMessageAndBlocksInDB(messageDataToSave, blocksToUpdate) } catch (error) { - logger.error(`[DB Save Updates] Failed for message ${messageId}:`, error) + logger.error(`[DB Save Updates] Failed for message ${messageId}:`, error as Error) } } @@ -954,7 +954,7 @@ export const sendMessage = }) } } catch (error) { - logger.error('Error in sendMessage thunk:', error) + logger.error('Error in sendMessage thunk:', error as Error) } finally { handleChangeLoadingOfTopic(topicId) } @@ -1029,7 +1029,7 @@ export const deleteSingleMessageThunk = dispatch(updateTopicUpdatedAt({ topicId })) } } catch (error) { - logger.error(`[deleteSingleMessage] Failed to delete message ${messageId}:`, error) + logger.error(`[deleteSingleMessage] Failed to delete message ${messageId}:`, error as Error) } } @@ -1073,7 +1073,7 @@ export const deleteMessageGroupThunk = dispatch(updateTopicUpdatedAt({ topicId })) } } catch (error) { - logger.error(`[deleteMessageGroup] Failed to delete messages with askId ${askId}:`, error) + logger.error(`[deleteMessageGroup] Failed to delete messages with askId ${askId}:`, error as Error) } } @@ -1103,7 +1103,7 @@ export const clearTopicMessagesThunk = await db.message_blocks.bulkDelete(blockIdsToDelete) } } catch (error) { - logger.error(`[clearTopicMessagesThunk] Failed to clear messages for topic ${topicId}:`, error) + logger.error(`[clearTopicMessagesThunk] Failed to clear messages for topic ${topicId}:`, error as Error) } } @@ -1131,7 +1131,7 @@ export const resendMessageThunk = window.keyv.remove(`web-search-${userMessageToResend.id}`) window.keyv.remove(`knowledge-search-${userMessageToResend.id}`) } catch (error) { - logger.warn(`Failed to clear keyv cache for message ${userMessageToResend.id}:`, error) + logger.warn(`Failed to clear keyv cache for message ${userMessageToResend.id}:`, error as Error) } const resetDataList: Message[] = [] @@ -1197,7 +1197,7 @@ export const resendMessageThunk = const finalMessagesToSave = selectMessagesForTopic(getState(), topicId) await db.topics.update(topicId, { messages: finalMessagesToSave }) } catch (dbError) { - logger.error('[resendMessageThunk] Error updating database:', dbError) + logger.error('[resendMessageThunk] Error updating database:', dbError as Error) } const queue = getTopicQueue(topicId) @@ -1211,7 +1211,7 @@ export const resendMessageThunk = }) } } catch (error) { - logger.error(`[resendMessageThunk] Error resending user message ${userMessageToResend.id}:`, error) + logger.error(`[resendMessageThunk] Error resending user message ${userMessageToResend.id}:`, error as Error) } finally { handleChangeLoadingOfTopic(topicId) } @@ -1343,7 +1343,7 @@ export const regenerateAssistantResponseThunk = } catch (error) { logger.error( `[regenerateAssistantResponseThunk] Error regenerating response for assistant message ${assistantMessageToRegenerate.id}:`, - error + error as Error ) // dispatch(newMessagesActions.setTopicLoading({ topicId, loading: false })) } finally { @@ -1404,7 +1404,7 @@ export const initiateTranslationThunk = }) return newBlock.id // Return the ID } catch (error) { - logger.error(`[initiateTranslationThunk] Failed for message ${messageId}:`, error) + logger.error(`[initiateTranslationThunk] Failed for message ${messageId}:`, error as Error) return undefined // Optional: Dispatch an error action or show notification } @@ -1429,7 +1429,7 @@ export const updateTranslationBlockThunk = await db.message_blocks.update(blockId, changes) // Logger.log(`[updateTranslationBlockThunk] Successfully updated translation block ${blockId}.`) } catch (error) { - logger.error(`[updateTranslationBlockThunk] Failed to update translation block ${blockId}:`, error) + logger.error(`[updateTranslationBlockThunk] Failed to update translation block ${blockId}:`, error as Error) } } @@ -1520,7 +1520,7 @@ export const appendAssistantResponseThunk = ) }) } catch (error) { - logger.error(`[appendAssistantResponseThunk] Error appending assistant response:`, error) + logger.error(`[appendAssistantResponseThunk] Error appending assistant response:`, error as Error) // Optionally dispatch an error action or notification // Resetting loading state should be handled by the underlying fetchAndProcessAssistantResponseImpl } finally { @@ -1667,7 +1667,7 @@ export const cloneMessagesToNewTopicThunk = return true // Indicate success } catch (error) { - logger.error(`[cloneMessagesToNewTopicThunk] Failed to clone messages:`, error) + logger.error(`[cloneMessagesToNewTopicThunk] Failed to clone messages:`, error as Error) return false // Indicate failure } } @@ -1739,7 +1739,7 @@ export const updateMessageAndBlocksThunk = dispatch(updateTopicUpdatedAt({ topicId })) } catch (error) { - logger.error(`[updateMessageAndBlocksThunk] Failed to process updates for message ${messageId}:`, error) + logger.error(`[updateMessageAndBlocksThunk] Failed to process updates for message ${messageId}:`, error as Error) } } @@ -1784,7 +1784,7 @@ export const removeBlocksThunk = return } catch (error) { - logger.error(`[removeBlocksFromMessageThunk] Failed to remove blocks from message ${messageId}:`, error) + logger.error(`[removeBlocksFromMessageThunk] Failed to remove blocks from message ${messageId}:`, error as Error) throw error } } diff --git a/src/renderer/src/trace/pages/SpanDetail.tsx b/src/renderer/src/trace/pages/SpanDetail.tsx index 336f30504..c74871dd6 100644 --- a/src/renderer/src/trace/pages/SpanDetail.tsx +++ b/src/renderer/src/trace/pages/SpanDetail.tsx @@ -44,7 +44,7 @@ const SpanDetail: FC = ({ node, clickShowModal }) => { setIsJson(true) return } catch { - logger.error('failed to parse json data:', data) + logger.error(`failed to parse json data: ${data}`) } } else if (typeof data === 'object' || Array.isArray(data)) { setJsonData(data) diff --git a/src/renderer/src/utils/blacklistMatchPattern.ts b/src/renderer/src/utils/blacklistMatchPattern.ts index ea2acc384..9e78ab58f 100644 --- a/src/renderer/src/utils/blacklistMatchPattern.ts +++ b/src/renderer/src/utils/blacklistMatchPattern.ts @@ -198,7 +198,7 @@ export async function parseSubscribeContent(url: string): Promise { .map((line) => line.trim()) .filter((pattern) => parseMatchPattern(pattern) !== null) } catch (error) { - logger.error('Error parsing subscribe content:', error) + logger.error('Error parsing subscribe content:', error as Error) throw error } } @@ -240,14 +240,14 @@ export async function filterResultWithBlacklist( const regexPattern = pattern.slice(1, -1) regexPatterns.push(new RegExp(regexPattern, 'i')) } catch (error) { - logger.error('Invalid regex pattern:', pattern, error) + logger.error(`Invalid regex pattern: ${pattern}`, error as Error) } } else { // 处理匹配模式格式 try { patternMap.set(pattern, pattern) } catch (error) { - logger.error('Invalid match pattern:', pattern, error) + logger.error(`Invalid match pattern: ${pattern}`, error as Error) } } }) @@ -267,7 +267,7 @@ export async function filterResultWithBlacklist( const matchesPattern = patternMap.get(result.url).length > 0 return !matchesPattern } catch (error) { - logger.error('Error processing URL: ' + result.url, error) + logger.error(`Error processing URL: ${result.url}`, error as Error) return true // 如果URL解析失败,保留该结果 } }) diff --git a/src/renderer/src/utils/export.ts b/src/renderer/src/utils/export.ts index 204ea8cdf..d498e86de 100644 --- a/src/renderer/src/utils/export.ts +++ b/src/renderer/src/utils/export.ts @@ -543,7 +543,7 @@ export const exportMarkdownToObsidian = async (attributes: any) => { window.open(obsidianUrl) window.message.success(i18n.t('chat.topics.export.obsidian_export_success')) } catch (error) { - logger.error('导出到Obsidian失败:', error) + logger.error('导出到Obsidian失败:', error as Error) window.message.error(i18n.t('chat.topics.export.obsidian_export_failed')) } } @@ -699,7 +699,7 @@ export const exportMarkdownToSiyuan = async (title: string, content: string) => key: 'siyuan-success' }) } catch (error) { - logger.error('导出到思源笔记失败:', error) + logger.error('导出到思源笔记失败:', error as Error) window.message.error({ content: i18n.t('message.error.siyuan.export') + (error instanceof Error ? `: ${error.message}` : ''), key: 'siyuan-error' diff --git a/src/renderer/src/utils/fetch.ts b/src/renderer/src/utils/fetch.ts index 66b96869a..3b8c1d9e1 100644 --- a/src/renderer/src/utils/fetch.ts +++ b/src/renderer/src/utils/fetch.ts @@ -121,7 +121,7 @@ export async function fetchWebContent( throw e } - logger.error(`Failed to fetch ${url}`, e) + logger.error(`Failed to fetch ${url}`, e as Error) return { title: url, url: url, @@ -142,7 +142,7 @@ export async function fetchRedirectUrl(url: string) { }) return response.url } catch (e) { - logger.error(`Failed to fetch redirect url: ${e}`) + logger.error('Failed to fetch redirect url', e as Error) return url } } diff --git a/src/renderer/src/utils/image.ts b/src/renderer/src/utils/image.ts index 43d784a5f..0a5889a1c 100644 --- a/src/renderer/src/utils/image.ts +++ b/src/renderer/src/utils/image.ts @@ -44,7 +44,7 @@ export async function captureDiv(divRef: React.RefObject) { const imageData = canvas.toDataURL('image/png') return imageData } catch (error) { - logger.error('Error capturing div:', error) + logger.error('Error capturing div:', error as Error) return Promise.reject() } } @@ -138,7 +138,7 @@ export const captureScrollableDiv = async (divRef: React.RefObject): } return null } catch (error) { - logger.error('getFilesFromDropEvent - getPathForFile error:', error) + logger.error('getFilesFromDropEvent - getPathForFile error:', error as Error) return null } }) diff --git a/src/renderer/src/utils/mcp-tools.ts b/src/renderer/src/utils/mcp-tools.ts index 095aacaeb..ae081e325 100644 --- a/src/renderer/src/utils/mcp-tools.ts +++ b/src/renderer/src/utils/mcp-tools.ts @@ -309,7 +309,7 @@ export async function callMCPTool( logger.info(`Tool called: ${toolResponse.tool.serverName} ${toolResponse.tool.name}`, resp) return resp } catch (e) { - logger.error(`Error calling Tool: ${toolResponse.tool.serverName} ${toolResponse.tool.name}`, e) + logger.error(`Error calling Tool: ${toolResponse.tool.serverName} ${toolResponse.tool.name}`, e as Error) return Promise.resolve({ isError: true, content: [ diff --git a/src/renderer/src/utils/messageUtils/create.ts b/src/renderer/src/utils/messageUtils/create.ts index f3af4c858..e0081c8c6 100644 --- a/src/renderer/src/utils/messageUtils/create.ts +++ b/src/renderer/src/utils/messageUtils/create.ts @@ -103,7 +103,7 @@ export function createImageBlock( overrides: Partial> = {} ): ImageMessageBlock { if (overrides.file && overrides.file.type !== FileTypes.IMAGE) { - logger.warn('Attempted to create ImageBlock with non-image file type:', overrides.file.type) + logger.warn(`Attempted to create ImageBlock with non-image file type: ${overrides.file.type}`) } const { file, url, metadata, ...baseOverrides } = overrides const baseBlock = createBaseMessageBlock(messageId, MessageBlockType.IMAGE, baseOverrides) diff --git a/src/renderer/src/utils/oauth.ts b/src/renderer/src/utils/oauth.ts index 1da6a29bb..f48245c8b 100644 --- a/src/renderer/src/utils/oauth.ts +++ b/src/renderer/src/utils/oauth.ts @@ -50,7 +50,7 @@ export const oauthWithAihubmix = async (setKey) => { window.removeEventListener('message', messageHandler) } } catch (error) { - logger.error('[oauthWithAihubmix] error', error) + logger.error('[oauthWithAihubmix] error', error as Error) popup?.close() window.message.error(i18n.t('oauth.error')) } @@ -113,7 +113,7 @@ export const oauthWithPPIO = async (setKey) => { if (!tokenResponse.ok) { const errorText = await tokenResponse.text() - logger.error('[PPIO OAuth] Token exchange failed:', tokenResponse.status, errorText) + logger.error(`[PPIO OAuth] Token exchange failed: ${tokenResponse.status} ${errorText}`) throw new Error(`Failed to exchange code for token: ${tokenResponse.status} ${errorText}`) } @@ -127,7 +127,7 @@ export const oauthWithPPIO = async (setKey) => { reject(new Error('No access token received')) } } catch (error) { - logger.error('[PPIO OAuth] Error processing callback:', error) + logger.error('[PPIO OAuth] Error processing callback:', error as Error) reject(error) } finally { removeListener() diff --git a/src/renderer/src/utils/prompt.ts b/src/renderer/src/utils/prompt.ts index cf3738f50..a566f2a30 100644 --- a/src/renderer/src/utils/prompt.ts +++ b/src/renderer/src/utils/prompt.ts @@ -178,7 +178,7 @@ export const buildSystemPrompt = async ( const systemType = await window.api.system.getDeviceType() userSystemPrompt = userSystemPrompt.replace(/{{system}}/g, systemType) } catch (error) { - logger.error('Failed to get system type:', error) + logger.error('Failed to get system type:', error as Error) userSystemPrompt = userSystemPrompt.replace(/{{system}}/g, 'Unknown System') } } @@ -188,7 +188,7 @@ export const buildSystemPrompt = async ( const language = store.getState().settings.language userSystemPrompt = userSystemPrompt.replace(/{{language}}/g, language) } catch (error) { - logger.error('Failed to get language:', error) + logger.error('Failed to get language:', error as Error) userSystemPrompt = userSystemPrompt.replace(/{{language}}/g, 'Unknown System Language') } } @@ -198,7 +198,7 @@ export const buildSystemPrompt = async ( const appInfo = await window.api.getAppInfo() userSystemPrompt = userSystemPrompt.replace(/{{arch}}/g, appInfo.arch) } catch (error) { - logger.error('Failed to get architecture:', error) + logger.error('Failed to get architecture:', error as Error) userSystemPrompt = userSystemPrompt.replace(/{{arch}}/g, 'Unknown Architecture') } } @@ -207,7 +207,7 @@ export const buildSystemPrompt = async ( try { userSystemPrompt = userSystemPrompt.replace(/{{model_name}}/g, assistant?.model?.name || 'Unknown Model') } catch (error) { - logger.error('Failed to get model name:', error) + logger.error('Failed to get model name:', error as Error) userSystemPrompt = userSystemPrompt.replace(/{{model_name}}/g, 'Unknown Model') } } @@ -217,7 +217,7 @@ export const buildSystemPrompt = async ( const username = store.getState().settings.userName || 'Unknown Username' userSystemPrompt = userSystemPrompt.replace(/{{username}}/g, username) } catch (error) { - logger.error('Failed to get username:', error) + logger.error('Failed to get username:', error as Error) userSystemPrompt = userSystemPrompt.replace(/{{username}}/g, 'Unknown Username') } } diff --git a/src/renderer/src/utils/shiki.ts b/src/renderer/src/utils/shiki.ts index 5334a4446..a9a6f9507 100644 --- a/src/renderer/src/utils/shiki.ts +++ b/src/renderer/src/utils/shiki.ts @@ -90,7 +90,7 @@ export async function loadThemeIfNeeded(highlighter: HighlighterGeneric { } } catch (error) { // Silently handle clipboard read errors (common in some environments) - logger.warn('Failed to read clipboard:', error) + logger.warn('Failed to read clipboard:', error as Error) } }, [readClipboardAtStartup]) @@ -397,7 +397,7 @@ const HomeWindow: FC = () => { } catch (err) { if (isAbortError(err)) return handleError(err instanceof Error ? err : new Error('An error occurred')) - logger.error('Error fetching result:', err) + logger.error('Error fetching result:', err as Error) } finally { setIsLoading(false) setIsOutputted(true) diff --git a/src/renderer/src/windows/mini/translate/TranslateWindow.tsx b/src/renderer/src/windows/mini/translate/TranslateWindow.tsx index 56ef9312d..908d1c44b 100644 --- a/src/renderer/src/windows/mini/translate/TranslateWindow.tsx +++ b/src/renderer/src/windows/mini/translate/TranslateWindow.tsx @@ -58,7 +58,7 @@ const Translate: FC = ({ text }) => { translatingRef.current = false } catch (error) { - logger.error('Error fetching result:', error) + logger.error('Error fetching result:', error as Error) } finally { translatingRef.current = false } diff --git a/src/renderer/src/windows/selection/action/components/ActionUtils.ts b/src/renderer/src/windows/selection/action/components/ActionUtils.ts index 97e57a326..8802b6b78 100644 --- a/src/renderer/src/windows/selection/action/components/ActionUtils.ts +++ b/src/renderer/src/windows/selection/action/components/ActionUtils.ts @@ -218,6 +218,6 @@ export const processMessages = async ( } catch (err) { if (isAbortError(err)) return onError(err instanceof Error ? err : new Error('An error occurred')) - logger.error('Error fetching result:', err) + logger.error('Error fetching result:', err as Error) } } diff --git a/src/renderer/src/workers/shiki-stream.worker.ts b/src/renderer/src/workers/shiki-stream.worker.ts index 753246e45..bcc9c8964 100644 --- a/src/renderer/src/workers/shiki-stream.worker.ts +++ b/src/renderer/src/workers/shiki-stream.worker.ts @@ -96,7 +96,7 @@ async function ensureLanguageAndThemeLoaded( await highlighter.loadTheme(themeData) } catch (error) { // 回退到 one-light - logger.debug(`Worker: Failed to load theme '${theme}', falling back to 'one-light':`, error) + logger.debug(`Worker: Failed to load theme '${theme}', falling back to 'one-light':`, error as Error) const { bundledThemes } = await import('shiki') const oneLightTheme = await bundledThemes['one-light']() await highlighter.loadTheme(oneLightTheme) @@ -157,7 +157,7 @@ async function highlightCodeChunk( recall: result.recall } } catch (error) { - logger.error('Worker failed to highlight code chunk:', error) + logger.error('Worker failed to highlight code chunk:', error as Error) // 提供简单的 fallback const fallbackToken: ThemedToken = { content: chunk || '', color: '#000000', offset: 0 }