feat(context): add recall fusion and zvec workspace adapters

Introduce RRF-based recall fusion for personal/episodic/temporal paths,
zvec-grep workspace shadow probing for code executors, and a local
headroom proxy starter aligned with the fusion plan defaults.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-09-09 21:28:04 +08:00
parent 49a1a68a29
commit 40e4a527fe
11 changed files with 677 additions and 1 deletions
+9 -1
View File
@@ -10,6 +10,10 @@ import {
PAGE_DATA_COLLECT_SKILL_NAME,
} from './chat-skills.mjs';
import { applyContextBudgetToOrchestration } from './context-budget.mjs';
import {
applyRecallFusionToMemoryMerge,
buildRecallFusionResolvedEvent,
} from './recall-fusion.mjs';
import { isDirectChatSessionId } from './direct-chat-service.mjs';
import {
memoryLimitForIntervention,
@@ -1709,12 +1713,14 @@ export function createChatIntentRouter(options = {}) {
agentMemoryPolicy.timeoutMs,
'Memory V2 agent resolve',
);
const memories = mergeAgentMemoryCandidates({
const fused = applyRecallFusionToMemoryMerge({
personalMemories: personalResolved?.memories,
episodicMemories: episodicResolved?.memories,
query: text,
limit,
legacyMerge: mergeAgentMemoryCandidates,
});
const memories = fused.memories;
const degraded = personalFailed
|| episodicFailed
|| Boolean(personalResolved?.degraded)
@@ -1730,6 +1736,8 @@ export function createChatIntentRouter(options = {}) {
? (memories.length ? 'partial_memory_resolve_failed' : 'memory_resolve_failed')
: (memories.length ? null : (episodicResolved?.reason ?? personalResolved?.reason ?? null)),
memories,
recallFusion: buildRecallFusionResolvedEvent(fused.fusion),
recallFusionApplied: fused.applied,
latencyMs: Date.now() - startedAt,
};
agentMemoryMetrics.resolved += 1;