# MCP 会话显示隐藏开关计划 ## 目标 在侧栏搜索框右侧增加一个图标按钮,用于显示或隐藏由 MCP 创建的会话;正常会话始终可见,并完整覆盖状态记忆、搜索临时显示与运行态例外。 ## 当前阶段 阶段 5:交付 ## 执行步骤 1. 审查需求与实现计划 2. 补充会话过滤与图标状态的失败回归测试 3. 实现持久化状态与 MCP 会话过滤逻辑 4. 接入搜索框右侧图标及主题响应式样式 5. 运行定向测试并修复问题 6. 执行完整回归与差异审查 7. 清理临时跟踪文件并记录交付 ## 阶段 ### 阶段 1:需求与计划审查 - [x] 通过逐项访谈确认产品边界 - [x] 定位现有会话列表、搜索、分组和 MCP 标识逻辑 - [x] 完成独立计划审查 - **状态:** complete ### 阶段 2:测试先行 - [x] 为过滤规则、状态例外、搜索覆盖和图标契约补充失败测试 - [x] 运行新增测试并确认修改前失败 - **状态:** complete ### 阶段 3:实现 - [x] 增加本地持久化的显示状态 - [x] 在列表派生数据阶段过滤 MCP 会话 - [x] 接入无文字图标按钮、无障碍状态和主题样式 - **状态:** complete ### 阶段 4:验证 - [x] 运行定向测试、语法检查与完整回归 - [x] 审查变更差异、工作区状态及项目规范符合性 - **状态:** complete ### 阶段 5:交付 - [x] 更新持久计划与 Trellis 记录 - [x] 清理临时 TODO CSV - **状态:** complete ## 已确认需求 - 过滤对象仅为 `createdFromKind === 'mcp'` 的会话,正常会话始终显示。 - 隐藏模式仍保留当前打开或 `isRunning` 的 MCP 会话;其他 MCP 会话隐藏。 - 搜索时临时恢复全部 MCP 会话参与匹配,清空搜索后恢复隐藏规则。 - 按钮位于搜索框右侧并与高级搜索并排,仅显示一个状态图标。 - 首次默认显示;用户切换结果保存在本机浏览器,刷新和下次打开继续沿用。 - 没有可见会话的项目分组不渲染。 ## 技术决策 | 决策 | 理由 | |---|---| | 在 `getVisibleSessions()` 之后、搜索匹配之前派生列表可见性 | 保持服务端快照和缓存完整,只影响侧栏展示 | | 搜索查询非空时绕过 MCP 隐藏过滤 | 满足主动搜索可以找回隐藏会话的需求 | | 使用单一 `localStorage` 布尔偏好,缺失时按显示处理 | 与首次默认显示和跨刷新记忆一致 | | 图标按钮维护 `aria-pressed`、动态 `title`/`aria-label` | 只有图标时仍能清晰表达当前状态和点击动作 | | 将显示偏好纳入列表结构签名或切换时强制失效 | 避免现有结构签名优化跳过重新渲染 | ## 风险与验证重点 - 置顶 MCP 会话也应服从隐藏规则,除非它是当前会话或运行中。 - 当前会话从 MCP 状态切换后,侧栏不能丢失当前定位。 - 新快照把会话从运行中更新为已完成时,隐藏模式应自动移除该条目。 - 所有主题及窄屏布局不得挤压搜索输入框或高级搜索按钮。 - 不引入服务端状态或协议改动。 ## 错误记录 | 错误 | 尝试 | 处理 | |---|---:|---| | 完整历史分叉不能同时指定 worker 类型 | 1 | 改为 `fork_turns: none` 并在任务中显式提供上下文 | | `wait_agent` 等待值低于 10 秒下限 | 1 | 改用 10 秒以上等待值 | | 高级搜索回归要求保留荒原主题精确选择器 | 1 | 恢复 `.session-search-row .advanced-search-open`,新按钮使用独立规则 | | Firefox 无头渲染图形后端超时且未生成截图 | 1 | 改用软件渲染/Xvfb 再试一次,失败则降级到计算布局与静态契约 | | 完整回归 Codex App steer 场景等待 WebSocket 消息超时 | 1 | 失败位于既有 server/mock 集成链路,与前端侧栏变更隔离;保留定向回归与审查证据 |