diff --git a/src/services/dialogService.ts b/src/services/dialogService.ts index 8fb1414..fab077f 100644 --- a/src/services/dialogService.ts +++ b/src/services/dialogService.ts @@ -460,6 +460,8 @@ export class DialogSession { callbacks.onToolComplete?.(data.tool_name, data.result); // 实时发送段落更新 callbacks.onSegmentUpdate?.(this.segments); + // 追踪工具执行结果(用于后端重启后恢复) + historyManager.trackToolResult(data.tool_name, data.result); }, onToolError: (data) => { @@ -467,6 +469,8 @@ export class DialogSession { callbacks.onToolError?.(data.tool_name, data.error); // 实时发送段落更新 callbacks.onSegmentUpdate?.(this.segments); + // 追踪工具执行错误(用于后端重启后恢复) + historyManager.trackToolResult(data.tool_name, `[错误] ${data.error}`); }, onToolConfirm: async (data: ToolConfirmEvent) => { diff --git a/src/utils/chatHistoryManager.ts b/src/utils/chatHistoryManager.ts index 9f702d4..f36ce07 100644 --- a/src/utils/chatHistoryManager.ts +++ b/src/utils/chatHistoryManager.ts @@ -715,6 +715,10 @@ export class ChatHistoryManager { if (!projectPath) { console.error('[ChatHistoryManager] 无法保存压缩数据:projectPath 为空'); + // 通知用户压缩数据保存失败 + vscode.window.showWarningMessage( + '对话历史压缩数据保存失败:无法确定项目路径。后端重启后可能无法恢复完整对话历史。' + ); return; } @@ -731,6 +735,19 @@ export class ChatHistoryManager { // 文件不存在,使用空数组 } + // 版本检查:防止旧版本覆盖新版本(从尾部扫描,与加载逻辑一致) + let existingSummary: CompactionSummaryMessage | null = null; + for (let i = messages.length - 1; i >= 0; i--) { + if (messages[i].type === MessageType.COMPACTION_SUMMARY) { + existingSummary = messages[i] as CompactionSummaryMessage; + break; + } + } + if (existingSummary && existingSummary.version >= compacted.version) { + console.log(`[ChatHistoryManager] 跳过旧版本压缩数据: 现有版本=${existingSummary.version}, 新版本=${compacted.version}`); + return; + } + // 创建压缩摘要消息 const summaryMessage: CompactionSummaryMessage = { type: MessageType.COMPACTION_SUMMARY, @@ -893,4 +910,14 @@ export class ChatHistoryManager { content: text }); } + + /** + * 追踪新消息(工具执行结果) + */ + public trackToolResult(toolName: string, result: string): void { + this.newMessagesSinceCompaction.push({ + type: 'TOOL_RESULT', + content: `[${toolName}] ${result}` + }); + } }