Skip to content

fix(mobile): 修复发送消息触发历史重排跳动 - #3940

Merged
MagicLizi merged 2 commits into
mainfrom
dash/fix-mobile-send-history-jump
Sep 5, 2026
Merged

fix(mobile): 修复发送消息触发历史重排跳动#3940
MagicLizi merged 2 commits into
mainfrom
dash/fix-mobile-send-history-jump

Conversation

@dashhuang

@dashhuang dashhuang commented Sep 4, 2026

Copy link
Copy Markdown
Member

这次改了什么

摘要

修复手机点击发送时,上一轮已折叠的工作过程被重新展开、随后又折回,导致消息列表位置跳动的问题。发送和排队状态只驱动输入区反馈,消息分组使用远端回复状态;已收到结束标记的内容保持完成态,仅后续内容进入进行中分组。

变更类型

  • fix 缺陷修复

范围

  • 关联 Issue / 需求:手机点击发送后立即跳向上方聊天信息的反馈。
  • 本 PR 包含:手机消息分组状态拆分;共享分组尊重回复结束边界;手机流式缓存遇到结束边界时重新计算旧分组;发送、状态先到、缓存收尾、继续输出和后台子 Agent 回归测试。
  • 明确不包含:滚动动画重写、键盘布局改动、原生依赖或配置变更。
  • 用户可见变化:发送新消息时,上一轮已完成的工作过程保持折叠;真正进行中的过程消息与后台子 Agent 继续显示活动状态。
  • 是否存在 breaking change:无。

UI 变化

修复消息列表的状态过渡,不新增界面、颜色或文案。

  • 引用的设计规范:docs/design-rules/DESIGN.md §8 Mobile 保持现有布局,§14.4 避免无意义位移;§10 沿用既有主题样式。Light/Dark 实机目检未执行。

怎么验证的

自动验证

pnpm test:unit:related
结果:6 个相关 workspace 全部通过(包含 Desktop/Mobile 完整单测)。

pnpm --filter mobile run --if-present typecheck
pnpm --filter desktop run --if-present typecheck
结果:通过。@cindy/maker-shared 无 typecheck script,--if-present 正常跳过。

pnpm --filter @cindy/maker-shared exec vitest run src/__tests__/messageRender.test.ts
结果:68 项通过。

pnpm --filter mobile exec vitest run src/__tests__/messageRenderModel.test.ts src/__tests__/messagePerformance.test.ts src/__tests__/subagentGrouping.test.ts src/__tests__/sessionComposerDesktopFirst.test.ts
结果:68 项通过。

node scripts/hardcoded-color-audit.mjs
pnpm check:dco
git diff --check
结果:通过。

完整单测: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:relatedrun-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。完全没有结束标记的旧消息,仍依赖远端运行状态与新用户消息边界;本地发送/排队已不再使其进入进行中分组。
  • 回滚 / 降级方式:回退本 PR;无持久数据、schema 或原生 fingerprint 改动。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s
  • UI 改动已注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(行为不变的 bugfix,代码注释与回归测试记录边界)
  • 已确认测试结果或说明未执行原因

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang requested a review from a team as a code owner September 4, 2026 22:42
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 4, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-04T22:59:36.596735Z 5671577 New commits
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 将输入区的本地发送/排队反馈与消息列表的远端流式状态拆开,并让共享消息分组和移动端流式缓存尊重持久的回复完成边界,从而避免发送下一条消息时重新展开上一轮已折叠工作。

  • 消息列表分组只由远端运行状态或当前轮流式状态驱动。
  • 已完成回复之前的工作继续按完成态折叠,完成边界后的内容仍可按活动态展示。
  • 流式前缀在收到完成标记、费用或 token 用量结束信号时重新计算。
  • 新增发送过渡、同轮继续输出、缓存失效和后台子 Agent 等回归测试。

Confidence Score: 5/5

未发现由本 PR 引入的可操作问题,当前变更看起来可以安全合并。

本地发送状态与远端消息分组状态的拆分保持了输入反馈,同时避免重新激活已完成历史;完成边界、缓存引用校验和后台子 Agent 状态之间未发现破坏现有契约的路径。

Important Files Changed

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: 仅后续内容显示为活动态
Loading

Reviews (1): Last reviewed commit: "fix(mobile): 发送新消息时保持已完成回复分组稳定" | Re-trigger Greptile

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@MagicLizi MagicLizi added status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) and removed status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) labels Sep 4, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 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 MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

代码重审通过:当前 head 未发现 P0/P1,全部 conversation 已 resolve。发送时历史分组不再跟着重排跳动。

@MagicLizi
MagicLizi merged commit fb3d5c0 into main Sep 5, 2026
20 of 21 checks passed
@MagicLizi
MagicLizi deleted the dash/fix-mobile-send-history-jump branch September 5, 2026 02:23
@MagicLizi

Copy link
Copy Markdown
Contributor

合了。发送那一下历史不再跟着跳,消息分组终于跟手势对齐。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants