Skip to content

fix(sync): 修复移动端详情消息缓存与同步时序 - #3338

Draft
DavidShenXD wants to merge 3 commits into
mainfrom
cindy/humble-thompson
Draft

fix(sync): 修复移动端详情消息缓存与同步时序#3338
DavidShenXD wants to merge 3 commits into
mainfrom
cindy/humble-thompson

Conversation

@DavidShenXD

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

修复移动端出现“列表已经有新消息,但进入详情仍显示旧消息”以及重开详情同步变慢的问题。Desktop 为消息变更维护持久、权威的版本号并提供原子同步快照;Mobile 缓存已覆盖版本,在订阅确认后对账,发现版本落后时合并触发补拉。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:移动端详情消息同步问题
  • 本 PR 包含:Desktop SQLite 消息版本与迁移、原子 messages:sync 协议、device-link 兼容与响应收口、Mobile 消息缓存和 known/covered 双水位同步
  • 明确不包含:增量消息合并、服务端改动、UI 视觉或文案调整
  • 用户可见变化:重开详情立即展示缓存并更及时地完成后台对账;列表与详情的新鲜度恢复一致
  • 是否存在 breaking change:无。新 Mobile 连接不支持新通道的旧 Desktop 时回退到 messages:list;旧 Mobile 的既有通道语义不变

UI 变化

不涉及:虽然调整了详情页的数据装载逻辑,但界面结构、样式、交互和文案均未改变。

  • 引用的设计规范:不涉及 UI 改动

怎么验证的

自动验证

pnpm test:unit:related
结果:通过;apps/desktop、apps/mobile、packages/device-link、packages/lizi-mcps、packages/maker-core、packages/maker-shared、packages/orca-workflow 均 PASS

pnpm --filter mobile run --if-present typecheck
结果:通过

pnpm --filter desktop run --if-present typecheck
结果:通过

pnpm --filter @cindy/maker-shared run --if-present typecheck
pnpm --filter @cindy/device-link run --if-present typecheck
结果:通过;两个 package 均无 typecheck script,按 --if-present 正常跳过

pnpm --filter desktop db:validate
结果:通过

pnpm --filter desktop test:migration-replay
结果:通过

pnpm check:dco
结果:通过;1 个 commit 已签名

手工验证

未执行 Mobile 实机或模拟器联调;本次通过协议、数据库迁移、缓存、store 和竞态相关自动测试覆盖核心行为。

未执行的验证

  • 未执行 Mobile 本地运行验证,因此没有 branch/worktree、Metro 归属与 __DEV__ build label 证据
  • 未执行全仓 pnpm test:unit;仓库提交门禁要求的是 pnpm test:unit:related,本 PR 已通过该门禁

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:消息缓存一致性与同步时序

影响与回滚

  • 影响范围:Desktop 本地消息写入会同步推进任务消息版本;Mobile 详情进入、重开和实时消息路径会基于版本对账。版本未变化时不传输消息正文,降低重开热路径成本。迁移只增加字段、索引与触发器,不删除已有数据
  • 回滚 / 降级方式:代码回滚后旧版会忽略新增字段;数据库新增字段和触发器可保留,不阻断旧查询。新 Mobile 在旧 Desktop 不支持 messages:sync 时自动回退到既有列表接口
  • 协议兼容:新通道为向后兼容扩展;旧通道保留,响应边界继续经过 allowlist 与压缩/清洗
  • 冷更新评估:无。未修改 Mobile 原生配置、原生依赖、config plugin、原生模块或其他 runtime fingerprint 输入
  • 存量插件影响:无

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s
  • UI 改动已在“UI 变化”说明;本 PR 不涉及 UI
  • 未提交凭证、令牌或授权文件
  • 已补充必要的 migration 元数据与测试;无需新增独立文档
  • 已确认测试结果并说明未执行项

@DavidShenXD
DavidShenXD force-pushed the cindy/humble-thompson branch 2 times, most recently from f914a5e to c9e6e38 Compare August 25, 2026 13:52
@DavidShenXD
DavidShenXD marked this pull request as ready for review August 26, 2026 09:34
@DavidShenXD
DavidShenXD requested a review from a team as a code owner August 26, 2026 09:34
@DavidShenXD
DavidShenXD marked this pull request as draft August 26, 2026 09:35
@greptile-apps

greptile-apps Bot commented Aug 26, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为桌面端消息状态增加持久化 epoch/revision 和原子同步快照,并在移动端引入 known/covered 双水位缓存对账,以修复列表与详情消息新鲜度不一致的问题。

  • 新增 SQLite 迁移、消息变更触发器及备份恢复后的 epoch 重置
  • 新增 allowlist 内的 local-db:messages:sync 协议,并保持旧 Desktop 的 messages:list 回退路径
  • 在 session topic 订阅确认后读取权威快照,使用消息 token 驱动缓存替换与后台补拉
  • 扩展超大消息响应的清洗、裁剪和兼容测试

