diff --git a/extensions/memory-core/src/memory/manager-sync-control.ts b/extensions/memory-core/src/memory/manager-sync-control.ts index 96c9db939ab..0595a263248 100644 --- a/extensions/memory-core/src/memory/manager-sync-control.ts +++ b/extensions/memory-core/src/memory/manager-sync-control.ts @@ -102,11 +102,12 @@ export async function runMemorySyncWithReadonlyRecovery( try { state.db.close(); } catch {} + const previousVectorDims = state.vector.dims; state.db = state.openDatabase(); state.resetVectorState(); state.ensureSchema(); const meta = state.readMeta(); - state.vector.dims = meta?.vectorDims; + state.vector.dims = meta?.vectorDims ?? previousVectorDims; try { await state.runSync(params); state.readonlyRecoverySuccesses += 1; diff --git a/extensions/memory-core/src/memory/manager.readonly-recovery.test.ts b/extensions/memory-core/src/memory/manager.readonly-recovery.test.ts index 067ce7cadae..5e149754686 100644 --- a/extensions/memory-core/src/memory/manager.readonly-recovery.test.ts +++ b/extensions/memory-core/src/memory/manager.readonly-recovery.test.ts @@ -136,6 +136,7 @@ describe("memory manager readonly recovery", () => { expect(harness.runSync).toHaveBeenCalledTimes(2); expect(harness.openDatabase).toHaveBeenCalledTimes(1); expect(harness.resetVectorState).toHaveBeenCalledTimes(1); + expect(harness.vector.dims).toBe(123); expect(initialClose).toHaveBeenCalledTimes(1); expectReadonlyRecoveryStatus(harness, params.expectedLastError); } @@ -194,6 +195,20 @@ describe("memory manager readonly recovery", () => { expect(harness.vectorDegradedWriteWarningShown).toBe(false); }); + it("prefers reopened vector dims when metadata is available", async () => { + const { harness } = createReadonlyRecoveryHarness(); + harness.readMeta.mockReturnValueOnce({ vectorDims: 768 }); + harness.runSync.mockRejectedValueOnce(new Error("attempt to write a readonly database")); + + await expect( + runSyncWithReadonlyRecovery(harness, { + reason: "test", + }), + ).resolves.toBeUndefined(); + + expect(harness.vector.dims).toBe(768); + }); + it("sets busy_timeout on memory sqlite connections", async () => { const db = openMemoryDatabaseAtPath(indexPath, false); const row = db.prepare("PRAGMA busy_timeout").get() as