perf(device-link): 按可见内容分页并按需读取工作详情 - #4081
Conversation
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 |
|---|---|
| packages/maker-shared/src/historyViewController.ts | 新增共享历史分页、展开详情、缓存及生命周期控制器;普通刷新会吞掉并发的旧页请求。 |
| apps/desktop/src/main/localDb/ipc/historyViewReader.ts | 新增基于可见项目和字节预算的 Host 历史投影及详情分页读取。 |
| apps/desktop/src/main/localDb/ipc/messages.ts | 注册历史视图、展开意图和工作详情 IPC,并校验会话范围锚点。 |
| apps/desktop/src/main/device-link/dispatch.ts | 根据每个控制端的历史视图状态抑制详情推送,并合并发送失效通知。 |
| packages/maker-shared/src/historyViewProjection.ts | 将思考和可延迟工具活动折叠成稳定、可恢复的工作摘要。 |
| apps/desktop/src/renderer/lib/makerChatStore.ts | 为远程 Desktop 会话接入共享历史控制器、兼容降级和定位流程。 |
| apps/mobile/app/sessions/[sessionId].tsx | Mobile 会话页切换到投影历史渲染,并接入后台暂停、分页和消息定位。 |
| apps/mobile/src/session/remoteHistoryView.ts | 新增按设备和会话隔离的 Mobile 历史控制器注册及 React 订阅封装。 |
Sequence Diagram
sequenceDiagram
participant C as Desktop/Mobile 控制端
participant V as HistoryViewController
participant H as 被控 Desktop Host
participant DB as SQLite 历史
C->>V: 打开远程会话
V->>H: messages:view
H->>DB: 按原始游标扫描
H-->>V: 正文 + 工作摘要
V-->>C: 渲染可见历史
C->>V: 展开工作摘要
V->>H: messages:view-intent
V->>H: messages:work-details
H->>DB: 分页读取完整范围
H-->>V: 详情页
V-->>C: 自动续读并渲染
H-->>V: history-view-changed
V->>H: 合并后的刷新请求
Prompt To Fix All With AI
### Issue 1
packages/maker-shared/src/historyViewController.ts:62-68
**旧页请求被吞掉**
普通刷新或失效刷新仍在进行时,用户触发的“加载更早”会直接复用现有 `pagePromise`,因此不会执行 `older=true` 的旧页读取。调用方在该 Promise 结束后仍按成功处理,但列表没有增加任何旧内容,用户只能再次操作。建议保留这一分页意图,并在当前请求完成后执行。
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.Reviews (1): Last reviewed commit: "perf(device-link): 按可见内容分页并按需读取工作详情" | Re-trigger Greptile
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: bda60c1d29
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
命中 UI 路径(apps/desktop/src/renderer/components/chat/MessageStream.tsx / apps/desktop/src/renderer/components/chat/WorkGroupBlock.tsx / apps/desktop/src/renderer/components/chat/messageWorkGroups.ts 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e7c1d7c74f
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@dashhuang 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/maker-shared/src/historyViewController.ts / packages/maker-shared/src/historyViewRender.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 76cfd360d1
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
76cfd36 to
6a18b1c
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6a18b1c4f9
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 2f8a9e9420
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1b7ea18ec2
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
@dashhuang 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/renderer/lib/makerChatStore.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: fee8b97497
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
fee8b97 to
8c4ec31
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8c4ec31a8b
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
4ccd274 to
379caff
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 379caff501
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
e1befcf to
6b43c9b
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6b43c9baa5
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5a4e058e08
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| return page; | ||
| }; | ||
| if (ref.liveMessageIds?.length) { | ||
| const live = await Promise.all(ref.liveMessageIds.map((id) => deps.anchor(sessionId, id))); |
There was a problem hiding this comment.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 952d8b886c
ℹ️ 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".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| entry.consumers++; | ||
| entry.view.setActive(active); | ||
| const authority = historyDiskAuthority(entry.deviceId, entry.sessionId); | ||
| void entry.view.restoreCachedView(() => readHistoryDisk(authority)); |
There was a problem hiding this comment.
当任务已有磁盘投影、随后因扫描超限或旧 Host 缺少通道而降级到原始历史时,当前 controller 虽会拒绝恢复缓存,但并不会清除这份磁盘数据;它被 8 项/4 MiB 内存 LRU 淘汰后,再次进入会创建一个 error=null 的新 controller,并由这里恢复旧投影。若此时 Host 离线或最新页只得到瞬态错误,恢复后的 ready: true 会一直让 SessionScreen 优先显示旧投影,遮住降级期间已同步的较新原始消息。相较此前同类修复,新的证据是该检查只绑定当前 controller,LRU 重建会丢失 unavailable 状态而磁盘条目仍然存在;应在能力降级时清盘或持久化不可恢复代际。
AGENTS.md reference: AGENTS.md:L136-L139
Useful? React with 👍 / 👎.
这次改了什么
摘要
补齐应用退出中断的持久告警同步:Host 按与本地中断查询相同的启动边界,在现有任务行附加可选
interruptedTurnStartedAt。手机和 Desktop 远程端共用判定,普通查看/已读确认不清红点;继续或忽略产生的 ended 更新、clear、归档或新一轮代次使旧告警失效。折叠项目和自动化分组同样展示并定位中断子任务。不新增查询、轮询或告警账本。将 Mobile 打开任务后的已读停留从 1.2 秒缩短为 0.2 秒,仍要求前台、当前连接代同步和内容渲染完成。手机与 Desktop 远程任务行共用 Desktop 的五档状态判定;自动化失败/中断未读显示红点,主动中止不计未读。手机组头展开时代表最新运行,收起时保留整组未读失败并打开对应运行。
Desktop 远程端从被控端已有轻量索引读取自动化未读,复用现有刷新队列;schedule 事件只读索引,不追加周期轮询。已读操作明确路由至任务所属设备,同值索引保留引用,迟到结果按原设备代际丢弃,撤销访问继续走原撤销路径。Mobile 切换抽屉显示期间读取相同的轻量索引,已读推送后刷新;结果仅用于抽屉,不覆盖首页完整绑定缓存,关闭后不提交迟到响应。自动化索引部分没有新增 wire 字段、持久缓存、轮询计时器或原生依赖;中断告警部分追加上述可选任务行字段。
共享可靠传输按接收端现有 16 槽限制首次发送,剩余消息留在原有有界 pending 中;累计 ACK 或合法前缀淘汰推进后立即释放未首发消息,避免 322 KB 级响应因接收槽满被拒后再等待尺寸退避。手机与桌面远程复用同一实现,保留大包重传间隔、控制 ACK 与 1013 物理帧预算。新增只在实际发出时记录的队头重传元数据,不含正文或请求参数。
修复远程流式正文与历史快照交接时短暂换位:同一 clientId 已有历史记录时,保留流式正文与状态,但使用历史 createdAt/rowid 排序,避免临时时间覆盖权威顺序。共享交接和渲染替换复用同一规则,Mobile 与 Desktop 远程同时生效,不修改原始 store 或持久数据,也不增加排序状态、缓存或传输字段。
修复 Mobile 历史列表已显示后仍绑定原生动画透明度的问题:定位成功或兜底完成后外层固定为 opacity=1,旧动画停止回调的迟到值不再影响后续键盘/布局重绘。切换任务仍重置首次定位保护。该路径能解释键盘开合后整块消息区保持空白,但尚无故障现场透明度日志,不能认定它是用户那次故障的唯一原因。
按需求方最新确认,Mobile 历史与全部媒体磁盘缓存不按总容量淘汰。取消历史 1 GiB、远程图片 150 MiB 默认上限,以及已发送图片本地副本的 64 条、8 MiB 文件准入和 7 天过期限制。视频和分享临时文件原本无总容量限制,保持原路径。手动清理功能留待后续;现有账号/任务清理、失败残留清理、内存及单次解析保护保留,不改变原生依赖或传输协议。
远程历史原先按原始消息翻页,一页可能全是已折叠的思考和工具记录。现在先读取正文和工作摘要,展开后自动续读详情;手机与桌面远程链接使用同一套读取逻辑。
保留原来的折叠层级:完成后的短旁白和连续工作放在一个外层摘要内,展开显示旁白及内层动作组;内层独立展开为思考和工具。纯动作只有一层工作组。读取边界不再直接生成界面分组,避免连续出现多个“已工作”。
修复 Desktop 远程任务与 Mobile 流式正文结束后的短暂消失:两端复用 maker-shared 的 HistoryViewHandoff 和渲染交接规则,仅适配各自的 streaming 字段。当前视图只记录已观察到的实时回复身份,生成结束和持久化推送后继续使用原始消息镜像,直到历史快照按 clientId 接管;接管后只显示一次,普通旧缓存行不会补回。移除 Mobile 独立实现,本地 Desktop 保留原路径。
修复手机重进已访问任务时重新 loading,以及运行中任务内容未变却上下跳动:普通聚焦/回前台只恢复读取,不再清空历史;复用已有历史控制器,离开页面后最多保留 8 个视图、约 4 MiB 序列化估算的内存缓存,后台核验期间继续显示内容。相同历史响应的项目与数组引用复用放在共享控制器中,Desktop 同样受益。缓存接入原账号/设备清理、任务删除/归档、回退、定时任务回收与正文预算淘汰边界;内存淘汰不删除下述磁盘缓存,不改变传输协议。
手机历史消息首次定位确认到位后立即显示,取消原先固定 300ms 隐藏再 100ms 淡入;300ms 原生动画只保留为直接显示的上限兜底。复用原 tail follower 的实际位置校验,任务切换清理旧回调;不新增滚动循环,不改变手势、流式正文或传输逻辑。
iOS 向上翻历史时,在原有距顶部约两屏的预取区直接发起加载,不再等拖动、触摸或惯性结束;沿用 native MVCP 保持阅读位置。Android 的手动锚定仍等待手势安全点及 MVCP 切换提交。没有新增缓存、并发请求或重试机制,Desktop 无同类手势等待,不修改其路径。
按需求方确认,Mobile 增加不设总容量上限的历史磁盘缓存,内存仍只保留近期视图。已加载的历史页和完整详情以独立文件保存,启动仅读取元数据索引,按需读取当前任务正文;不设时间过期或总容量淘汰。按区域、账号、设备和任务隔离,登出/切换账号、移除设备、删除/归档、回退时清理。旧读取、旧计时器和旧写入不能恢复已清理内容,电脑的新结果优先;运行中标志与未完成详情不恢复为重启状态。使用已有文件系统依赖,无原生或 fingerprint 改动。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
Desktop 工作详情重试复用标准 secondary Button 的 pill 边框、主题、hover/pressed/focus 与禁用状态;Mobile 工作详情重试复用现有 MessageListActionButton 与 payload 按钮边框/文字样式,最小触控区域 44×44,沿用按下、禁用、无障碍与 reduced-motion 行为;引用 DESIGN §5 和 design-governance §13,不改内外层展开。
引用的设计规范:
docs/design-rules/DESIGN.md§2 Color Palette & Roles、§10 Theme System & Token Reference / 双模式交付门槛。复用现有工作组、加载与重试组件和语义主题颜色;没有按设备型号或屏幕尺寸划分读取策略。Desktop 运行组保留最近 5 条活动预览;Mobile 仍只显示折叠标题。工具参数/结果自己的展开入口、真正的子 Agent 层级,以及 Workflow 等既有平台差异保留。
历史消息显示遵循
docs/design-rules/DESIGN.md§14.4:取消无必要的旧内容淡入,保留首次定位保护;不改主题颜色与布局。未提供实机截图;Light/Dark 目检尚未完成。
异步生命周期与收敛不变量
满 20 个完整可见项即停止扫描,把更早的超大工作组留给下一页;不改变分组完整性或旧页超预算降级。
终态外层重分组按真实首消息边界识别重叠,保留此前加载的完整旧前缀与游标;无可信重叠仍替换,不通过内部任意交集保留旧内容。
两端订阅 ACK 恢复要求读取 ACK 后的新页:若已有旧页在途,沿 controller 原等待队列在其结束后补读,重复恢复合并,停用/换代不补读;不 reset 展开集合,不新增队列或状态字段。成功页沿原路径重发展开兴趣。Mobile 页面及后台重建、Desktop 订阅恢复均接入,包括尚未 ready 的首屏。
liveMessageIds 校验与 Host 投影共用既有 2000 行扫描上限,生成的引用可由详情端接受;单页字节预算与逐条归属检查保持,超限输入仍拒绝。
Mobile 删除成功回调与入站删除推送统一经 removeMessages:先移除原始镜像,再沿既有 resetRemoteHistoryViews 作废投影与旧代请求;移除 route 中重复的删除 reset。即使推送丢失、内存 raw 中没有被删行,可靠成功返回也会清除旧投影,其他设备同名任务不受影响。
磁盘快照只清除摘要/预览与消息 agentMeta 顶层的运行中标志,递归覆盖内层项目和完整详情;正文、工具输入、卡片及嵌套业务元数据中的同名字段保持原值,源快照不修改。原有预算检查仍先于复制与序列化。
思考快照跨普通 turn 收尾保留,直到原持久化队列成功写入;写入失败仍可读取。账号失效、clear、会话清理及 Pi 历史分支重投影成功后沿同一显式清理入口回收,redacted 仍立即撤回。旧写回调不能清除替代快照,不新增缓存、重试或状态字段。
历史投影扫描最多累计 2,000 条源行、8 MiB 序列化内容,运行中的来源也计入;超预算不拆分工作摘要,而是使用既有原始窗口读取。Host 作废当前订阅身份、恢复旧推送;双端沿既有同步入口补齐原始镜像,覆盖首屏、旧页、定位及自动刷新。降级沿现有错误状态保持到 reset,不新增部分摘要、数据库聚合或缓存管理器。
Host 在成功读取首屏后登记全部运行中工作组;任一运行组展开即可沿既有会话级路径接收详情,全部收起时恢复过滤。新页替换运行组列表,旧订阅迟到结果仍不能复活状态;无新增 wire 字段或逐事件分组机制。
ask/plan 决策通过原持久化队列写入后,沿现有 owner scope 广播权威消息行,两端原 created 通知刷新投影;不再依赖下一轮活动消除旧待处理卡片。
搜索/深链沿用原 UI 的折叠摘要定位,目标范围读取不修改内外层展开记忆,也不订阅隐藏活动。停用、换源或范围 revision/端点变化作废成功和失败;当前完整缓存优先于预览,同 revision 的不完整后台分页不覆盖完整范围。
历史读取复用现有 IPC 错误码:参数/游标越界 INVALID_PARAMS、消失的范围 NOT_FOUND、扫描不前进 INTERNAL,无新协议或恢复机制。
Desktop/Mobile 共用的交接记录仅保存当前视图已观察到的 assistant 身份,不复制正文、不持久化。首次历史加载期间保留交接;原始镜像移除消息、历史 reset 或更换视图会清理;新历史包含已落定的同 ID 行时释放。只有这些明确身份可绕过历史尾部时间门,普通缓存行维持原规则。
删除、清空和归档是历史窗口的重置边界:清除已加载旧页与详情,并作废旧代响应;清空同时清理原始消息镜像,防止刷新失败时回退显示旧内容。普通元数据更新不重置。空详情兴趣沿原通知队列发送,不再被视图尚未 ready 拦下。Desktop 删除复用既有删除 reducer,clear 复用 reloadMessages;Mobile 复用已有窗口清理和 controller reset。
与主干连接恢复诊断兼容:历史读取返回是否实际接受快照,刷新后已过期、后台或换源的读取记录为失效;旧 Host 降级仍按原 store 提交结果记录。保留主干推送失败汇总、session patch 清理和本 PR 的历史失效通知清理,不扩大断链恢复范围。
Desktop 远程历史保留当前 store 内尚未落库或被插件拦截的用户气泡,按原消息顺序合入,不受两端时钟差影响。已有 source ID 与正文优先;普通持久用户行不作为临时气泡补回,清理和回退仍由原 store 管理。Mobile 沿用独立的待发送气泡路径。
Mobile 前后台监听器随当前设备/任务重新绑定;换源后进入后台停止新来源的详情读取,回前台恢复新来源。旧分页完成只有在 controller 仍为当前登记且 active 时才更新错误提示,防止旧来源覆盖新页面。
Host 保管原始完整历史;共享 controller 保管可见投影、展开集合、详情与分页。平台原有 builder 负责最终层级。新增轻量子项和预览引用复用现有详情端点,不增加独立缓存、重试管理器或尾读接口。
有效页请求按代际和方向合并;旧代成功、失败、超时、取消和迟到结果均不能回填新代。展开详情自动续读,收起、离开、后台与重置停止后续读取。失败保留可用内容并提供重试。
详情按 revision 更新;当前源行优先于旧详情缓存,缓存按当前引用首尾裁剪,防止媒体结果出现后分组拆分时重复或吞掉内容。含可见内容的混合工具段及真正子 Agent 树保留源行,由原 builder 处理,优先保持原有分组语义。
控制端换源后创建对应 Host 的 controller,所有旧页面/详情回调失效;原有意图队列随同一登记槽交接,保证旧展开、旧释放、新展开的顺序,覆盖 A→B→A、移除后重建和旧意图失败。新 Host 的页读取不等待旧 Host 的意图确认。
Host 过滤仅属于当前控制连接的当前订阅,首次成功读取新接口才启用;断链、取消订阅、撤权和重新建链清理旧登记,迟到操作不污染新连接。未升级控制端保持完整旧路径。
计划发现沿用 Desktop 原空闲发现预算;首拉接管后清理临时冷缓存,回收或移除的 controller 不再补读或回填。Mobile 不新增后台计划扫描。
怎么验证的
自动验证
中断告警补充:Host 序列化/启动边界及 Desktop 单行和折叠状态共 58 项定向测试通过;Mobile 状态 9 项、共享兼容/分组代次 2 项通过。Desktop/Mobile typecheck 通过,maker-shared 无 typecheck script。相关单测门禁通过(清除继承的区域与 NODE_ENV 变量)。
状态与已读对齐(
f5caf4c7f):根pnpm test:unit:related最终全部相关包通过(Desktop、Mobile、device-link、lizi-mcps、maker-core、maker-shared、orca-workflow);Desktop 与 Mobile typecheck 通过,maker-shared 无 typecheck script。测试前清除 CINDY_AUTH_REGION、VITE_CINDY_AUTH_REGION、NODE_ENV。新增覆盖失败/中断与主动中止、组头展开/折叠和点击目标、远程读确认路由、同值索引不重复发布、断线迟到结果、撤销访问、抽屉响应跨端已读及轻量查询不覆盖首页绑定缓存。首次 Desktop 单项本地 WebSocket 握手出现 HTTP 426;该文件单独 14 项通过,最终整包通过,没有修改无关语音实现。未安装日常实例,双端实机与 Light/Dark 未验证。共享发送窗口(
0db63417f):device-link 全包 290 项通过,覆盖 16 槽后的大响应本地等待、ACK 立即放行、18 秒慢包不重复发送、满 socket 本地排队、窗口外超时 skip、前缀淘汰和多 peer 隔离。device-link build、Mobile/Desktop typecheck、根pnpm test:unit:related全部通过;运行前清除继承的区域与 NODE_ENV 变量。没有安装到日常实例,也没有本次实机弱网验证。流式文字顺序:Mobile history handoff/render 18 项、Desktop remoteHistoryHandoff 3 项通过。新增用例经过真实 Mobile builder,覆盖旧临时时间、历史先到、正式推送后到三个阶段始终 A→B,流式正文优先、权威时间/行号保留及不修改输入;同时覆盖不经过 handoff 的渲染入口。双端 typecheck 和根
pnpm test:unit:related全部相关包通过,测试前清除继承区域与 NODE_ENV 变量。复现与修复验证均为模拟集成,没有实机现场时间戳证据;未安装日常实例或做实机弱网验证。ACK 与实时范围回归:共享 40 项(在途成功/失败、停用、降级、展开保留、重复请求及终态重分组前缀保留),Host 40 项(真实投影生成 101/2000 条 live 引用后完整读取,2001 拒绝),Mobile 实际恢复回调 18 项、Desktop hook/store 37 项通过。Host 满页停止和扫描保护 15 项通过。根
pnpm test:unit:related、双端 typecheck 均通过;接入0db63417f后统一 runner 完整通过(运行前清除继承区域变量,GATE_EXIT=0)。29 个提交 DCO 检查通过。列表透明度交接:messageFollowGesture、messageListVirtualization、messageTailFollower 共 74 项通过,新增测试执行生产揭示回调及透明度表达式,模拟 stop 迟到写回 0、键盘高度变化后保持 1,以及新任务重新使用首次定位值。Mobile typecheck、根
pnpm test:unit:related全部相关包通过,清除继承区域与 NODE_ENV 变量后执行。测试模拟原生迟到值,不代表实际 RN 原生解绑或实机键盘验证;未安装日常实例,Light/Dark 实机未验证。遵循 DESIGN.md §14.4,沿用现有样式,无颜色或布局变化。取消磁盘容量淘汰:historyDiskStore、remoteMediaDiskCache、sentAttachmentThumbStore 定向 46 项通过,覆盖超过旧总量仍保留、重建索引读取、65 张图片及 30 天旧副本保留、失败和孤儿清理。大容量通过注入文件元数据验证,未实际写入 GiB 文件。Mobile typecheck 和根
pnpm test:unit:related全部相关包通过;清除继承的 CINDY_AUTH_REGION、VITE_CINDY_AUTH_REGION、NODE_ENV 后执行。未安装日常实例或进行实机验证。删除可靠返回与推送的真实 store/controller 回归覆盖 ready/初始页迟到、同名任务设备隔离与随后正确刷新;三文件 283 项通过。原 route 提取测试的删除场景由该真实路径覆盖,clear/archive 场景保留。Mobile 类型检查、相关全包与清除区域环境变量后的统一全量门禁均通过(GATE_EXIT=0)。
磁盘字段保真回归:Mobile 磁盘缓存、存储和重进共 38 项通过;覆盖嵌套工作组、预览、完整详情、业务同名字段及源对象不变。Mobile 类型检查、相关全包门禁及清除区域环境变量后的统一全量门禁均通过(GATE_EXIT=0)。
思考快照交接:持久化回归 130 项通过,包含延迟写入跨终态 reset、失败保留与 owner/clear/session/tree 清理、旧写迟到不删除替代快照及 redacted 立即撤回。独立只读复核通过;根相关门禁、Desktop typecheck 和清除区域变量后的统一全量 runner 均通过(GATE_EXIT=0)。
主干冲突同步:重基到
10928e638,仅手工合并 Mobile 测试依赖与并列用例,保留主干 Debug off/on/failed 和本 PR 历史定位显示回归。定向 43 项、双端 typecheck、21 个提交 DCO 与统一全量 runner(GATE_EXIT=0)通过;根pnpm test:unit:related复跑全部相关包通过。首次 related 的 iOS Simulator 文件锁单项失败,相关代码与主干相同,同一最终代码的全量 Desktop 随后完整通过;未修改该无关实现。临时基线单项因依赖加载失败,未获得有效复现结论。缓存边界与 Windows 修复:Mobile 磁盘/恢复/重进 37 项,Desktop LF/CRLF 回调 8 项通过;相关全包、双端 typecheck、统一全量 runner 完整通过(GATE_EXIT=0),运行前清除继承区域变量。Windows 原失败已定位为本 PR 新测试的换行提取问题,未修改生产 Windows 行为。
1 GiB 磁盘缓存:historyDiskStore、remoteHistoryDiskCache、remoteHistoryReentry 共 32 项通过;覆盖重建 store 后读取、UTF-8 字节预算和 LRU、超大单项、账号隔离、回退后的迟到写入、损坏缓存、删除/索引写入失败、磁盘与网络乱序及停用/reset。Mobile typecheck、根
pnpm test:unit:related全部相关包通过,执行前清除继承的区域与 NODE_ENV 变量。合入并行修复2b85eb846后再跑 Mobile 四文件 41 项、共享历史 34 项及 Mobile typecheck 均通过。尚未安装到日常实例,未做实际 1 GiB 数据量或实机重启验证。扫描预算 Host 23 项、共享历史 34 项、实际双端降级回调 4 项通过;覆盖无边界超长轮次、字节与 live 预算、旧订阅迟到、首屏/旧页/刷新、停用及旧 Host 不触发循环。相关全包与双端类型通过;页面接线断言补入 requestSync 后 9 项通过。统一全量门禁首次因锁排队超时退出(75,单测未开跑),确认结束后重新排队完整通过(GATE_EXIT=0)。
iOS 提前预取(
0f401f464):pnpm --filter mobile exec vitest run src/__tests__/messageHistoryAutofillCallbacks.test.ts src/__tests__/messageListVirtualization.test.ts src/__tests__/messageFollowGesture.test.ts58 项通过,新增实际生产回调测试覆盖拖动/惯性/触摸期间启动、重复调用合并、取消后不启动及 Android 的手势/MVCP 提交屏障。Mobile typecheck 与根pnpm test:unit:related全部相关包通过;运行前清除CINDY_AUTH_REGION、VITE_CINDY_AUTH_REGION、NODE_ENV。未安装到日常版本,无本次实机滚动/弱网验证,不能保证任意网络下无等待。历史消息直接显示(
7ed5b83b7):pnpm --filter mobile exec vitest run src/__tests__/messageTailFollower.test.ts src/__tests__/messageFollowGesture.test.ts src/__tests__/messageListVirtualization.test.ts共 70 项通过;Mobile typecheck、scope/smoke 和根pnpm test:unit:related全部相关包通过。测试前清除CINDY_AUTH_REGION、VITE_CINDY_AUTH_REGION、NODE_ENV。覆盖真实定位后提前显示、重试耗尽不误报、用户拖动、reset 和重复通知。未安装到手机,未做本次修改的实机目检。多运行组推送回归 49 项通过,覆盖仅展开后续组、组列表替换、收起、空运行组、旧端和实际 thinking delta 转发;Desktop typecheck、相关全包门禁和清除区域环境变量后的全量统一 runner 均通过(GATE_EXIT=0)。
重进与位置稳定性修复(
5bb859454):新增 15 条回归通过,包括运行中任务每次刷新通知的完整渲染内容/列表标识稳定、缓存重进、迟到响应、后台回收、账号/设备清理、回退、删除/归档和容量边界。Mobile 相关 4 个测试文件合计 279 项通过(末次新增运行中场景后单独重跑该文件 15 项通过)。两端 typecheck、Mobile scope/smoke、最终同一工作区的pnpm test:unit:related全部相关包通过。初轮 Desktop 7 项失败发生在另一轮接口/测试修改过程中,当前文件重跑 8 项通过,最终整轮 Desktop 也通过。本次未安装手机或重启日常实例,尚无修改后的实机滚动/弱网验证。本轮三类审查修复:Host 读取错误码 11 项、交互持久化/权威行广播 124 项、共享历史与定位 31 项定向通过;包括已挂载/旧页挂载折叠组、预览外定位、失效后迟到成功/失败、完整范围与部分分页交错。相关全包门禁与双端 typecheck 均通过;清除区域环境变量后,全量统一 runner 完整通过(GATE_EXIT=0)。此前一次因内部排队超时退出、未执行单测;确认旧进程结束后重新排队,本次完整通过。
全量
pnpm test:unit经统一 runner 执行,补齐破坏性历史推送与详情兴趣清理后完整通过,GATE_EXIT=0;运行前清除CINDY_AUTH_REGION和VITE_CINDY_AUTH_REGION。首轮 Desktop 进程出现 SIGSEGV、无断言失败,经统一 runner 自动复跑通过。根目录
pnpm test:unit:related:本轮全部相关包通过。Desktop 控制端场景 33 项、Mobile 实际回调场景 18 项通过:删除已翻到的旧页、远程 clear、归档停止、初始旧页迟到,以及普通元数据不重置。共享 23 项含 active/inactive reset 在替代页未就绪前发出空详情兴趣。
直接执行合并后的实际历史读取回调,验证成功、后台、换源、过期、读取失败、旧 Host 降级、原始路径及 store 拒绝提交,共 10 条路径通过。
共享历史投影/渲染回归 23 项通过,包含待发送与被拦截气泡、时钟偏差、原顺序、落库正文优先与回退/清除不复活。
pnpm --filter desktop --filter mobile --filter @cindy/maker-shared run --if-present typecheck通过;maker-shared 没有 typecheck script。执行实际 AppState effect 验证 A→B 后后台停止 B、前台恢复 B 和监听器解绑;实际分页回调验证当前来源正常更新、换源和停用后丢弃迟到更新,均通过。
折叠回归 13 项:层级与稳定标识、纯动作、空思考、迟到工具结果、媒体、真实子 Agent、内外层独立展开、自动续读和 Desktop 有界预览。
Desktop 控制端、展开状态和推送定向回归 55 项;包含换源、ABA、旧意图失败与相同组件 key 更换 controller。
Host invoke 安全回归 40 项;含嵌套历史的敏感字段过滤、payload 上限及不修改原始行。
本地真实 171 行历史分别比较折叠结构与完整加载后的内容树,均与原 builder 一致;原始数据未提交或上传。
现有共享并发、Host 详情读取、旧端降级、重连、冷缓存和计划发现测试继续由相关及全量门禁覆盖。
git diff --check通过。上一提交
379caff5的 Linux、Windows、verify 和 Git 集成 CI 全部通过;本轮修复发布后需重新等待 CI。流式交接补充验证:Mobile 交接与折叠定向测试 16 项通过,覆盖首次历史未到、生成结束、持久化推送、旧历史页返回、最终历史纠正与去重、删除/回退和较早的时间锚。Mobile typecheck 及 Mobile scope/smoke 通过;maker-shared 没有 typecheck 脚本。额外执行 build:原历史测试的类型推断错误已修复;剩余 7 项错误在干净 origin/main 源码副本上同样复现(brandIdentity、composerPalette 测试与 workRunGrouping 的 ES lib 配置),没有改动这些无关文件,不能宣称 build 全绿。相关门禁在新增交接修改后重新运行,Desktop、Mobile、device-link、lizi-mcps、maker-core、maker-shared、orca-workflow 全部通过。
共享交接补充验证:Desktop 实际 buildRenderItems/groupWorkRuns + 共享 controller/renderer 集成测试 3 项、Mobile 交接与折叠测试 16 项通过。覆盖首屏加载期间结束、旧页迟到、持久化改 ID、clientId 接管去重、删除/reset/换源不复活,以及 Desktop 待发送用户气泡保留。两端没有分别新增缓存、计时器、重试或传输协议。
CI 台账同步:新增
projectScheduleSidebarIndex.ts后重新生成设计台账,仅更新 GENERATED 文件清单,人工状态及产品代码不变。修复 verify-checks、Git 集成和 Windows 预检共同报告的台账过期错误。定向台账测试与双端类型检查通过;相关单测全部通过,统一全量门禁GATE_EXIT=0。实时详情落库交接:共享渲染器的首尾边界仅对
history-live:引用按 clientId 兼容持久消息 ID,普通数据库 ID 仍严格匹配。完整详情和预览共用该判据,不改 Host 返回身份、原始消息或展开状态。44 项共享回归通过,覆盖纯实时、混合、预览、前后缓存裁剪与普通 ID 不误匹配;独立只读复核无新增问题。同步主干时仅设计台账发生冲突,沿生成器保留最新主干与 PR 的文件清单。双端类型检查与统一全量门禁GATE_EXIT=0通过,相关单测全部通过。就绪切换的推送衔接:Host 在已有历史登记尚未 ready 时也沿原 history notice 通知,仍完整透传 raw;过滤继续严格等 ready。两端原 invalidate 等在途页结束后补读,复用既有通知合并和 pagePromise,不新增状态字段、队列、wire 或 consumer 分支。52 项 Host 回归含真实 controller 两种通知/结果先后顺序、pending raw、ready 折叠 delta 静默、旧端和断链/退订/降级不复活。Desktop 类型检查、相关单测及统一全量门禁
GATE_EXIT=0通过。故障半径限该 peer/session 的既有登记,不重连共享链路;回退此修改恢复原通知时机。手工验证
完成代码和异步生命周期自审。交接身份记录已获需求方明确确认。本轮未启动开发版或操作实机。
未执行的验证
手机/桌面真实远程连接、弱网耗时、超长详情滚动表现、Light/Dark 实机目检未完成。没有 Metro 归属或
__DEV__build label 证据。自动化结构对比不等于实机体验验收。风险
风险分类
影响与回滚
中断告警字段为追加可选元数据:旧 Host 缺失时保持旧显示,旧控制端忽略它;要获得本次一致体验需升级 Host 与控制端。沿已有 sessions patch 同步,不改数据库 schema、ACK、权限或 relay 协议。未安装日常实例,尚无本次修复后的实机重启/弱网和双模式验证。此补充只处理现代中断标记,不宣称覆盖独立的历史 error-tail 告警来源。
状态对齐故障边界:单设备自动化索引不可用时保留已有显示,不影响任务历史读取或其他设备;旧 Host 不支持已有轻量索引时不使 bootstrap 失败。首页完整绑定索引与抽屉轻量运行状态用途不同,不能互相覆盖。回退本次状态提交恢复原判定和 1.2 秒停留。未改远程自动化的编辑/暂停/删除入口,未安装日常实例、未做实机双端或 Light/Dark 验收。
发送窗口故障半径:触发问题是单 peer 的有序接收积压;限制与恢复仅作用该 peer,沿原 pending/ACK 推进,不重启共享 relay。多 peer 用例覆盖一方停止 ACK 时另一方仍可发送。无新 wire 字段、消息类型、状态缓存或计时器,旧可靠端沿原 ACK 兼容;回退此提交恢复原首次发送调度。后台扫描与任务列表 DTO 保留现有实现,本轮不调整字段或订阅语义。
按已确认需求保留无总容量/过期淘汰;长期磁盘占用会增长。已发送附件底图位于 documentDirectory,不承诺由系统按 cache 回收,也未新增任务/账号级删除机制;手动清理仍属后续范围。不能将历史快照已有的账号/任务清理边界泛化为全部附件副本。
磁盘单项使用 8 MiB 保守序列化准入预算,磁盘总量不设上限;超额跳过该份缓存,阅读与原始历史不变。普通 wire JSON 在 stringify/Map 数组化之前按字符串长度、字段和容器开销提前停止计量;离场内存计量复用同一无状态检查,避免整快照复制。预算是保守上界,部分实际不足 8 MiB 的内容也可能不缓存。已知不可用状态及读取期间发生降级时均禁止恢复旧磁盘投影;保留原代际、账号与清理边界。
Mobile 历史正文保存在应用私有 cache 目录,普通重启可复用,系统存储紧张时可能回收。不设置磁盘总容量上限;原子替换期间的临时文件及索引也会占用空间。缓存失败降级为在线读取;回退代码停止读写此目录,系统可继续回收。缓存只影响展示,不替代服务端授权或同步确认。
超大轮次超过投影扫描预算时退回旧窗口体验,不承诺这类历史获得完整可见分页优化。预算限制累计扫描与处理量;单次数据库仍按原接口最多返回 100 行,单条/单批巨型正文可能瞬时超过字节预算,不能将其宣称为进程总内存上限。完整历史、详情和模型上下文不变。
影响范围:新版远程控制端与 Host 的历史读取和活动推送。新增接口使用既有隧道,不新增 relay kind;不改原始历史、模型上下文与授权语义。存量插件影响:无。
回滚 / 降级方式:回退本 PR 恢复原消息读取和推送;不支持新接口的旧 Host 自动走旧路径,旧控制端不启用过滤。无需数据库迁移或重新登录。
性能边界:超大正文保留现有 wire 压缩兜底;展开超长工作段会自动读取完整详情,revision 改变时重读。可见混合工具段及真正子 Agent 树保留原始读取,实际弱网性能仍待测量。
提交前检查
git commit -s)