fix(memory-v2): improve pgvector recall and WeChat memory injection

Add keyword fallback and dedupe for pgvector resolve, score personal vs episodic memories by relevance, record WeChat recall product events, and disable broken chatrecall on Postgres session storage.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-08-01 22:26:47 +08:00
parent dac06753ce
commit dcf83e9b6f
8 changed files with 286 additions and 16 deletions
+37
View File
@@ -29,6 +29,8 @@ import {
isChatLlmRouterEligible,
logChatLlmRouterShadow,
resolveChatIntentRouterPolicy,
mergeAgentMemoryCandidates,
scoreAgentMemoryCandidate,
} from './chat-intent-router.mjs';
/** Ambiguous user text that should miss FAQ/rules and exercise LLM router paths in tests. */
@@ -1361,6 +1363,41 @@ test('agent memory recall prioritizes historical session evidence over personal
assert.equal(episodicCalls[0].sessionId, 'current-session');
});
test('agent memory merge prefers relevant personal memories over weak episodic matches', () => {
const merged = mergeAgentMemoryCandidates({
query: '你记得我们聊过德川家康吗',
limit: 2,
episodicMemories: [{
id: 'episodic:news',
label: '历史会话',
text: '会话“每日新闻页面”:用户要求整理今天国际国内热点新闻并做成页面。',
}],
personalMemories: [{
id: 'personal:tokugawa',
label: 'interest',
text: '用户对日本战国人物德川家康感兴趣,并希望继续深入讨论',
}],
});
assert.equal(merged[0].id, 'personal:tokugawa');
assert.equal(merged[1].id, 'episodic:news');
});
test('scoreAgentMemoryCandidate boosts episodic matches when topic overlap exists', () => {
const episodicScore = scoreAgentMemoryCandidate({
id: 'episodic:old-session',
label: '历史会话',
sessionId: 'old-session',
text: '会话“日本战国史”:用户与助手讨论过德川家康。',
}, '我们之前聊过德川家康,你还记得吗?');
const personalScore = scoreAgentMemoryCandidate({
id: 'personal-1',
label: '偏好',
text: '用户喜欢历史话题',
}, '我们之前聊过德川家康,你还记得吗?');
assert.ok(episodicScore > personalScore);
});
test('active agent memory context is hidden from displayText but available to orchestration envelope', () => {
const enriched = applyAgentOrchestrationToUserMessage(
{