From c2086fdb1521a2008a5f56a7c62a97249dc8041c Mon Sep 17 00:00:00 2001
From: fullex <106392080+0xfullex@users.noreply.github.com>
Date: Wed, 23 Jul 2025 13:24:03 +0800
Subject: [PATCH] refactor[Logger]: strict type check for Logger (#8363)
* fix: strict type check of logger
* feat: logger format in renderer
* fix: error type
---
docs/technical/how-to-use-logger-en.md | 23 +++++----
docs/technical/how-to-use-logger-zh.md | 22 +++++----
packages/shared/config/logger.ts | 4 ++
src/main/index.ts | 6 +--
src/main/ipc.ts | 8 ++--
src/main/knowledge/loader/epubLoader.ts | 6 +--
src/main/knowledge/loader/index.ts | 5 +-
src/main/knowledge/loader/odLoader.ts | 2 +-
src/main/knowledge/ocr/MacSysOcrProvider.ts | 4 +-
.../preprocess/MineruPreprocessProvider.ts | 2 +-
.../preprocess/MistralPreprocessProvider.ts | 2 +-
src/main/mcpServers/dify-knowledge.ts | 4 +-
src/main/mcpServers/memory.ts | 12 ++---
src/main/mcpServers/python.ts | 2 +-
src/main/services/AppService.ts | 2 +-
src/main/services/AppUpdater.ts | 13 +++--
src/main/services/BackupManager.ts | 26 +++++-----
src/main/services/CopilotService.ts | 12 ++---
src/main/services/DxtService.ts | 24 +++++-----
src/main/services/ExportService.ts | 2 +-
src/main/services/FileStorage.ts | 44 ++++++++---------
src/main/services/KnowledgeService.ts | 12 ++---
src/main/services/LoggerService.ts | 29 +++++------
src/main/services/MCPService.ts | 16 +++----
src/main/services/NutstoreService.ts | 2 +-
src/main/services/ObsidianVaultService.ts | 20 ++++----
src/main/services/ProtocolClient.ts | 4 +-
src/main/services/ProxyManager.ts | 6 +--
src/main/services/ReduxService.ts | 10 ++--
src/main/services/S3Storage.ts | 12 ++---
src/main/services/SelectionService.ts | 20 ++++----
src/main/services/SpanCacheService.ts | 8 ++--
src/main/services/WebDav.ts | 14 +++---
src/main/services/mcp/oauth/callback.ts | 4 +-
src/main/services/mcp/oauth/storage.ts | 6 +--
src/main/services/mcp/shell-env.ts | 2 +-
src/main/services/memory/MemoryService.ts | 34 ++++++-------
src/main/services/remotefile/GeminiService.ts | 8 ++--
.../services/remotefile/MistralService.ts | 8 ++--
.../services/urlschema/handle-providers.ts | 2 +-
src/main/services/urlschema/mcp-install.ts | 4 +-
src/main/utils/zip.ts | 4 +-
src/preload/index.ts | 2 +-
.../src/aiCore/clients/NewAPIClient.ts | 2 +-
.../clients/anthropic/AnthropicAPIClient.ts | 2 +-
.../aiCore/clients/gemini/GeminiAPIClient.ts | 2 +-
.../aiCore/clients/openai/OpenAIBaseClient.ts | 2 +-
.../src/aiCore/clients/ppio/PPIOAPIClient.ts | 2 +-
src/renderer/src/aiCore/index.ts | 2 +-
.../common/FinalChunkConsumerMiddleware.ts | 4 +-
.../middleware/common/LoggingMiddleware.ts | 4 +-
.../middleware/core/McpToolChunkMiddleware.ts | 14 +++---
.../core/ResponseTransformMiddleware.ts | 2 +-
.../TransformCoreToSdkParamsMiddleware.ts | 2 +-
.../feat/ToolUseExtractionMiddleware.ts | 2 +-
.../src/components/CodeEditor/hooks.ts | 8 ++--
.../CodeToolbar/usePreviewTools.tsx | 4 +-
src/renderer/src/components/ImageViewer.tsx | 2 +-
.../src/components/LocalBackupModals.tsx | 2 +-
.../MinApp/MinappPopupContainer.tsx | 2 +-
.../components/ModelList/EditModelsPopup.tsx | 2 +-
.../src/components/NutstorePathSelector.tsx | 2 +-
.../src/components/ObsidianExportDialog.tsx | 4 +-
.../components/Popups/ApiKeyListPopup/hook.ts | 2 +-
.../src/components/Popups/BackupPopup.tsx | 2 +-
.../Popups/SaveToKnowledgePopup.tsx | 2 +-
.../src/components/Popups/TextEditPopup.tsx | 2 +-
.../src/components/TranslateButton.tsx | 2 +-
src/renderer/src/config/minapps.ts | 2 +-
src/renderer/src/databases/upgrades.ts | 2 +-
src/renderer/src/hooks/useChatContext.ts | 2 +-
.../src/hooks/useMessageOperations.ts | 8 ++--
src/renderer/src/hooks/useNutstoreSSO.ts | 2 +-
src/renderer/src/hooks/usePinnedModels.ts | 2 +-
.../pages/agents/components/AddAgentPopup.tsx | 2 +-
src/renderer/src/pages/agents/index.ts | 4 +-
src/renderer/src/pages/apps/App.tsx | 2 +-
src/renderer/src/pages/apps/NewAppButton.tsx | 4 +-
src/renderer/src/pages/home/Chat.tsx | 2 +-
.../src/pages/home/Inputbar/Inputbar.tsx | 4 +-
.../src/pages/home/Messages/Message.tsx | 4 +-
.../src/pages/home/Messages/MessageImage.tsx | 4 +-
.../src/pages/home/Messages/MessageTools.tsx | 6 +--
.../src/pages/home/Messages/Messages.tsx | 5 +-
.../components/AddKnowledgePopup.tsx | 4 +-
.../components/KnowledgeSearchPopup.tsx | 4 +-
.../components/KnowledgeSettings.tsx | 2 +-
.../pages/knowledge/components/QuotaTag.tsx | 2 +-
.../pages/knowledge/components/StatusIcon.tsx | 2 +-
.../knowledge/items/KnowledgeSitemaps.tsx | 2 +-
src/renderer/src/pages/memory/index.tsx | 25 +++++-----
.../src/pages/memory/settings-modal.tsx | 4 +-
.../src/pages/paintings/AihubmixPage.tsx | 4 +-
.../src/pages/paintings/NewApiPage.tsx | 4 +-
.../pages/paintings/PaintingsRoutePage.tsx | 2 +-
.../src/pages/paintings/SiliconPage.tsx | 4 +-
.../src/pages/paintings/TokenFluxPage.tsx | 2 +-
.../components/DynamicFormRender.tsx | 2 +-
.../pages/paintings/utils/TokenFluxService.ts | 4 +-
.../AssistantMemorySettings.tsx | 2 +-
.../DataSettings/LocalBackupSettings.tsx | 2 +-
.../DataSettings/ObsidianSettings.tsx | 2 +-
.../settings/DataSettings/SiyuanSettings.tsx | 2 +-
.../MCPSettings/AddMcpServerModal.tsx | 2 +-
.../settings/MCPSettings/EditMcpJsonPopup.tsx | 2 +-
.../MCPSettings/modelscopeSyncUtils.ts | 4 +-
.../settings/MCPSettings/providers/302ai.ts | 4 +-
.../settings/MCPSettings/providers/lanyun.ts | 4 +-
.../MCPSettings/providers/tokenflux.ts | 4 +-
.../MemorySettings/MemoriesSettingsModal.tsx | 4 +-
.../MemorySettings/MemorySettings.tsx | 26 +++++-----
.../ProviderSettings/AddProviderPopup.tsx | 2 +-
.../GithubCopilotSettings.tsx | 10 ++--
.../pages/settings/ProviderSettings/index.tsx | 10 ++--
.../components/SelectionActionSearchModal.tsx | 2 +-
.../hooks/useSettingsActionsList.ts | 2 +-
.../WebSearchSettings/BlacklistSettings.tsx | 6 +--
.../CompressionSettings/RagSettings.tsx | 2 +-
.../WebSearchProviderSetting.tsx | 2 +-
.../src/pages/translate/TranslatePage.tsx | 4 +-
.../WebSearchProvider/BochaProvider.ts | 2 +-
.../WebSearchProvider/ExaProvider.ts | 2 +-
.../WebSearchProvider/LocalBaiduProvider.ts | 2 +-
.../WebSearchProvider/LocalBingProvider.ts | 2 +-
.../WebSearchProvider/LocalGoogleProvider.ts | 2 +-
.../WebSearchProvider/LocalSearchProvider.ts | 2 +-
.../WebSearchProvider/SearxngProvider.ts | 4 +-
.../WebSearchProvider/TavilyProvider.ts | 2 +-
src/renderer/src/queue/KnowledgeQueue.ts | 2 +-
src/renderer/src/services/ApiService.ts | 18 +++----
src/renderer/src/services/BackupService.ts | 18 +++----
src/renderer/src/services/FileAction.ts | 2 +-
src/renderer/src/services/FileManager.ts | 2 +-
.../src/services/HealthCheckService.ts | 2 +-
src/renderer/src/services/ImageStorage.ts | 4 +-
src/renderer/src/services/KnowledgeService.ts | 10 ++--
src/renderer/src/services/LoggerService.ts | 39 +++++++--------
src/renderer/src/services/MemoryProcessor.ts | 29 +++++------
src/renderer/src/services/MemoryService.ts | 6 +--
src/renderer/src/services/MessagesService.ts | 2 +-
src/renderer/src/services/NutstoreService.ts | 10 ++--
src/renderer/src/services/PasteService.ts | 4 +-
src/renderer/src/services/PyodideService.ts | 2 +-
.../src/services/QuickPhraseService.ts | 2 +-
.../src/services/ShikiStreamService.ts | 12 ++---
src/renderer/src/services/StoreSyncService.ts | 2 +-
.../src/services/StreamProcessingService.ts | 2 +-
src/renderer/src/services/WebSearchService.ts | 2 +-
.../callbacks/citationCallbacks.ts | 8 ++--
src/renderer/src/store/migrate.ts | 48 +++++++++----------
src/renderer/src/store/thunk/messageThunk.ts | 34 ++++++-------
src/renderer/src/trace/pages/SpanDetail.tsx | 2 +-
.../src/utils/blacklistMatchPattern.ts | 8 ++--
src/renderer/src/utils/export.ts | 4 +-
src/renderer/src/utils/fetch.ts | 4 +-
src/renderer/src/utils/image.ts | 4 +-
src/renderer/src/utils/index.ts | 4 +-
src/renderer/src/utils/input.ts | 2 +-
src/renderer/src/utils/mcp-tools.ts | 2 +-
src/renderer/src/utils/messageUtils/create.ts | 2 +-
src/renderer/src/utils/oauth.ts | 6 +--
src/renderer/src/utils/prompt.ts | 10 ++--
src/renderer/src/utils/shiki.ts | 4 +-
.../src/windows/mini/home/HomeWindow.tsx | 4 +-
.../mini/translate/TranslateWindow.tsx | 2 +-
.../action/components/ActionUtils.ts | 2 +-
.../src/workers/shiki-stream.worker.ts | 4 +-
167 files changed, 542 insertions(+), 548 deletions(-)
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 }