From 51630f95fd7e6c940911230fd20f0b6f7eebd983 Mon Sep 17 00:00:00 2001 From: Vaayne Date: Tue, 30 Sep 2025 17:17:56 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20refactor(agents):=20improv?= =?UTF-8?q?e=20error=20handling=20and=20logging=20in=20agent=20services?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/services/agents/BaseService.ts | 25 ++++++++++++------- .../agents/services/SessionMessageService.ts | 4 +-- .../agents/services/claudecode/index.ts | 5 ++++ .../agents/services/claudecode/transform.ts | 9 +++++++ 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/main/services/agents/BaseService.ts b/src/main/services/agents/BaseService.ts index cadf45b43d..86d4aef52c 100644 --- a/src/main/services/agents/BaseService.ts +++ b/src/main/services/agents/BaseService.ts @@ -59,16 +59,23 @@ export abstract class BaseService { } if (ids && ids.length > 0) { for (const id of ids) { - const server = await mcpApiService.getServerInfo(id) - if (server) { - server.tools.forEach((tool: MCPTool) => { - tools.push({ - id: `mcp_${id}_${tool.name}`, - name: tool.name, - type: 'mcp', - description: tool.description || '', - requirePermissions: true + try { + const server = await mcpApiService.getServerInfo(id) + if (server) { + server.tools.forEach((tool: MCPTool) => { + tools.push({ + id: `mcp_${id}_${tool.name}`, + name: tool.name, + type: 'mcp', + description: tool.description || '', + requirePermissions: true + }) }) + } + } catch (error) { + logger.warn('Failed to list MCP tools', { + id, + error: error as Error }) } } diff --git a/src/main/services/agents/services/SessionMessageService.ts b/src/main/services/agents/services/SessionMessageService.ts index 0aa17425f0..f7d44e1612 100644 --- a/src/main/services/agents/services/SessionMessageService.ts +++ b/src/main/services/agents/services/SessionMessageService.ts @@ -6,7 +6,7 @@ import type { ListOptions } from '@types' import { TextStreamPart } from 'ai' -import { and, desc, eq } from 'drizzle-orm' +import { and, desc, eq, not } from 'drizzle-orm' import { BaseService } from '../BaseService' import { sessionMessagesTable } from '../database/schema' @@ -276,7 +276,7 @@ export class SessionMessageService extends BaseService { const result = await this.database .select({ agent_session_id: sessionMessagesTable.agent_session_id }) .from(sessionMessagesTable) - .where(eq(sessionMessagesTable.session_id, sessionId)) + .where(and(eq(sessionMessagesTable.session_id, sessionId), not(eq(sessionMessagesTable.agent_session_id, '')))) .orderBy(desc(sessionMessagesTable.created_at)) .limit(1) diff --git a/src/main/services/agents/services/claudecode/index.ts b/src/main/services/agents/services/claudecode/index.ts index 63523b8288..8752dd8914 100644 --- a/src/main/services/agents/services/claudecode/index.ts +++ b/src/main/services/agents/services/claudecode/index.ts @@ -211,6 +211,11 @@ class ClaudeCodeService implements AgentServiceInterface { message, event: JSON.stringify(message.event) }) + } else { + logger.silly('Claude response', { + message, + event: JSON.stringify(message) + }) } // Transform SDKMessage to UIMessageChunks diff --git a/src/main/services/agents/services/claudecode/transform.ts b/src/main/services/agents/services/claudecode/transform.ts index 9badef411c..12dc4de295 100644 --- a/src/main/services/agents/services/claudecode/transform.ts +++ b/src/main/services/agents/services/claudecode/transform.ts @@ -591,6 +591,15 @@ function handleSystemMessage(message: Extract): raw: message } }) + } else if (message.subtype === 'compact_boundary') { + chunks.push({ + type: 'raw', + rawValue: { + type: 'compact', + session_id: message.session_id, + raw: message + } + }) } return chunks }