3.1 KiB
3.1 KiB
发现与决策
需求
- 用户希望减少侧栏中带金色角标的 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.mdpublic/app.jspublic/index.htmlpublic/style.cssscripts/regression.js