feat(memory-v2): restore personal shadow pipeline and candidate store

Recover WIP modules from stash so admin can persist capability config,
observe chat writes in shadow mode, and review persisted candidates.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
john
2026-07-13 13:59:51 +08:00
parent 249b0697cb
commit e90a2da6cb
9 changed files with 773 additions and 1 deletions
+49
View File
@@ -81,6 +81,36 @@ test('memory v2 admin config service persists non-secret and secret patches', as
url: 'http://127.0.0.1:6333',
apiKey: 'secret-qdrant',
},
candidateMemory: {
enabled: true,
mode: 'shadow',
minImportance: '0.75',
minConfidence: '0.85',
maxPending: '500',
persistenceEnabled: true,
},
policy: {
enabled: true,
saveExplicit: true,
rejectSensitive: true,
requireEvidence: true,
retentionDays: '365',
},
retriever: {
enabled: true,
episodicEnabled: true,
semanticEnabled: true,
preferenceEnabled: true,
goalEnabled: true,
limit: '12',
tokenBudget: '1800',
timeoutMs: '1200',
},
lifecycle: { enabled: true, dedupeEnabled: true, conflictReview: true },
persona: { enabled: true, provider: 'ai-mind', shadowMode: true },
graph: { enabled: true, provider: 'postgres', maxDepth: '2' },
userMemory: { enabled: true, reviewEnabled: true, forgetEnabled: true, deletePropagation: true },
pluginHealth: { enabled: true, intervalSeconds: '60', timeoutMs: '1500', failureThreshold: '3', autoFallback: true },
}, { updatedBy: 'admin-1' });
assert.equal(updated.config.global.enabled, true);
@@ -91,6 +121,15 @@ test('memory v2 admin config service persists non-secret and secret patches', as
assert.equal(updated.config.qdrant.enabled, true);
assert.equal(updated.config.qdrant.url, 'http://127.0.0.1:6333');
assert.equal(updated.config.qdrant.apiKeyConfigured, true);
assert.equal(updated.config.candidateMemory.mode, 'shadow');
assert.equal(updated.config.candidateMemory.persistenceEnabled, true);
assert.equal(updated.config.policy.requireEvidence, true);
assert.equal(updated.config.retriever.tokenBudget, '1800');
assert.equal(updated.config.lifecycle.dedupeEnabled, true);
assert.equal(updated.config.persona.provider, 'ai-mind');
assert.equal(updated.config.graph.provider, 'postgres');
assert.equal(updated.config.userMemory.deletePropagation, true);
assert.equal(updated.config.pluginHealth.autoFallback, true);
assert.equal(updated.updatedBy, 'admin-1');
const runtimeState = await service.getRuntimeState();
@@ -107,6 +146,16 @@ test('memory v2 admin config service persists non-secret and secret patches', as
assert.equal(runtimeState.overrides.MEMORY_QDRANT_ENABLED, '1');
assert.equal(runtimeState.overrides.MEMORY_QDRANT_URL, 'http://127.0.0.1:6333');
assert.equal(runtimeState.overrides.MEMORY_QDRANT_API_KEY, 'secret-qdrant');
assert.equal(runtimeState.overrides.MEMORY_CANDIDATE_ENABLED, '1');
assert.equal(runtimeState.overrides.MEMORY_CANDIDATE_MODE, 'shadow');
assert.equal(runtimeState.overrides.MEMORY_CANDIDATE_PERSISTENCE_ENABLED, '1');
assert.equal(runtimeState.overrides.MEMORY_POLICY_REQUIRE_EVIDENCE, '1');
assert.equal(runtimeState.overrides.MEMORY_RETRIEVER_TOKEN_BUDGET, '1800');
assert.equal(runtimeState.overrides.MEMORY_LIFECYCLE_DEDUPE_ENABLED, '1');
assert.equal(runtimeState.overrides.MEMORY_PERSONA_PROVIDER, 'ai-mind');
assert.equal(runtimeState.overrides.MEMORY_GRAPH_PROVIDER, 'postgres');
assert.equal(runtimeState.overrides.MEMORY_USER_DELETE_PROPAGATION, '1');
assert.equal(runtimeState.overrides.MEMORY_PLUGIN_HEALTH_AUTO_FALLBACK, '1');
});
test('memory v2 admin config internals flatten booleans and numbers consistently', () => {