Repository navigation
fix(chat): 保留切换范围时的委派阅读内容 - #7966
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
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.
切换“待跟进 / 全部记录”时,当前列表会先变为空白骨架屏,读完后才重新出现。本改动在同一管家来源切换范围时保留已核验列表,页签和数量继续描述当前显示内容,目标页签显示读取状态;新结果完整核验后一起切换。
搜索、来源变化和读取失败仍清空旧内容;取消、反向切换和迟到响应保留 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 检查;新增真实响应延迟、旧列表/数量/页签一致、反向取消、失败恢复和中断后重开断言。git diff --check通过。首屏与交互证据(tested source
12a8be75924b0f2c8c966aa2f75dd4f10f276b58;两份产品源文件与构建清单的 SHA256 一致)。以下全部来自合成数据;将真实 HTTP 响应暂缓交付以观察等待状态,没有测量或宣称延迟收益。构建产物通过隔离服务加载,尚未合并、安装到用户 App 或证明原有后端长等待已解决。读取失败后清空旧内容,明确数量未知,并提供重试:
范围说明:本 PR 修复读取等待时的可用性。后端慢读和大型原对话读取失败仍需分别归因、修复与真实宿主验收。本地完整浏览器回归已通过;未运行全仓 canary / 实际 App 安装验收。局部改进复用既有读取 owner,没有新增共享状态或协议 vocabulary;语义检查不支持这些 TSX 形态,空报告不代表完整语义覆盖。只提交两份产品源码与现有 smoke,截图和一次性诊断不入仓。