Skip to content

fix(chat): 保留切换范围时的委派阅读内容 - #7966

Merged
huangruiteng merged 1 commit into
mainfrom
codex/frontend-backlog-actual-20261103
Nov 3, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/frontend-backlog-actual-20261103

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

切换“待跟进 / 全部记录”时,当前列表会先变为空白骨架屏,读完后才重新出现。本改动在同一管家来源切换范围时保留已核验列表,页签和数量继续描述当前显示内容,目标页签显示读取状态;新结果完整核验后一起切换。

搜索、来源变化和读取失败仍清空旧内容;取消、反向切换和迟到响应保留 generation/abort 防护,关闭后重开仍从待跟进开始。兼容显式 Session 和现有 owner fallback;fallback 解析到不同来源时先清空。没有增加授权、后端缓存或超时豁免。

验证:

  • npm run build:TypeScript、Vite 和 packaged Chat bundle 校验通过;现有 chunk size warning 保留。
  • LOOPX_REQUEST_STORAGE=sqlite npm run smoke:delegation-search 与 LOOPX_REQUEST_STORAGE=file npm run smoke:delegation-search 均通过。保留原搜索、分页、长原文、损坏日志、来源拒绝、部分/最终回传与读取无新增 Turn 检查;新增真实响应延迟、旧列表/数量/页签一致、反向取消、失败恢复和中断后重开断言。
  • Ego 实测 packaged Chat + 真实隔离 SQLite HTTP owner,63 条合成委派、两个接收者;1440px / 390px、中英文、长详情、失败重试。等待期间保留 12 / 62,完成后切换为 12 / 63;窄屏无横向溢出。公开边界扫描 3 文件无错误/警告,git diff --check 通过。

首屏与交互证据(tested source 12a8be75924b0f2c8c966aa2f75dd4f10f276b58;两份产品源文件与构建清单的 SHA256 一致)。以下全部来自合成数据;将真实 HTTP 响应暂缓交付以观察等待状态,没有测量或宣称延迟收益。构建产物通过隔离服务加载,尚未合并、安装到用户 App 或证明原有后端长等待已解决。

切换前的行为:当前内容被清空 修复后:保留当前内容并标记目标正在读取
切换范围时的空白骨架屏 等待时仍能阅读当前委派
390px:列表、范围与数量可读 展开详情:原地阅读与固定分页
390px 等待视图 展开委派详情

读取失败后清空旧内容,明确数量未知,并提供重试:

读取失败与重试

范围说明:本 PR 修复读取等待时的可用性。后端慢读和大型原对话读取失败仍需分别归因、修复与真实宿主验收。本地完整浏览器回归已通过;未运行全仓 canary / 实际 App 安装验收。局部改进复用既有读取 owner,没有新增共享状态或协议 vocabulary;语义检查不支持这些 TSX 形态,空报告不代表完整语义覆盖。只提交两份产品源码与现有 smoke,截图和一次性诊断不入仓。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

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

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

未发现阻塞 finding。评审精确头为 12a8be75924b0f2c8c966aa2f75dd4f10f276b58,实际 PR merge-base 为 0095109a2f7e3a022887fd31e87c36476febfa05;后来的目标分支历史不计入这三个文件的差异。

动机 / Motivation

在管家中阅读已交办请求、切换“待跟进/全部记录”的用户。

原来切换范围会立即清空正在阅读的列表,慢读期间只剩骨架;现在同一来源的已核验内容保留,目标范围显示正在读取,读完后才一起换列表、数量和选中范围。

独立的打包页面与真实 SQLite HTTP 观察确认,延迟返回时原有 12 条记录、12 / 63 数量和原选中页签仍一致;不可变基线在同样流程中变成零条和“正在读取记录”。

本 PR 只改善等待时的可读性,不修复后端慢读、不新增缓存或执行授权,也不宣称已经安装到用户 App。

改动思路 / Approach

保留内容应由现有 ConversationRequests 的读取与显示 owner 完成;后端继续决定完整清单、来源、状态和分页,前端只记录已发布内容对应的范围。新增通用缓存、后端接口或用户确认均无必要。

本次边界是同来源范围切换的完整读取、取消与失败恢复;来源或搜索改变仍立即隔离,错误仍清空旧结果并显示未知数量。既有 generation / AbortController 防止迟到响应覆盖新选择,未扩大原对话读取或任何协作写权限。

