#!/usr/bin/env node import { createLegacyMemoryBackend } from '../memory-v2.mjs'; import { createMemoryV2PluginBackends } from '../memory-v2-plugin-backends.mjs'; import { createPgvectorMemoryBackend } from '../memory-v2-pgvector.mjs'; import { validateMemoryV2BackendSet } from '../memory-v2-backend-contract.mjs'; function usage() { return `Usage: node scripts/check-memory-v2-contracts.mjs [options] Options: --include-pgvector-adapter Include the real disabled pgvector adapter instead of its placeholder. -h, --help Show this help. `; } export function parseMemoryV2ContractArgs(argv = []) { const options = { includePgvectorAdapter: false, help: false, }; for (const arg of argv) { if (arg === '--include-pgvector-adapter') { options.includePgvectorAdapter = true; } else if (arg === '-h' || arg === '--help') { options.help = true; } else { throw new Error(`Unknown argument: ${arg}`); } } return options; } function createSyntheticLegacyMemoryService() { return { async listMemories() { return []; }, async saveAndAnalyze() { return { saved: 0, analyzed: 0, memories: 0 }; }, async analyzeUser() { return { analyzed: 0, memories: 0 }; }, }; } export async function runMemoryV2ContractCli({ argv = process.argv.slice(2), stdout = process.stdout, } = {}) { const options = parseMemoryV2ContractArgs(argv); if (options.help) { stdout.write(usage()); return 0; } const backends = [ createLegacyMemoryBackend(createSyntheticLegacyMemoryService()), ]; if (options.includePgvectorAdapter) { backends.push(createPgvectorMemoryBackend({ enabled: false })); } backends.push(...createMemoryV2PluginBackends({ exclude: options.includePgvectorAdapter ? ['pgvector'] : [], })); const report = validateMemoryV2BackendSet(backends); stdout.write(`${JSON.stringify(report, null, 2)}\n`); return report.ok ? 0 : 1; } if (import.meta.url === `file://${process.argv[1]}`) { runMemoryV2ContractCli().then((code) => { process.exitCode = code; }).catch((err) => { console.error(err instanceof Error ? err.message : err); process.exitCode = 1; }); }