Confidence Score: 5/5

当前改动看起来可以安全合并,未发现由本 PR 引入且具有现实可达失败路径的问题。

消息版本迁移、原子快照、订阅确认、缓存覆盖水位和旧版本回退路径形成了完整闭环;超帧裁剪仍保留可继续分页的历史入口,已检查的消息变更路径也能通过触发器和 token 对账收敛。

Important Files Changed

Filename Overview
apps/desktop/drizzle/scripts/0096_session_message_sync_token.ts 新增会话消息 epoch/revision 字段和覆盖插入、更新、删除及清空操作的 SQLite 触发器;迁移脚本具备列存在性保护。
apps/desktop/src/main/localDb/ipc/messages.ts 新增原子消息同步查询与合并后的 token 广播,并确保导入副作用发生在快照读取之前。
apps/desktop/src/main/device-link/dispatch.ts 将同步响应纳入消息清洗和超帧压缩逻辑,同时保留 reset 响应包装及裁剪标记。
apps/mobile/app/sessions/[sessionId].tsx 详情页改为订阅确认后执行 token 对账,并保留旧 Desktop 的列表同步兼容路径和历史分页入口。
apps/mobile/src/session/remoteSessionStore.ts 增加消息缓存 covered token 管理和同步窗口替换语义,使缓存新鲜度与 session 元数据版本分离。
apps/mobile/src/device-link/DeviceLinkContext.tsx 订阅调用新增远端 ACK 状态校验,继续通过按 owner 引用计数保护共享 topic。
packages/maker-shared/src/deviceLinkContract.ts 定义消息同步 token 与 reset/not-modified 协议,并加入移动端远程调用通道集合。

Sequence Diagram

sequenceDiagram
  participant M as Mobile 详情页
  participant L as Device Link
  participant D as Desktop
  participant DB as SQLite
  M->>L: "订阅 session:<id>"
  L->>D: subscribe
  D-->>M: subscription ACK
  M->>D: messages:sync(covered token)
  D->>DB: 单条查询读取 token 与最新消息窗口
  alt token 相同
    DB-->>D: not-modified
    D-->>M: token,无消息正文
  else token 不同
    DB-->>D: reset 快照
    D-->>M: token + 最新消息窗口
    M->>M: 替换缓存并更新 covered token
  end
  DB-->>D: 后续消息写入推进 revision
  D-->>M: sessions:patched(new token)
  M->>M: known 与 covered 不一致,触发再次对账
Loading

Reviews (1): Last reviewed commit: "fix(sync): 修复移动端详情消息缓存与同步时序" | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c9e6e381b9

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/mobile/app/sessions/[sessionId].tsx
@DavidShenXD
DavidShenXD force-pushed the cindy/humble-thompson branch from c9e6e38 to bd427b5 Compare August 26, 2026 09:48
@DavidShenXD

Copy link
Copy Markdown
Collaborator Author

反馈已处理

已处理:

  • 确认普通 message sync token 前进会误清除已加载历史;已将普通尾部追加与历史改写、删除等破坏性变更分开处理。

变更:

  • Desktop token 的同 epoch revision 前进现在只表示尾部追加;历史插入、更新、删除、rewind、clear 会更换 epoch。
  • Mobile 在同 epoch 向前同步时保留已验证连续的旧页;epoch 变化、无 covered token 或强制替换仍执行完整 reset。
  • 补充 migration token 语义与 Mobile token 判定回归测试。
  • 已提交并推送 d669ecf

验证:

  • pnpm --filter desktop exec vitest run src/main/localDb/__tests__/migrationReplay.test.ts:通过(7 项)。
  • pnpm --filter mobile exec vitest run src/__tests__/messagePaging.test.ts src/__tests__/remoteSessionStore.test.ts src/__tests__/scrollWindowModel.test.ts:通过(273 项)。
  • pnpm --filter desktop run --if-present typecheck:通过。
  • pnpm --filter mobile run --if-present typecheck:通过。
  • pnpm --filter @cindy/maker-shared run --if-present typecheck:通过(无对应脚本,正常跳过)。
  • pnpm test:unit:related:通过(7 个 workspace)。
  • pnpm check:dco:通过。
  • 未执行 pnpm test:unit:仓库要求使用关联单测门禁,本次已通过。

备注:

  • 已回复并解决对应 review conversation;未等待 GitHub 自动检查完成,状态以 PR 页面实时结果为准。

Signed-off-by: DavidShen <david@xd.com>
Signed-off-by: DavidShen <david@xd.com>
Signed-off-by: DavidShen <david@xd.com>
@DavidShenXD
DavidShenXD force-pushed the cindy/humble-thompson branch from d669ecf to 3bd9259 Compare August 27, 2026 05:55
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.

1 participant