现象
从 GitHub README 详情页进入 chat(带条目上下文)后,在会话抽屉里切换到一个通用会话,页面上「描述当前会话」的 UI 仍然停留在进入时那个 repo:
- 「一键详细解读」chip 依旧显示,点击会带着上一个 repo 的
externalId 去请求解读,落进当前这个不相关的会话;
- 顶栏标题仍显示
owner/repo;
- 空会话时的快捷问是「介绍这个项目」而不是通用助手那条;
ChatWelcome(hasContext = ...) 也按条目会话渲染。
反向同理:从底栏通用入口进 chat,再切到某个 repo 会话,chip 不会出现(尽管该会话本该有)。
根因
ChatScreen 用的是导航参数 initialContext,它在页面存续期间恒定;而会话的真实上下文是 ChatViewModel.activeContext,会随 enterEntry / openThread / startNewThread 变化,但它是 private var,UI 观察不到。
于是出现两个真相源:chip 的可见性判定读 initialContext,而 sendDetailSummary() 实际请求读 activeContext —— 这正是错误请求得以发出的原因(UI 认为该显示,VM 用的却是另一个 context)。
涉及位置:
ChatScreen.kt — DetailSummaryPolicy.chipVisible(initialContext, ...)、顶栏 title、quickAction、ChatWelcome(hasContext)
ChatViewModel.kt — private var activeContext
影响
需要用户在同一次 chat 页面停留期间用抽屉切换会话才会触发,日常单会话使用不受影响。危害是可能对一个无关会话发起 detail-summary 请求(消耗 credits,且解读内容与会话主题不符)。
修复方向
把 activeContext 提升为 StateFlow 暴露给 UI,上述四处改用它。
需要注意的边界:「一次性语义」的几处必须继续用 initialContext,不能一起改掉 ——
enterEntry(initialContext) 的入参;
autoDetailSummary / autoDeepResearch 的自动触发(描述的是「这一次进入」);
- 初次
autoFocusInput。
建议补一个 VM 层测试:repo 会话 → startNewThread(断言 context 为 null)→ 切回 repo 会话(断言 externalId 回来)→ 再切回通用会话(断言为 null)。
备注
2026-08-05 讨论 chat 会话恢复语义时发现,当时已实现过一版修复(VM 暴露 StateFlow + UI 四处替换 + 单测),验证通过但决定不随本次埋点改动一起进,先记录待办。
现象
从 GitHub README 详情页进入 chat(带条目上下文)后,在会话抽屉里切换到一个通用会话,页面上「描述当前会话」的 UI 仍然停留在进入时那个 repo:
externalId去请求解读,落进当前这个不相关的会话;owner/repo;ChatWelcome(hasContext = ...)也按条目会话渲染。反向同理:从底栏通用入口进 chat,再切到某个 repo 会话,chip 不会出现(尽管该会话本该有)。
根因
ChatScreen用的是导航参数initialContext,它在页面存续期间恒定;而会话的真实上下文是ChatViewModel.activeContext,会随enterEntry/openThread/startNewThread变化,但它是private var,UI 观察不到。于是出现两个真相源:chip 的可见性判定读
initialContext,而sendDetailSummary()实际请求读activeContext—— 这正是错误请求得以发出的原因(UI 认为该显示,VM 用的却是另一个 context)。涉及位置:
ChatScreen.kt—DetailSummaryPolicy.chipVisible(initialContext, ...)、顶栏title、quickAction、ChatWelcome(hasContext)ChatViewModel.kt—private var activeContext影响
需要用户在同一次 chat 页面停留期间用抽屉切换会话才会触发,日常单会话使用不受影响。危害是可能对一个无关会话发起 detail-summary 请求(消耗 credits,且解读内容与会话主题不符)。
修复方向
把
activeContext提升为StateFlow暴露给 UI,上述四处改用它。需要注意的边界:「一次性语义」的几处必须继续用
initialContext,不能一起改掉 ——enterEntry(initialContext)的入参;autoDetailSummary/autoDeepResearch的自动触发(描述的是「这一次进入」);autoFocusInput。建议补一个 VM 层测试:repo 会话 →
startNewThread(断言 context 为 null)→ 切回 repo 会话(断言 externalId 回来)→ 再切回通用会话(断言为 null)。备注
2026-08-05 讨论 chat 会话恢复语义时发现,当时已实现过一版修复(VM 暴露 StateFlow + UI 四处替换 + 单测),验证通过但决定不随本次埋点改动一起进,先记录待办。