diff --git a/desktop/src/stores/sessionStore.ts b/desktop/src/stores/sessionStore.ts index ceeaaf82..439ec0d0 100644 --- a/desktop/src/stores/sessionStore.ts +++ b/desktop/src/stores/sessionStore.ts @@ -244,9 +244,10 @@ function mergeSessionList( for (const item of incoming) { const current = currentById.get(item.id) const candidate = preserveLocalTitle(current, item) - const existing = byId.get(candidate.id) - if (!existing || sessionModifiedTime(candidate) > sessionModifiedTime(existing)) { - byId.set(candidate.id, candidate) + const merged = preserveStaleModifiedAt(current, candidate) + const existing = byId.get(merged.id) + if (!existing || sessionModifiedTime(merged) > sessionModifiedTime(existing)) { + byId.set(merged.id, merged) } } @@ -269,6 +270,21 @@ function preserveLocalTitle( return incoming } +function preserveStaleModifiedAt( + current: SessionListItem | undefined, + incoming: SessionListItem, +): SessionListItem { + if (!current) return incoming + // Preserve modifiedAt when the effective title hasn't changed — indicates no meaningful + // content change. messageCount is NOT used here because listSessions always returns 0 + // (a placeholder for performance), while fetchSessionSummary returns the real count, + // so comparing them would always fail and defeat the preservation logic. + if (current.title === incoming.title) { + return { ...incoming, modifiedAt: current.modifiedAt } + } + return incoming +} + function syncOpenSessionTabTitles(sessions: SessionListItem[]): void { const titleById = new Map(sessions.map((session) => [session.id, session.title])) const { tabs, updateTabTitle } = useTabStore.getState()