触发 独立观察
同来源切换,真实 HTTP 响应延后交付 原列表、数量和选中范围保留;目标页签 busy
点击原范围取消,随后释放旧响应 原范围继续可读,迟到结果不覆盖
读取失败,再重试 清空记录、数量未知、明确重试;恢复后读回同一来源

这是行为观察的文字对照,不把截图或字段存在当作延迟收益。

具体改动 / Changes

独立规格为 docs/development/design.md,spec_revision 0095109a2f7e3a022887fd31e87c36476febfa05。explanations-on-demand 的同来源安静更新与保留阅读状态、states-that-are-designed-not-defaulted 的加载/失败/来源隔离、populated-page-review 的默认、展开和窄屏阅读均在本次有界任务中 implemented。更换范围的显示增量不改变后端事实或原有权限合同。

完整差异为 3 文件 +82/-12:两个产品文件 +32/-11、既有浏览器 smoke +50/-1;没有新模块、共享 vocabulary 或第二份持久状态。

关键代码讲解

  • ConversationRequests 的 scope / keepPreviousView:只在现有已核验来源、相同搜索且相反范围时显示旧页;显式 Session 与 owner fallback 沿原解析路径,fallback 解析到另一来源先清空。
  • load:保留原分页、snapshot digest 和 generation 校验,完整核验后才更新 loadedScope 并发布新页。读取失败清空结果;旧响应不会成为新范围的事实。
  • changeHistory 与显示范围:切换时先围住旧请求,shownHistory 从已发布范围派生;aria-pressed 描述当前内容,aria-busy 描述目标读取。关闭后重开仍从待跟进开始。

既有 API 的 Zod 校验继续检查 session_id,清单和原对话读取仍消费真实 HTTP owner。邻近项目协作授权控件不在这个改动范围,不能从“保留旧列表”推导任何写权。

对主干的风险 / Risks

最强反例是“新页签配旧内容”,或取消后被迟到历史结果覆盖。本轮实际暂缓真实后端响应,检查列表/数量/页签一致,再取消和释放旧响应;同脚本路径的基线明确复现清空缺陷,当前头通过。搜索、来源不可用、分页换快照、损坏原对话、部分与最终回传由完整既有浏览器回归覆盖。

PASS:两版 Dashboard TypeScript/Vite 与 packaged Chat 构建;当前头 File、SQLite 两次完整 delegation-search smoke;独立 SQLite 63 条合成请求、两个接收者的桌面/390px 等待、取消、长原文及失败恢复;3 文件公开边界扫描;标准 premerge 4 项直接检查与 2 项 catalog 检查。构建的既有 chunk-size warning 保留。精确范围质量记录 cqr_6bfe0c0a0e8a9c08d305 为 PASS。

这是现有默认阅读行为的显式修复,没有 feature-off 声明、自动加载指令、共享协议或后端状态变更。merge-base 范围的语义 advisory 为零支持的候选;它不证明 TSX 的全部语义已被自动覆盖。检查实际消费者、基线反例与错误恢复承担主要验证。未获取、轮询或等待 CI。

我的整体评价 / Verdict

结论为 APPROVE。long_horizon=preserved:读取不新增业务 Turn 或协作效果;user_experience=improved:既有读取等待不再打断阅读,不要求重新输入或确认同一个来源。

实际整页观察:桌面分组列表、当前范围和固定分页能一起辨认;390px 保留状态与数量,长原文以正常正文尺寸展开,15,623 字符的合成原文完整读回、无对话框横向溢出。失败状态清楚显示未知与重试。视觉未验证范围:安装态 App、真实私有数据与原生触屏设备;本轮是源码构建的 packaged Chat 和隔离真实 HTTP 后端,不是安装态验收。

有界整理已在原组件内完成,不需要通用缓存框架或新后续任务。后端延迟、大型来源性能、真实 Host/model 采用和完整成本收益仍由各自原任务验收;评审和质量 PASS 均不授予合并或安装权限。

English verdict: APPROVE — 12a8be7. Real File/SQLite browser regressions and an independent delayed-response baseline/head walkthrough cover retained rows, truthful tabs, cancellation and recovery. Packaged builds and scoped validation pass; backend latency and installed-host adoption remain unqualified.

@huangruiteng
huangruiteng merged commit cbc1eea into main Nov 3, 2026
31 of 42 checks passed
@huangruiteng
huangruiteng deleted the codex/frontend-backlog-actual-20261103 branch November 3, 2026 10:18
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.

2 participants