From d8691ff4ec4c4467b7d49c07743903e504c8b2db Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Mon, 16 Feb 2026 00:29:01 +0000 Subject: [PATCH] refactor(memory): share sync progress helpers --- src/memory/sync-memory-files.ts | 24 +++++++------------ src/memory/sync-progress.ts | 38 ++++++++++++++++++++++++++++++ src/memory/sync-session-files.ts | 40 ++++++++------------------------ 3 files changed, 56 insertions(+), 46 deletions(-) create mode 100644 src/memory/sync-progress.ts diff --git a/src/memory/sync-memory-files.ts b/src/memory/sync-memory-files.ts index 3988b61388..eee354bb6c 100644 --- a/src/memory/sync-memory-files.ts +++ b/src/memory/sync-memory-files.ts @@ -1,24 +1,19 @@ import type { DatabaseSync } from "node:sqlite"; +import type { SyncProgressState } from "./sync-progress.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { buildFileEntry, listMemoryFiles, type MemoryFileEntry } from "./internal.js"; import { indexFileEntryIfChanged } from "./sync-index.js"; +import { bumpSyncProgressTotal } from "./sync-progress.js"; import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); -type ProgressState = { - completed: number; - total: number; - label?: string; - report: (update: { completed: number; total: number; label?: string }) => void; -}; - export async function syncMemoryFiles(params: { workspaceDir: string; extraPaths?: string[]; db: DatabaseSync; needsFullReindex: boolean; - progress?: ProgressState; + progress?: SyncProgressState; batchEnabled: boolean; concurrency: number; runWithConcurrency: (tasks: Array<() => Promise>, concurrency: number) => Promise; @@ -42,14 +37,11 @@ export async function syncMemoryFiles(params: { }); const activePaths = new Set(fileEntries.map((entry) => entry.path)); - if (params.progress) { - params.progress.total += fileEntries.length; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - label: params.batchEnabled ? "Indexing memory files (batch)..." : "Indexing memory files…", - }); - } + bumpSyncProgressTotal( + params.progress, + fileEntries.length, + params.batchEnabled ? "Indexing memory files (batch)..." : "Indexing memory files…", + ); const tasks = fileEntries.map((entry) => async () => { await indexFileEntryIfChanged({ diff --git a/src/memory/sync-progress.ts b/src/memory/sync-progress.ts new file mode 100644 index 0000000000..a67eb43540 --- /dev/null +++ b/src/memory/sync-progress.ts @@ -0,0 +1,38 @@ +export type SyncProgressState = { + completed: number; + total: number; + label?: string; + report: (update: { completed: number; total: number; label?: string }) => void; +}; + +export function bumpSyncProgressTotal( + progress: SyncProgressState | undefined, + delta: number, + label?: string, +) { + if (!progress) { + return; + } + progress.total += delta; + progress.report({ + completed: progress.completed, + total: progress.total, + label, + }); +} + +export function bumpSyncProgressCompleted( + progress: SyncProgressState | undefined, + delta = 1, + label?: string, +) { + if (!progress) { + return; + } + progress.completed += delta; + progress.report({ + completed: progress.completed, + total: progress.total, + label, + }); +} diff --git a/src/memory/sync-session-files.ts b/src/memory/sync-session-files.ts index a087f3bf72..d0c7883b61 100644 --- a/src/memory/sync-session-files.ts +++ b/src/memory/sync-session-files.ts @@ -1,5 +1,6 @@ import type { DatabaseSync } from "node:sqlite"; import type { SessionFileEntry } from "./session-files.js"; +import type { SyncProgressState } from "./sync-progress.js"; import { createSubsystemLogger } from "../logging/subsystem.js"; import { buildSessionEntry, @@ -7,22 +8,16 @@ import { sessionPathForFile, } from "./session-files.js"; import { indexFileEntryIfChanged } from "./sync-index.js"; +import { bumpSyncProgressCompleted, bumpSyncProgressTotal } from "./sync-progress.js"; import { deleteStaleIndexedPaths } from "./sync-stale.js"; const log = createSubsystemLogger("memory"); -type ProgressState = { - completed: number; - total: number; - label?: string; - report: (update: { completed: number; total: number; label?: string }) => void; -}; - export async function syncSessionFiles(params: { agentId: string; db: DatabaseSync; needsFullReindex: boolean; - progress?: ProgressState; + progress?: SyncProgressState; batchEnabled: boolean; concurrency: number; runWithConcurrency: (tasks: Array<() => Promise>, concurrency: number) => Promise; @@ -46,35 +41,20 @@ export async function syncSessionFiles(params: { concurrency: params.concurrency, }); - if (params.progress) { - params.progress.total += files.length; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - label: params.batchEnabled ? "Indexing session files (batch)..." : "Indexing session files…", - }); - } + bumpSyncProgressTotal( + params.progress, + files.length, + params.batchEnabled ? "Indexing session files (batch)..." : "Indexing session files…", + ); const tasks = files.map((absPath) => async () => { if (!indexAll && !params.dirtyFiles.has(absPath)) { - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } + bumpSyncProgressCompleted(params.progress); return; } const entry = await buildSessionEntry(absPath); if (!entry) { - if (params.progress) { - params.progress.completed += 1; - params.progress.report({ - completed: params.progress.completed, - total: params.progress.total, - }); - } + bumpSyncProgressCompleted(params.progress); return; } await indexFileEntryIfChanged({