From 185e88ba3ec76543f15fd42f71012b285dd4fff7 Mon Sep 17 00:00:00 2001 From: CEQ151 Date: Sun, 31 May 2026 19:38:48 +0800 Subject: [PATCH] fix(import): refresh sidebar message count after incremental import After incremental import via Electron IPC, the sidebar session list showed stale message counts. Three contributing gaps: 1. The chat:incrementalImport IPC handler did not notify the renderer to refresh the session list (unlike the API route which calls notifySessionListChanged). Added win.webContents.send('api:importCompleted') to trigger the Sidebar's existing onImportCompleted listener. 2. The postImportHook in worker adapters was async (due to dynamic import()) but the caller did not await it, causing a race condition where loadSessions() could read stale overview cache before computeAndSetOverviewCache() finished. Converted to static import making the hook synchronous, and updated the type to void | Promise with await at call sites in both incremental-importer and streaming-importer. 3. The @imported handlers on group-chat and private-chat pages only refreshed local analysis data without calling sessionStore.loadSessions(). Added the call so the sidebar updates immediately on the client side. Co-Authored-By: Claude Opus 4.8 --- apps/desktop/main/ipc/chat.ts | 2 ++ apps/desktop/main/worker/import/incrementalImport.ts | 4 ++-- apps/desktop/main/worker/import/streamImport.ts | 4 ++-- packages/node-runtime/src/import/incremental-importer.ts | 4 ++-- packages/node-runtime/src/import/streaming-importer.ts | 4 ++-- src/pages/group-chat/index.vue | 7 ++++++- src/pages/private-chat/index.vue | 7 ++++++- 7 files changed, 22 insertions(+), 10 deletions(-) diff --git a/apps/desktop/main/ipc/chat.ts b/apps/desktop/main/ipc/chat.ts index 566a4cd3..0fde79aa 100644 --- a/apps/desktop/main/ipc/chat.ts +++ b/apps/desktop/main/ipc/chat.ts @@ -225,6 +225,8 @@ export function registerChatHandlers(ctx: IpcContext): void { console.error('[IpcMain] Failed to incrementally generate session index:', e) } worker.invalidateAnalysisCache(sessionId).catch(() => {}) + // 通知渲染进程刷新会话列表(与 API 路由的 notifySessionListChanged 保持一致) + win.webContents.send('api:importCompleted') } return result diff --git a/apps/desktop/main/worker/import/incrementalImport.ts b/apps/desktop/main/worker/import/incrementalImport.ts index 8d52d8eb..26d2e037 100644 --- a/apps/desktop/main/worker/import/incrementalImport.ts +++ b/apps/desktop/main/worker/import/incrementalImport.ts @@ -11,6 +11,7 @@ import { BetterSqliteAdapter, analyzeIncrementalImport as sharedAnalyze, incrementalImport as sharedImport, + computeAndSetOverviewCache, } from '@openchatlab/node-runtime' import type { IncrementalImportDeps, @@ -39,9 +40,8 @@ function buildDeps(requestId: string): IncrementalImportDeps { onProgress(progress) { sendProgress(requestId, progress) }, - async postImportHook(_db, sessionId) { + postImportHook(_db, sessionId) { try { - const { computeAndSetOverviewCache } = await import('@openchatlab/node-runtime') const dbPath = getDbPath(sessionId) const rawDb = new Database(dbPath) computeAndSetOverviewCache(new BetterSqliteAdapter(rawDb), sessionId, getCacheDir()) diff --git a/apps/desktop/main/worker/import/streamImport.ts b/apps/desktop/main/worker/import/streamImport.ts index 9f257f9e..a2170515 100644 --- a/apps/desktop/main/worker/import/streamImport.ts +++ b/apps/desktop/main/worker/import/streamImport.ts @@ -15,6 +15,7 @@ import { analyzeNewImport as sharedAnalyzeNewImport, streamParseFileInfo as sharedStreamParseFileInfo, TEMP_DB_SCHEMA, + computeAndSetOverviewCache, } from '@openchatlab/node-runtime' import type { StreamImportDeps, StreamImportResult, ImportLogger } from '@openchatlab/node-runtime' import { sendProgress, generateSessionId, getDbPath, createDatabaseWithoutIndexes } from './utils' @@ -87,9 +88,8 @@ function buildStreamImportDeps(requestId: string): StreamImportDeps { sendProgress(requestId, progress) }, logger: buildElectronLogger(), - async postImportHook(_db, sessionId) { + postImportHook(_db, sessionId) { try { - const { computeAndSetOverviewCache } = await import('@openchatlab/node-runtime') const dbPath = getDbPath(sessionId) const rawDb = new Database(dbPath) computeAndSetOverviewCache(new BetterSqliteAdapter(rawDb), sessionId, getCacheDir()) diff --git a/packages/node-runtime/src/import/incremental-importer.ts b/packages/node-runtime/src/import/incremental-importer.ts index 4198adfa..adec4e88 100644 --- a/packages/node-runtime/src/import/incremental-importer.ts +++ b/packages/node-runtime/src/import/incremental-importer.ts @@ -64,7 +64,7 @@ export interface IncrementalImportDeps { openDatabase(sessionId: string, readonly?: boolean): DatabaseAdapter onProgress: ImportProgressCallback /** Optional hook after incremental import (e.g. update overview cache). */ - postImportHook?: (db: DatabaseAdapter, sessionId: string) => void + postImportHook?: (db: DatabaseAdapter, sessionId: string) => void | Promise } // ==================== Internal helpers ==================== @@ -383,7 +383,7 @@ export async function incrementalImport( // Post-import hook (e.g. overview cache) try { - deps.postImportHook?.(db, sessionId) + await deps.postImportHook?.(db, sessionId) } catch { /* non-fatal */ } diff --git a/packages/node-runtime/src/import/streaming-importer.ts b/packages/node-runtime/src/import/streaming-importer.ts index f375612b..499bd053 100644 --- a/packages/node-runtime/src/import/streaming-importer.ts +++ b/packages/node-runtime/src/import/streaming-importer.ts @@ -74,7 +74,7 @@ export interface StreamImportDeps { /** Optional perf/diagnostic logger */ logger?: ImportLogger /** Optional hook after import completes (e.g. write overview cache) */ - postImportHook?: (db: DatabaseAdapter, sessionId: string) => void + postImportHook?: (db: DatabaseAdapter, sessionId: string) => void | Promise /** Generate a session ID. Defaults to timestamp + random. */ generateSessionId?: () => string } @@ -520,7 +520,7 @@ async function streamImportSingle( // Post-import hook (e.g. overview cache) try { - deps.postImportHook?.(db, sessionId) + await deps.postImportHook?.(db, sessionId) if (deps.postImportHook) logger?.perf('Post-import hook done', totalMessageCount) } catch { /* non-fatal */ diff --git a/src/pages/group-chat/index.vue b/src/pages/group-chat/index.vue index aa70a130..fc415875 100644 --- a/src/pages/group-chat/index.vue +++ b/src/pages/group-chat/index.vue @@ -294,7 +294,12 @@ const filteredMemberCount = computed(() => { v-model="showIncrementalImportModal" :session-id="currentSessionId" :session-name="session.name" - @imported="loadData" + @imported=" + () => { + loadData() + sessionStore.loadSessions() + } + " /> diff --git a/src/pages/private-chat/index.vue b/src/pages/private-chat/index.vue index dff6e5e4..cf49aca2 100644 --- a/src/pages/private-chat/index.vue +++ b/src/pages/private-chat/index.vue @@ -304,7 +304,12 @@ const otherMemberAvatar = computed(() => { v-model="showIncrementalImportModal" :session-id="currentSessionId" :session-name="session.name" - @imported="loadAnalysisData" + @imported=" + () => { + loadAnalysisData() + sessionStore.loadSessions() + } + " />