---
url: /wave-agent/specs/ui/action-confirm-dialog.md
description: 三端共享的破坏性操作确认对话框：消息回滚、删除会话（含 worktree 改动检查）、主按钮初始焦点与 Enter/Esc 键盘语义
---

# 功能规格说明：操作确认对话框

**创建日期**：2026-07-29
**设计稿**：[Figma — 操作确认对话框](https://www.figma.com/design/EiDsFbqhDRmPgFlrZkEkwE/mcp-test?node-id=2294-1496)

## 用户场景与测试 *（必填）*

### 用户故事：消息回滚二次确认（优先级：P1）

作为用户，我在点击消息的回滚按钮后，希望先在应用内看到居中的确认对话框并明确告知后果，再决定是否执行，以避免误操作丢失对话与文件更改；且在 VS Code、JetBrains 与桌面应用中看到完全一致的确认界面。

**为什么是这个优先级**：回滚会删除消息并撤销文件更改，属于破坏性操作；目前三端各自弹宿主原生确认（VS Code 模态框 / JetBrains 对话框 / 操作系统弹窗），样式与交互不统一。

**独立测试**：hover 一条用户消息并点击回滚按钮，验证屏幕中央出现确认对话框；点击「确定」执行回滚，点击「取消」或按 Esc 不执行任何操作。

**验收场景**：

1. **假设**对话中有多条消息，**当**用户点击某条用户消息的回滚按钮时，**则**屏幕中央显示确认对话框（标题「确定要回滚到此消息吗？」，描述「这将删除之后的所有消息并撤销相关的文件更改。」），此时不执行回滚。
2. **假设**确认对话框已显示，**当**用户点击「确定」（或按 Enter）时，**则**执行回滚并关闭对话框。
3. **假设**确认对话框已显示，**当**用户点击「取消」或按 Esc 时，**则**对话框关闭，对话与文件保持不变。
4. **假设**用户在 VS Code、JetBrains 或桌面应用中触发回滚，**当**确认流程出现时，**则**三端均显示同一个应用内确认对话框，不再出现宿主原生弹窗。

***

### 用户故事：删除会话二次确认（优先级：P1）

作为桌面应用用户，我在侧边栏点击删除会话时，希望看到与回滚一致的应用内确认对话框，而不是浏览器原生 confirm 弹窗，以获得统一的视觉与交互体验。

**为什么是这个优先级**：删除会话（尤其 worktree 会话）不可逆；浏览器原生 confirm 样式简陋且与应用主题不一致。

**独立测试**：在桌面应用侧边栏点击某会话的删除图标，验证应用内确认对话框出现；确认后删除会话，取消后不删除。

**验收场景**：

1. **假设**侧边栏存在会话条目，**当**用户点击删除图标时，**则**屏幕中央显示确认对话框，标题为「确定删除会话「X」？」（X 为会话标题）。
2. **假设**被删会话是 worktree 会话，**当**确认对话框显示时，**则**描述文案明确告知将一并删除 worktree 目录与临时分支、未提交改动将丢失。
3. **假设**确认对话框已显示，**当**用户点击「确定」时，**则**执行删除；点击「取消」或按 Esc 时不删除。

***

### 用户故事：确认对话框的初始焦点（优先级：P1）

作为键盘用户，我希望确认对话框出现时焦点就落在主按钮上（若主按钮暂时不可用，则在它变为可用时补上），以便我按 Enter 就能确认，而不必先用 Tab 摸索进对话框。

**为什么是这个优先级**：对话框由侧边栏行菜单、消息回滚按钮等触发元素打开，焦点留在触发元素上；如果对话框拿不到焦点，Enter 会落到那个触发元素上（例如重新打开侧边栏行菜单）而不是执行确认——用户按 Enter 得到的是「菜单又弹出来」。worktree 删除确认还要先等宿主回报将丢失的改动，主按钮在回报前不可用，而只在挂载瞬间生效的自动聚焦在这种情形下落空（不可用的按钮也接不住焦点），必须等主按钮变为可用时补上。

**独立测试**：把焦点放在触发元素上打开确认对话框，验证焦点落在主按钮、按 Enter 执行确认；对需要「正在检查」阶段的 worktree 删除确认（宿主尚未回报）验证检查期间焦点不停在不可用的主按钮上，回报后焦点落到主按钮；若用户在检查期间已 Tab 到「取消」，回报后验证焦点不被抢走。

**验收场景**：

1. **假设**确认对话框打开且主按钮可用，**当**对话框挂载时，**则**焦点落在主按钮上，此时按 Enter 执行确认（由按钮自身处理，窗口级 Enter 处理不得再触发一次）。
2. **假设**确认对话框打开时主按钮因后果未知而不可用（worktree 改动检查尚未返回，见「删除会话二次确认」与 `desktop-sessions.md`），**当**检查返回、主按钮变为可用时，**则**焦点落到主按钮上，对话框不得因「打开时按钮不可用」而永久停留在失焦状态。
3. **假设**检查期间用户已把焦点移进对话框（如 Tab 到「取消」），**当**检查返回、主按钮变为可用时，**则**焦点保持在用户当前所在元素上，不被抢走。
4. **假设**用户在 VS Code、JetBrains 或桌面应用中打开该对话框，**当**焦点规则生效时，**则**三端表现一致（同一共享对话框组件）。

***

### 边界情况

* **流式生成中点击回滚按钮怎么办？** 保持现状：直接忽略，不弹确认对话框。
* **主按钮的后果检查迟迟不返回怎么办？** 对话框按 `desktop-sessions.md` 的时限自行放开主按钮；放开后按场景 2 落焦，不得因为「等待无果」而让对话框保持无焦点。
* **确认对话框显示期间重复触发怎么办？** 同一时刻最多存在一个操作确认对话框，新的触发被忽略。
* **点击遮罩会关闭对话框吗？** 不会。破坏性操作要求显式选择「取消」或「确定」（Esc 可取消）。
* **浅色主题下可读吗？** 全部颜色取自 `--vscode-*` 主题变量，亮暗主题均可读。
