Files
cc-web/.planning/2026-08-26-mcp-session-toggle/findings.md

3.1 KiB
Raw Blame History

发现与决策

需求

  • 用户希望减少侧栏中带金色角标的 MCP 创建会话噪声,而不是隐藏普通会话。
  • 控件是搜索框右侧的单个图标按钮,不显示文字或数量角标。
  • 隐藏模式保留当前打开、运行中的 MCP 会话;其余 MCP 会话隐藏。
  • 搜索匹配可临时显示隐藏的 MCP 会话。
  • 首次默认显示,并记住用户最后一次切换结果。

代码发现

  • public/app.js 的 createSessionListItem() 已通过 createdFromKind === 'mcp' 识别 MCP 会话,并添加 llm-created 类。
  • renderSessionList() 先取 getVisibleSessions(),再做搜索、置顶拆分和项目分组,是加入纯展示过滤的合适入口。
  • buildSessionListStructureSignature() 会阻止结构未变化时重建 DOM,新偏好必须影响结构签名或显式使签名失效。
  • public/index.html 的 .session-search-row 当前包含搜索框和高级搜索按钮,适合并排增加图标开关。
  • 项目已有项目折叠和旧会话“加载更多”,本功能不能改变这些状态模型。
  • scripts/regression.js 已有 assertFrontendSidebarCollapseContract()、assertSidebarTitleRefreshStormContract() 和 assertAdvancedSessionSearchContract(),可沿用其静态契约与 VM 隔离执行模式补充定向回归。
  • 完整回归入口是 scripts/regression.js 的 main();新增断言需要显式接入该入口,避免测试函数存在但未执行。
  • readSidebarCollapsedPreference() / persistSidebarCollapsedPreference() 已提供“读取失败保守降级 + 布尔字符串持久化”的本地偏好范式,新开关应沿用该模式。
  • applySessionSnapshot() 是会话运行态/快照变化后刷新列表的重要入口;过滤应基于每次快照中的 isRunning 派生,不能缓存单条会话的隐藏结论。
  • 搜索输入、Escape 清空和清除按钮都会直接调用 renderSessionList();因此只要过滤基于规范化后的 sessionSearchQuery 派生,搜索覆盖和清空恢复无需额外状态。
  • .advanced-search-open 已有 34px 基础按钮与荒原主题 36px 覆盖;新图标按钮可共用尺寸、交互色和窄屏间距,但应使用独立类名表达语义。
  • scripts/regression.js 支持 --target 定向入口,可为本功能增加独立 target,把失败测试和后续验证控制在 60 秒内。

视觉发现

  • 用户截图使用荒原主题的窄侧栏。
  • MCP 创建会话通过条目左侧/边缘的金色角标与普通会话区分。
  • 搜索行横向空间有限,因此必须使用与高级搜索同级的紧凑图标按钮。

技术决策

决策 理由
仅做前端派生过滤 避免改变会话数据、接口和后端排序
搜索时绕过过滤 用户主动查找时应能发现隐藏项
运行态变化依靠现有快照触发重渲染 无需增加独立轮询或服务端事件
使用内联 SVG 眼睛图标并切换状态 比字符图标跨平台更稳定,符合“一个图标”要求

资源

  • .trellis/spec/frontend/quality-guidelines.md
  • public/app.js
  • public/index.html
  • public/style.css
  • scripts/regression.js