Merge Memory V2 runtime facade
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
import assert from 'node:assert/strict';
|
||||
import test from 'node:test';
|
||||
import vm from 'node:vm';
|
||||
import {
|
||||
normalizeMemoryV2AdapterScaffoldOptions,
|
||||
renderMemoryV2AdapterScaffold,
|
||||
} from './memory-v2-adapter-scaffold.mjs';
|
||||
import { inspectMemoryV2Backend } from './memory-v2-backend-contract.mjs';
|
||||
|
||||
async function loadGeneratedBackend(source, factoryName) {
|
||||
const transformed = `${source.replace(/export function /, 'function ')}\n${factoryName};`;
|
||||
const script = new vm.Script(transformed);
|
||||
const factory = script.runInNewContext({});
|
||||
return factory();
|
||||
}
|
||||
|
||||
test('normalizeMemoryV2AdapterScaffoldOptions normalizes names, flags, and capabilities', () => {
|
||||
assert.deepEqual(
|
||||
normalizeMemoryV2AdapterScaffoldOptions({
|
||||
name: 'Qdrant Store',
|
||||
category: 'semantic',
|
||||
role: 'Scale Out Vector Store',
|
||||
capabilities: ['resolve', 'resolve'],
|
||||
}),
|
||||
{
|
||||
name: 'qdrant-store',
|
||||
factoryName: 'createQdrantStoreMemoryBackend',
|
||||
category: 'semantic',
|
||||
role: 'scale-out-vector-store',
|
||||
capabilities: ['resolve'],
|
||||
flag: 'MEMORY_QDRANT_STORE_ENABLED',
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
test('normalizeMemoryV2AdapterScaffoldOptions rejects invalid category and capability', () => {
|
||||
assert.throws(
|
||||
() => normalizeMemoryV2AdapterScaffoldOptions({
|
||||
name: 'bad',
|
||||
category: 'unknown',
|
||||
capabilities: ['resolve'],
|
||||
}),
|
||||
/Adapter category/,
|
||||
);
|
||||
assert.throws(
|
||||
() => normalizeMemoryV2AdapterScaffoldOptions({
|
||||
name: 'bad',
|
||||
category: 'semantic',
|
||||
capabilities: ['delete'],
|
||||
}),
|
||||
/Unsupported Memory V2 capability/,
|
||||
);
|
||||
});
|
||||
|
||||
test('renderMemoryV2AdapterScaffold generates disabled backend that passes contract gate', async () => {
|
||||
const options = normalizeMemoryV2AdapterScaffoldOptions({
|
||||
name: 'qdrant',
|
||||
category: 'semantic',
|
||||
role: 'scale-out-vector-store',
|
||||
capabilities: ['resolve'],
|
||||
flag: 'MEMORY_QDRANT_ENABLED',
|
||||
});
|
||||
const source = renderMemoryV2AdapterScaffold(options);
|
||||
const backend = await loadGeneratedBackend(source, options.factoryName);
|
||||
const report = inspectMemoryV2Backend(backend);
|
||||
|
||||
assert.match(source, /export function createQdrantMemoryBackend/);
|
||||
assert.equal(backend.isAvailable(), false);
|
||||
assert.equal(backend.getUnavailableReason(), 'not_configured');
|
||||
assert.equal(report.ok, true);
|
||||
assert.deepEqual(report.supports, {
|
||||
resolve: true,
|
||||
write: false,
|
||||
compact: false,
|
||||
});
|
||||
});
|
||||
|
||||
test('renderMemoryV2AdapterScaffold can include write and compact operations', async () => {
|
||||
const options = normalizeMemoryV2AdapterScaffoldOptions({
|
||||
name: 'mem0',
|
||||
category: 'extraction',
|
||||
capabilities: ['write', 'compact'],
|
||||
});
|
||||
const backend = await loadGeneratedBackend(
|
||||
renderMemoryV2AdapterScaffold(options),
|
||||
options.factoryName,
|
||||
);
|
||||
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(await backend.write({}))), {
|
||||
saved: 0,
|
||||
analyzed: 0,
|
||||
memories: 0,
|
||||
});
|
||||
assert.deepEqual(JSON.parse(JSON.stringify(await backend.compact({}))), {
|
||||
analyzed: 0,
|
||||
memories: 0,
|
||||
});
|
||||
assert.equal(inspectMemoryV2Backend(backend).ok, true);
|
||||
});
|
||||
Reference in New Issue
Block a user