From 1c45a882053f673a25801a94118f34539c60c2f4 Mon Sep 17 00:00:00 2001 From: kris Date: Wed, 1 Apr 2026 06:42:41 +0800 Subject: [PATCH] refactor: tighten master-agent memory ingestion --- src/lib/boss-data.ts | 34 +++++++++++++++++---- tests/master-agent-memory-ingestion.test.ts | 28 +++++++++++++++++ 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/src/lib/boss-data.ts b/src/lib/boss-data.ts index 8766148..c1f3d7f 100644 --- a/src/lib/boss-data.ts +++ b/src/lib/boss-data.ts @@ -3942,6 +3942,23 @@ function normalizeAutoMemoryText(value: string | undefined) { .trim(); } +function isLowValueAutoMemoryText(text: string) { + const normalized = normalizeAutoMemoryText(text); + if (!normalized) { + return true; + } + if (normalized.length < 10) { + return true; + } + if (/^(好的|收到|明白|继续|先这样|可以|行|没问题|辛苦了|谢谢|了解|嗯嗯)$/i.test(normalized)) { + return true; + } + if (/(马上|稍后|回头|等下|一会|临时|先看下|先试试|先这样)/i.test(normalized)) { + return true; + } + return false; +} + function inferAutoMemoryType(text: string): MasterMemoryType | null { if (!text.trim()) return null; if (/(微信|wechat|中文回复|中文沟通|UI风格|交互风格|偏好|习惯|默认)/i.test(text)) { @@ -4120,15 +4137,20 @@ function autoCaptureMasterAgentMemoriesInState( const createdOrUpdated: MasterAgentMemory[] = []; const combined = [requestText, replyText].filter(Boolean).join(" "); - const preferenceType = inferAutoMemoryType(requestText); + const preferenceCandidate = isLowValueAutoMemoryText(requestText) ? "" : requestText; + const projectCandidate = isLowValueAutoMemoryText(replyText) ? combined : replyText || combined; + const preferenceType = inferAutoMemoryType(preferenceCandidate); - if (preferenceType === "user_preference" || preferenceType === "workflow_rule") { + if ( + preferenceCandidate && + (preferenceType === "user_preference" || preferenceType === "workflow_rule") + ) { createdOrUpdated.push( upsertAutoMasterMemoryInState(state, { account: input.account, scope: "global", title: buildAutoMemoryTitle(preferenceType), - content: requestText, + content: preferenceCandidate, memoryType: preferenceType, tags: preferenceType === "user_preference" ? ["用户偏好"] : ["工作方式"], sourceMessageId: input.sourceMessageId, @@ -4137,15 +4159,15 @@ function autoCaptureMasterAgentMemoriesInState( } const referencedProject = detectReferencedProjectForMemory(state, combined); - const projectType = inferProjectAutoMemoryType(replyText) ?? inferProjectAutoMemoryType(combined); - if (referencedProject && projectType) { + const projectType = inferProjectAutoMemoryType(projectCandidate) ?? inferProjectAutoMemoryType(combined); + if (referencedProject && projectType && !isLowValueAutoMemoryText(projectCandidate)) { createdOrUpdated.push( upsertAutoMasterMemoryInState(state, { account: input.account, scope: "project", projectId: referencedProject.projectId, title: buildAutoMemoryTitle(projectType, referencedProject.projectName), - content: replyText || requestText, + content: projectCandidate, memoryType: projectType, tags: [referencedProject.projectName, referencedProject.alias], sourceMessageId: input.sourceMessageId, diff --git a/tests/master-agent-memory-ingestion.test.ts b/tests/master-agent-memory-ingestion.test.ts index 7b30465..9fe9e12 100644 --- a/tests/master-agent-memory-ingestion.test.ts +++ b/tests/master-agent-memory-ingestion.test.ts @@ -57,3 +57,31 @@ test("主 Agent 完成对话后会自动沉淀用户偏好和项目记忆", asyn assert.match(globalMemory?.content ?? "", /微信式交互|中文回复/); assert.match(projectMemory?.content ?? "", /boss 项目当前进度已更新/); }); + +test("主 Agent 不会把低价值短句和瞬时安排自动写入记忆", async () => { + await setup(); + + const task = await queueMasterAgentTask({ + projectId: "master-agent", + requestMessageId: "msg-user-2", + requestText: "好的,先这样,稍后我再看。", + executionPrompt: "prompt", + requestedBy: "17600003315", + requestedByAccount: "17600003315", + deviceId: "master-agent-openai", + }); + + await completeMasterAgentTask({ + taskId: task.taskId, + deviceId: "master-agent-openai", + status: "completed", + replyBody: "好的,稍后继续。", + }); + + const memories = await listUserMasterMemories("17600003315", { includeArchived: false }); + const noisyMemory = memories.find( + (memory) => (memory.content ?? "").includes("先这样") || (memory.content ?? "").includes("稍后继续"), + ); + + assert.equal(noisyMemory, undefined); +});