diff --git a/src/renderer/components/memory-modal.ts b/src/renderer/components/memory-modal.ts index 4bf8098..ab863fc 100644 --- a/src/renderer/components/memory-modal.ts +++ b/src/renderer/components/memory-modal.ts @@ -3,7 +3,7 @@ * 基于工作空间 MEMORY.md 文件 */ -import { loadAllEntries, addEntry, removeEntry, type MemoryEntry, type MemoryType } from '../services/memory-service.js'; +import { loadAllEntries, addEntry, removeEntry, DuplicateEntryError, type MemoryEntry, type MemoryType } from '../services/memory-service.js'; import { showToast } from './toast.js'; import { showPrompt, showConfirm } from './prompt-modal.js'; import { escapeHtml, formatTime } from '../utils/utils.js'; @@ -170,6 +170,10 @@ async function openAddDialog(): Promise { await renderList(); showToast('记忆已添加', 'success', 1500); } catch (err) { - showToast(`添加失败: ${(err as Error).message}`, 'error'); + if (err instanceof DuplicateEntryError) { + showToast('该记忆已存在,无需重复添加', 'info', 2000); + } else { + showToast(`添加失败: ${(err as Error).message}`, 'error'); + } } } diff --git a/src/renderer/services/memory-service.ts b/src/renderer/services/memory-service.ts index 562ca6e..fbcb435 100644 --- a/src/renderer/services/memory-service.ts +++ b/src/renderer/services/memory-service.ts @@ -21,6 +21,18 @@ import { logInfo, logWarn, logDebug, logMemory } from './log-service.js'; // 类型定义 // ═══════════════════════════════════════════════════════════════ +/** 重复条目错误:记忆已存在时抛出,告诉调用方无需重复添加 */ +export class DuplicateEntryError extends Error { + existingId: string; + existingPreview: string; + constructor(id: string, preview: string) { + super(`重复条目: ${preview}... (ID: ${id})`); + this.name = 'DuplicateEntryError'; + this.existingId = id; + this.existingPreview = preview; + } +} + export type MemoryType = 'fact' | 'preference' | 'rule'; export interface MemoryEntry { @@ -435,7 +447,10 @@ export async function addEntry( if (prefixLen > 20 && content.slice(0, prefixLen) === e.content.slice(0, prefixLen)) return true; return simpleSimilarity(e.content, content) > 0.8; }); - if (existing) return existing; + if (existing) { + logDebug('记忆去重: 已有相同条目', `${type}: ${content.slice(0, 40)}`); + throw new DuplicateEntryError(existing.id, existing.content.slice(0, 60)); + } const entry: MemoryEntry = { id: generateMemoryId(), diff --git a/src/renderer/services/tool-registry.ts b/src/renderer/services/tool-registry.ts index 6acc527..ba66fb4 100644 --- a/src/renderer/services/tool-registry.ts +++ b/src/renderer/services/tool-registry.ts @@ -779,7 +779,7 @@ export async function executeTool(toolName: string, args: Record