From d16aabcf7477ccb80b6501f71075d8edb3202820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E5=91=98=E9=98=BF=E6=B1=9F=28Relakkes?= =?UTF-8?q?=29?= Date: Sun, 20 Sep 2026 03:02:26 +0800 Subject: [PATCH] fix(perf): restore continuous history scrolling and bound search indexing --- desktop/src/api/sessions.ts | 2 + .../src/components/chat/MessageActionBar.tsx | 24 +- .../src/components/chat/MessageList.test.tsx | 66 +++- desktop/src/components/chat/MessageList.tsx | 166 ++++++--- .../src/components/chat/UserMessage.test.tsx | 19 + desktop/src/components/chat/UserMessage.tsx | 5 +- .../hooks/useContinuousChatHistory.test.tsx | 162 +++++++++ desktop/src/hooks/useContinuousChatHistory.ts | 177 +++++++++ desktop/src/i18n/locales/en.ts | 10 +- desktop/src/i18n/locales/jp.ts | 10 +- desktop/src/i18n/locales/kr.ts | 10 +- desktop/src/i18n/locales/zh-TW.ts | 10 +- desktop/src/i18n/locales/zh.ts | 10 +- desktop/src/lib/chatHistoryBudget.test.ts | 12 +- desktop/src/lib/chatHistoryBudget.ts | 42 ++- desktop/src/lib/chatHistoryWindow.test.ts | 45 +++ desktop/src/lib/chatHistoryWindow.ts | 56 +++ desktop/src/stores/chatStore.test.ts | 141 +++++++- desktop/src/stores/chatStore.ts | 257 ++++++++++++-- .../services/boundedSessionHistory.test.ts | 100 +++++- src/server/services/boundedSessionHistory.ts | 237 +++++++++---- .../searchContentCommitWorker.test.ts | 67 ++++ .../localIndex/searchContentCommitWorker.ts | 101 ++++++ .../searchContentCoordinator.test.ts | 72 ++++ .../localIndex/searchContentCoordinator.ts | 39 +- .../localIndex/searchContentDatabase.ts | 2 + .../services/localIndex/searchContentIndex.ts | 42 ++- .../localIndex/searchContentProjector.test.ts | 92 ++++- .../localIndex/searchContentProjector.ts | 335 ++++++++++-------- .../services/sessionHistoryContext.test.ts | 10 + src/server/services/sessionHistoryContext.ts | 37 +- .../services/sessionHistoryRecovery.test.ts | 20 +- src/server/services/sessionHistoryRecovery.ts | 4 +- src/server/services/sessionService.ts | 6 +- 34 files changed, 2009 insertions(+), 379 deletions(-) create mode 100644 desktop/src/hooks/useContinuousChatHistory.test.tsx create mode 100644 desktop/src/hooks/useContinuousChatHistory.ts create mode 100644 desktop/src/lib/chatHistoryWindow.test.ts create mode 100644 desktop/src/lib/chatHistoryWindow.ts create mode 100644 src/server/services/localIndex/searchContentCommitWorker.test.ts create mode 100644 src/server/services/localIndex/searchContentCommitWorker.ts diff --git a/desktop/src/api/sessions.ts b/desktop/src/api/sessions.ts index c883b1fe..84441483 100644 --- a/desktop/src/api/sessions.ts +++ b/desktop/src/api/sessions.ts @@ -33,7 +33,9 @@ type MessagesResponse = { export type SessionHistoryPage = MessagesResponse & { page?: { nextCursor: string | null + previousCursor?: string | null hasMore: boolean + contentTruncated?: boolean historyComplete: boolean sourceVersion: string scannedBytes: number diff --git a/desktop/src/components/chat/MessageActionBar.tsx b/desktop/src/components/chat/MessageActionBar.tsx index 0cd37543..9a2966eb 100644 --- a/desktop/src/components/chat/MessageActionBar.tsx +++ b/desktop/src/components/chat/MessageActionBar.tsx @@ -1,4 +1,4 @@ -import { Check, Copy, GitFork } from 'lucide-react' +import { Check, Copy, GitFork, Undo2 } from 'lucide-react' import type { ReactNode } from 'react' import { useSettingsStore } from '../../stores/settingsStore' import { formatExactMessageTimestamp, formatMessageHoverTime } from '../../lib/formatMessageTimestamp' @@ -11,6 +11,12 @@ export type MessageBranchAction = { onBranch: () => void } +export type MessageRewindAction = { + label: string + loading?: boolean + onRewind: () => void +} + /** * The copy chip and the branch chip sit side by side and must look identical. * The branch one is an `IconButton size="sm" tone="muted" shape="circle"`; @@ -27,6 +33,7 @@ type Props = { copyText?: string copyLabel: string branchAction?: MessageBranchAction + rewindAction?: MessageRewindAction align?: 'start' | 'end' timestamp?: number /** Inline metadata that shares the same compact row as the actions. */ @@ -43,6 +50,7 @@ export function MessageActionBar({ copyText, copyLabel, branchAction, + rewindAction, align = 'start', timestamp, metadata, @@ -57,7 +65,7 @@ export function MessageActionBar({ ? formatExactMessageTimestamp(timestamp, locale) : '' - if (!hasCopy && !branchAction && !metadata) return null + if (!hasCopy && !branchAction && !rewindAction && !metadata) return null return (
event.currentTarget.blur()} /> ) : null} + {rewindAction ? ( +