From 53104a65e9f3f15162d4e2ba4e871479032fcf71 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <209825114+claude[bot]@users.noreply.github.com> Date: Sun, 24 Aug 2025 02:51:58 +0000 Subject: [PATCH] Add backward compatibility for memory.json -> memory.jsonl migration When no custom MEMORY_FILE_PATH is set and memory.json exists but memory.jsonl doesn't exist, automatically migrate the old file to the new format with proper file extension. This ensures existing users don't lose their data when upgrading to the version with the corrected .jsonl extension. Co-authored-by: Ola Hungerford --- src/memory/index.ts | 43 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/src/memory/index.ts b/src/memory/index.ts index 3c69bd3f..385a1f12 100644 --- a/src/memory/index.ts +++ b/src/memory/index.ts @@ -13,12 +13,40 @@ import { fileURLToPath } from 'url'; // Define memory file path using environment variable with fallback const defaultMemoryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'memory.jsonl'); -// If MEMORY_FILE_PATH is just a filename, put it in the same directory as the script -const MEMORY_FILE_PATH = process.env.MEMORY_FILE_PATH - ? path.isAbsolute(process.env.MEMORY_FILE_PATH) - ? process.env.MEMORY_FILE_PATH - : path.join(path.dirname(fileURLToPath(import.meta.url)), process.env.MEMORY_FILE_PATH) - : defaultMemoryPath; +// Handle backward compatibility: migrate memory.json to memory.jsonl if needed +async function ensureMemoryFilePath(): Promise { + if (process.env.MEMORY_FILE_PATH) { + // Custom path provided, use it as-is (with absolute path resolution) + return path.isAbsolute(process.env.MEMORY_FILE_PATH) + ? process.env.MEMORY_FILE_PATH + : path.join(path.dirname(fileURLToPath(import.meta.url)), process.env.MEMORY_FILE_PATH); + } + + // No custom path set, check for backward compatibility migration + const oldMemoryPath = path.join(path.dirname(fileURLToPath(import.meta.url)), 'memory.json'); + const newMemoryPath = defaultMemoryPath; + + try { + // Check if old file exists and new file doesn't + await fs.access(oldMemoryPath); + try { + await fs.access(newMemoryPath); + // Both files exist, use new one (no migration needed) + return newMemoryPath; + } catch { + // Old file exists, new file doesn't - migrate + await fs.rename(oldMemoryPath, newMemoryPath); + console.error('Migrated memory.json to memory.jsonl for JSONL format compatibility'); + return newMemoryPath; + } + } catch { + // Old file doesn't exist, use new path + return newMemoryPath; + } +} + +// Initialize memory file path (will be set during startup) +let MEMORY_FILE_PATH: string; // We are storing our memory using entities, relations, and observations in a graph structure interface Entity { @@ -410,6 +438,9 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => { }); async function main() { + // Initialize memory file path with backward compatibility + MEMORY_FILE_PATH = await ensureMemoryFilePath(); + const transport = new StdioServerTransport(); await server.connect(transport); console.error("Knowledge Graph MCP Server running on stdio");