生成日期: 2026-02-04 当前状态: 88% 完成 (7/8 组件运行正常)
问题: Android 模拟器无法连接到 daemon
根本原因:
Android 模拟器中 localhost 指向模拟器自身,而非宿主机
错误: Connection refused (OS Error: Connection refused, errno = 61)
解决方案:
// 修改: opencli_app/lib/services/daemon_service.dart
String get _daemonHost {
if (Platform.isAndroid) {
return '10.0.2.2'; // Android 模拟器的宿主机别名
}
return 'localhost';
}文件位置: opencli_app/lib/services/daemon_service.dart
优先级: 🔴 Critical (阻塞 Android 部署)
预估时间: 15 分钟修复 + 30 分钟测试
当前状态:
- ✅ Vite 服务器运行正常 (http://localhost:3000)
- ✅ React 应用加载成功
- ⏳ WebSocket 连接未在浏览器中测试
待验证功能:
1. 连接到 ws://localhost:9875/ws
2. 接收实时状态更新
3. 显示 daemon 信息
4. 查看任务列表
5. 提交新任务
6. 监控任务进度
测试步骤:
# 1. 启动 daemon
cd daemon && dart run bin/daemon.dart --mode personal
# 2. 启动 WebUI
cd web-ui && npm run dev
# 3. 打开浏览器
open http://localhost:3000
# 4. 打开浏览器控制台,检查 WebSocket 连接优先级: 🟡 Medium
预估时间: 1 小时
iOS 应用 (已连接,需功能测试):
- 聊天界面 - 发送消息到 daemon
- 聊天界面 - 接收 AI 响应
- 聊天界面 - 消息历史记录
- 任务管理 - 提交任务
- 任务管理 - 查看任务状态
- 任务管理 - 接收任务进度通知
- 设置页面 - 配置测试
- 扫描页面 - QR 配对测试
Android 应用 (待连接修复后测试):
- 所有上述 iOS 测试项
- Android 特定功能测试
macOS 桌面应用 (已连接,需功能测试):
- 托盘图标显示 ✅
- 托盘菜单点击 ✅
- 状态轮询 ✅
- 主窗口打开/关闭
- 聊天功能
- 任务管理
- 设置配置
WebUI (待浏览器测试):
- Dashboard 显示
- 任务列表
- AI 模型选择
- 聊天界面
- 实时状态更新
优先级: 🟡 Medium
预估时间: 4-6 小时
当前状态: iOS/Android 使用旧协议 (ws://localhost:9876)
新协议: ws://localhost:9875/ws (OpenCLIMessage 统一协议)
优势:
- ✅ 类型安全的消息结构
- ✅ 客户端识别 (mobile/desktop/web/cli)
- ✅ 优先级支持
- ✅ 请求/响应关联 (通过 ID)
- ✅ 广播通知
- ✅ 更好的错误处理
迁移步骤:
- 更新 iOS 应用使用新协议
- 更新 Android 应用使用新协议
- 更新 macOS 应用使用新协议
- 测试所有功能
- 弃用端口 9876
优先级: 🟢 Low (不阻塞功能)
预估时间: 2-3 天
当前风险:
- 🔴 代码注入 - High
- 🔴 权限提升 - Critical
- 🔴 数据泄露 - High
解决方案: Firecracker MicroVM 隔离
状态: 📋 设计完成,待实施
文档: MICROVM_SECURITY_PROPOSAL.md
实施计划:
- Phase 1: 基础设施 (2-3 周)
- Phase 2: Security Router (1-2 周)
- Phase 3: Guest Agent (1 周)
- Phase 4: 测试 (1 周)
- Phase 5: 部署 (1 周)
优先级: 🔴 High (安全关键)
预估时间: 6-8 周
文件: tests/e2e/full_workflow_test.dart
-
完整聊天工作流 (基础版)
✅ 启动 daemon ✅ 执行 CLI 命令 ✅ 验证响应 ✅ 停止 daemon -
冷启动性能测试
✅ CLI 版本命令 < 10ms
-
Flutter 启动工作流
- 状态: 仅占位符
expect(true, isTrue) - 需要: 完整 Flutter 应用启动和连接测试
- 状态: 仅占位符
-
插件热重载工作流
- 状态: 仅占位符
- 需要: 插件加载、卸载、热重载测试
-
多模型路由工作流
- 状态: 仅占位符
- 需要: AI 模型选择和切换测试
-
缓存性能测试
- 状态: 仅占位符
- 需要: 缓存命中 < 2ms 测试
-
并发请求测试
- 状态: 仅占位符
- 需要: 多客户端并发测试
应该测试的流程:
1. iOS/Android 应用启动
↓
2. 连接到 daemon (WebSocket)
↓
3. 用户发送聊天消息 "Hello"
↓
4. Daemon 接收消息
↓
5. Daemon 转发到 AI 模型 (Claude/GPT)
↓
6. AI 返回响应
↓
7. Daemon 推送响应到移动端
↓
8. 移动端显示响应
↓
9. 验证消息历史记录
当前状态: ❌ 未实现
应该测试的流程:
1. 客户端提交任务 "执行 ls 命令"
↓
2. Daemon 接收任务
↓
3. Permission Manager 检查权限
↓
4. Task Manager 创建任务
↓
5. 任务开始执行
↓
6. 广播 task_started 通知
↓
7. 任务执行中,广播 task_progress 通知
↓
8. 任务完成,广播 task_completed 通知
↓
9. 客户端接收所有通知
↓
10. 验证任务结果
当前状态: ❌ 未实现
应该测试的流程:
1. iOS 客户端连接到 daemon
2. Android 客户端连接到 daemon
3. macOS 客户端连接到 daemon
4. WebUI 连接到 daemon
↓
5. iOS 提交任务
↓
6. Daemon 广播任务状态到所有客户端
↓
7. 验证 Android 收到通知
8. 验证 macOS 收到通知
9. 验证 WebUI 收到通知
↓
10. macOS 更新任务状态
↓
11. 验证所有客户端收到更新
当前状态: ❌ 未实现
应该测试的流程:
1. 移动端打开扫描页面
↓
2. Daemon 生成配对二维码
↓
3. 移动端扫描二维码
↓
4. 发送配对请求
↓
5. Daemon 生成配对 token
↓
6. 移动端保存 token
↓
7. 后续请求携带 token
↓
8. 验证设备已配对
↓
9. 验证权限管理生效
当前状态: ❌ 未实现
应该测试的场景:
场景 1: Daemon 崩溃恢复
1. 客户端连接到 daemon
2. Daemon 崩溃
3. 客户端检测到断线
4. Daemon 重启
5. 客户端自动重连
6. 恢复会话状态
场景 2: 网络中断恢复
1. 任务执行中
2. 网络中断
3. 任务继续执行
4. 网络恢复
5. 推送积压的通知
6. 客户端同步状态
场景 3: 权限拒绝
1. 提交危险操作
2. Permission Manager 拒绝
3. 返回错误信息
4. 客户端显示错误
5. 请求用户确认
6. 用户批准后重试
当前状态: ❌ 未实现
应该测试的场景:
1. 10 个客户端同时连接
2. 每个客户端提交 100 个任务
3. 验证所有任务完成
4. 验证没有任务丢失
5. 验证响应时间 < 100ms
6. 验证内存使用稳定
7. 验证无内存泄漏
当前状态: ❌ 未实现
| 测试类型 | 覆盖率 | 状态 | 说明 |
|---|---|---|---|
| 单元测试 | 30% | 🟡 部分 | 基础模块测试 |
| 集成测试 | 60% | 🟢 良好 | Daemon、API、WebSocket |
| E2E 测试 | 10% | 🔴 差 | 仅基础聊天工作流 |
| 手动 UI 测试 | 0% | 🔴 无 | 需要人工测试 |
| 性能测试 | 20% | 🟡 部分 | 基础性能指标 |
| 安全测试 | 0% | 🔴 无 | 无安全测试 |
| 并发测试 | 0% | 🔴 无 | 无并发测试 |
| 错误恢复测试 | 0% | 🔴 无 | 无恢复测试 |
-
修复 Android 连接 (15 分钟)
- 修改 daemon_service.dart
- 测试连接
-
WebUI 浏览器测试 (1 小时)
- 验证 WebSocket 连接
- 测试基本功能
-
创建基础 E2E 测试套件 (2-3 天)
- 移动端到 AI 完整流程
- 任务提交和进度更新
- 多客户端同步
-
手动 UI 测试 (1 天)
- iOS 应用功能
- macOS 应用功能
- WebUI 功能
-
错误处理测试 (2 天)
- Daemon 崩溃恢复
- 网络中断恢复
- 权限拒绝处理
-
性能和并发测试 (2 天)
- 多客户端并发
- 大量任务处理
- 内存泄漏检测
-
安全测试 (1 周)
- 权限绕过测试
- 注入攻击测试
- 数据泄漏测试
-
MicroVM 集成 (6-8 周)
- Firecracker 集成
- 隔离测试
- 性能优化
目标: 建立完整的 E2E 测试基础设施
任务:
-
创建测试工具类
- DaemonTestHelper - 启动/停止 daemon
- ClientTestHelper - 模拟客户端连接
- AssertionHelper - 验证工具
-
实现测试场景
- 移动端到 AI 流程
- 任务提交流程
- 多客户端同步
-
自动化测试运行
- CI/CD 集成
- 测试报告生成
目标: 覆盖所有关键场景
任务:
- 错误处理测试
- 性能测试
- 并发测试
- 安全测试
目标: 维护和优化测试套件
任务:
- 监控测试覆盖率
- 添加新功能测试
- 优化测试性能
- 修复 flaky 测试
# 1. 修改文件
vim opencli_app/lib/services/daemon_service.dart
# 2. 添加平台检测
String get _daemonHost {
if (Platform.isAndroid) {
return '10.0.2.2';
}
return 'localhost';
}
# 3. 重新构建
cd opencli_app
flutter build apk
# 4. 测试
flutter run -d <android-device-id># 1. 启动 daemon
cd daemon
dart run bin/daemon.dart --mode personal
# 2. 启动 WebUI
cd web-ui
npm run dev
# 3. 在浏览器中测试
# - 打开 http://localhost:3000
# - 打开开发者工具
# - 检查 WebSocket 连接
# - 测试聊天功能
# - 测试任务提交总体进度: 88% 完成
分类进度:
- ✅ 核心基础设施: 95%
- ✅ 移动端集成: 75% (iOS ✅, Android ⏳)
- ✅ Web UI: 70% (服务器 ✅, 功能 ⏳)
- ⏳ E2E 测试: 10%
- ⏳ 手动测试: 0%
- ⏳ 安全隔离: 0% (设计完成)
阻塞问题: 1 个 (Android 连接) 待办任务: 8 个 预估完成时间:
- P0 (立即): 2 小时
- P1 (本周): 4 天
- P2 (下周): 4 天
- P3 (长期): 8 周
报告生成: 2026-02-04 下次审查: 2026-02-11