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