Skip to content

feat: 添加消息删除模式 - #209

Open
Georgyhongbo wants to merge 1 commit into
TencentCloud:developfrom
Georgyhongbo:feat/chat-delete-mode
Open

feat: 添加消息删除模式#209
Georgyhongbo wants to merge 1 commit into
TencentCloud:developfrom
Georgyhongbo:feat/chat-delete-mode

Conversation

@Georgyhongbo

Copy link
Copy Markdown
Contributor

Add chat delete mode (UI only, no memory layer changes)

Summary

添加聊天消息删除模式,支持在界面上选择删除聊天消息,完全不触碰记忆层(后端数据库/Agent记忆),仅做前端过滤。

What does this PR change and why?

  • 新增:聊天删除模式,支持勾选单条/多条/全部消息进行删除
  • 新增:每条消息添加删除按钮,点击可直接进入删除模式并选中该消息
  • 新增:成组的 Assistant 消息会自动全组选中/删除(工具调用+文本回复)
  • 新增:删除记录持久化(localStorage),刷新/加载更多历史时不会重新出现
  • 修复:非删除模式下保持原布局完全不变
  • 修复:仅对临时客户端 ID 消息做指纹匹配,避免误删
  • 修复:会话移除/重命名时正确清理/迁移删除记录

Important Note (初版说明)

这是删除模式的第一版,完全没有触碰记忆层

  • 不调用任何后端删除接口
  • 后端数据库保持完整
  • Agent 记忆完全不受影响
  • 只做前端 UI 隐藏,用户随时可以通过清除 localStorage 让消息重新显示

Target branch

  • Base is develop (feature / fix - default)
  • Base is main (release/* or hotfix/* only)

Type of change

  • Bug fix
  • New feature
  • Breaking change
  • Documentation
  • Refactor / chore
  • Release / hotfix

Detailed change list

dashboard/src/pages/Chat/hooks/chatStore.ts

  • 新增 DeleteModeState 用于管理删除模式和选中状态

    • setDeleteMode(sessionId, isDeleteMode):切换删除模式
    • toggleMessageSelection(sessionId, messageId):切换单条选中状态
    • setAllMessagesSelected(sessionId, messages, isSelected):全选/取消全选
    • deleteSelectedMessages(sessionId):删除所有选中消息
    • isMessageSelected(sessionId, messageId):检查是否选中
  • 新增 表面删除记录持久化

    • DELETED_MESSAGES_STORAGE_PREFIX = "octop:deleted-messages:"
    • loadDeletedMessages(sessionId):读取已删除消息
    • persistDeletedMessages(sessionId):保存已删除记录
    • filterDeletedMessages(sessionId, messages):过滤历史消息
  • 新增 消息指纹(用于流式消息 reload 后匹配)

    • isTemporaryMessageId(messageId):识别是否为临时客户端ID
    • messageDeleteFingerprint(message):
      • 工具消息:{role}|tool:{toolName}:{callId}:{timestamp}
      • 文本消息:{role}|{text}:{timestamp}
      • 仅对临时 ID 生成指纹避免误删
  • 更新 会话生命周期管理

    • removeSession(sessionId):同时清理删除记录
    • renameSessionKey(oldId, newId):同时迁移删除记录
    • setHistoryPage/setMessages/prependHistoryMessages:均调用过滤

dashboard/src/pages/Chat/components/MessageList.tsx

  • 新增 删除模式 props: isDeleteMode, isMessageSelected, onToggleMessageSelection, onDeleteMessage
  • 新增 renderCheckbox(messageId):渲染复选框
  • 新增 messageContent(messageId, content, {isUser}):仅在删除模式下包裹 flex 布局
  • 更新 renderMessageGroup():成组的 Assistant 消息点击会选中整个组

dashboard/src/pages/Chat/components/MessageBubble.tsx

  • 新增 onDeleteMessage? prop
  • 新增 删除按钮:用户消息在操作区,Assistant 消息在时间戳旁边
  • 新增 Trash2 icon import

dashboard/src/pages/Chat/components/AssistantTurnView.tsx

  • 新增 onDeleteMessage? prop,透传给 MessageBubble

dashboard/src/pages/Chat/chatMessages.partial.less

  • 新增 .messageRow:删除模式下的 flex 容器
  • 新增 .messageRowUser:用户消息对齐
  • 新增 .messageCheckboxWrapper / .messageCheckbox:复选框样式
  • 新增 .deleteModeToolbar:底部删除工具栏
  • 新增 .deleteModeSelectAll / .deleteModeDeleteBtn / .deleteModeExitBtn

dashboard/src/pages/Chat/index.tsx

  • 新增 删除模式状态和回调
  • 新增 条件渲染:删除模式下显示删除工具栏,否则显示原有输入框
  • 新增 全选/删除/退出按钮
  • 新增 Trash2 / X icons import

Test plan

功能验证

  1. 单条删除:

    • Hover 消息点击删除按钮 -> 进入删除模式并选中该条
    • 点击底部删除 -> 消息消失
    • 刷新页面 -> 消息保持删除
    • 向上滑动加载更多历史 -> 消息仍然保持删除
  2. 多条选择:

    • 进入删除模式 -> 手动勾选多条消息
    • 点击删除 -> 全部选中消息消失
  3. 全选删除:

    • 进入删除模式 -> 点击"全选"复选框
    • 点击删除 -> 所有消息消失
  4. 成组 Assistant 消息:

    • 发送带工具调用的消息
    • 点击成组中任意一条消息的复选框 -> 整组选中
    • 点击删除 -> 成组的所有消息一起删除
  5. 非删除模式下布局无影响:

    • 退出删除模式 -> 检查所有消息布局与之前完全一致
    • 用户消息右对齐,Assistant 消息左对齐
    • 气泡尺寸、间距无变化
  6. 删除持久化隔离:

    • 会话A中删除几条消息
    • 切换到会话B -> 会话B的消息完整不受影响
    • 切换回会话A -> 删除的消息保持删除
  7. 会话重命名/删除:

    • 在会话中删除几条消息
    • 重命名会话 -> 删除记录正确迁移
    • 删除会话 -> 删除记录正确清理

Checklist

  • Updated CHANGELOG.md (if user-facing)
  • README / docs updated (if needed)
  • 不涉及记忆层改动

Security / Safety Notes

完全不触碰记忆层:

不调用任何后端删除接口
后端数据库保持完整
Agent 记忆完全不受影响
只做前端 UI 隐藏,用户随时可以通过清除 localStorage 找回消息

这是第一版,后续可以考虑加上:

  • Undo 删除撤销
  • 批量管理删除记录
  • 更细粒度的过滤控制

- 添加删除模式,支持选择单条/多条/全部消息删除
- 支持点击消息上的删除按钮直接进入删除模式并选中该消息
- 成组的 Assistant 消息自动全组选择/删除
- 删除的消息持久化过滤,不会在刷新/加载更多历史时再现
- 修复:非删除模式下保持原布局不变
- 修复:仅对临时客户端 ID 做指纹匹配避免误删
- 修复:消息删除记录在会话移除/重命名时正确清理/迁移
@miaowmint

Copy link
Copy Markdown
Contributor

PR要提交到dev分支的,别直接提交到main

@Georgyhongbo
Georgyhongbo changed the base branch from main to develop August 9, 2026 02:54
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.

2 participants