Skip to content

chat: 抽屉切换会话后,解读 chip / 标题 / 快捷问仍停留在进入时的条目上下文 #84

Description

@HarlonWang

现象

从 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.ktDetailSummaryPolicy.chipVisible(initialContext, ...)、顶栏 titlequickActionChatWelcome(hasContext)
  • ChatViewModel.ktprivate 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 四处替换 + 单测),验证通过但决定不随本次埋点改动一起进,先记录待办。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions