Skip to content

fix(ui): stabilize streaming scroll and deduplicate live status - #551

Merged
mssssss123 merged 3 commits into
OpenBMB:mainfrom
mssssss123:codex/fix-streaming-scroll-status
Sep 5, 2026
Merged

fix(ui): stabilize streaming scroll and deduplicate live status#551
mssssss123 merged 3 commits into
OpenBMB:mainfrom
mssssss123:codex/fix-streaming-scroll-status

Conversation

@mssssss123

@mssssss123 mssssss123 commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

Streaming replies could pull the conversation back to the bottom while the reader scrolled upward, and thinking or tool execution could appear in multiple live status rows. This change preserves the reader's position through streaming, tool transitions and completion, and gives each active process a single status owner.

  • Share scroll-follow behavior between the conversation, thinking viewports and subagent details. User displacement wins when scrolling and resizing happen in the same frame; reading anchors survive history insertion and layout shrink. Short thinking blocks let the conversation consume scrolling, and do not pause following when neither viewport can scroll. Back to latest appears for actual unseen content and resumes visible nested viewports together.
  • Separate initial history positioning from continuous automatic following. Preserve each conversation's reading window and message offset when switching sessions, including when automatic following is disabled.
  • Wait for streamed search text to become visible before completing navigation. If a complete message cannot generate a highlight (for example, a phrase spanning a link or a hidden Markdown URL), fall back to message-level positioning. Use actual typewriter progress, including the tail after backend completion, and observe readiness changes even when visible text does not change. Highlight subsequent rendering progress without repeatedly recentering a successful result; wheel, touch, keyboard and pointer input cancel pending navigation.
  • Keep thinking rows and their React ancestry stable when completed tool summaries attach, preserving the order thinking A → Read → thinking B → Bash → answer. Preserve expansion and scroll state across subagent completion snapshots, retain the live tail during background refresh, and continue following until the remaining text has rendered.
  • Resolve tool status against the current run and invocation, treat empty successful results as completed, and keep parallel invocations running until their own results arrive. Remove duplicate thinking and plan-mode web-fetch status rows. Reveal text according to elapsed time and render math consistently during streaming.

Validation on Node 22.23.1:

  • 1,151 UI/server unit and integration tests passed across 147 files, using the existing CI exclusions for Playwright files and the legacy streamSmoother suite.
  • 21 Chromium regression scenarios passed, including nested short/long thinking, same conversation reading preservation, streamed search with cancellation, historical session positioning/revisits, subagent rendering drain and the actual completion snapshot refresh path. Deterministic unit tests cover both scroll/resize event orders and simultaneous history insertion.
  • TypeScript check and production UI build passed. The build retains the existing large-chunk warning.

Browser regression command: pnpm --dir ui exec playwright test --config=e2e/streaming-scroll.config.mjs.

@mssssss123
mssssss123 merged commit a8ef656 into OpenBMB:main Sep 5, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants