diff --git a/src/memory/sync-memory-files.ts b/src/memory/sync-memory-files.ts index e282bba7cf5..7f845f789bd 100644 --- a/src/memory/sync-memory-files.ts +++ b/src/memory/sync-memory-files.ts @@ -1,6 +1,7 @@ import type { DatabaseSync } from "node:sqlite"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { buildFileEntry, listMemoryFiles, type MemoryFileEntry } from "./internal.js"; +import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); @@ -74,29 +75,14 @@ export async function syncMemoryFiles(params: { }); await params.runWithConcurrency(tasks, params.concurrency); - - const staleRows = params.db - .prepare(`SELECT path FROM files WHERE source = ?`) - .all("memory") as Array<{ path: string }>; - for (const stale of staleRows) { - if (activePaths.has(stale.path)) { - continue; - } - params.db.prepare(`DELETE FROM files WHERE path = ? AND source = ?`).run(stale.path, "memory"); - try { - params.db - .prepare( - `DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`, - ) - .run(stale.path, "memory"); - } catch {} - params.db.prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`).run(stale.path, "memory"); - if (params.ftsEnabled && params.ftsAvailable) { - try { - params.db - .prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`) - .run(stale.path, "memory", params.model); - } catch {} - } - } + deleteStaleIndexedPaths({ + db: params.db, + source: "memory", + activePaths, + vectorTable: params.vectorTable, + ftsTable: params.ftsTable, + ftsEnabled: params.ftsEnabled, + ftsAvailable: params.ftsAvailable, + model: params.model, + }); } diff --git a/src/memory/sync-session-files.ts b/src/memory/sync-session-files.ts index efcf1b4aa39..9183a651a1d 100644 --- a/src/memory/sync-session-files.ts +++ b/src/memory/sync-session-files.ts @@ -6,6 +6,7 @@ import { listSessionFilesForAgent, sessionPathForFile, } from "./session-files.js"; +import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); @@ -99,33 +100,14 @@ export async function syncSessionFiles(params: { }); await params.runWithConcurrency(tasks, params.concurrency); - - const staleRows = params.db - .prepare(`SELECT path FROM files WHERE source = ?`) - .all("sessions") as Array<{ path: string }>; - for (const stale of staleRows) { - if (activePaths.has(stale.path)) { - continue; - } - params.db - .prepare(`DELETE FROM files WHERE path = ? AND source = ?`) - .run(stale.path, "sessions"); - try { - params.db - .prepare( - `DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`, - ) - .run(stale.path, "sessions"); - } catch {} - params.db - .prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`) - .run(stale.path, "sessions"); - if (params.ftsEnabled && params.ftsAvailable) { - try { - params.db - .prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`) - .run(stale.path, "sessions", params.model); - } catch {} - } - } + deleteStaleIndexedPaths({ + db: params.db, + source: "sessions", + activePaths, + vectorTable: params.vectorTable, + ftsTable: params.ftsTable, + ftsEnabled: params.ftsEnabled, + ftsAvailable: params.ftsAvailable, + model: params.model, + }); } diff --git a/src/memory/sync-stale.ts b/src/memory/sync-stale.ts new file mode 100644 index 00000000000..cddd5a1d50a --- /dev/null +++ b/src/memory/sync-stale.ts @@ -0,0 +1,42 @@ +import type { DatabaseSync } from "node:sqlite"; + +export function deleteStaleIndexedPaths(params: { + db: DatabaseSync; + source: string; + activePaths: Set; + vectorTable: string; + ftsTable: string; + ftsEnabled: boolean; + ftsAvailable: boolean; + model: string; +}) { + const staleRows = params.db + .prepare(`SELECT path FROM files WHERE source = ?`) + .all(params.source) as Array<{ path: string }>; + + for (const stale of staleRows) { + if (params.activePaths.has(stale.path)) { + continue; + } + params.db + .prepare(`DELETE FROM files WHERE path = ? AND source = ?`) + .run(stale.path, params.source); + try { + params.db + .prepare( + `DELETE FROM ${params.vectorTable} WHERE id IN (SELECT id FROM chunks WHERE path = ? AND source = ?)`, + ) + .run(stale.path, params.source); + } catch {} + params.db + .prepare(`DELETE FROM chunks WHERE path = ? AND source = ?`) + .run(stale.path, params.source); + if (params.ftsEnabled && params.ftsAvailable) { + try { + params.db + .prepare(`DELETE FROM ${params.ftsTable} WHERE path = ? AND source = ? AND model = ?`) + .run(stale.path, params.source, params.model); + } catch {} + } + } +}