Repository navigation
fix(chat): keep original conversation readers open across refresh - #7536
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)
动机 / Motivation
正在委派列表中阅读原对话的用户会遇到此问题。刷新委派时,旧页面卸载列表,正在看的原对话关闭;当前头保留同来源的阅读位置,并把原生返回读进已经展开的原对话。已验证两页列表整批更新、展开状态与输入焦点及滚动保留,真实 Inbox 返回全文无需再展开即可读到。本次不修改权限、业务执行、外部发送、后台轮询周期或模型调用。完整双向新发送、所有卡片与线程映射、长期原生稳定性和本头安装采用仍待后续独立验收。这是作者自审,不是独立审核或 GitHub formal approval。原来已经可读的证据不应因一次只读刷新而要求用户重新定位;本头交付这一独立可用的改进,没有把整体同步任务说成完成。
改动思路 / Approach
来源和分页仍由原 API 与 native owner 决定,组件仅保留同来源的阅读投影并在读完后一起替换,失败清空;没有第二份业务权威。当前切口覆盖已加载页、打开的原对话、迟到取消和失败恢复;完整同步计划继续由原任务承担。仅删掉清空列表一行,仍会丢失第二页,已展开的原对话也不会收到新的正文;全局缓存、另一个服务和新后端协议则带来更大的来源失效和维护成本。当前头在原组件里对已加载页做有界完整读取,成功后一起替换,依靠稳定请求 key 保留展开。关闭原对话或整个对话框立即取消读取,不创建后台轮询。
| 同一触发 | 旧版 | 当前精确头 |
|---|---|---|
| 同来源刷新 | 原对话折叠 | 保留展开和已加载页 |
| 原生结论到达后刷新 | 重新展开才可看 | 原位读取完整返回 |
| 外来源、迟到或混合快照 | 保留来源隔离要求 | 拒绝、清空并可重试 |
这张表解释实际验证的路径,不是另造执行证据。已有用户意图和授权不需要重新澄清、确认、复制或设置;普通导航不变,同来源刷新省去重新展开请求和原对话两个动作。
具体改动 / Changes
关键代码讲解
ConversationRequests.load(apps/presentation/dashboard/src/features/personal-workspace/conversation-requests.tsx:205)先比较查询范围和真正解析的源 Session;相同来源保留已核验行,其他来源清空。它按已加载页数有界读取,要求一个 snapshot_digest 和持续前进的游标,全部成功才发布。旧 More 游标失效时沿现有路径从头读取一次,重读仍变化则明确失败,不能拼接混合数据或无限重试。成功后更新的是局部阅读 revision,不是业务送达版本。
OriginalRequest(同文件 :139)沿原 fetchChatSession 读取完整正文,核对返回 Session 后只选原 Turn。源 key 变化重建 reader,原 AbortController 使关闭或过期结果不能写回。有效刷新使已经展开的原对话重新读取;只有第一次打开主动聚焦和滚动,随后更新不抢搜索输入的焦点。错误清空旧正文并给出提示,原图片渲染、主会话历史和业务回执 owner 不变。
规范是 docs/development/frontend-delivery.md#finding-original-steward-delegations,spec_revision=98c4ba315d98c7e79b16f1ae184c5dd120d54a20。条款 finding-original-steward-delegations 在本头为 implemented:完整原对话、原来源、明确不完整/失败与沿原查询重试、浏览不执行,映射现有 reader 与实际打包验证。这里没有从别的视图设计段落推导新权限。
两个现有 smoke 复用生产 SQLite、Inbox 和 HTTP fixture。新结论由原生 Inbox drain 追加,route 仅丰富第一条原文/图片和注入失败,不能伪造所测 native 返回。搜索 smoke 补了当前 Chat 导航及 fixture 无绑定声明,保留原搜索、分页、返回历史、迟到和工作区隔离断言。README 与三张新增截图只有公开合成数据。
对主干的风险 / Risks
最强反例是为了保留阅读而误留旧来源,或在两页间发生返回时发布半批数据。本头的范围、Session、Turn、digest、游标和 generation/abort 共同约束这些分支。外 Session、其他 Turn、503、坏图、关闭/查询变化后迟到、第二页快照变化及重试已通过真实打包入口;展开状态始终不能代替服务授权。
多个打开的原对话会增加既有完整 Session GET 的读取量;没有测生产 p95、全运行字节或费用,也不声称降低这些成本。没有新增循环或消费者,关闭对话框中止读取,回滚无需迁移。目标分支新增 qualification/settlement 改动不重叠此 reader/API,实际安装合入版本仍需独立验收。
PASS:同一最终 oracle 在不可变基线因展开丢失失败,在当前打包矩阵通过;完整搜索回归和35项相邻 native inventory/bundle 检查通过。预合并四项直接和十五项选定检查无自动失败;三张 PNG 产生 manual hold,已逐图检查合成来源、像素和仅 IHDR/IDAT/IEND chunks。exit1 保留,不能称全自动绿。早期测试时序、选择器、禁用按钮焦点和清理错误均保留,最终断言保留对应不变量,没有删断言或放宽阈值。按当前政策不查询或等待远端 CI。
我的整体评价 / Verdict
未发现阻塞 eba66337b1230799816b05813bb1b3c928038389 的缺陷,APPROVE。长程阅读为 improved:原生返回和累计页可继续读,失败有界恢复,无第二执行者。用户体验为 improved:零新增准备或确认轮次,同来源刷新减少重复展开。逐图检查公开合成的刷新前折叠、桌面原生返回和窄屏长内容;页头、查询与全文层级清楚,失败和重试仍沿原入口,无新增卡片或说明噪声。未把合成截图称为实际安装、真实外部发送、所有卡片或长期运行验收。
来源和分页仍由原 API 与 native owner 决定,组件仅保留同来源的阅读投影并在读完后一起替换,失败清空;没有第二份业务权威。当前切口覆盖已加载页、打开的原对话、迟到取消和失败恢复;完整同步计划继续由原任务承担。同域重构已收敛到原组件,不需要全局缓存和公共协议;无新增 actor、authority、持久版本或核心义务。三张图的人工项已具体核验。本头安装、原服务实际新返回与剩余同步要求仍要沿正常采用和原 owner 验收,作者自审不替代它们。
English verdict: APPROVE — eba6633; the reader-loss regression fails on the immutable baseline and passes the packaged native-backend journey, with negative cases and adoption gaps retained.
Goal And Delivered Outcome
刷新委派会先清空列表,正在阅读的原对话随之关闭,后续返回必须重新展开才看得到。本次保留同一来源的展开项与已加载页,刷新后在原位置读取完整返回;读取失败、查询或来源改变仍清空旧内容。
main。98c4ba315d98c7e79b16f1ae184c5dd120d54a20因原对话关闭失败,在本头保留展开、焦点与滚动;真实 SQLite/Inbox 返回进入同一已展开 reader。Author Declaration
Implemented against
规范:
docs/development/frontend-delivery.md#finding-original-steward-delegations、docs/development/design.md的阅读连续性、来源隔离及按需展开要求,基线98c4ba315d98c7e79b16f1ae184c5dd120d54a20。OriginalRequestConversationRequests.load提交前读过现有 owner、调用者和设计规范;复用原 API、原 SQLite/Inbox fixture、同一列表与展开组件。无新增协议字段、调度、执行者、消费者或外部消息。
Scope And Continuation
本切口解决刷新期间阅读状态丢失,并让打开的原对话读取后续返回。原有自动会话更新沿既有 refreshKey 触发;手动刷新沿原入口。已加载页按同一 snapshot_digest 成批更新,变化时明确失败重试,不拼接混合快照。关闭 reader/dialog 中止读取。
原完整双向发送、所有渠道卡片和线程映射、长期原生稳定性仍属原同步工作的后续范围;这次不声称完成它们。当前边界可独立撤回与验收。相关重构仅收拢现有分页更新和一次打开聚焦,不引入共享状态框架。
Validation
eba66337b1230799816b05813bb1b3c928038389;不可变基线98c4ba315d98c7e79b16f1ae184c5dd120d54a20。git diff --checkdelegation-media-browser-smoke.mjs:生产 SQLite、Inbox、HTTP 与打包页面;整页读取、两页刷新、原生返回、错误与恢复、关闭/查询迟到、双语与窄屏;浏览器零非 GETdelegation-search-browser-smoke.mjs:搜索/分页/计数/返回历史/恢复/旧响应及工作区隔离;补齐当前 Chat 导航及 fixture 无 Lark 绑定声明初次搜索 smoke 停在旧入口,未运行其断言;修正 fixture 入口后通过。初次新增测试包含选择器和刷新完成时序问题,已修正并保留失败记录;未将这些当作产品缺陷。原安装运行内容、长期成本和真实新双向发送不由合成验证代替。
Frontend / Visual Evidence
Type of Change
LoopX Area
Shared-authority RFC fixture impact
N/A:不修改共享 authority、Core 状态、存储或协议;保留原 API/source owner。
Boundary Checklist