# Bug 修复说明

## 修复的问题

### 1. 内容显示两遍
**原因**: WebSocket 和轮询同时工作，导致事件被处理了两次

**解决方案**:
- 在 `app/state.ts` 中添加 `usePollingMode: true` 标志
- 在所有关键的 WebSocket 事件处理器开头添加检查：
  ```javascript
  if (ctx.usePollingMode) {
      return; // 跳过 WebSocket 事件
  }
  ```
- 修改的事件包括：
  - `ai_message_start`
  - `thinking_start/chunk/end`
  - `text_start/chunk/end`
  - `tool_preparing/intent/status/start`

### 2. 刷新后内容消失
**原因**: `restoreTaskState()` 清空了 `messages` 数组，导致已加载的历史记录丢失

**解决方案**:
- 修改 `app/methods/taskPolling.ts` 中的 `restoreTaskState()` 方法
- 不再清空 `messages` 数组
- 只标记状态为进行中（`streamingMessage = true`, `taskInProgress = true`）
- 轮询只处理新事件，不重建历史记录

## 修改的文件

1. **static/src/app/state.ts**
   - 添加 `usePollingMode: true` 标志

2. **static/src/app/methods/taskPolling.ts**
   - 修改 `restoreTaskState()` 方法，不清空消息

3. **static/src/composables/useLegacySocket.ts**
   - 在所有关键事件处理器开头添加轮询模式检查
   - 修改的事件：
     - `ai_message_start`
     - `thinking_start`
     - `thinking_chunk`
     - `thinking_end`
     - `text_start`
     - `text_chunk`
     - `text_end`
     - `tool_preparing`
     - `tool_intent`
     - `tool_status`
     - `tool_start`

## 工作流程

### 正常发送消息
1. 用户输入消息并发送
2. 调用 REST API 创建任务
3. 后端在独立线程中运行任务
4. 前端每秒轮询一次，获取新事件
5. 通过 `handleTaskEvent()` 处理事件，更新界面
6. WebSocket 事件被 `usePollingMode` 标志跳过

### 页面刷新恢复
1. 页面加载完成
2. 延迟 1 秒后调用 `restoreTaskState()`
3. 查找运行中的任务
4. 如果找到，标记状态为进行中
5. 启动轮询，只处理新事件
6. 已加载的历史记录保持不变
7. 新事件追加到现有消息后面

## 测试建议

1. **基本功能**
   - 发送消息，观察是否只显示一次
   - 刷新页面，观察历史记录是否保留
   - 观察新内容是否正常追加

2. **边界情况**
   - 任务执行中多次刷新
   - 任务完成后刷新
   - 快速连续发送多条消息

3. **性能**
   - 长时间运行任务
   - 大量事件（观察是否有重复）

## 构建

```bash
cd static
npm run build
```

构建成功！
- `static/dist/assets/main.js` (687.87 kB)
- `static/dist/assets/task.js` (3.68 kB)

## 下一步

现在可以启动服务器测试：
```bash
python web_server.py
```

访问 http://localhost:8091 测试功能。
