fix(mobile): 修复发送消息触发历史重排跳动 - #3940
Conversation
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
| Filename | Overview |
|---|---|
| apps/mobile/app/sessions/[sessionId].tsx | 将输入区活动状态与消息列表流式分组状态解耦,并同步更新渲染窗口缓存依赖。 |
| apps/mobile/src/session/messageNormalize.ts | 提取统一的远端回复完成边界判定,保持显式完成、费用和 token 信号语义一致。 |
| apps/mobile/src/session/messageRenderStreamingCache.ts | 在截断活动前缀后出现完成边界时停止复用旧前缀并重新构建分组。 |
| packages/maker-shared/src/messageRender.ts | 活动尾部按最后一个持久完成边界拆分,完成内容保持折叠而后续内容继续采用活动分组。 |
| apps/mobile/src/tests/messagePerformance.test.ts | 覆盖不同完成信号触发流式前缀失效及后续发送保持历史折叠的行为。 |
| apps/mobile/src/tests/messageRenderModel.test.ts | 覆盖发送回显延迟、过程消息停顿及父回复完成后后台子 Agent 继续运行。 |
| packages/maker-shared/src/tests/messageRender.test.ts | 验证共享分组在完成回复后仍允许同轮后续工作保持活动态。 |
Sequence Diagram
sequenceDiagram
participant U as 用户
participant C as 输入区
participant R as 远端会话状态
participant G as 消息分组
participant V as 消息列表
U->>C: 点击发送
C->>C: 立即显示发送/排队反馈
Note over G,V: 本地发送状态不再重新激活历史分组
R-->>G: 远端运行或流式状态
G->>G: 在最后完成边界处分割
G-->>V: 完成内容保持折叠
R-->>G: 后续过程输出
G-->>V: 仅后续内容显示为活动态
Reviews (1): Last reviewed commit: "fix(mobile): 发送新消息时保持已完成回复分组稳定" | Re-trigger Greptile
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
|
命中 UI 路径(apps/mobile/app/sessions/[sessionId].tsx / apps/mobile/src/session/messageNormalize.ts / apps/mobile/src/session/messageRenderStreamingCache.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。缺 UI 证据不阻断合并。 |
MagicLizi
left a comment
There was a problem hiding this comment.
代码重审通过:当前 head 未发现 P0/P1,全部 conversation 已 resolve。发送时历史分组不再跟着重排跳动。
|
合了。发送那一下历史不再跟着跳,消息分组终于跟手势对齐。 |
这次改了什么
摘要
修复手机点击发送时,上一轮已折叠的工作过程被重新展开、随后又折回,导致消息列表位置跳动的问题。发送和排队状态只驱动输入区反馈,消息分组使用远端回复状态;已收到结束标记的内容保持完成态,仅后续内容进入进行中分组。
变更类型
fix缺陷修复范围
UI 变化
修复消息列表的状态过渡,不新增界面、颜色或文案。
docs/design-rules/DESIGN.md§8 Mobile 保持现有布局,§14.4 避免无意义位移;§10 沿用既有主题样式。Light/Dark 实机目检未执行。怎么验证的
自动验证
完整单测:
run-unit-gate.sh执行仓库完整单测,最终退出码 0,全部适用 workspace 通过。首轮 Desktop 的CustomProviderDialogAccessibility.test.tsx一项 tooltip 等待超时;在同一主干 SHA 的干净 checkout 与 PR 分支分别定向复验,26 项均通过,随后完整单测复验通过。该文件及实现未改动,相关门禁中的完整 Desktop 单测也通过。主干在验证期间合入共享分组抽取(#3934);已将修复接入新的
workRunGrouping.ts,保留该重构。合并后手机针对性 68 项、Desktop 分组一致性 14 项、两端 typecheck、pnpm test:unit:related及run-unit-gate.sh完整单测全部通过。原改动的 Prettier 全文件检查报告 8 个文件格式告警,逐个对照基线
15f9175f1同样都有告警。同步主干后的workRunGrouping.ts已按现有 Prettier 风格格式化,其余文件未混入整文件格式化。手工验证
源码与完整 diff 复核。回归测试先确认旧实现会把完成态分组展开;修复后验证发送过渡、远端状态先到、正式用户消息回流、过程输出停顿、同轮继续工作,以及父回复结束后后台子 Agent 仍运行。
未执行的验证
未启动 iOS/Android 模拟器或连接用户真机采集原生滚动事件,因此没有截图/录屏、Metro 归属及
__DEV__build label 证据。验证分支为dash/fix-mobile-send-history-jump,worktree 为cindy-fix-mobile-send-history-jump。本 PR 验证的是导致跳动的分组重排路径,不宣称已复现用户真机那一次滚动事件。风险
风险分类
影响与回滚
turnCompleted、旧费用、token 用量结束信号,不改 wire protocol。完全没有结束标记的旧消息,仍依赖远端运行状态与新用户消息边界;本地发送/排队已不再使其进入进行中分组。提交前检查
git commit -s)