diff --git a/src/memory/sync-index.ts b/src/memory/sync-index.ts new file mode 100644 index 00000000000..b5e15888387 --- /dev/null +++ b/src/memory/sync-index.ts @@ -0,0 +1,39 @@ +import type { DatabaseSync } from "node:sqlite"; + +type SyncProgress = { + completed: number; + total: number; + report: (update: { completed: number; total: number; label?: string }) => void; +}; + +function tickProgress(progress: SyncProgress | undefined): void { + if (!progress) { + return; + } + progress.completed += 1; + progress.report({ + completed: progress.completed, + total: progress.total, + }); +} + +export async function indexFileEntryIfChanged< + TEntry extends { path: string; hash: string }, +>(params: { + db: DatabaseSync; + source: string; + needsFullReindex: boolean; + entry: TEntry; + indexFile: (entry: TEntry) => Promise; + progress?: SyncProgress; +}): Promise { + const record = params.db + .prepare(`SELECT hash FROM files WHERE path = ? AND source = ?`) + .get(params.entry.path, params.source) as { hash: string } | undefined; + if (!params.needsFullReindex && record?.hash === params.entry.hash) { + tickProgress(params.progress); + return; + } + await params.indexFile(params.entry); + tickProgress(params.progress); +} diff --git a/src/memory/sync-memory-files.ts b/src/memory/sync-memory-files.ts index 7f845f789bd..3988b613884 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 { indexFileEntryIfChanged } from "./sync-index.js"; import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); @@ -51,27 +52,14 @@ export async function syncMemoryFiles(params: { } const tasks = fileEntries.map((entry) => async () => { - const record = params.db - .prepare(`SELECT hash FROM files WHERE path = ? AND source = ?`) - .get(entry.path, "memory") as { hash: string } | undefined; - if (!params.needsFullReindex && record?.hash === entry.hash) { - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } - return; - } - await params.indexFile(entry); - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } + await indexFileEntryIfChanged({ + db: params.db, + source: "memory", + needsFullReindex: params.needsFullReindex, + entry, + indexFile: params.indexFile, + progress: params.progress, + }); }); await params.runWithConcurrency(tasks, params.concurrency); diff --git a/src/memory/sync-session-files.ts b/src/memory/sync-session-files.ts index 9183a651a1d..a087f3bf728 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 { indexFileEntryIfChanged } from "./sync-index.js"; import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); @@ -76,27 +77,14 @@ export async function syncSessionFiles(params: { } return; } - const record = params.db - .prepare(`SELECT hash FROM files WHERE path = ? AND source = ?`) - .get(entry.path, "sessions") as { hash: string } | undefined; - if (!params.needsFullReindex && record?.hash === entry.hash) { - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } - return; - } - await params.indexFile(entry); - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } + await indexFileEntryIfChanged({ + db: params.db, + source: "sessions", + needsFullReindex: params.needsFullReindex, + entry, + indexFile: params.indexFile, + progress: params.progress, + }); }); await params.runWithConcurrency(tasks, params.concurrency);