From a3306d456e36d6f0bd8d2d0eb48e1488bbbd6f2c Mon Sep 17 00:00:00 2001 From: new-Beginner <3205732937@qq.com> Date: Sat, 24 Oct 2026 00:05:15 +0800 Subject: [PATCH] fix(transcript): continue restored reading ranges automatically Restored reading ranges should preserve their bookmark without leaving readers behind a manual history paging control. Continue bounded pages near the viewport boundary and rejoin live output only after the gap closes. Keep explicit search paging isolated, preserve the viewport and model input, and cover continuation, retries, and hidden-pane cleanup. --- .../chat/transcript/ChatTranscript.tsx | 14 ++- .../src/hooks/use-transcript-continuation.ts | 51 ++++++++++ apps/desktop/src/lib/transcript-reading.ts | 16 +++- apps/desktop/test/transcript-reading.test.mjs | 35 +++++++ docs/spec/04-ux/08-component-spec.md | 6 ++ docs/spec/06-delivery/04-e2e-test-plan.md | 15 ++- scripts/e2e-transcript-reading-position.mjs | 5 +- scripts/e2e/session-reading-position.tsx | 37 ++++++++ scripts/e2e/transcript-continuation.tsx | 93 +++++++++++++++++++ scripts/e2e/transcript-reading-position.tsx | 1 + 10 files changed, 263 insertions(+), 10 deletions(-) create mode 100644 apps/desktop/src/hooks/use-transcript-continuation.ts create mode 100644 scripts/e2e/transcript-continuation.tsx diff --git a/apps/desktop/src/features/chat/transcript/ChatTranscript.tsx b/apps/desktop/src/features/chat/transcript/ChatTranscript.tsx index 828ca77796..1012190411 100644 --- a/apps/desktop/src/features/chat/transcript/ChatTranscript.tsx +++ b/apps/desktop/src/features/chat/transcript/ChatTranscript.tsx @@ -19,6 +19,7 @@ import { TranscriptHistory, TranscriptTail } from "./AssistantTurn"; import { collectLiveDelegationEntries } from "../../../lib/live-delegation-entries"; import { reuseReadonlyMap } from "../../../lib/assistant-turns"; import { useTranscriptScroll } from "./hooks/useTranscriptScroll"; +import { useTranscriptContinuation } from "../../../hooks/use-transcript-continuation"; import type { TranscriptSearchTarget } from "../../../lib/transcript-reading"; import type { RestoreTranscriptReading } from "../../../hooks/use-transcript-reading-position"; import { TranscriptSearchContext } from "../../../lib/transcript-search-context"; @@ -158,6 +159,17 @@ function TranscriptBody({ onRestoreReading, }); + const continuationCursor = useAppStore((state) => + sessionId ? state.transcriptViews[sessionId]?.messageEnd : undefined, + ); + const automaticContinuation = readingWindow && !searchTarget; + useTranscriptContinuation({ + scrollRef, contentRef, messages, onLoadNewer, + enabled: automaticContinuation && hasMoreAfter && paneVisible && !veilCovering, + cursor: continuationCursor, + loading: navigationLoading, + }); + const specializedActivity = agentActivity; const rawLiveDelegations = useMemo( () => collectLiveDelegationEntries(historyEntries, tailEntry, transcriptRunning), @@ -293,7 +305,7 @@ function TranscriptBody({ runtimeActivity={specializedActivity} /> ) : null} - {hasMoreAfter ? ( + {hasMoreAfter && !automaticContinuation ? (