fix(rectification): stream answers live and keep mobile chat visible

Use the quiet overlay scrollbar on chat and the house board, replace the blocking mobile dialog with a bottom sheet, and emit agent deltas before billing so users can read progress and stop a run.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-20 19:46:27 +08:00
co-authored by Cursor
parent 421ec0f9bf
commit 994f0583af
10 changed files with 322 additions and 121 deletions
+48
View File
@@ -4922,3 +4922,51 @@
- 相关记录:BUG-322
- 复发自:无
- 修复版本:dbbcb71b
## BUG-327 | Web 对话与生时纠正仍露出原生滚动条
- 状态:resolved
- 首次发现:2026-08-20
- 最近更新:2026-08-20
- 影响面:普通 session `.conversation`、生时纠正消息列表、右侧盘面 `.rectification-board__body`
- 用户现象:聊天和生时纠正内容超出高度时,直接出现浏览器原生滚动条,和侧栏已有的安静 overlay 滚动条不一致。
- 触发条件:普通对话或生时纠正历史超过可视高度,在桌面 Chromium / Firefox 中滚动。
- 根因:只有侧栏 `SidebarContent` 使用产品内滚动条;会话区和盘面仍是 `overflow-y: auto` 并保留 `scrollbar-gutter`,因此继续露出系统滚动条。
- 修复:会话列表、普通对话和生时纠正盘面共用同一套安静 overlay 滚动条:透明轨道、无 gutter、默认隐藏拇指,悬停或键盘焦点后显示低对比圆角拇指。
- 验证:`frontend/tests/sidebar-contract.test.ts``frontend/tests/rectification-agentic-entry.test.ts`
- 防复发:独立滚动容器必须同时覆盖标准 scrollbar 属性和 WebKit 伪元素,且不得再用 `scrollbar-gutter` 给系统滚动条留槽。
- 相关记录:BUG-042
- 复发自:BUG-042(只修了当时的生时纠正消息区,后来的 session 列宽和盘面分栏又回到原生滚动条)
- 修复版本:待本次提交
## BUG-328 | 移动端盘面以模态挡住聊天且关闭入口弱
- 状态:resolved
- 首次发现:2026-08-20
- 最近更新:2026-08-20
- 影响面:生时纠正窄屏盘面、`rectification-board`
- 用户现象:打开“当前盘面”后,白色面板盖住大部分聊天,几乎读不到刚才的对话;关闭只能靠一段会折行的文字按钮。
- 触发条件:窄于分栏阈值的视口打开宫位表。
- 根因:窄屏用 `showModal()` 对话框加不透明 backdrop,并把聊天设为 `inert`;高度约 86dvh / 100dvh,聊天被遮死。
- 修复:窄屏改为工作区分栏下半屏 sheet(约 46% 高),聊天留在上半屏可继续阅读;关闭改为 44px 图标按钮,Escape 仍可关闭。
- 验证:`frontend/tests/rectification-agentic-entry.test.ts`
- 防复发:窄屏盘面不得再用 modal dialog / backdrop 盖住聊天;关闭控件必须是独立 44px 目标并带 `aria-label="关闭盘面"`
- 相关记录:BUG-322、BUG-326
- 复发自:BUG-322(分栏后窄屏改成对话框,聊天被挡住)
- 修复版本:待本次提交
## BUG-329 | 生时纠正 Agent 回答在结算后一次性出现,推理中无法停止
- 状态:resolved
- 首次发现:2026-08-20
- 最近更新:2026-08-20
- 影响面:`POST /api/rectification/agent``runV9AgentTurn`、生时纠正输入框
- 用户现象:发送经历后接口长时间无增量文字,工具活动与回答在计费完成后才整段出现;推理过程中发送按钮不可用,也无法停止。
- 触发条件:任意生时纠正 `message` / `opening` 流,尤其是 `rectification-set-focus` 同轮重试的长等待。
- 根因:成功 attempt 的 tool.activity 与 `answer.delta` 被攒到 `billing.complete` 和持久化之后才发给浏览器。前端 fetch 没有 AbortSignal,输入区也没有停止按钮。
- 修复:工具活动和回答增量在生成过程中即时发布;失败重试先发 `attempt.reset` 清掉弃用 attempt 的可见文字。前端在推理中显示停止按钮,中止请求;已流出的文字保留。
- 验证:`frontend/tests/rectification-v9-stream.test.ts``frontend/tests/rectification-agentic-entry.test.ts`
- 防复发:`answer.delta` 必须在 `billing.settled` 之前出现在公共流里;生时纠正 composer 在 `busy` 时必须提供停止按钮并绑定 fetch abort。
- 相关记录:BUG-039、BUG-067
- 复发自:BUG-039(当时为了 attempt 隔离把增量攒到结算后,V9 流式合同被一起推迟)
- 修复版本:待本次提交