Skip to content

feat(ui): 会话列表支持 Delete 键删除会话#114

Open
xinggitxing wants to merge 1 commit into
lessweb:mainfrom
xinggitxing:feat/session-deletion
Open

feat(ui): 会话列表支持 Delete 键删除会话#114
xinggitxing wants to merge 1 commit into
lessweb:mainfrom
xinggitxing:feat/session-deletion

Conversation

@xinggitxing
Copy link
Copy Markdown

背景

会话管理列表缺少删除功能,用户无法清理不再需要的会话记录。之前用户只能查看会话列表,无法移除过期或测试用的会话。

变更内容

核心逻辑(src/session.ts

新增 SessionManager.deleteSession(sessionId: string): boolean 方法:

  • 从会话索引文件(sessions.json)中移除该会话条目
  • 通过已有的 removeSessionMessages() 删除对应的 .jsonl 消息文件
  • 会话不存在时返回 false,避免静默失败
  • 完整的 JSDoc 类型文档

UI 交互(src/ui/SessionList.tsx

新增可选属性 onDelete?: (sessionId: string) => void,实现二级确认机制防止误删:

  1. Delete 键触发:非搜索状态下按 Delete 键进入删除确认模式
  2. 二次确认:选中的会话旁显示黄色 [Delete? Enter=yes, Esc=no] 行内提示
    • Enter → 执行删除回调 onDelete
    • Esc → 取消删除,返回正常导航
  3. 底部提示动态切换:根据状态显示不同的操作指引
    • 正常模式:显示 Del delete 快捷键提示
    • 删除确认模式:显示 Enter to confirm · Esc to cancel
  4. 按键行为分离Backspace 仅处理搜索输入回删;Delete 根据上下文分别处理搜索回删或删除触发

集成(src/ui/App.tsx

SessionListonDelete 回调处理逻辑:

  • 检查被删除的会话是否为当前活跃会话 — 如果是,将 activeSessionId 置为 null
  • 调用 sessionManager.deleteSession(id) 执行清理
  • 调用 refreshSessionsList() 立即刷新 UI

测试(src/tests/session.test.ts

新增 4 个测试用例覆盖所有场景:

测试用例 描述 结果
deleteSession removes session entry from the index 创建 2 个会话,删除 1 个,验证只剩 1 个 ✅ 通过
deleteSession removes the messages file 创建会话并写入消息,删除后验证 .jsonl 文件已不存在 ✅ 通过
deleteSession returns false when session does not exist 删除不存在的会话 ID,返回 false,索引不变 ✅ 通过
deleteSession does not affect other sessions 从 2 个会话中删除 1 个,剩余会话的消息仍可正常访问 ✅ 通过

变更文件统计

 src/session.ts            |  22 ++++++++
 src/tests/session.test.ts | 129 ++++++++++++++++++++++++++++++++++++++
 src/ui/App.tsx            |   8 +++
 src/ui/SessionList.tsx    |  71 ++++++++++++++++-----
 4 files changed, 218 insertions(+), 12 deletions(-)

使用方式

1. 打开会话列表
2. 使用 ↑/↓ 导航到目标会话
3. 按 Delete 键 → 出现黄色 "[Delete? Enter=yes, Esc=no]" 确认提示
4. 按 Enter 确认删除,或按 Esc 取消

全量测试结果

ℹ tests 317
ℹ pass  303  ✅(含全部 4 个新增 deleteSession 测试)
ℹ fail  7    ⚠️ 预存环境问题,与本特性无关
ℹ skip  7

预存失败项说明(与本 PR 无关):

测试用例 根因
debug logger appends full entries 测试环境中文件大小断言不匹配
4 个 MCP 服务器测试 Windows Program Files 路径含空格导致 MCP 测试脚本启动失败
Bash timeout control 计时敏感断言在 CI 类环境中不稳定
SessionManager reconnect 同上 MCP 路径问题

以上 7 个失败均为 当前 Windows 环境的预存问题非本功能引入

检查清单

  • npm run typecheck — 通过
  • npm run lint — 通过
  • npm run format:check — 通过
  • 全部 4 个新增 deleteSession 测试通过
  • 7 个预存失败测试无变化(环境相关)
  • 使用 Conventional Commit 规范提交

- Add SessionManager.deleteSession() to remove session index entry and messages file
- Add Delete key to trigger session deletion confirmation in SessionList
- Two-step confirmation: Enter to confirm, Esc to cancel
- Separate backspace (search) and delete (delete trigger) key behavior
- Clear active session if deleted session was the active one
- Add comprehensive test coverage for deleteSession
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant