Skip to content

交互 Bug:流式输出时向上滚动会被强制拉回到底部 #222

Description

@minorcell

问题描述

AI 输出(尤其是流式输出)时,用户向上滚动终端查看历史内容,视口会被强制拉回到底部,阅读/复制之前的内容变得不可用。

实际行为

  • 输出仍在进行中时,用户向上滚动查看之前的输出内容。
  • 一旦下一个流式 chunk 到达并触发重绘,终端视口被强制跳回底部(正在输出的位置)。
  • 任何新输出都会打断阅读,用户无法稳定地查看或复制已输出的内容。

原因分析(初步)

  • packages/tui/src/features/timeline/ChatWidget.tsx 用 Ink 的 <Static> 渲染已提交历史,正在流式输出的 turn 作为 live 区域(TurnCell)每帧重绘。
  • 流式输出时 live 区域持续增长;当输出超过终端高度后,重绘位置位于可视区域之外(下方),终端为保持光标可见会强制滚动视口到底部。
  • 应用层没有任何滚动状态追踪(grep 不到 scroll / follow 相关逻辑),也没有重绘节流,导致每个 chunk 到达都可能触发一次"拉回底部"。
  • 这属于 Ink 类终端应用的普遍交互缺口,需要在应用层缓解(节流重绘、限制 live 区域高度、或检测滚动状态暂停跟随)。

期望

  • 用户向上滚动后,流式输出不应强制夺回视口;新内容到达时不应打断用户阅读历史。
  • 提供明确机制(如暂停跟随、限流重绘),让滚动查看 / 复制成为可靠操作。

影响范围

  • packages/tui(timeline 流式输出渲染)
  • 所有需要长输出阅读 / 复制的用户(日志、长回复、工具输出)

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:toolsBuilt-in tools and tool runtimearea:tuiTerminal UI and interaction layerbugSomething isn't workingneeds-triageIssue needs initial triage

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions