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

48 lines
3.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 发现与决策
## 需求
- 用户希望减少侧栏中带金色角标的 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`