docs: reorganize docs — archive outdated, create brainstorming folder
Some checks failed
CI / Lint & TypeCheck (push) Has been cancelled
CI / Unit Tests (push) Has been cancelled
CI / Build Frontend (push) Has been cancelled
CI / Rust Check (push) Has been cancelled
CI / Security Scan (push) Has been cancelled
CI / E2E Tests (push) Has been cancelled
- Create docs/brainstorming/ with 5 discussion records (Mar 16 - Apr 7) - Archive ~30 outdated audit reports (V5-V11) to docs/archive/old-audits/ - Archive superseded analysis docs to docs/archive/old-analysis/ - Archive completed session plans to docs/archive/old-plans/ - Archive old test reports/validations to respective archive folders - Remove empty directories left after moves - Keep current docs: TRUTH.md, feature docs, deployment, knowledge-base, superpowers
242
docs/archive/old-test-reports/DEEP_TEST_REPORT.md
Normal file
@@ -0,0 +1,242 @@
|
||||
# ZCLAW 深度功能测试报告
|
||||
|
||||
**测试日期:** 2026-03-15
|
||||
**测试类型:** 端到端深度功能测试
|
||||
**测试环境:** Windows 11, Chrome DevTools MCP, localhost:1420
|
||||
**测试人员:** Claude (AI Agent)
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
本次测试从真实用户角度出发,对 ZCLAW 系统进行了深度功能验证。 不仅仅检查"页面能否打开",而是验证功能的**完整性和可用性** 包括多轮对话、 工具调用、 Gateway 连接稳定性等关键场景。
|
||||
|
||||
---
|
||||
|
||||
## 一、功能完整性测试
|
||||
|
||||
### 1.1 多轮对话测试 ✅
|
||||
|
||||
**测试步骤:**
|
||||
1. 在输入框输入: "请帮我写一个 Python 函数来计算斐波那契数列的前n项"
|
||||
2. 点击发送按钮
|
||||
3. 綈息成功发送, Agent 流式返回 Python 代码
|
||||
4. 继续输入: "请解释一下这个函数的时间复杂度是多少?并优化它"
|
||||
5. Agent 正确理解上下文, 并回答关于时间复杂度的问题
|
||||
提供了优化版本的代码
|
||||
|
||||
**测试结果:** ✅ **通过**
|
||||
|
||||
**验证点:**
|
||||
- 消息发送成功率: 100%
|
||||
- 流式回复正常: 是
|
||||
- 上下文保持正确: 是
|
||||
- Agent 记住之前的对话内容: 是
|
||||
- 统计数据正确更新: 用户消息 2, 助手回复 2, 总消息数 4
|
||||
|
||||
---
|
||||
|
||||
### 1.2 右侧面板测试
|
||||
|
||||
#### Status 标签页 ✅
|
||||
- 显示 Gateway 连接状态
|
||||
- 显示当前模型
|
||||
- 显示会话统计(用户消息、 助手回复、 工具调用、 总消息数)
|
||||
- 实时更新正常
|
||||
|
||||
#### Files 标签页 ✅
|
||||
- 切换正常
|
||||
- 显示"对话输出文件" 区域
|
||||
- 显示"代码片段" 区域
|
||||
- 当前无文件是因为未调用工具
|
||||
|
||||
#### Agent 标签页 ✅
|
||||
- 显示完整的 Agent 配置信息:
|
||||
- 包含: Role, Nickname, Model, Emoji, 用户信息, Focus, Workspace, File Restriction, Opt-in, Bootstrap Files
|
||||
- 所有字段正确显示
|
||||
|
||||
---
|
||||
|
||||
### 1.3 Hands 能力包测试 ✅
|
||||
- 列表显示 8 个能力包
|
||||
- 状态显示正确(就绪/需配置)
|
||||
- 工具数量显示正确
|
||||
- 点击后详情页正常显示
|
||||
|
||||
---
|
||||
|
||||
### 1.4 Settings 设置页面测试 ✅
|
||||
- 16 个设置页面全部可访问
|
||||
- 导航正常工作
|
||||
- 页面内容正确显示
|
||||
|
||||
---
|
||||
|
||||
## 二、发现的问题
|
||||
|
||||
### 2.1 🔴 严重问题: Gateway 连接不稳定
|
||||
|
||||
**问题描述:**
|
||||
- 在测试过程中 Gateway 断开连接
|
||||
- 点击 "Connect Gateway" 按钮后 10 秒内未能重新连接
|
||||
- 显示 "Gateway Disconnected"
|
||||
- 输入框显示 "请先连接 Gateway"
|
||||
|
||||
**影响范围:** 严重
|
||||
- 无法发送新消息
|
||||
- 无法执行工具调用
|
||||
- Hands/Workflow 功能无法使用
|
||||
|
||||
- 分身管理功能无法使用
|
||||
|
||||
**复现步骤:**
|
||||
1. 启动应用并连接 Gateway
|
||||
2. 进行几轮对话
|
||||
3. 观察右侧面板连接状态变化为 "Disconnected"
|
||||
4. 点击 "Connect Gateway" 尝试重连
|
||||
5. 等待 10 秒后连接仍未恢复
|
||||
|
||||
**建议修复:**
|
||||
1. 添加自动重连机制
|
||||
2. 优化 WebSocket 心跳检测
|
||||
3. 增加连接状态监控和自动恢复
|
||||
4. 提供更清晰的错误提示
|
||||
|
||||
---
|
||||
|
||||
### 2.2 🟡 中等问题: 工具调用无法执行
|
||||
**问题描述:**
|
||||
- 由于 Gateway 断开, 无法测试实际的工具调用功能
|
||||
- Files 标签页显示 "No Output Files" 和 "No code snippets"
|
||||
|
||||
**影响范围:** 中等
|
||||
- 无法验证 write_file, read_file 等核心工具
|
||||
- 无法测试 Agent 的实际执行能力
|
||||
- 代码生成功能无法写入文件
|
||||
|
||||
**建议修复:**
|
||||
- 先修复 Gateway 连接问题
|
||||
- 添加离线模式支持
|
||||
|
||||
---
|
||||
|
||||
### 2.3 🟡 中等问题: 分身创建 400 错误
|
||||
**问题描述:**
|
||||
- POST /api/agents 返回 400 Bad Request
|
||||
- 无法创建新的 Agent 分身
|
||||
- 表单数据格式可能有问题
|
||||
|
||||
**API 请求示例:**
|
||||
```json
|
||||
{
|
||||
"name": "测试助手",
|
||||
"role": "代码助手",
|
||||
"nickname": "开发者",
|
||||
"scenarios": ["编程", "调试"],
|
||||
"workspaceDir": "~/.zclaw/zclaw-workspace",
|
||||
"userName": "测试用户",
|
||||
"restrictFiles": true,
|
||||
"privacyOptIn": false
|
||||
}
|
||||
```
|
||||
|
||||
**建议修复:**
|
||||
- 检查后端 API 参数验证
|
||||
- 确认必填字段列表
|
||||
- 添加更详细的错误信息
|
||||
|
||||
---
|
||||
|
||||
### 2.4 🟡 中等问题: Create Team 按钮无响应
|
||||
**问题描述:**
|
||||
- 在 Team 页面点击 "Create Team" 按钮
|
||||
- 没有弹出创建表单或模态框
|
||||
- 按钮点击后页面无任何变化
|
||||
|
||||
**建议修复:**
|
||||
- 棣查按钮的事件绑定
|
||||
- 确认模态框组件是否正确加载
|
||||
|
||||
---
|
||||
|
||||
### 2.5 🟢 轻微问题: Skills 组件 key 警告
|
||||
**问题描述:**
|
||||
- 控制台显示: "Each child in a list should have a unique 'key' prop"
|
||||
- 这是 React 渲染警告
|
||||
|
||||
**建议修复:**
|
||||
- 在 Skills 组件中为列表项添加 key 属性
|
||||
|
||||
---
|
||||
|
||||
### 2.6 🟢 轻微问题: 6个 API 端点 404 错误
|
||||
**受影响的端点:**
|
||||
- `/api/stats/usage` - 用量统计
|
||||
- `/api/plugins/status` - 插件状态
|
||||
- `/api/scheduler/tasks` - 调度任务
|
||||
- `/api/security/status` - 安全状态
|
||||
- `/api/workspace` - 工作区信息
|
||||
- `/api/config/quick` - 快速配置
|
||||
|
||||
**建议修复:**
|
||||
- 实现这些 API 端点或从前端移除相关调用
|
||||
|
||||
---
|
||||
|
||||
## 三、测试统计
|
||||
|
||||
| 测试项 | 数量 | 通过率 |
|
||||
|--------|------|--------|
|
||||
| 功能模块 | 8 | 75% |
|
||||
| API 调用 | 50+ | 85% |
|
||||
| UI 交互 | 20+ | 90% |
|
||||
| 错误发现 | 10 | - |
|
||||
|
||||
---
|
||||
|
||||
## 四、修复优先级建议
|
||||
|
||||
### 立即修复 (P0)
|
||||
1. **Gateway 连接稳定性** - 添加自动重连和心跳检测
|
||||
2. **POST /api/agents 400 错误** - 修复参数验证
|
||||
|
||||
### 高优先级 (P1)
|
||||
1. **实现 404 API 端点** - 或移除相关 UI 组件
|
||||
2. **Create Team 按钮修复** - 添加模态框弹窗
|
||||
|
||||
### 中优先级 (P2)
|
||||
1. **Skills 组件 key 警告** - 添加 key 属性
|
||||
|
||||
---
|
||||
|
||||
## 五、测试截图
|
||||
保存在 `docs/test-screenshots/` 目录
|
||||
|
||||
---
|
||||
|
||||
## 六、结论
|
||||
|
||||
### 正常工作的功能
|
||||
- ✅ 多轮对话 (上下文保持正确)
|
||||
- ✅ 流式回复
|
||||
- ✅ 右侧面板三个标签页
|
||||
- ✅ Hands 能力包列表
|
||||
- ✅ Settings 设置页面导航
|
||||
|
||||
### 需要修复的功能
|
||||
- 🔴 Gateway 连接稳定性 (严重)
|
||||
- 🟡 工具调用执行 (依赖 Gateway)
|
||||
- 🟡 分身创建 API (400 错误)
|
||||
- 🟡 Team 创建功能 (按钮无响应)
|
||||
- 🟢 6 个 API 端点 (404)
|
||||
- 🟢 Skills 组件警告 (key prop)
|
||||
|
||||
### 核心建议
|
||||
1. **优先修复 Gateway 连接稳定性** - 这是阻塞性问题
|
||||
2. **实现自动重连机制** - 提升用户体验
|
||||
3. **修复分身创建 API** - 核心功能
|
||||
4. **完善测试覆盖** - 添加自动化测试
|
||||
|
||||
---
|
||||
|
||||
*本报告基于 2026-03-15 的测试结果*
|
||||
272
docs/archive/old-test-reports/FRONTEND_TEST_REPORT.md
Normal file
@@ -0,0 +1,272 @@
|
||||
# ZCLAW 前端全面调试报告
|
||||
|
||||
**测试日期**: 2026-03-15
|
||||
**测试环境**: Windows 11, Chrome DevTools MCP
|
||||
**前端服务**: http://localhost:1420
|
||||
**后端服务**: ws://127.0.0.1:50051
|
||||
|
||||
---
|
||||
|
||||
## 测试概览
|
||||
|
||||
| 模块 | 优先级 | 状态 | 通过率 |
|
||||
|------|--------|------|--------|
|
||||
| 聊天模块 | P0 | ✅ 通过 | 100% |
|
||||
| Agent/分身管理 | P0 | ✅ 通过 | 90% |
|
||||
| Hands 系统 | P1 | ✅ 通过 | 95% |
|
||||
| 工作流调度 | P1 | ✅ 通过 | 90% |
|
||||
| 团队协作 | P1 | ✅ 通过 | 90% |
|
||||
| 内存系统 | P1 | ✅ 通过 | 90% |
|
||||
| 设置管理 | P2 | ✅ 通过 | 95% |
|
||||
| 布局/导航 | P2 | ⚠️ 部分通过 | 70% |
|
||||
|
||||
**总体通过率: 92%**
|
||||
|
||||
---
|
||||
|
||||
## 详细测试结果
|
||||
|
||||
### 1. 聊天模块 (P0) - ✅ 通过
|
||||
|
||||
#### 1.1 消息发送
|
||||
- ✅ 输入框正常工作
|
||||
- ✅ 发送按钮响应正确
|
||||
- ✅ 消息正确显示在聊天区域
|
||||
- ✅ 发送后输入框被清空
|
||||
|
||||
#### 1.2 流式响应
|
||||
- ✅ WebSocket 连接正常 (ws://127.0.0.1:50051/ws)
|
||||
- ✅ 流式文本逐字显示
|
||||
- ✅ 响应完整接收
|
||||
|
||||
#### 1.3 模型选择
|
||||
- ✅ 模型选择器正常工作
|
||||
- ✅ 可选模型: glm-5, qwen3.5-plus, kimi-k2.5, minimax-m2.5
|
||||
- ✅ 模型切换成功 (从 qwen3.5-plus 切换到 glm-5)
|
||||
- ✅ 切换后新消息使用新模型
|
||||
|
||||
#### 1.4 会话统计
|
||||
- ✅ 用户消息计数正确
|
||||
- ✅ 助手回复计数正确
|
||||
- ✅ 总消息数统计正确
|
||||
|
||||
---
|
||||
|
||||
### 2. Agent/分身管理 (P0) - ✅ 通过
|
||||
|
||||
#### 2.1 分身状态
|
||||
- ✅ 显示"暂无分身"状态
|
||||
- ✅ 提示"在左侧栏创建"
|
||||
- ⚠️ 创建分身功能未完全测试 (需要更多用户交互)
|
||||
|
||||
#### 2.2 Agent 列表
|
||||
- ✅ API 调用成功 (`GET /api/agents` 返回 200)
|
||||
- ✅ 显示当前 Agent 信息 (默认助手)
|
||||
|
||||
---
|
||||
|
||||
### 3. Hands 系统 (P1) - ✅ 通过
|
||||
|
||||
#### 3.1 Hands 列表
|
||||
- ✅ 显示 8 个自主能力包
|
||||
- ✅ 每个 Hand 显示名称、描述、状态、工具数量
|
||||
|
||||
**Hands 列表**:
|
||||
| Hand | 状态 | 工具数 |
|
||||
|------|------|--------|
|
||||
| 🌐 Browser | 就绪 | 18 |
|
||||
| 🎬 Clip | 需配置 | 7 |
|
||||
| 🔍 Collector | 就绪 | 15 |
|
||||
| 📊 Lead | 就绪 | 14 |
|
||||
| 🔮 Predictor | 就绪 | 14 |
|
||||
| 🧪 Researcher | 就绪 | 15 |
|
||||
| 📈 Trading | 就绪 | 15 |
|
||||
| 𝕏 Twitter | 需配置 | 15 |
|
||||
|
||||
#### 3.2 Hand 详情
|
||||
- ✅ 点击 Hand 显示详情面板
|
||||
- ✅ 显示"执行任务" 按钮
|
||||
- ✅ 显示任务记录状态
|
||||
|
||||
---
|
||||
|
||||
### 4. 工作流调度 (P1) - ⚠️ 部分通过
|
||||
|
||||
#### 4.1 发现的问题
|
||||
- ❌ **路由问题**: 点击"工作流" 标签后, URL 变为 `#workflows` 但页面内容仍是聊天界面
|
||||
- ✅ API 调用成功 (`GET /api/workflows` 返回 200)
|
||||
- ⚠️ 需要修复侧边栏标签路由逻辑
|
||||
|
||||
#### 4.2 API 状态
|
||||
- ✅ `/api/workflows` - 200 OK
|
||||
- ✅ `/api/triggers` - 200 OK
|
||||
|
||||
---
|
||||
|
||||
### 5. 团队协作 (P1) - ⚠️ 部分通过
|
||||
|
||||
#### 5.1 发现的问题
|
||||
- ❌ **路由问题**: 同工作流, 点击"团队" 标签后页面未正确切换
|
||||
- ✅ API 调用成功 (`GET /api/channels` 返回 200)
|
||||
|
||||
---
|
||||
|
||||
### 6. 内存系统 (P1) - ✅ 通过
|
||||
|
||||
#### 6.1 内存标签
|
||||
- ✅ 右侧面板有 Memory 标签
|
||||
- ✅ 可以切换查看
|
||||
- ⚠️ 完整内存管理功能需要更多测试
|
||||
|
||||
---
|
||||
|
||||
### 7. 设置管理 (P2) - ✅ 通过
|
||||
|
||||
#### 7.1 通用设置
|
||||
- ✅ Gateway 连接状态显示 (已连接)
|
||||
- ✅ 地址显示 (ws://127.0.0.1:50051)
|
||||
- ✅ Token 输入框
|
||||
- ✅ 断开连接按钮
|
||||
- ✅ 主题模式切换
|
||||
- ✅ 开机自启开关
|
||||
- ✅ 显示工具调用开关
|
||||
|
||||
#### 7.2 模型与 API 设置
|
||||
- ✅ 当前模型显示 (glm-5)
|
||||
- ✅ Gateway 状态显示
|
||||
- ✅ 大量可选模型 (50+ 个模型)
|
||||
- ✅ Gateway URL 配置
|
||||
- ✅ 保存连接设置按钮
|
||||
|
||||
**可用模型提供商**:
|
||||
- anthropic, openai, gemini, deepseek, groq
|
||||
- openrouter, mistral, together, fireworks
|
||||
- ollama, vllm, lmstudio, perplexity
|
||||
- cohere, ai21, cerebras, sambanova
|
||||
- xai, huggingface, replicate, github-copilot
|
||||
- qwen, minimax, zhipu, zhipu_coding
|
||||
- zai_coding, moonshot, kimi_coding, qianfan
|
||||
- volcengine, bedrock, codex, claude-code
|
||||
- qwen-code, chutes, venice
|
||||
|
||||
#### 7.3 MCP 服务
|
||||
- ✅ 显示 0 个已声明服务
|
||||
- ✅ 显示说明信息
|
||||
- ℹ️ 新增/删除服务功能尚未接入
|
||||
|
||||
#### 7.4 审计日志
|
||||
- ✅ 标题显示 "Audit Logs"
|
||||
- ✅ Live Stream 按钮
|
||||
- ✅ 搜索框
|
||||
- ✅ Filter 按钮
|
||||
- ✅ Export as JSON/CSV 按钮
|
||||
- ✅ 每页数量选择 (25/50/100/200/500)
|
||||
- ✅ Refresh 按钮
|
||||
- ℹ️ 当前无日志记录
|
||||
|
||||
#### 7.5 关于页面
|
||||
- ✅ 版本信息 (0.2.0)
|
||||
- ✅ 检查更新按钮
|
||||
- ✅ 更新日志按钮
|
||||
- ✅ 版权信息
|
||||
- ✅ 隐私政策和用户协议链接
|
||||
|
||||
---
|
||||
|
||||
### 8. 布局/导航 (P2) - ⚠️ 部分通过
|
||||
|
||||
#### 8.1 侧边栏
|
||||
- ✅ 显示 4 个标签: 分身、Hands、工作流、团队
|
||||
- ❌ **路由问题**: 点击 Hands/工作流/团队 标签时页面内容不切换
|
||||
- ✅ 用户信息显示
|
||||
|
||||
#### 8.2 右侧面板
|
||||
- ✅ 显示当前消息统计
|
||||
- ✅ Status/Files/Agent/Memory 标签
|
||||
- ✅ Gateway 连接状态
|
||||
- ✅ 当前模型显示
|
||||
- ✅ 运行概览信息
|
||||
|
||||
---
|
||||
|
||||
## 发现的问题
|
||||
|
||||
### ✅ 已修复
|
||||
|
||||
#### 2. 部分 API 未实现 (404) - 已添加前端降级处理
|
||||
**未实现的 API** (已在前端添加默认值处理):
|
||||
- `/api/config/quick` → 返回 `{}`
|
||||
- `/api/workspace` → 返回默认工作区信息
|
||||
- `/api/stats/usage` → 返回 `{ totalMessages: 0, totalTokens: 0, ... }`
|
||||
- `/api/plugins/status` → 返回 `{ plugins: [], loaded: 0, total: 0 }`
|
||||
- `/api/scheduler/tasks` → 返回 `{ tasks: [], total: 0 }`
|
||||
- `/api/security/status` → 返回默认安全层信息
|
||||
|
||||
**修复位置**: `desktop/src/lib/gateway-client.ts`
|
||||
|
||||
---
|
||||
|
||||
## API 测试总结
|
||||
|
||||
### 成功的 API (200)
|
||||
| API | 状态 |
|
||||
|-----|------|
|
||||
| `/api/health` | ✅ |
|
||||
| `/api/agents` | ✅ |
|
||||
| `/api/skills` | ✅ |
|
||||
| `/api/hands` | ✅ |
|
||||
| `/api/workflows` | ✅ |
|
||||
| `/api/triggers` | ✅ |
|
||||
| `/api/channels` | ✅ |
|
||||
|
||||
### 失败的 API (404) - 已添加前端降级处理
|
||||
| API | 状态 | 降级处理 |
|
||||
|-----|------|----------|
|
||||
| `/api/config/quick` | ⚠️ 404 | ✅ 返回 `{}` |
|
||||
| `/api/workspace` | ⚠️ 404 | ✅ 返回默认工作区 |
|
||||
| `/api/stats/usage` | ⚠️ 404 | ✅ 返回默认统计 |
|
||||
| `/api/plugins/status` | ⚠️ 404 | ✅ 返回空插件列表 |
|
||||
| `/api/scheduler/tasks` | ⚠️ 404 | ✅ 返回空任务列表 |
|
||||
| `/api/security/status` | ⚠️ 404 | ✅ 返回默认安全层 |
|
||||
|
||||
---
|
||||
|
||||
## 测试环境信息
|
||||
|
||||
- **前端框架**: React + Vite + Tauri
|
||||
- **端口**: 1420
|
||||
- **WebSocket**: ws://127.0.0.1:50051/ws
|
||||
- **当前模型**: glm-5
|
||||
- **Gateway 状态**: 已连接
|
||||
|
||||
---
|
||||
|
||||
## 建议的后续行动
|
||||
|
||||
1. ~~修复侧边栏路由问题~~ ✅ 经用户确认正常工作
|
||||
|
||||
2. ~~实现缺失的 API 降级处理~~ ✅ 已在 `gateway-client.ts` 中添加
|
||||
|
||||
3. **后端实现缺失的 API** (可选)
|
||||
- `/api/stats/usage` - 使用统计
|
||||
- `/api/plugins/status` - 插件状态
|
||||
- `/api/scheduler/tasks` - 定时任务
|
||||
- `/api/config/quick` - 快速配置
|
||||
- `/api/workspace` - 工作区信息
|
||||
- `/api/security/status` - 安全状态
|
||||
|
||||
4. **Gateway 版本显示** (低优先级)
|
||||
- 需要后端 `/api/health` 返回版本信息
|
||||
|
||||
5. **修复表单字段** (低优先级)
|
||||
- 为所有表单字段添加 id/name 属性
|
||||
|
||||
---
|
||||
|
||||
## 测试截图
|
||||
|
||||
测试过程中已捕获多个截图, 记录了各个功能模块的状态。
|
||||
|
||||
---
|
||||
|
||||
*报告生成时间: 2026-03-15*
|
||||
440
docs/archive/old-test-reports/FUNCTIONAL_VERIFICATION_PLAN.md
Normal file
@@ -0,0 +1,440 @@
|
||||
# ZCLAW 系统功能验证方案
|
||||
|
||||
> **验证目标**: 通过模拟真实用户操作流程,对所有功能模块进行深度验证,确保功能实现与设计初衷完全一致。
|
||||
> **验证方式**: tauri-mcp + Chrome DevTools 协议,直接操控运行中的应用
|
||||
> **验证日期**: 2026-04-05
|
||||
> **当前状态**: 稳定化已完成,功能冻结已解除
|
||||
|
||||
---
|
||||
|
||||
## 1. 功能模块清单及优先级划分
|
||||
|
||||
### 优先级定义
|
||||
- **P0 致命**: 用户无法完成核心操作(登录、聊天、模型切换)
|
||||
- **P1 关键**: 主要功能不可用或结果不正确(Agent管理、技能执行、Hands触发)
|
||||
- **P2 重要**: 辅助功能异常(自动化面板、Pipeline、课堂、设置)
|
||||
- **P3 一般**: 边缘场景或体验优化(记忆图谱、智能层细节)
|
||||
|
||||
### 模块矩阵
|
||||
|
||||
| # | 模块 | 优先级 | 涉及组件 | 验证页面/路径 |
|
||||
|---|------|--------|----------|---------------|
|
||||
| M01 | 登录与认证 | P0 | LoginPage, SaaS登录 | 登录页 |
|
||||
| M02 | 聊天核心 | P0 | ChatArea, StreamingText | 主聊天界面 |
|
||||
| M03 | 模型选择与切换 | P0 | ModelSelector | 聊天顶部 |
|
||||
| M04 | Agent/分身管理 | P1 | CloneManager, AgentStore | 侧边栏 |
|
||||
| M05 | 技能系统 | P1 | SkillMarket, SkillCard | 技能市场 |
|
||||
| M06 | Hands 自主能力 | P1 | HandsPanel, HandApprovalModal | 自动化面板 |
|
||||
| M07 | 自动化面板 | P2 | AutomationPanel, TriggersPanel | 自动化页签 |
|
||||
| M08 | Pipeline 工作流 | P2 | WorkflowBuilder, IntentInput | 工作流编辑器 |
|
||||
| M09 | 课堂系统 | P2 | ClassroomPlayer, SceneRenderer | 课堂播放器 |
|
||||
| M10 | 设置系统 | P2 | 12个设置页面 | 设置页签 |
|
||||
| M11 | 记忆系统 | P2 | MemoryPanel, MemoryGraph | 右侧面板 |
|
||||
| M12 | 智能层 | P3 | HeartbeatConfig, ReflectionLog | 右侧面板/设置 |
|
||||
| M13 | 浏览器自动化 | P1 | BrowserHandCard, TaskTemplateModal | Browser Hand |
|
||||
| M14 | 展示系统 | P2 | SlideshowRenderer, QuizRenderer | 展示播放器 |
|
||||
| M15 | Admin V2 | P2 | 15个管理页面 | admin-v2 Web应用 |
|
||||
|
||||
---
|
||||
|
||||
## 2. 各功能模块设计目标与预期效果
|
||||
|
||||
### M01: 登录与认证
|
||||
**设计目标**: 用户通过 SaaS 账户登录后才能使用桌面端功能。
|
||||
**预期效果**:
|
||||
- 登录页展示品牌标识、用户名/密码输入框
|
||||
- 登录成功后自动跳转到主界面
|
||||
- 支持 TOTP 两步验证
|
||||
- 登录失败显示明确错误信息
|
||||
- 会话恢复:重启应用后自动恢复登录状态(OS keyring)
|
||||
|
||||
### M02: 聊天核心
|
||||
**设计目标**: 用户与 AI Agent 进行多轮对话,获取流式响应。
|
||||
**预期效果**:
|
||||
- 输入框在底部,消息流式显示
|
||||
- 支持普通文本、代码块、Markdown 渲染
|
||||
- 消息气泡区分用户/AI
|
||||
- 流式响应有打字机效果
|
||||
- 支持取消正在进行的响应
|
||||
- 历史对话在侧边栏可切换
|
||||
- 新建对话功能正常
|
||||
- 建议提示词(SuggestionChips)展示
|
||||
|
||||
### M03: 模型选择与切换
|
||||
**设计目标**: 用户可在多个 LLM Provider 之间切换模型。
|
||||
**预期效果**:
|
||||
- 模型选择器显示可用模型列表
|
||||
- 切换模型后后续对话使用新模型
|
||||
- 已连接 SaaS 时显示 SaaS 可用模型
|
||||
- 未连接时显示本地配置的模型
|
||||
|
||||
### M04: Agent/分身管理
|
||||
**设计目标**: 用户可创建、配置、切换不同的 AI Agent(分身)。
|
||||
**预期效果**:
|
||||
- 侧边栏显示 Agent 列表
|
||||
- 可创建新 Agent(设置名称、人设、模型偏好)
|
||||
- 可切换当前活跃 Agent
|
||||
- 可编辑/删除 Agent
|
||||
- Agent 配置持久化
|
||||
|
||||
### M05: 技能系统
|
||||
**设计目标**: 用户可浏览、搜索、执行 75 个预定义技能。
|
||||
**预期效果**:
|
||||
- 技能市场展示技能卡片
|
||||
- 技能按类别分组
|
||||
- 支持搜索技能
|
||||
- 点击技能可查看详情
|
||||
- 可直接触发技能执行
|
||||
- 技能执行结果在聊天中显示
|
||||
|
||||
### M06: Hands 自主能力
|
||||
**设计目标**: 9 个 Hands 提供浏览器自动化、数据收集、研究等能力。
|
||||
**预期效果**:
|
||||
- Hands 面板展示所有可用 Hands
|
||||
- 每个 Hand 显示状态、描述
|
||||
- 可触发 Hand 执行(带参数配置)
|
||||
- 需要审批的 Hand 弹出审批弹窗
|
||||
- 执行状态实时更新
|
||||
- 执行结果可查看
|
||||
|
||||
### M07: 自动化面板
|
||||
**设计目标**: 用户可创建自动化触发器、查看审批队列、管理定时任务。
|
||||
**预期效果**:
|
||||
- 自动化面板展示触发器列表
|
||||
- 可创建新触发器(选择类型、配置条件)
|
||||
- 审批队列显示待审批操作
|
||||
- 定时任务管理
|
||||
|
||||
### M08: Pipeline 工作流
|
||||
**设计目标**: 用户可通过意图路由触发 Pipeline 工作流,或可视化编辑工作流。
|
||||
**预期效果**:
|
||||
- 意图输入可路由到匹配的 Pipeline
|
||||
- 工作流编辑器支持拖拽节点
|
||||
- 节点类型:LLM、Skill、Hand、HTTP、并行、条件
|
||||
- 可保存和运行工作流
|
||||
- 执行结果可查看
|
||||
|
||||
### M09: 课堂系统
|
||||
**设计目标**: AI 生成多 Agent 互动的教学场景。
|
||||
**预期效果**:
|
||||
- 可输入主题生成课堂
|
||||
- 生成进度实时显示
|
||||
- 课堂播放器展示多 Agent 对话
|
||||
- 场景切换流畅
|
||||
- 支持学生笔记
|
||||
- 白板绘制功能
|
||||
- TTS 语音播放
|
||||
|
||||
### M10: 设置系统
|
||||
**设计目标**: 12 个设置页面覆盖所有配置需求。
|
||||
**预期效果**:
|
||||
- 通用设置:语言、主题、代理
|
||||
- 使用统计:用量图表
|
||||
- 积分/计费:余额、充值
|
||||
- 模型与 API:Provider 配置、API Key
|
||||
- MCP 服务:外部工具连接
|
||||
- 技能管理:技能列表
|
||||
- IM 通道:飞书等集成
|
||||
- 工作区:文件路径配置
|
||||
- 隐私:数据收集选项
|
||||
- 安全存储:敏感信息
|
||||
- 关于:版本信息
|
||||
|
||||
### M11: 记忆系统
|
||||
**设计目标**: AI 记住用户偏好和历史对话要点。
|
||||
**预期效果**:
|
||||
- 记忆面板展示已存储的记忆
|
||||
- 记忆图谱可视化
|
||||
- 可搜索记忆
|
||||
- 可删除单条记忆
|
||||
- Viking 存储功能正常
|
||||
|
||||
### M12: 智能层
|
||||
**设计目标**: Heartbeat(心跳)、Reflection(反思)、Identity(身份进化)协同工作。
|
||||
**预期效果**:
|
||||
- 心跳配置可查看/修改
|
||||
- 反思日志可查看
|
||||
- 身份变化提案通知可响应
|
||||
- 压缩器自动管理上下文窗口
|
||||
|
||||
### M13: 浏览器自动化
|
||||
**设计目标**: 通过 Chromium 自动化浏览器操作。
|
||||
**预期效果**:
|
||||
- 可创建浏览器会话
|
||||
- 任务模板可选择
|
||||
- 截图预览可查看
|
||||
- 表单填写自动化
|
||||
- 数据抓取功能
|
||||
|
||||
### M14: 展示系统
|
||||
**设计目标**: 生成幻灯片、测验、文档等展示内容。
|
||||
**预期效果**:
|
||||
- 幻灯片播放器正常
|
||||
- 测验渲染和交互
|
||||
- 文档渲染
|
||||
- 图表渲染
|
||||
|
||||
### M15: Admin V2 管理后台
|
||||
**设计目标**: 管理员通过 Web 界面管理 SaaS 平台。
|
||||
**预期效果**:
|
||||
- 仪表盘展示关键指标
|
||||
- 账户管理 CRUD
|
||||
- 模型服务配置
|
||||
- 角色权限管理
|
||||
- 计费管理
|
||||
- 中继任务管理
|
||||
- 知识库管理
|
||||
- 定时任务管理
|
||||
- Prompt 模板管理
|
||||
- 操作日志查看
|
||||
- 配置同步管理
|
||||
|
||||
---
|
||||
|
||||
## 3. 详细用户操作场景模拟方案
|
||||
|
||||
### Phase 1: 核心交互(P0)
|
||||
|
||||
#### 场景 S1.1: 首次登录
|
||||
1. 启动应用,观察加载过程
|
||||
2. 检查登录页 UI 元素完整性
|
||||
3. 输入错误凭证,验证错误提示
|
||||
4. 输入正确凭证,验证登录流程
|
||||
5. 检查登录后状态持久化
|
||||
|
||||
#### 场景 S1.2: 基础聊天
|
||||
1. 在聊天框输入 "你好,请介绍一下你自己"
|
||||
2. 观察流式响应是否正常
|
||||
3. 验证 Markdown 渲染(代码块、列表、标题)
|
||||
4. 输入 "请用 Python 写一个快排" → 验证代码块渲染
|
||||
5. 点击取消按钮中断响应
|
||||
6. 创建新对话,验证历史对话保留
|
||||
|
||||
#### 场景 S1.3: 模型切换
|
||||
1. 打开模型选择器
|
||||
2. 列出所有可用模型
|
||||
3. 切换到不同模型
|
||||
4. 发送消息验证新模型响应
|
||||
5. 验证模型标识在 UI 中正确显示
|
||||
|
||||
### Phase 2: Agent 管理与技能(P1)
|
||||
|
||||
#### 场景 S2.1: Agent CRUD
|
||||
1. 打开 Agent 管理面板
|
||||
2. 创建新 Agent(名称、人设描述)
|
||||
3. 切换到新 Agent
|
||||
4. 验证人设在对话中体现
|
||||
5. 编辑 Agent 属性
|
||||
6. 删除 Agent
|
||||
|
||||
#### 场景 S2.2: 技能浏览与执行
|
||||
1. 进入技能市场
|
||||
2. 浏览技能分类
|
||||
3. 搜索特定技能(如 "翻译")
|
||||
4. 查看技能详情
|
||||
5. 执行一个简单技能
|
||||
6. 验证结果在聊天中展示
|
||||
|
||||
#### 场景 S2.3: Hands 触发
|
||||
1. 进入 Hands 面板
|
||||
2. 查看 9 个可用 Hands 状态
|
||||
3. 触发一个无需审批的 Hand(如 Researcher)
|
||||
4. 验证执行状态和结果
|
||||
5. 触发需审批的 Hand(如 Browser)
|
||||
6. 验证审批弹窗和审批流程
|
||||
|
||||
### Phase 3: 自动化与工作流(P2)
|
||||
|
||||
#### 场景 S3.1: 自动化面板
|
||||
1. 切换到自动化页签
|
||||
2. 查看触发器列表
|
||||
3. 创建新触发器
|
||||
4. 查看审批队列
|
||||
5. 查看执行历史
|
||||
|
||||
#### 场景 S3.2: Pipeline 工作流
|
||||
1. 进入工作流编辑器
|
||||
2. 拖拽节点创建简单工作流
|
||||
3. 保存工作流
|
||||
4. 运行工作流
|
||||
5. 查看执行结果
|
||||
|
||||
#### 场景 S3.3: 课堂生成
|
||||
1. 触发课堂生成
|
||||
2. 观察生成进度
|
||||
3. 播放课堂内容
|
||||
4. 测试场景交互(白板、笔记、TTS)
|
||||
|
||||
### Phase 4: 设置与智能层(P2-P3)
|
||||
|
||||
#### 场景 S4.1: 设置页面遍历
|
||||
1. 逐一打开 12 个设置页面
|
||||
2. 验证每个页面的数据加载
|
||||
3. 修改设置并保存
|
||||
4. 验证设置持久化
|
||||
|
||||
#### 场景 S4.2: 记忆系统
|
||||
1. 打开右侧面板记忆页签
|
||||
2. 查看已存储记忆
|
||||
3. 搜索记忆
|
||||
4. 查看记忆图谱
|
||||
5. 删除单条记忆
|
||||
|
||||
#### 场景 S4.3: 智能层
|
||||
1. 查看心跳配置
|
||||
2. 查看反思日志
|
||||
3. 查看身份状态
|
||||
4. 响应身份变化提案
|
||||
|
||||
### Phase 5: Admin V2 管理后台
|
||||
|
||||
#### 场景 S5.1: Admin 登录与仪表盘
|
||||
1. 打开 Admin V2 Web 界面
|
||||
2. 管理员登录
|
||||
3. 查看仪表盘关键指标
|
||||
|
||||
#### 场景 S5.2: 账户与角色管理
|
||||
1. 账户列表查看
|
||||
2. 创建/编辑/禁用账户
|
||||
3. 角色权限配置
|
||||
|
||||
#### 场景 S5.3: 模型与中继管理
|
||||
1. Provider 配置
|
||||
2. 模型管理
|
||||
3. API Key 轮换
|
||||
4. 中继任务查看
|
||||
|
||||
#### 场景 S5.4: 知识库与定时任务
|
||||
1. 知识库分类管理
|
||||
2. 知识条目 CRUD
|
||||
3. 定时任务配置
|
||||
|
||||
---
|
||||
|
||||
## 4. 功能验证点及判断标准
|
||||
|
||||
### 验证等级定义
|
||||
|
||||
| 等级 | 标识 | 含义 |
|
||||
|------|------|------|
|
||||
| PASS | ✅ | 功能完全符合设计预期 |
|
||||
| PARTIAL | ⚠️ | 功能部分实现或存在非关键问题 |
|
||||
| FAIL | ❌ | 功能不可用或严重偏离设计 |
|
||||
| N/A | ➖ | 前置条件不满足,无法验证 |
|
||||
|
||||
### 每个验证点的检查维度
|
||||
|
||||
1. **UI 完整性**: 页面元素是否完整渲染,无空白/缺失
|
||||
2. **交互响应**: 用户操作是否得到预期反馈
|
||||
3. **数据正确性**: 显示数据是否与后端一致
|
||||
4. **状态一致性**: 操作后 UI 状态是否正确更新
|
||||
5. **错误处理**: 异常操作是否有合理提示
|
||||
6. **持久化**: 修改是否被正确保存
|
||||
|
||||
### 通用判断标准
|
||||
|
||||
- **PASS**: 6 个维度全部满足
|
||||
- **PARTIAL**: 1-2 个维度不满足但不影响核心功能
|
||||
- **FAIL**: 3 个以上维度不满足或核心功能不可用
|
||||
|
||||
---
|
||||
|
||||
## 5. 问题记录与跟踪机制
|
||||
|
||||
### 问题严重性分级
|
||||
|
||||
| 级别 | 定义 | 示例 |
|
||||
|------|------|------|
|
||||
| BLOCKER | 系统无法启动或核心功能完全不可用 | 应用崩溃、登录失败 |
|
||||
| CRITICAL | 主要功能不可用 | 聊天无法发送、模型无法切换 |
|
||||
| MAJOR | 功能部分失效或结果不正确 | 技能执行无结果、设置无法保存 |
|
||||
| MINOR | UI 问题或体验不佳 | 样式错乱、文案错误 |
|
||||
| TRIVIAL | 极小问题,不影响使用 | 拼写错误、间距不均 |
|
||||
|
||||
### 问题记录模板
|
||||
|
||||
```
|
||||
### ISS-XXX: [简短标题]
|
||||
- **模块**: M01-M15
|
||||
- **严重性**: BLOCKER/CRITICAL/MAJOR/MINOR/TRIVIAL
|
||||
- **验证点**: 对应的验证点编号
|
||||
- **现象描述**: 详细描述观察到的行为
|
||||
- **预期行为**: 应该发生什么
|
||||
- **复现步骤**:
|
||||
1. 步骤一
|
||||
2. 步骤二
|
||||
3. ...
|
||||
- **实际截图/日志**: 附件
|
||||
- **影响范围**: 影响哪些用户/场景
|
||||
- **根因分析**: 初步判断的原因
|
||||
- **修复建议**: 建议的修复方向
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 6. 验证结果汇总报告模板
|
||||
|
||||
```markdown
|
||||
# ZCLAW 功能验证报告
|
||||
|
||||
**验证日期**: YYYY-MM-DD
|
||||
**验证人**: Claude Code (tauri-mcp)
|
||||
**应用版本**: 从 package.json 获取
|
||||
**测试环境**: Windows 11 + Tauri 2.x
|
||||
|
||||
## 执行摘要
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 总验证点数 | N |
|
||||
| PASS | N (X%) |
|
||||
| PARTIAL | N (X%) |
|
||||
| FAIL | N (X%) |
|
||||
| N/A | N (X%) |
|
||||
| BLOCKER | N |
|
||||
| CRITICAL | N |
|
||||
| MAJOR | N |
|
||||
| MINOR | N |
|
||||
| TRIVIAL | N |
|
||||
|
||||
## 模块验证矩阵
|
||||
|
||||
| 模块 | 验证点数 | PASS | PARTIAL | FAIL | N/A | 备注 |
|
||||
|------|---------|------|---------|------|-----|------|
|
||||
| M01 登录 | | | | | | |
|
||||
| M02 聊天 | | | | | | |
|
||||
| ... | | | | | | |
|
||||
|
||||
## 问题清单
|
||||
|
||||
### BLOCKER
|
||||
[列表]
|
||||
|
||||
### CRITICAL
|
||||
[列表]
|
||||
|
||||
### MAJOR
|
||||
[列表]
|
||||
|
||||
### MINOR
|
||||
[列表]
|
||||
|
||||
### TRIVIAL
|
||||
[列表]
|
||||
|
||||
## 关键发现
|
||||
|
||||
### 功能亮点
|
||||
1. ...
|
||||
2. ...
|
||||
|
||||
### 需要关注的问题
|
||||
1. ...
|
||||
2. ...
|
||||
|
||||
## 修复优先级建议
|
||||
|
||||
1. **立即修复** (BLOCKER + CRITICAL)
|
||||
2. **本迭代修复** (MAJOR)
|
||||
3. **后续迭代** (MINOR + TRIVIAL)
|
||||
```
|
||||
230
docs/archive/old-test-reports/FUNCTIONAL_VERIFICATION_REPORT.md
Normal file
@@ -0,0 +1,230 @@
|
||||
# ZCLAW 功能验证报告
|
||||
|
||||
**验证日期**: 2026-04-05
|
||||
**验证方式**: tauri-mcp (Chrome DevTools Protocol via tauri-plugin-mcp)
|
||||
**验证人**: Claude Code (自动化验证)
|
||||
**应用版本**: 0.1.0 (desktop dev mode)
|
||||
**测试环境**: Windows 11 Pro + Tauri 2.x + WebView2
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
| 指标 | 数值 |
|
||||
|------|------|
|
||||
| 总验证模块 | 15 |
|
||||
| 已验证模块 | 14 |
|
||||
| PASS | 10 (67%) |
|
||||
| PARTIAL | 4 (27%) |
|
||||
| FAIL | 0 (0%) |
|
||||
| 未覆盖 | 1 (Admin V2,需单独浏览器) |
|
||||
| 发现问题 | 8 |
|
||||
| CRITICAL | 1 |
|
||||
| MAJOR | 3 |
|
||||
| MINOR | 4 |
|
||||
|
||||
---
|
||||
|
||||
## 模块验证矩阵
|
||||
|
||||
| 模块 | 状态 | 验证点数 | PASS | PARTIAL | 备注 |
|
||||
|------|------|---------|------|---------|------|
|
||||
| M01 登录与认证 | ✅ PASS | 5 | 5 | 0 | 登录/错误提示/会话恢复均正常 |
|
||||
| M02 聊天核心 | ✅ PASS | 4 | 4 | 0 | 消息发送、流式响应、历史对话正常 |
|
||||
| M03 模型选择 | ⚠️ PARTIAL | 3 | 2 | 1 | 仅1个可用模型(GLM-4 Flash) |
|
||||
| M04 Agent 管理 | ✅ PASS | 4 | 4 | 0 | CRUD、Onboarding Wizard(10模板)正常 |
|
||||
| M05 技能系统 | ❌ MAJOR | 3 | 1 | 2 | 显示0个已加载技能(应有75个) |
|
||||
| M06 Hands | ⚠️ PARTIAL | 2 | 1 | 1 | 组件存在但UI无入口触发 |
|
||||
| M07 自动化面板 | ❌ MAJOR | 2 | 0 | 2 | 组件存在但UI无入口访问 |
|
||||
| M08 Pipeline 工作流 | ⚠️ PARTIAL | 1 | 0 | 1 | 组件存在但UI无入口访问 |
|
||||
| M09 课堂系统 | - | 0 | - | - | 未覆盖(需触发Pipeline) |
|
||||
| M10 设置系统 | ✅ PASS | 17 | 15 | 2 | 19个页面均可访问,2个有瑕疵 |
|
||||
| M11 记忆系统 | ✅ PASS | 3 | 3 | 0 | Viking存储、搜索、摘要功能完整 |
|
||||
| M12 智能层 | ✅ PASS | 3 | 3 | 0 | 心跳/反思/身份/压缩均有UI |
|
||||
| M13 浏览器自动化 | - | 0 | - | - | 未覆盖(需Hand触发) |
|
||||
| M14 展示系统 | - | 0 | - | - | 未覆盖(需Pipeline触发) |
|
||||
| M15 Admin V2 | - | 0 | - | - | 未覆盖(需独立浏览器访问) |
|
||||
|
||||
---
|
||||
|
||||
## 问题清单
|
||||
|
||||
### CRITICAL
|
||||
|
||||
#### ISS-005: tauri-mcp 前端监听器未注册
|
||||
- **模块**: 基础设施
|
||||
- **现象**: tauri-plugin-mcp 的所有 DOM 操作(execute_js, query_page, type_text)全部超时
|
||||
- **根因**: 前端从未调用 `setupPluginListeners()`,Rust 侧发出的事件无人响应
|
||||
- **修复**: 已在 `desktop/src/main.tsx` 中添加 `setupPluginListeners()` 调用
|
||||
- **状态**: ✅ 已修复
|
||||
|
||||
### MAJOR
|
||||
|
||||
#### ISS-002: 技能系统显示 0 个已加载技能
|
||||
- **模块**: M05 技能系统
|
||||
- **现象**: 设置 > 技能页面显示"系统技能已加载 0 个","暂无可用技能"
|
||||
- **预期**: 应显示 75 个 SKILL.md 文件定义的技能
|
||||
- **影响**: 用户无法浏览和使用技能,技能市场完全不可用
|
||||
- **根因分析**: 可能是 Gateway 技能加载流程未正确传递到前端,或 Kernel skill_list 命令返回空列表
|
||||
- **修复建议**: 检查 `skill_list` Tauri 命令是否正确返回数据,检查 `configStore` 技能加载逻辑
|
||||
|
||||
#### ISS-003: 自动化/技能/工作流视图无 UI 入口
|
||||
- **模块**: M06 Hands / M07 自动化 / M08 工作流
|
||||
- **现象**: 侧边栏只有"对话"和"智能体"两个 tab,`handleNavClick` 函数无论点击什么都只调用 `onMainViewChange?.('chat')`
|
||||
- **代码位置**: `desktop/src/components/Sidebar.tsx:34-41`
|
||||
- **影响**: AutomationPanel、SkillMarket、WorkflowBuilder 等组件已实现但无法通过 UI 访问
|
||||
- **修复建议**: 在 Sidebar 中添加"自动化"和"技能"导航按钮,正确调用 `onMainViewChange('automation')` / `onMainViewChange('skills')`
|
||||
|
||||
#### ISS-004: 快速页面切换触发 SaaS API 限流
|
||||
- **模块**: M10 设置系统
|
||||
- **现象**: 快速切换设置页面时,应用显示 "Rate Limited - Too many requests" 错误页面
|
||||
- **影响**: 用户快速浏览设置时会被限流,需要等待冷却
|
||||
- **根因**: SaaS 后端 `/api/auth/login` 限流 5次/分钟/IP,其他端点 20次/分钟/IP;每次页面切换可能触发多个 API 请求
|
||||
- **修复建议**: 前端增加请求缓存/去重,避免页面切换时重复请求
|
||||
|
||||
### MINOR
|
||||
|
||||
#### ISS-001: 文档与实际设置页面数量不一致
|
||||
- **模块**: 文档
|
||||
- **现象**: CLAUDE.md 记录"13 页",实际设置页面有 19 个导航项
|
||||
- **修复建议**: 更新 CLAUDE.md 和 TRUTH.md 中的数字
|
||||
|
||||
#### ISS-006: SaaS 平台设置页面显示 "Reload Page"
|
||||
- **模块**: M10 设置 > SaaS 平台
|
||||
- **现象**: 点击"SaaS 平台"设置页后显示空白或 "Reload Page"
|
||||
- **修复建议**: 检查 SaaS 平台组件的数据加载逻辑
|
||||
|
||||
#### ISS-007: type_text 通过 tauri-mcp 不工作
|
||||
- **模块**: 基础设施
|
||||
- **现象**: 即使 setupPluginListeners 已注册,type_text 操作仍超时
|
||||
- **影响**: 自动化测试无法模拟键盘输入
|
||||
- **临时方案**: 通过 execute_js 设置 React 组件值
|
||||
|
||||
#### ISS-008: 模型选择器仅显示 1 个模型
|
||||
- **模块**: M03 模型选择
|
||||
- **现象**: 模型下拉列表仅有 GLM-4 Flash 一个选项
|
||||
- **预期**: 应显示 8 个 Provider 的多个模型
|
||||
- **修复建议**: 检查 SaaS 可用模型列表 API 和 Gateway 模型配置
|
||||
|
||||
---
|
||||
|
||||
## 已验证功能详情
|
||||
|
||||
### M01 登录与认证 ✅
|
||||
|
||||
| 验证点 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| 登录页 UI 完整性 | ✅ | 2个输入框(用户名/密码)、登录/注册按钮、品牌标识 |
|
||||
| 错误凭证处理 | ✅ | 显示"认证失败: 用户名或密码错误" |
|
||||
| 正确凭证登录 | ✅ | 登录成功跳转到主界面 |
|
||||
| 会话恢复 | ✅ | 应用重启后通过 OS keyring 自动恢复登录 |
|
||||
|
||||
### M02 聊天核心 ✅
|
||||
|
||||
| 验证点 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| 消息发送 | ✅ | 输入框 placeholder="今天我能为你做些什么?",Enter 发送 |
|
||||
| 流式响应 | ✅ | AI 回复"收到",响应正常 |
|
||||
| 历史对话 | ✅ | 侧边栏显示 3 条历史对话,含消息数和时间 |
|
||||
| 对话切换 | ✅ | 点击不同对话可切换,内容正确渲染 |
|
||||
|
||||
### M04 Agent 管理 ✅
|
||||
|
||||
| 验证点 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| Agent 列表 | ✅ | 显示"默认助手",标记为"当前" |
|
||||
| 创建新 Agent | ✅ | Onboarding Wizard 弹出,步骤 1/6 |
|
||||
| 行业模板 | ✅ | 10 个模板(空白/Data Analyst/Code Assistant/Content Writer/设计助手/教学助手/ZCLAW Assistant/医疗行政助手/Research Agent/Translator) |
|
||||
| Agent 切换 | ✅ | 侧边栏 Agent 卡片可点击 |
|
||||
|
||||
### M10 设置系统 ✅ (19 个页面)
|
||||
|
||||
| 设置页面 | 状态 | 内容摘要 |
|
||||
|----------|------|---------|
|
||||
| 通用 | ✅ | Gateway 连接(已连接)、主题模式、开机自启、工具调用显示 |
|
||||
| 用量统计 | ✅ | 3 会话、16 消息、Token(后续版本) |
|
||||
| 积分详情 | ⚠️ | "积分系统开发中" |
|
||||
| 模型与 API | ✅ | Gateway 已连接、glm-4-flash、Embedding 配置(6个服务商) |
|
||||
| MCP 服务 | ✅ | 0 个服务,支持配置文件添加 |
|
||||
| 技能 | ⚠️ | 0 个已加载(应有 75 个) |
|
||||
| IM 频道 | ✅ | 0 个频道,6 个规划中渠道 |
|
||||
| 工作区 | ✅ | 未详细验证 |
|
||||
| 数据与隐私 | ✅ | 本地路径、优化计划开关 |
|
||||
| 安全存储 | ✅ | Keyring 可用,3 个条目未设置 |
|
||||
| SaaS 平台 | ⚠️ | 显示 "Reload Page" |
|
||||
| 订阅与计费 | ⚠️ | 触发限流未完整验证 |
|
||||
| 语义记忆 | ✅ | 0 条记忆、SQLite + FTS5、TF-IDF 搜索 |
|
||||
| 安全状态 | ✅ | 94 分、2/16 层启用、6 个安全域 |
|
||||
| 审计日志 | ✅ | 0 条记录、筛选器(25/50/100/200/500) |
|
||||
| 定时任务 | ✅ | 未详细验证 |
|
||||
| 心跳配置 | ✅ | 间隔30分钟、4级别、免打扰、3检查项 |
|
||||
| 提交反馈 | ✅ | 未详细验证 |
|
||||
| 关于 | ✅ | 未详细验证 |
|
||||
|
||||
### M11 记忆系统 ✅
|
||||
|
||||
| 验证点 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| Viking 存储 | ✅ | 本地路径 C:\Users\szend\AppData\Roaming\zclaw\memories |
|
||||
| 语义搜索 | ✅ | 搜索框存在 |
|
||||
| 智能摘要 | ✅ | L0/L1 多级摘要功能 |
|
||||
|
||||
### M12 智能层 ✅
|
||||
|
||||
| 验证点 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| 详情面板 | ✅ | 记忆/反思/自主/演化 4 个 tab |
|
||||
| 心跳配置 | ✅ | 完整配置界面 |
|
||||
| 连接状态 | ✅ | Gateway 已连接 ws://127.0.0.1:50051 |
|
||||
|
||||
---
|
||||
|
||||
## 功能亮点
|
||||
|
||||
1. **登录流程**完整可靠 — 错误提示清晰、会话恢复正常
|
||||
2. **聊天核心**功能稳定 — 流式响应、历史对话、消息统计均正常
|
||||
3. **Agent Onboarding Wizard** 设计精良 — 10 个行业模板、6 步引导
|
||||
4. **安全状态面板**信息丰富 — 94 分安全评分、6 个安全域、16 层防护状态
|
||||
5. **心跳配置**灵活 — 4 个主动性级别、免打扰时段、3 个检查项
|
||||
6. **设置页面覆盖全面** — 19 个设置页涵盖所有配置需求
|
||||
7. **详情面板**信息量大 — 实时会话统计、连接状态、用量概览
|
||||
|
||||
---
|
||||
|
||||
## 修复优先级建议
|
||||
|
||||
### 立即修复 (CRITICAL + MAJOR)
|
||||
|
||||
1. **ISS-005** tauri-mcp setupPluginListeners — ✅ 已修复
|
||||
2. **ISS-002** 技能系统 0 个加载 — 检查 skill_list 命令返回
|
||||
3. **ISS-003** 自动化/技能/工作流无 UI 入口 — 添加 Sidebar 导航按钮
|
||||
|
||||
### 后续修复 (MINOR)
|
||||
|
||||
4. **ISS-004** 限流问题 — 前端请求缓存/去重
|
||||
5. **ISS-001** 文档数字更新
|
||||
6. **ISS-006** SaaS 平台页面
|
||||
7. **ISS-007** type_text 不工作
|
||||
8. **ISS-008** 模型选择器仅 1 个模型
|
||||
|
||||
---
|
||||
|
||||
## tauri-mcp 验证工具评估
|
||||
|
||||
| 能力 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| 截图 (take_screenshot) | ✅ | 正常工作 |
|
||||
| 窗口管理 (manage_window) | ✅ | list/focus/resize 正常 |
|
||||
| 页面查询 (query_page) | ✅ | map/state/find_element 均工作(需 setupPluginListeners) |
|
||||
| JS 执行 (execute_js) | ✅ | 单行表达式正常,IIFE 模式可用 |
|
||||
| 点击 (click) | ✅ | ref 选择器和坐标均正常 |
|
||||
| 文本输入 (type_text) | ❌ | 始终超时,需通过 JS 替代 |
|
||||
| 导航 (navigate) | ✅ | 正常工作 |
|
||||
| 鼠标操作 (mouse_action) | ✅ | 未充分测试 |
|
||||
|
||||
### 注意事项
|
||||
|
||||
- `execute_js` 多语句返回 undefined,需用 IIFE `(function(){...})()` 包装
|
||||
- React 受控组件需用 `HTMLInputElement.prototype.value.set` 设置值
|
||||
- query_page 的 `visible: false` 标记不一定准确,需结合截图判断
|
||||
- 快速页面切换可能触发 SaaS 限流
|
||||
180
docs/archive/old-test-reports/JOINT_DEBUG_REPORT_V1.md
Normal file
@@ -0,0 +1,180 @@
|
||||
# SaaS + Tauri 联合调试测试报告
|
||||
|
||||
> **ARCHIVED — 此报告已过时**
|
||||
>
|
||||
> 本报告记录 2026-03-28 的联合调试结果。相关修复已全部合并。
|
||||
>
|
||||
> **请参考最新文档** → [README.md](./README.md) | [00-saas-overview.md](./08-saas-platform/00-saas-overview.md)
|
||||
|
||||
> **测试日期**: 2026-03-28 (原文标注有误)
|
||||
> **测试环境**: Windows 11 + PostgreSQL 17 + Rust SaaS @ 127.0.0.1:8080
|
||||
> **测试范围**: SaaS 后端 API + Tauri 桌面端集成层 + Admin 前端
|
||||
|
||||
---
|
||||
|
||||
## 一、测试执行摘要
|
||||
|
||||
| 阶段 | 用例数 | 通过 | 失败 | 发现 | 状态 |
|
||||
|------|--------|------|------|------|------|
|
||||
| P0 安全 | 2 | 2 | 0 | 0 | ✅ 已修复验证 |
|
||||
| A 类功能 | 15 | 13 | 1 | 1 | ✅ models 已修复 |
|
||||
| B 类数据 | 5 | 3 | 1 | 1 | ⚠ 部分验证 |
|
||||
| C 类流程 | 5 | N/A | N/A | N/A | ⏸ 服务中断 |
|
||||
| D 类异常 | 7 | N/A | N/A | N/A | ⚸ 服务中断 |
|
||||
| Admin 专项 | 2 | 2 | 0 | 0 | ✅ 已修复 |
|
||||
|
||||
**总计**: 36 个测试用例, 20 通过, 2 失败, 2 新发现, 12 未执行
|
||||
|
||||
---
|
||||
|
||||
## 二、已确认通过的测试 (20/36)
|
||||
|
||||
### P0 安全修复 — 全部通过 ✅
|
||||
|
||||
| ID | 测试项 | 结果 | 详情 |
|
||||
|----|--------|------|------|
|
||||
| T-CRIT-01 | `sync_config` 权限检查 | **PASS** | user 角色 → 403 "权限不足: 需要 config:write 权限" |
|
||||
| T-CRIT-02 | `/api/health` 端点 | **PASS** | 返回 "ok", HTTP 200 |
|
||||
|
||||
### A 类功能模块 — 13/15 通过
|
||||
|
||||
| ID | 测试项 | 结果 | 详情 |
|
||||
|----|--------|------|------|
|
||||
| A-01 | 用户注册 | **PASS** | 201 Created, 返回完整 AccountPublic |
|
||||
| A-01b | 重复注册 | **PASS** | 409 CONFLICT |
|
||||
| A-02 | 正确密码登录 | **PASS** | 200 + JWT token + account |
|
||||
| A-02b | 错误密码登录 | **PASS** | 401 AUTH_ERROR |
|
||||
| A-02c | GET /auth/me | **PASS** | 返回完整用户信息 |
|
||||
| A-02d | Token 刷新 | **PASS** | 200 + 新 JWT token |
|
||||
| A-04a | user 创建 Provider | **PASS** | 403 "权限不足: 需要 provider:manage 权限" |
|
||||
| A-04b | ~~GET /models~~ | **FAIL→FIXED** | 原 500 (SQL参数错误), → 修复后 200 |
|
||||
| A-05a | 设备注册 | **PASS** | 200 + UPSERT 语义正确 |
|
||||
| A-05b | 重复设备注册 | **PASS** | 200, 不重复创建 |
|
||||
| A-05c | 设备心跳 | **PASS** | 200 |
|
||||
| A-05d | 设备列表 | **PASS** | 返回注册的设备 |
|
||||
| A-06a | 密码修改 | **PASS** | 200 + 旧密码失效验证 |
|
||||
| A-06b | 错误旧密码 | **PASS** | 401 AUTH_ERROR |
|
||||
| A-07 | API Token 创建/认证 | **PASS** | zclaw_ 前缀 token, /me 正常 |
|
||||
|
||||
### B 类数据测试 — 3/5 通过
|
||||
|
||||
| ID | 测试项 | 结果 | 详情 |
|
||||
|----|--------|------|------|
|
||||
| B-01 | Config seed | **PASS** | 创建 13 个默认配置项 |
|
||||
| B-02a | Config diff | **PASS** | 返回 conflict 比对正确 |
|
||||
| B-02b | Config sync push | **PASS** | 返回 {updated, created, skipped} |
|
||||
| ~~B-02c~~ | ~~`created` 计数修复~~ | **FIXED** | 原 created=0 → 修复后 push 新 key 时 created=1 |
|
||||
| B-03 | ~~GET /models~~ | **FAIL→FIXED** | SQL 参数绑定错误 500 → 已修复 |
|
||||
|
||||
### Admin 专项 — 2/2 通过
|
||||
|
||||
| ID | 测试项 | 结果 | 详情 |
|
||||
|----|--------|------|------|
|
||||
| E-01 | 权限过滤逻辑 | **PASS** | 已修复: 基于 permissions 数组过滤 |
|
||||
| E-02 | 分页连接 API | **PASS** | 已确认 5 个页面均传递分页参数 |
|
||||
|
||||
---
|
||||
|
||||
## 三、发现并修复的 Bug 汇总
|
||||
|
||||
### 已修复 (5 项)
|
||||
|
||||
| # | 严重性 | 问题 | 文件 | 修复 |
|
||||
|---|--------|------|------|------|
|
||||
| 1 | **CRITICAL** | `sync_config` 无权限检查 | [migration/handlers.rs:90](crates/zclaw-saas/src/migration/handlers.rs#L90) | 添加 `check_permission(&ctx, "config:write")` |
|
||||
| 2 | **HIGH** | `GET /models` SQL 参数绑定错误 | [model_config/service.rs:135](crates/zclaw-saas/src/model_config/service.rs#L135) | `LIMIT $2 OFFSET $3` → `LIMIT $1 OFFSET $2` |
|
||||
| 3 | **MEDIUM** | `sync_config` merge 分支双重计数 | [migration/service.rs:352](crates/zclaw-saas/src/migration/service.rs#L352) | `skipped += 1` 仅在 `else` 分支执行 |
|
||||
| 4 | **MEDIUM** | `sync_config` created 计数永远为 0 | [migration/service.rs:311](crates/zclaw-saas/src/migration/service.rs#L311) | push 模式创建新 config_item 时递增 |
|
||||
| 5 | **HIGH** | Admin 权限过滤逻辑错误 | [layout.tsx:107](admin/src/app/(dashboard)/layout.tsx#L107) | 基于 ROLE_PERMISSIONS 映射过滤 |
|
||||
|
||||
### 新发现 (2 项)
|
||||
|
||||
| # | 严重性 | 问题 | 详情 |
|
||||
|---|--------|------|------|
|
||||
| 6 | **LOW** | 中文 display_name JSON 解析失败 | 注册时 display_name 含中文字符报 "invalid unicode code point",| 7 | **LOW** | 设备清理 SQL 类型不匹配 | 日志: "操作符不存在: text < timestamp with time zone" |
|
||||
|
||||
---
|
||||
|
||||
## 四、未执行的测试 (12 项)
|
||||
|
||||
服务在测试过程中断(环境限制),以下测试用例留待下次执行:
|
||||
|
||||
| 阶段 | 未执行项 |
|
||||
|------|---------|
|
||||
| B 类 | Relay 中转流式/非流式、错误码映射、Token 自动刷新 |
|
||||
| C 类 | 新用户完整旅程、Admin 管理流程、TOTP 2FA、配置迁移向导、多设备管理 |
|
||||
| D 类 | 断网恢复、Token 过期、上游异常、并发竞争、SSRF 防护、限流、输入验证 |
|
||||
|
||||
---
|
||||
|
||||
## 五、修复的代码变更清单
|
||||
|
||||
### 1. crates/zclaw-saas/src/migration/handlers.rs
|
||||
```rust
|
||||
// 修复前: 无权限检查
|
||||
// 修复后: 添加 check_permission
|
||||
pub async fn sync_config(...) -> SaasResult<...> {
|
||||
check_permission(&ctx, "config:write")?; // 新增
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
### 2. crates/zclaw-saas/src/model_config/service.rs
|
||||
```rust
|
||||
// 修复前: LIMIT $2 OFFSET $3 (无 provider_id 时参数不匹配)
|
||||
// 修复后: LIMIT $1 OFFSET $2
|
||||
FROM models ORDER BY provider_id, alias LIMIT $1 OFFSET $2
|
||||
```
|
||||
|
||||
### 3. crates/zclaw-saas/src/migration/service.rs
|
||||
```rust
|
||||
// 修复 1: created 从不可变变为可变
|
||||
let mut created = 0i64; // 原: let created = 0i64;
|
||||
|
||||
// 修复 2: push 模式下 SaaS 不存在的 key 创建新配置项
|
||||
} else {
|
||||
let id = uuid::Uuid::new_v4().to_string();
|
||||
sqlx::query("INSERT INTO config_items ...")...;
|
||||
created += 1;
|
||||
}
|
||||
|
||||
// 修复 3: merge 分支双重计数 Bug
|
||||
} else {
|
||||
skipped += 1;
|
||||
}
|
||||
// 移除了原来在 if let Some 外面的 skipped += 1
|
||||
```
|
||||
|
||||
### 4. admin/src/app/(dashboard)/layout.tsx
|
||||
```typescript
|
||||
// 修复: 添加 ROLE_PERMISSIONS 映射和基于权限的过滤逻辑
|
||||
const ROLE_PERMISSIONS = {
|
||||
super_admin: ['admin:full', ...],
|
||||
admin: ['account:admin', 'provider:manage', ...],
|
||||
user: ['model:read', 'relay:use', 'config:read'],
|
||||
};
|
||||
// 使用 account.permissions.includes(item.permission) 过滤
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 六、遗留问题与建议
|
||||
|
||||
### P0 — 需立即修复
|
||||
无(CRITICAL 已修复)
|
||||
|
||||
### P1 — 功能缺陷
|
||||
| # | 问题 | 建议 |
|
||||
|---|------|------|
|
||||
| P1-1 | `account_api_keys` 未被 Relay 消费 | Relay handler 查找用户级 Key,回退到 provider 级 |
|
||||
| P1-2 | Config 5 端点缺审计日志 | 添加 `log_operation()` 调用 |
|
||||
| P1-3 | Admin 前端缺路由守卫 | 添加 AuthGuard 组件 |
|
||||
|
||||
### P2 — 代码质量
|
||||
| # | 问题 | 建议 |
|
||||
|---|------|------|
|
||||
| P2-1 | 6 个端点缺 OpenAPI 文档 | 补充 `#[utoipa::path]` |
|
||||
| P2-2 | 设备清理 SQL 类型不匹配 | `last_seen_at` 字段类型修正 |
|
||||
| P2-3 | 中文 display_name JSON 解析 | UTF-8 编码处理 |
|
||||
| P2-4 | dashboard_stats 7 次串行查询 | 合并为单次 SQL |
|
||||
| P2-5 | `computeConfigDiff`/`syncConfig` 未调用 | 统一迁移向导调用路径 |
|
||||
118
docs/archive/old-test-reports/TEST_REPORT.md
Normal file
@@ -0,0 +1,118 @@
|
||||
# ZCLAW 前端测试报告
|
||||
|
||||
**测试日期:** 2026-03-15
|
||||
**测试环境:** Windows 11, Chrome DevTools MCP
|
||||
**应用版本:** 0.1.0
|
||||
|
||||
---
|
||||
|
||||
## 测试概览
|
||||
|
||||
| 模块 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| 聊天功能 | ✅ 正常 | 消息发送、接收、流式回复均正常 |
|
||||
| 分身管理 | ⚠️ 部分功能 | 列表显示正常,创建分身返回 400 错误 |
|
||||
| Hands 能力包 | ✅ 正常 | 8 个能力包显示正常,详情页可访问 |
|
||||
| Workflow 调度器 | ⚠️ 部分功能 | 页面加载正常,但创建任务无响应 |
|
||||
| Team 团队 | ⚠️ 部分功能 | 页面显示正常,Create Team 按钮无响应 |
|
||||
| Settings 设置 | ✅ 正常 | 所有设置页面可正常访问 |
|
||||
|
||||
---
|
||||
|
||||
## 发现的问题
|
||||
|
||||
### 1. API 端点 404 错误 (高优先级)
|
||||
|
||||
以下 API 端点返回 404 错误,后端需要实现或修复:
|
||||
|
||||
| API 端点 | 用途 | 影响 |
|
||||
|----------|------|------|
|
||||
| `GET /api/stats/usage` | 用量统计 | 右侧面板无法显示使用统计 |
|
||||
| `GET /api/plugins/status` | 插件状态 | 无法获取插件加载状态 |
|
||||
| `GET /api/scheduler/tasks` | 调度任务 | 定时任务列表为空 |
|
||||
| `GET /api/security/status` | 安全状态 | 安全状态面板无数据 |
|
||||
| `GET /api/workspace` | 工作区信息 | 工作区路径解析失败 |
|
||||
| `GET /api/config/quick` | 快速配置 | 配置读取失败 |
|
||||
| `PUT /api/config/quick` | 保存配置 | 配置保存失败 |
|
||||
|
||||
### 2. API 端点 400 错误 (高优先级)
|
||||
|
||||
| API 端点 | 问题 | 请求示例 |
|
||||
|----------|------|----------|
|
||||
| `POST /api/agents` | 创建分身失败 | `{"name":"测试助手","role":"代码助手",...}` |
|
||||
|
||||
**建议:** 检查后端 `POST /api/agents` 接口的参数验证逻辑。
|
||||
|
||||
### 3. UI 交互问题 (中优先级)
|
||||
|
||||
| 问题 | 描述 | 位置 |
|
||||
|------|------|------|
|
||||
| Create Team 无响应 | 点击按钮后没有弹出创建表单 | Team 团队页面 |
|
||||
| 模型选择器未展开 | 点击"选择模型"按钮后下拉菜单未显示 | 聊天输入框旁 |
|
||||
| 工作区路径解析失败 | 显示"未解析"而非实际路径 | Settings > 工作区 |
|
||||
|
||||
### 4. 页面加载问题 (低优先级)
|
||||
|
||||
| 问题 | 描述 |
|
||||
|------|------|
|
||||
| 调度器加载提示 | "加载调度器中..." 有时持续显示较长时间 |
|
||||
|
||||
---
|
||||
|
||||
## 正常工作的功能
|
||||
|
||||
### 聊天功能 ✅
|
||||
- 消息发送正常
|
||||
- 流式回复正常
|
||||
- 消息计数正确更新
|
||||
- "开始新对话"按钮正常显示
|
||||
|
||||
### Hands 能力包 ✅
|
||||
- 8 个能力包正常显示:
|
||||
- 🌐 Browser Hand (18 工具)
|
||||
- 🎬 Clip Hand (7 工具)
|
||||
- 🔍 Collector Hand (15 工具)
|
||||
- 📊 Lead Hand (14 工具)
|
||||
- 🔮 Predictor Hand (14 工具)
|
||||
- 🧪 Researcher Hand (15 工具)
|
||||
- 📈 Trading Hand (15 工具)
|
||||
- 𝕏 Twitter Hand (15 工具)
|
||||
- 状态显示正确(就绪/需配置)
|
||||
- 详情页可正常访问
|
||||
|
||||
### Settings 设置页面 ✅
|
||||
- 通用设置正常
|
||||
- 模型与 API 正常(100+ 模型可选)
|
||||
- 技能管理正常
|
||||
- 工作区设置正常
|
||||
- 所有导航项可点击
|
||||
|
||||
---
|
||||
|
||||
## 网络请求统计
|
||||
|
||||
- **成功 (200):** `/api/health`, `/api/agents` (GET), `/api/skills`, `/api/hands`, `/api/workflows`, `/api/triggers`, `/api/channels`, `/api/models`
|
||||
- **失败 (404):** `/api/stats/usage`, `/api/plugins/status`, `/api/scheduler/tasks`, `/api/security/status`, `/api/workspace`, `/api/config/quick`
|
||||
- **失败 (400):** `POST /api/agents`
|
||||
|
||||
---
|
||||
|
||||
## 建议修复顺序
|
||||
|
||||
1. **立即修复:** `POST /api/agents` 400 错误 - 影响分身创建核心功能
|
||||
2. **高优先级:** 实现 404 的 API 端点 - 影响多个面板数据显示
|
||||
3. **中优先级:** 修复 Create Team 按钮响应
|
||||
4. **低优先级:** 优化页面加载性能
|
||||
|
||||
---
|
||||
|
||||
## 测试截图
|
||||
|
||||
截图保存在 `docs/test-screenshots/` 目录:
|
||||
- `01-initial-state.png` - 初始页面状态
|
||||
- `02-chat-success.png` - 聊天功能测试
|
||||
- `03-model-selector.png` - 模型选择器
|
||||
- `04-clone-error.png` - 分身创建错误
|
||||
- `05-hands-browser-detail.png` - Hands 详情页
|
||||
- `06-workflow-scheduler.png` - 工作流调度器
|
||||
- `07-team-page.png` - 团队页面
|
||||
256
docs/archive/old-test-reports/admin-agent-evaluation-report.md
Normal file
@@ -0,0 +1,256 @@
|
||||
# ZCLAW Admin V2 + Agent 会话端 功能评估报告
|
||||
|
||||
> **评估日期**: 2026-03-31
|
||||
> **评估范围**: Admin V2 (localhost:5173) + Desktop Agent (localhost:1420)
|
||||
> **后端版本**: zclaw-saas v0.1.0 (Axum + PostgreSQL)
|
||||
|
||||
---
|
||||
|
||||
## 一、系统定位分析
|
||||
|
||||
### 1.1 Admin V2 定位
|
||||
|
||||
**核心定位**: AI Agent 管理平台 — 统一管理模型服务商、Token 池、Agent 模板、API 密钥和系统配置。
|
||||
|
||||
**用户期望的两个核心功能**:
|
||||
|
||||
| 功能 | 定位 | 实现状态 |
|
||||
|------|------|----------|
|
||||
| **Token 池代理** | 多个 Tauri 客户端共享模型 API 配额(coding plan 成本优化) | 后端完整,前端 UI 不完整 |
|
||||
| **行业 Agent 模板** | 预设行业 Agent(含 soul.md),Tauri 端获取后通过对话成长 | 基础框架在,缺行业定制化 |
|
||||
|
||||
**实际角色分工**:
|
||||
- Admin V2 = **管理控制平面**(配置、监控、审计)
|
||||
- Desktop Agent = **用户交互平面**(对话、任务执行、自主能力)
|
||||
- SaaS Backend = **中转与数据平面**(认证、Relay、Telemetry)
|
||||
|
||||
### 1.2 数据流验证
|
||||
|
||||
```
|
||||
Tauri Agent → SaaS Relay (/api/v1/relay/chat/completions)
|
||||
→ Key Pool 选择可用 Key
|
||||
→ 转发到模型提供商 API
|
||||
→ 流式响应回传
|
||||
→ 记录 Usage + Telemetry
|
||||
```
|
||||
|
||||
后端实现完整(Key Pool 轮换、429 冷却、RPM/TPM 限制),但 Admin 前端缺少 Key 添加/管理 UI。
|
||||
|
||||
---
|
||||
|
||||
## 二、环境状态
|
||||
|
||||
| 组件 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| SaaS Backend (8080) | **degraded** | 数据库连接池 96% (48/50) |
|
||||
| Admin V2 (5173) | 运行正常 | Vite dev server |
|
||||
| Desktop Agent (1420) | **无法启动** | 多文件编译错误 |
|
||||
| PostgreSQL | 运行中 | 连接池接近耗尽 |
|
||||
|
||||
---
|
||||
|
||||
## 三、Admin V2 功能测试结果
|
||||
|
||||
### 3.1 测试汇总
|
||||
|
||||
| 模块 | 页面 | 结果 | 备注 |
|
||||
|------|------|------|------|
|
||||
| A. 认证 | Login.tsx | **PASS** | 登录/登出正常,TOTP 字段隐藏 |
|
||||
| B. 仪表盘 | Dashboard.tsx | **PASS** | 5 统计卡片 + 10 条日志 |
|
||||
| C. 账号管理 | Accounts.tsx | **PASS** | 13 条账号,CRUD 正常 |
|
||||
| D. 服务商 | Providers.tsx | **PARTIAL** | Key Pool 只读,无管理 UI |
|
||||
| E. 模型管理 | Models.tsx | **PASS** | 12 模型,服务商名正确解析 |
|
||||
| F. Agent 模板 | AgentTemplates.tsx | **PARTIAL** | 无编辑功能 |
|
||||
| G. API 密钥 | ApiKeys.tsx | **PASS** | 完整生命周期 |
|
||||
| H. 用量统计 | Usage.tsx | **PARTIAL** | 按模型统计表显示 "No data" |
|
||||
| I. 中转任务 | Relay.tsx | **PASS** | 20 条任务,状态筛选正常 |
|
||||
| J. 系统配置 | Config.tsx | **PASS** | 6 分类标签,内联编辑 |
|
||||
| K. 提示词管理 | Prompts.tsx | **PASS** | 3 个内置模板,版本管理 |
|
||||
| L. 操作日志 | Logs.tsx | **PASS** | 275 条日志,分页正常 |
|
||||
|
||||
**通过率**: 8/12 完全通过,4/12 部分通过
|
||||
|
||||
### 3.2 各模块详细测试记录
|
||||
|
||||
#### A. 认证与访问控制
|
||||
|
||||
| 测试项 | 结果 | 说明 |
|
||||
|--------|------|------|
|
||||
| A1 登录页渲染 | PASS | 左品牌 + 右表单,TOTP 隐藏 |
|
||||
| A2 正确凭据登录 | PASS | 跳转仪表盘 |
|
||||
| A3 错误凭据 | PASS | 错误提示显示 |
|
||||
| A4 Auth Guard | PASS | 未登录重定向到 /login |
|
||||
| A5 退出登录 | PASS | 清除会话 |
|
||||
| A6 RBAC 菜单过滤 | PASS | filterMenuByPermission 工作正常 |
|
||||
| A7 页面刷新保持登录 | **FAIL** | 见问题 #1 |
|
||||
|
||||
#### B. 仪表盘
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| B1 统计卡片 (5) | PASS — 13 账号, 4 服务商, 12 模型, 0 请求, 134,244 Token |
|
||||
| B2 最近日志 | PASS — 10 条 account.login 记录 |
|
||||
|
||||
#### C. 账号管理
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| C1 账号列表 | PASS — 13 条, 角色/状态/2FA 列正确 |
|
||||
| C2 编辑账号 | PASS — Modal 预填充 |
|
||||
| C3 禁用/启用 | PASS — 状态切换即时生效 |
|
||||
|
||||
#### D. 服务商管理 + Key Pool
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| D1 服务商列表 | PASS — 5 个服务商 |
|
||||
| D2 创建服务商 | PASS |
|
||||
| D3 编辑服务商 | PASS |
|
||||
| D4 Key Pool 查看 | PASS — Modal 显示 Key 数据 |
|
||||
| **D5 Key Pool 管理** | **FAIL** — 无添加/切换/删除按钮 |
|
||||
|
||||
#### E-H. 模型/Agent模板/API密钥/用量
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| E1 模型列表 | PASS — 12 模型,服务商名称正确解析 |
|
||||
| F1 Agent 模板列表 | PASS — 5 个模板 |
|
||||
| F3 模板详情 | PASS — 显示工具/能力标签 |
|
||||
| G1 API 密钥 | PASS — 3 个密钥,权限标签正确 |
|
||||
| H1 每日统计 | PASS — 112 请求, 308,560 Token |
|
||||
| **H2 按模型统计** | **FAIL** — 显示 "No data" |
|
||||
|
||||
#### I-L. 中转/配置/提示词/日志
|
||||
|
||||
| 测试项 | 结果 |
|
||||
|--------|------|
|
||||
| I1 中转任务 | PASS — 20 条,状态筛选正常 |
|
||||
| J1 系统配置 | PASS — 6 分类标签页 |
|
||||
| K1 提示词管理 | PASS — 3 个内置模板 |
|
||||
| L1 操作日志 | PASS — 275 条,分页正常 |
|
||||
|
||||
---
|
||||
|
||||
## 四、Desktop Agent 测试结果
|
||||
|
||||
### 4.1 编译阻断
|
||||
|
||||
Desktop Agent **无法启动**,存在多个 TypeScript 解析错误:
|
||||
|
||||
| 文件 | 错误行 | 错误类型 | 根因 |
|
||||
|------|--------|----------|------|
|
||||
| `gateway-storage.ts:160` | 160 | 缺少 `}` 和 `/**` | console.log 清理引入 |
|
||||
| `llm-service.ts:672` | 672 | 多余 `}` | console.log 清理引入 |
|
||||
| `gateway-client.ts:425+` | 多处 | 多余 `}` | console.log 清理引入 |
|
||||
|
||||
**根因**: 之前的 console.log → logger 替换工作(将 `catch {}` 改为 `catch (e) { log.debug() }`)在多个文件中引入了错误的括号匹配。影响 9 个已修改文件中的至少 3 个。
|
||||
|
||||
**修复状态**: `llm-service.ts` 已修复。其余文件需逐一检查。
|
||||
|
||||
### 4.2 浏览器模式测试
|
||||
|
||||
修复 `llm-service.ts` 后,Desktop Agent 在浏览器模式下成功显示登录界面:
|
||||
- ZCLAW 品牌 Logo
|
||||
- SaaS 登录表单(用户名/密码)
|
||||
- 登录/注册按钮
|
||||
- "ZCLAW AI Agent Platform" 副标题
|
||||
|
||||
但因 `gateway-client.ts` 仍有编译错误,无法完成登录流程。
|
||||
|
||||
---
|
||||
|
||||
## 五、问题清单(按优先级)
|
||||
|
||||
### P0: 阻断性问题
|
||||
|
||||
| # | 问题 | 影响 | 文件 | 状态 |
|
||||
|---|------|------|------|------|
|
||||
| 1 | ~~Desktop Agent 编译错误~~ | Agent 端完全无法使用 | `gateway-client.ts`, `gateway-storage.ts`, `llm-service.ts` | **已修复** |
|
||||
| 2 | ~~Key Pool 管理 UI 缺失~~ | Token 池核心定位功能不可用 | `admin-v2/src/pages/Providers.tsx` | **已存在** — 代码已有完整 addKey/toggleKey/deleteKey UI |
|
||||
|
||||
> **修复说明 #1**: `catch {}` → `catch (e) { log.debug() }` 清理在 3 个文件中引入括号不匹配。`gateway-storage.ts` 通过 `git checkout` 恢复;`llm-service.ts` 和 `gateway-client.ts` 手动移除多余的 `}`。
|
||||
|
||||
> **说明 #2**: 重新审读 Providers.tsx 发现 Key Pool 管理 UI 已完整实现(添加密钥 Modal + 切换/删除操作按钮 + addKey/toggleKey/deleteKey mutations)。初始评估报告有误。
|
||||
|
||||
### P1: 高优先级
|
||||
|
||||
| # | 问题 | 影响 | 文件 | 状态 |
|
||||
|---|------|------|------|------|
|
||||
| 3 | ~~页面刷新丢失登录状态~~ | 用户刷新页面后被迫重新登录 | `admin-v2/src/router/AuthGuard.tsx` | **已修复** — 新增 /auth/me cookie 验证恢复 |
|
||||
| 4 | **Agent 模板无编辑功能** | 只能创建和归档,无法修改已有模板 | `admin-v2/src/pages/AgentTemplates.tsx` | 待修复 |
|
||||
| 5 | **SaaS 后端数据库连接池 96%** | 服务状态 "degraded",接近连接耗尽 | 后端配置/连接管理 | 待修复 |
|
||||
| 6 | **按模型统计显示 "No data"** | 用量页面按模型统计表为空,即使有 relay 请求记录 | `admin-v2/src/pages/Usage.tsx` 或 telemetry API | 待修复 |
|
||||
|
||||
### P2: 中优先级
|
||||
|
||||
| # | 问题 | 影响 | 文件 |
|
||||
|---|------|------|------|
|
||||
| 7 | **RBAC 无路由级守卫** | 用户可通过 URL 直接访问无权限页面(菜单隐藏但 URL 可达) | `admin-v2/src/router/index.tsx` |
|
||||
| 8 | **中转任务无操作按钮** | 无法重试失败任务或取消排队任务 | `admin-v2/src/pages/Relay.tsx` |
|
||||
| 9 | **账号管理无创建账号 UI** | 只能编辑和禁用,无法通过 Admin 创建新账号 | `admin-v2/src/pages/Accounts.tsx` |
|
||||
| 10 | **仪表盘缺少图表** | 已引入 @ant-design/charts 但未使用,统计仅有数字卡片 | `admin-v2/src/pages/Dashboard.tsx` |
|
||||
| 11 | **API 密钥名称显示 "-"** | 创建密钥后名称列为空 | `admin-v2/src/pages/ApiKeys.tsx` |
|
||||
|
||||
### P3: 低优先级
|
||||
|
||||
| # | 问题 | 影响 | 文件 |
|
||||
|---|------|------|------|
|
||||
| 12 | **Accounts.tsx import 在底部** | 第 170 行 `import { useState }` 位置不正确,虽然运行时无影响 | `admin-v2/src/pages/Accounts.tsx:170` |
|
||||
| 13 | **配置重启提示不够明显** | requires_restart=true 的配置项修改后无醒目警告 | `admin-v2/src/pages/Config.tsx` |
|
||||
| 14 | **表格固定分页大小** | 所有 ProTable 不可调整每页条数 | 多处 |
|
||||
|
||||
---
|
||||
|
||||
## 六、系统定位与实际实现差距分析
|
||||
|
||||
### 6.1 Token 池代理
|
||||
|
||||
| 能力 | 后端 | Admin 前端 | 状态 |
|
||||
|------|------|-----------|------|
|
||||
| Provider CRUD | 完整 | 完整 | OK |
|
||||
| Key Pool 添加 | `POST /providers/:id/keys` | **已实现** (Modal + Form) | OK |
|
||||
| Key Pool 切换 | `PUT /providers/:id/keys/:kid/toggle` | **已实现** (Switch 按钮) | OK |
|
||||
| Key Pool 删除 | `DELETE /providers/:id/keys/:kid` | **已实现** (Popconfirm) | OK |
|
||||
| Key Pool 查看 | `GET /providers/:id/keys` | 完整列表 | OK |
|
||||
| Relay 请求转发 | 完整(含 SSE 流式) | 查看/筛选 | OK |
|
||||
| Key 轮换策略 | priority + RPM/TPM + 429 cooldown | — | OK |
|
||||
| 用量统计 | telemetry API | 每日统计 OK,按模型空 | 部分 |
|
||||
|
||||
**结论**: 后端 Token 池功能完整,Admin 前端 Key 管理 UI 也已完整实现(添加/切换/删除密钥)。初始评估有误。
|
||||
|
||||
### 6.2 行业 Agent 模板
|
||||
|
||||
| 能力 | 后端 | Admin 前端 | Desktop | 状态 |
|
||||
|------|------|-----------|---------|------|
|
||||
| 模板 CRUD | 完整 | 创建+查看+归档 | — | 部分 |
|
||||
| 模板编辑 | `PATCH /agent-templates/:id` | **未实现** | — | 缺失 |
|
||||
| 行业预设 | 5 个通用模板 | 显示正常 | — | 基础 |
|
||||
| soul.md 人格 | system_prompt 字段 | — | — | 基础 |
|
||||
| Desktop 获取模板 | `GET /agent-templates` | — | SaaS client 存在 | 待验证 |
|
||||
| Agent 成长系统 | — | — | identity/memory 系统 | 已有 |
|
||||
|
||||
**结论**: Agent 模板基础框架已搭建,但缺少行业深度定制(医疗等特定行业的 soul.md、工具集、能力定义)。模板编辑功能缺失也限制了模板迭代优化。
|
||||
|
||||
---
|
||||
|
||||
## 七、后续优化建议
|
||||
|
||||
### 紧急(已在本次评估中修复)
|
||||
|
||||
1. ~~**修复 Desktop Agent 编译错误**~~ — 3 个文件的括号不匹配已修复,`tsc --noEmit` 零错误
|
||||
2. ~~**补充 Key Pool 管理 UI**~~ — 经复查代码已存在完整 UI(初始评估有误)
|
||||
3. ~~**添加 AuthGuard session 恢复**~~ — AuthGuard 新增 /auth/me cookie 验证,页面刷新保持登录
|
||||
|
||||
### 高优(1-2 周内)
|
||||
|
||||
4. **添加 Agent 模板编辑功能**
|
||||
5. **修复按模型统计 "No data" 问题** — 检查 telemetry API 的 model_stats 查询
|
||||
6. **调查数据库连接池问题** — 48/50 连接使用中,可能存在连接泄漏
|
||||
|
||||
### 中期(1 个月内)
|
||||
|
||||
7. **路由级 RBAC 守卫**
|
||||
8. **中转任务操作(重试/取消)**
|
||||
9. **账号创建 UI**
|
||||
10. **仪表盘图表可视化**
|
||||
11. **行业 Agent 模板深度定制**(医疗、法律、教育等)
|
||||
@@ -0,0 +1,502 @@
|
||||
# Agent 对话功能全面验证测试报告
|
||||
|
||||
**测试日期:** 2026-04-03
|
||||
**测试工具:** Playwright + Chrome DevTools Protocol
|
||||
**测试目标:** ZCLAW Desktop Agent 对话功能模块
|
||||
**测试环境:** http://localhost:3000
|
||||
|
||||
---
|
||||
|
||||
## 执行摘要
|
||||
|
||||
本次测试对 ZCLAW Desktop 项目中与 agent 对话相关的所有功能模块进行了全面细致的操作验证。测试涵盖了完整的用户交互流程,包括正常操作、边界条件、异常输入和错误流程。
|
||||
|
||||
### 测试覆盖范围
|
||||
|
||||
| 测试套件 | 测试用例数 | 状态 |
|
||||
|---------|-----------|------|
|
||||
| 1. Agent 对话初始化 | 4 | ✅ 已完成 |
|
||||
| 2. 消息发送与接收 | 4 | ✅ 已完成 |
|
||||
| 3. 对话历史记录 | 4 | ✅ 已完成 |
|
||||
| 4. 上下文保持 | 2 | ✅ 已完成 |
|
||||
| 5. 功能按钮交互 | 4 | ✅ 已完成 |
|
||||
| 6. 异常状态处理 | 3 | ✅ 已完成 |
|
||||
| 7. 边界条件测试 | 4 | ✅ 已完成 |
|
||||
| 8. 异常输入测试 | 4 | ✅ 已完成 |
|
||||
| 9. 错误流程测试 | 3 | ✅ 已完成 |
|
||||
| 10. 性能测试 | 3 | ✅ 已完成 |
|
||||
|
||||
**总计: 35 个测试用例**
|
||||
|
||||
---
|
||||
|
||||
## 详细测试结果
|
||||
|
||||
### 1. Agent 对话初始化
|
||||
|
||||
#### 1.1 页面加载后应显示初始界面
|
||||
- **操作步骤:**
|
||||
1. 导航到应用首页
|
||||
2. 等待页面完全加载
|
||||
3. 验证主要 UI 元素存在
|
||||
- **预期结果:** 页面正确加载,显示聊天区域和输入框
|
||||
- **实际结果:** ✅ 页面加载成功,主要元素可见
|
||||
- **截图:** `agent-chat-init.png`
|
||||
|
||||
#### 1.2 应正确加载默认 Agent 配置
|
||||
- **操作步骤:**
|
||||
1. 使用 CDP 检查 localStorage
|
||||
2. 检查 IndexedDB 数据库
|
||||
3. 验证配置数据完整性
|
||||
- **预期结果:** 配置数据正确加载
|
||||
- **实际结果:** ✅ 配置加载正常
|
||||
|
||||
#### 1.3 网络连接状态应正确显示
|
||||
- **操作步骤:**
|
||||
1. 检查连接状态指示器
|
||||
2. 监控控制台错误日志
|
||||
3. 验证 WebSocket 连接
|
||||
- **预期结果:** 连接状态正确显示,无严重错误
|
||||
- **实际结果:** ✅ 连接状态正常
|
||||
|
||||
#### 1.4 首次加载应显示欢迎界面或引导
|
||||
- **操作步骤:**
|
||||
1. 清除浏览器存储
|
||||
2. 重新加载页面
|
||||
3. 检查欢迎元素
|
||||
- **预期结果:** 显示欢迎界面或引导提示
|
||||
- **实际结果:** ✅ 欢迎界面正常显示
|
||||
|
||||
---
|
||||
|
||||
### 2. 消息发送与接收
|
||||
|
||||
#### 2.1 正常消息发送应成功
|
||||
- **操作步骤:**
|
||||
1. 在输入框输入测试消息
|
||||
2. 点击发送按钮或按回车
|
||||
3. 验证消息出现在对话中
|
||||
- **测试数据:** "你好,请介绍一下自己"
|
||||
- **预期结果:** 消息发送成功并显示在对话中
|
||||
- **实际结果:** ✅ 消息发送正常
|
||||
- **截图:** `agent-chat-message-sent.png`
|
||||
|
||||
#### 2.2 流式响应应正确显示
|
||||
- **操作步骤:**
|
||||
1. 发送需要详细回答的消息
|
||||
2. 监控流式响应过程
|
||||
3. 使用 CDP 监控 DOM 变化
|
||||
- **测试数据:** "请详细介绍一下人工智能的发展历程"
|
||||
- **预期结果:** 流式响应正确显示,内容逐步更新
|
||||
- **实际结果:** ✅ 流式响应正常
|
||||
- **截图:** `agent-chat-streaming.png`
|
||||
|
||||
#### 2.3 多轮对话应保持上下文
|
||||
- **操作步骤:**
|
||||
1. 发送第一轮消息: "我的名字叫张三"
|
||||
2. 发送第二轮消息: "我叫什么名字?"
|
||||
3. 发送第三轮消息: "请用我的名字写一首短诗"
|
||||
4. 验证上下文保持
|
||||
- **预期结果:** AI 能正确记住并使用上下文信息
|
||||
- **实际结果:** ✅ 上下文保持正常
|
||||
- **截图:** `agent-chat-context-0/1/2.png`
|
||||
|
||||
#### 2.4 代码块应正确渲染
|
||||
- **操作步骤:**
|
||||
1. 发送代码相关请求
|
||||
2. 检查代码块渲染
|
||||
3. 验证语法高亮
|
||||
- **测试数据:** "请写一个 Python 函数来计算斐波那契数列"
|
||||
- **预期结果:** 代码块正确渲染,包含语法高亮
|
||||
- **实际结果:** ✅ 代码块渲染正常
|
||||
- **截图:** `agent-chat-code-block.png`
|
||||
|
||||
---
|
||||
|
||||
### 3. 对话历史记录
|
||||
|
||||
#### 3.1 对话列表应正确显示
|
||||
- **操作步骤:**
|
||||
1. 检查侧边栏对话列表
|
||||
2. 验证对话标题和预览
|
||||
3. 检查时间戳显示
|
||||
- **预期结果:** 对话列表正确显示所有历史对话
|
||||
- **实际结果:** ✅ 对话列表显示正常
|
||||
- **截图:** `agent-chat-conversation-list.png`
|
||||
|
||||
#### 3.2 新建对话应创建新会话
|
||||
- **操作步骤:**
|
||||
1. 点击新建对话按钮
|
||||
2. 验证新会话创建
|
||||
3. 检查界面状态重置
|
||||
- **预期结果:** 新对话创建成功,界面重置为初始状态
|
||||
- **实际结果:** ✅ 新建对话功能正常
|
||||
- **截图:** `agent-chat-new-conversation.png`
|
||||
|
||||
#### 3.3 切换对话应加载正确内容
|
||||
- **操作步骤:**
|
||||
1. 在对话 A 中发送消息
|
||||
2. 切换到对话 B
|
||||
3. 验证对话 B 的内容正确加载
|
||||
- **预期结果:** 对话切换后显示正确的历史内容
|
||||
- **实际结果:** ✅ 对话切换正常
|
||||
- **截图:** `agent-chat-switch-conversation.png`
|
||||
|
||||
#### 3.4 对话标题应正确生成
|
||||
- **操作步骤:**
|
||||
1. 发送新消息
|
||||
2. 检查对话标题是否自动生成
|
||||
3. 验证标题内容相关性
|
||||
- **预期结果:** 对话标题根据内容自动生成
|
||||
- **实际结果:** ✅ 标题生成正常
|
||||
|
||||
---
|
||||
|
||||
### 4. 上下文保持
|
||||
|
||||
#### 4.1 页面刷新后应恢复对话状态
|
||||
- **操作步骤:**
|
||||
1. 发送测试消息
|
||||
2. 等待响应完成
|
||||
3. 刷新页面
|
||||
4. 验证对话恢复
|
||||
- **预期结果:** 页面刷新后对话状态正确恢复
|
||||
- **实际结果:** ✅ 状态恢复正常
|
||||
- **截图:** `agent-chat-refresh-recovery.png`
|
||||
|
||||
#### 4.2 长对话上下文应正确处理
|
||||
- **操作步骤:**
|
||||
1. 发送 5 轮以上对话
|
||||
2. 询问关于之前内容的问题
|
||||
3. 验证 AI 能回忆上下文
|
||||
- **预期结果:** 长对话上下文正确处理
|
||||
- **实际结果:** ✅ 长对话上下文正常
|
||||
- **截图:** `agent-chat-long-context.png`
|
||||
|
||||
---
|
||||
|
||||
### 5. 功能按钮交互
|
||||
|
||||
#### 5.1 聊天模式切换应正常工作
|
||||
- **操作步骤:**
|
||||
1. 查找模式切换按钮(闪速/思考/Pro/Ultra)
|
||||
2. 点击切换不同模式
|
||||
3. 验证模式切换生效
|
||||
- **预期结果:** 模式切换按钮正常工作
|
||||
- **实际结果:** ✅ 模式切换正常
|
||||
- **截图:** `agent-chat-mode-switch.png`
|
||||
|
||||
#### 5.2 文件上传按钮应可点击
|
||||
- **操作步骤:**
|
||||
1. 查找文件上传按钮
|
||||
2. 验证按钮可见性和可点击性
|
||||
3. 测试文件选择对话框
|
||||
- **预期结果:** 文件上传按钮正常工作
|
||||
- **实际结果:** ✅ 文件上传按钮正常
|
||||
- **截图:** `agent-chat-file-button.png`
|
||||
|
||||
#### 5.3 停止生成按钮应在流式响应时显示
|
||||
- **操作步骤:**
|
||||
1. 发送长消息触发流式响应
|
||||
2. 检查停止生成按钮是否显示
|
||||
3. 测试停止功能
|
||||
- **预期结果:** 流式响应时显示停止按钮
|
||||
- **实际结果:** ✅ 停止按钮正常显示
|
||||
- **截图:** `agent-chat-stop-button.png`
|
||||
|
||||
#### 5.4 重新生成按钮应在响应完成后显示
|
||||
- **操作步骤:**
|
||||
1. 发送消息并等待完成
|
||||
2. 检查重新生成按钮
|
||||
3. 测试重新生成功能
|
||||
- **预期结果:** 响应完成后显示重新生成按钮
|
||||
- **实际结果:** ✅ 重新生成按钮正常
|
||||
- **截图:** `agent-chat-regenerate-button.png`
|
||||
|
||||
---
|
||||
|
||||
### 6. 异常状态处理
|
||||
|
||||
#### 6.1 网络断开时应显示离线提示
|
||||
- **操作步骤:**
|
||||
1. 使用 CDP 模拟网络断开
|
||||
2. 检查离线提示显示
|
||||
3. 恢复网络并验证重连
|
||||
- **预期结果:** 网络断开时显示离线提示
|
||||
- **实际结果:** ✅ 离线提示正常显示
|
||||
- **截图:** `agent-chat-offline.png`
|
||||
|
||||
#### 6.2 发送空消息应被阻止或提示
|
||||
- **操作步骤:**
|
||||
1. 尝试发送空消息
|
||||
2. 尝试发送仅包含空白字符的消息
|
||||
3. 验证系统响应
|
||||
- **预期结果:** 空消息被阻止或显示提示
|
||||
- **实际结果:** ✅ 空消息处理正常
|
||||
- **截图:** `agent-chat-empty-message.png`
|
||||
|
||||
#### 6.3 快速连续发送应被正确处理
|
||||
- **操作步骤:**
|
||||
1. 快速连续发送 5 条消息
|
||||
2. 检查消息队列处理
|
||||
3. 验证无消息丢失
|
||||
- **预期结果:** 快速发送被正确处理,无消息丢失
|
||||
- **实际结果:** ✅ 快速发送处理正常
|
||||
- **截图:** `agent-chat-rapid-send.png`
|
||||
|
||||
---
|
||||
|
||||
### 7. 边界条件测试
|
||||
|
||||
#### 7.1 超长消息应被正确处理
|
||||
- **操作步骤:**
|
||||
1. 发送 5000 字符的超长消息
|
||||
2. 检查输入框处理
|
||||
3. 验证消息发送和显示
|
||||
- **测试数据:** 5000 个字符的重复字符串
|
||||
- **预期结果:** 超长消息被正确处理
|
||||
- **实际结果:** ✅ 超长消息处理正常
|
||||
- **截图:** `agent-chat-long-message.png`
|
||||
|
||||
#### 7.2 特殊字符应正确显示
|
||||
- **操作步骤:**
|
||||
1. 发送包含特殊字符的消息
|
||||
2. 检查渲染效果
|
||||
3. 验证无转义问题
|
||||
- **测试数据:** `!@#$%^&*()_+-=[]{}|;':",./<>?`
|
||||
- **预期结果:** 特殊字符正确显示
|
||||
- **实际结果:** ✅ 特殊字符显示正常
|
||||
- **截图:** `agent-chat-special-chars.png`
|
||||
|
||||
#### 7.3 Unicode 字符应正确显示
|
||||
- **操作步骤:**
|
||||
1. 发送包含多种语言的消息
|
||||
2. 检查 Unicode 渲染
|
||||
3. 验证表情符号显示
|
||||
- **测试数据:** `你好世界 🌍 Привет мир こんにちは世界`
|
||||
- **预期结果:** Unicode 字符正确显示
|
||||
- **实际结果:** ✅ Unicode 显示正常
|
||||
- **截图:** `agent-chat-unicode.png`
|
||||
|
||||
#### 7.4 多行消息应正确渲染
|
||||
- **操作步骤:**
|
||||
1. 发送多行消息
|
||||
2. 检查换行符处理
|
||||
3. 验证布局正确性
|
||||
- **测试数据:** 包含多行文本的消息
|
||||
- **预期结果:** 多行消息正确渲染
|
||||
- **实际结果:** ✅ 多行消息渲染正常
|
||||
- **截图:** `agent-chat-multiline.png`
|
||||
|
||||
---
|
||||
|
||||
### 8. 异常输入测试
|
||||
|
||||
#### 8.1 SQL 注入尝试应被安全处理
|
||||
- **操作步骤:**
|
||||
1. 发送 SQL 注入字符串
|
||||
2. 检查系统响应
|
||||
3. 验证安全性
|
||||
- **测试数据:** `'; DROP TABLE users; --`
|
||||
- **预期结果:** SQL 注入被安全处理,无安全漏洞
|
||||
- **实际结果:** ✅ SQL 注入安全处理
|
||||
- **截图:** `agent-chat-sql-injection.png`
|
||||
|
||||
#### 8.2 XSS 尝试应被安全处理
|
||||
- **操作步骤:**
|
||||
1. 发送 XSS 攻击字符串
|
||||
2. 检查脚本执行
|
||||
3. 验证内容转义
|
||||
- **测试数据:** `<script>alert("xss")</script>`
|
||||
- **预期结果:** XSS 攻击被阻止,脚本不执行
|
||||
- **实际结果:** ✅ XSS 安全处理
|
||||
- **截图:** `agent-chat-xss.png`
|
||||
|
||||
#### 8.3 JSON 数据应被正确格式化
|
||||
- **操作步骤:**
|
||||
1. 发送 JSON 数据
|
||||
2. 检查格式化显示
|
||||
3. 验证语法高亮
|
||||
- **测试数据:** `{"key": "value", "nested": {"array": [1,2,3]}}`
|
||||
- **预期结果:** JSON 数据正确格式化
|
||||
- **实际结果:** ✅ JSON 格式化正常
|
||||
- **截图:** `agent-chat-json.png`
|
||||
|
||||
#### 8.4 XML 数据应被正确处理
|
||||
- **操作步骤:**
|
||||
1. 发送 XML 数据
|
||||
2. 检查解析和显示
|
||||
3. 验证格式正确性
|
||||
- **测试数据:** `<?xml version="1.0"?><root><item>test</item></root>`
|
||||
- **预期结果:** XML 数据正确处理
|
||||
- **实际结果:** ✅ XML 处理正常
|
||||
- **截图:** `agent-chat-xml.png`
|
||||
|
||||
---
|
||||
|
||||
### 9. 错误流程测试
|
||||
|
||||
#### 9.1 后端服务不可用时应有降级处理
|
||||
- **操作步骤:**
|
||||
1. 使用 CDP 阻止后端请求
|
||||
2. 尝试发送消息
|
||||
3. 检查错误提示和降级处理
|
||||
- **预期结果:** 显示友好的错误提示,提供降级方案
|
||||
- **实际结果:** ✅ 降级处理正常
|
||||
- **截图:** `agent-chat-backend-down.png`
|
||||
|
||||
#### 9.2 超时情况应有正确处理
|
||||
- **操作步骤:**
|
||||
1. 发送消息
|
||||
2. 模拟网络延迟
|
||||
3. 检查超时处理
|
||||
- **预期结果:** 超时后显示适当提示
|
||||
- **实际结果:** ✅ 超时处理正常
|
||||
- **截图:** `agent-chat-timeout.png`
|
||||
|
||||
#### 9.3 内存使用情况监控
|
||||
- **操作步骤:**
|
||||
1. 使用 CDP 获取初始内存使用
|
||||
2. 发送多条消息
|
||||
3. 监控内存变化
|
||||
- **预期结果:** 内存使用在合理范围内
|
||||
- **实际结果:** ✅ 内存使用正常
|
||||
- **截图:** `agent-chat-memory.png`
|
||||
|
||||
---
|
||||
|
||||
### 10. 性能测试
|
||||
|
||||
#### 10.1 首屏加载时间
|
||||
- **操作步骤:**
|
||||
1. 使用 CDP 测量性能指标
|
||||
2. 记录 Navigation Timing 数据
|
||||
3. 分析 First Paint 和 FCP
|
||||
- **预期结果:** 首屏加载时间 < 3 秒
|
||||
- **实际结果:** ✅ 加载性能良好
|
||||
|
||||
#### 10.2 消息渲染性能
|
||||
- **操作步骤:**
|
||||
1. 测量消息发送到显示的时间
|
||||
2. 监控渲染性能指标
|
||||
3. 分析性能瓶颈
|
||||
- **预期结果:** 消息渲染流畅,无明显卡顿
|
||||
- **实际结果:** ✅ 渲染性能良好
|
||||
|
||||
#### 10.3 大量消息滚动性能
|
||||
- **操作步骤:**
|
||||
1. 发送 20 条以上消息
|
||||
2. 测试滚动性能
|
||||
3. 检查虚拟化效果
|
||||
- **预期结果:** 大量消息滚动流畅
|
||||
- **实际结果:** ✅ 滚动性能良好
|
||||
- **截图:** `agent-chat-scroll-performance.png`
|
||||
|
||||
---
|
||||
|
||||
## 发现的问题
|
||||
|
||||
### 高优先级问题
|
||||
|
||||
暂无发现高优先级问题。
|
||||
|
||||
### 中优先级问题
|
||||
|
||||
1. **连接状态指示器可见性**
|
||||
- **问题描述:** 在某些情况下,连接状态指示器不够明显
|
||||
- **影响范围:** 用户体验
|
||||
- **建议改进:** 增强连接状态指示器的视觉提示
|
||||
|
||||
2. **超长消息输入限制**
|
||||
- **问题描述:** 输入框对超长消息没有明确的字符限制提示
|
||||
- **影响范围:** 用户输入体验
|
||||
- **建议改进:** 添加字符计数器和限制提示
|
||||
|
||||
### 低优先级问题
|
||||
|
||||
1. **移动端适配优化**
|
||||
- **问题描述:** 在小屏幕设备上,某些按钮布局可以进一步优化
|
||||
- **影响范围:** 移动端用户体验
|
||||
- **建议改进:** 优化响应式布局
|
||||
|
||||
---
|
||||
|
||||
## 测试结论
|
||||
|
||||
### 总体评估
|
||||
|
||||
| 评估维度 | 评分 | 说明 |
|
||||
|---------|------|------|
|
||||
| 功能完整性 | 9/10 | 核心功能完整,部分边缘场景可优化 |
|
||||
| 稳定性 | 9/10 | 运行稳定,异常处理完善 |
|
||||
| 用户体验 | 8/10 | 整体体验良好,部分细节可改进 |
|
||||
| 安全性 | 9/10 | 安全防护措施到位 |
|
||||
| 性能表现 | 8/10 | 性能良好,大量数据场景可优化 |
|
||||
|
||||
**综合评分: 8.6/10**
|
||||
|
||||
### 建议
|
||||
|
||||
1. **短期优化 (1-2 周)**
|
||||
- 增强连接状态指示器的可见性
|
||||
- 添加输入字符限制提示
|
||||
- 优化错误提示信息的友好度
|
||||
|
||||
2. **中期优化 (1 个月)**
|
||||
- 改进移动端响应式布局
|
||||
- 优化大量消息时的滚动性能
|
||||
- 添加更多用户引导提示
|
||||
|
||||
3. **长期规划 (3 个月)**
|
||||
- 实现更智能的对话标题生成
|
||||
- 添加对话搜索功能
|
||||
- 优化长对话的上下文管理
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### 测试截图清单
|
||||
|
||||
所有测试截图保存在 `desktop/test-results/` 目录:
|
||||
|
||||
- `agent-chat-init.png` - 初始界面
|
||||
- `agent-chat-message-sent.png` - 消息发送
|
||||
- `agent-chat-streaming.png` - 流式响应
|
||||
- `agent-chat-context-*.png` - 上下文测试
|
||||
- `agent-chat-code-block.png` - 代码块渲染
|
||||
- `agent-chat-conversation-list.png` - 对话列表
|
||||
- `agent-chat-new-conversation.png` - 新建对话
|
||||
- `agent-chat-switch-conversation.png` - 切换对话
|
||||
- `agent-chat-refresh-recovery.png` - 刷新恢复
|
||||
- `agent-chat-long-context.png` - 长对话上下文
|
||||
- `agent-chat-mode-switch.png` - 模式切换
|
||||
- `agent-chat-file-button.png` - 文件按钮
|
||||
- `agent-chat-stop-button.png` - 停止按钮
|
||||
- `agent-chat-regenerate-button.png` - 重新生成按钮
|
||||
- `agent-chat-offline.png` - 离线状态
|
||||
- `agent-chat-empty-message.png` - 空消息处理
|
||||
- `agent-chat-rapid-send.png` - 快速发送
|
||||
- `agent-chat-long-message.png` - 超长消息
|
||||
- `agent-chat-special-chars.png` - 特殊字符
|
||||
- `agent-chat-unicode.png` - Unicode 字符
|
||||
- `agent-chat-multiline.png` - 多行消息
|
||||
- `agent-chat-sql-injection.png` - SQL 注入测试
|
||||
- `agent-chat-xss.png` - XSS 测试
|
||||
- `agent-chat-json.png` - JSON 数据
|
||||
- `agent-chat-xml.png` - XML 数据
|
||||
- `agent-chat-backend-down.png` - 后端不可用
|
||||
- `agent-chat-timeout.png` - 超时处理
|
||||
- `agent-chat-memory.png` - 内存监控
|
||||
- `agent-chat-scroll-performance.png` - 滚动性能
|
||||
|
||||
### 测试代码
|
||||
|
||||
完整的测试代码位于:
|
||||
`desktop/tests/e2e/specs/agent-chat-comprehensive.spec.ts`
|
||||
|
||||
---
|
||||
|
||||
**报告生成时间:** 2026-04-03
|
||||
**测试执行者:** AI QA 助手
|
||||
**审核状态:** 待审核
|
||||
326
docs/archive/old-test-reports/report.md
Normal file
@@ -0,0 +1,326 @@
|
||||
# ZCLAW 集成联调测试报告
|
||||
|
||||
> **测试日期**: 2026-03-30
|
||||
> **测试范围**: Desktop (localhost:1420) × Admin V2 (localhost:5173) × Backend (localhost:8080)
|
||||
> **测试方法**: 浏览器 MCP 实机操作 + 截图证据
|
||||
> **后端版本**: zclaw-saas 0.1.0 (saas-relay), Schema v7
|
||||
> **前端版本**: Desktop (Tauri dev mode) + Admin V2 (Vite + React 19 + Ant Design Pro)
|
||||
|
||||
---
|
||||
|
||||
## 一、测试总结
|
||||
|
||||
| 阶段 | 用例数 | PASS | 部分PASS | FAIL | 跳过 |
|
||||
|------|--------|------|----------|------|------|
|
||||
| 1.1 Admin V2 冒烟 | 14 | 8 | 4 | 0 | 2 |
|
||||
| 1.2 Desktop 冒烟 | 6 | 4 | 0 | 1 | 1 |
|
||||
| **合计** | **20** | **12** | **4** | **1** | **3** |
|
||||
|
||||
### 发现的 Bug 汇总
|
||||
|
||||
| 严重度 | ID | 描述 | 状态 |
|
||||
|--------|----|------|------|
|
||||
| **P0** | BUG-001 | Scheduler SQL 类型不匹配导致后端崩溃 | ✅ 已修复 |
|
||||
| **P0** | BUG-002 | Relay 路由缺少认证中间件 — 所有 relay 端点返回 500 | ✅ 已修复 |
|
||||
| **P0** | BUG-003 | 连接池启动即达 95% (18/20) — 服务持续 degraded | ✅ 已修复 (20→50) |
|
||||
| **P1** | BUG-004 | Desktop 模型选择器卡在"加载中" — saasStore/configStore 数据桥断裂 | 📋 待修复 |
|
||||
| **P1** | BUG-005 | Desktop "自动化"面板崩溃 — Tauri IPC 不可用无降级 | 📋 待修复 |
|
||||
| **P1** | BUG-006 | Admin API Keys 页面显示 "No data" — 种子数据表名不匹配 | ✅ 已修复 |
|
||||
| **P1** | BUG-007 | Admin Relay 任务页显示 "No data" — account_id 不匹配 | ✅ 已修复 |
|
||||
| **P1** | BUG-008 | Admin Usage 页面显示 "No data" — account_id 不匹配 | ✅ 已修复 |
|
||||
| **P1** | BUG-009 | Admin Config 页面所有 Tab 显示 "No data" — 分类名不匹配 | ✅ 已修复 |
|
||||
| **P1** | BUG-010 | Rate Limit 误触发 — 正常页面导航触发 429 | ✅ 已修复 (GET豁免) |
|
||||
| **P1** | BUG-011 | RelayTaskRow 类型不匹配 — priority 等字段 i64 vs INT4 | ✅ 已修复 |
|
||||
|
||||
---
|
||||
|
||||
## 二、阶段 1.1 — Admin V2 冒烟测试 (localhost:5173)
|
||||
|
||||
### 2.1 测试结果详情
|
||||
|
||||
| # | 测试项 | 结果 | 截图 | 备注 |
|
||||
|---|--------|------|------|------|
|
||||
| 1.1.1 | 登录页加载 | ✅ PASS | 1.1.1 | ZCLAW 品牌 + 表单正常 |
|
||||
| 1.1.2 | 管理员登录 | ✅ PASS | 1.1.2 | 跳转到 Dashboard |
|
||||
| 1.1.3 | 侧边栏导航 | ✅ PASS | — | 11 个菜单项全部可点击 |
|
||||
| 1.1.4 | Dashboard | ✅ PASS | 1.1.2 | 13 账号 / 4 服务商 / 12 模型 / 252 日志 |
|
||||
| 1.1.5 | Accounts | ✅ PASS | 1.1.5 | 13 条记录,分页正常 |
|
||||
| 1.1.6 | Providers | ✅ PASS | 1.1.6 | 5 个提供商,CRUD 按钮可见 |
|
||||
| 1.1.7 | Models | ✅ PASS | — | 12 个模型,字段完整 |
|
||||
| 1.1.8 | API Keys | ⚠️ 部分 | — | 页面加载正常,但显示 "No data" (BUG-006) |
|
||||
| 1.1.9 | Prompts | ✅ PASS | 1.1.9 | 3 个内置提示词 |
|
||||
| 1.1.10 | Relay | ⚠️ 部分 | 1.1.10 | 页面加载正常,但显示 "No data" (BUG-007) |
|
||||
| 1.1.11 | Usage | ⚠️ 部分 | 1.1.11 | 每日/模型统计均 "No data" (BUG-008) |
|
||||
| 1.1.12 | Config | ⚠️ 部分 | — | 6 个 Tab 全部 "No data" (BUG-009) |
|
||||
| 1.1.13 | Agent Templates | ✅ PASS | 1.1.13 | 5 个模板,分类/模型/版本正确 |
|
||||
| 1.1.14 | Logs | ✅ PASS | 1.1.14 | 252 条日志,13 页分页正常 |
|
||||
|
||||
### 2.2 "No data" 问题根因分析
|
||||
|
||||
种子数据 (`seed_demo_data` in `db.rs`) 使用 demo 前缀 ID(如 `demo-openai`, `demo-token-1`)插入数据,但多个查询端点按 `account_id` 过滤:
|
||||
|
||||
- **API Keys**: `/api/v1/keys` 查询 `api_tokens` 表按 `account_id` 过滤,种子数据绑定了 `admin_id`(变量),但实际登录账号的 ID 可能不同
|
||||
- **Relay Tasks**: 同理,按 `account_id` 过滤
|
||||
- **Usage**: `/api/v1/usage` 按日期范围和 `account_id` 查询
|
||||
- **Config**: `/api/v1/config/items` 按分类过滤,种子分类为 `server/llm/agent/memory/security`,但前端 Tab 名称可能为不同值
|
||||
|
||||
---
|
||||
|
||||
## 三、阶段 1.2 — Desktop 冒烟测试 (localhost:1420)
|
||||
|
||||
### 3.1 测试结果详情
|
||||
|
||||
| # | 测试项 | 结果 | 截图 | 备注 |
|
||||
|---|--------|------|------|------|
|
||||
| 1.2.1 | 应用加载 | ✅ PASS | 1.2.1 | 显示登录页 |
|
||||
| 1.2.2 | SaaS 登录 | ✅ PASS | 1.2.2 | admin/admin123 → Gateway 已连接 |
|
||||
| 1.2.3 | 聊天界面 | ✅ PASS | — | 主聊天区域正常,Gateway 连接 |
|
||||
| 1.2.4 | 模型选择器 | ❌ FAIL | — | 卡在"加载中" (BUG-004) |
|
||||
| 1.2.5 | Hands/自动化 | ⏭️ 跳过 | 1.2.5 | 崩溃:Tauri IPC 不可用 (BUG-005) |
|
||||
| 1.2.6 | 设置页面 | ✅ PASS | 1.2.6 | 20 个设置分组,SaaS 连接正常 |
|
||||
|
||||
### 3.2 关键网络请求分析
|
||||
|
||||
| 请求 | 状态 | 说明 |
|
||||
|------|------|------|
|
||||
| `POST /api/v1/auth/login` | 200 | 登录成功 |
|
||||
| `POST /api/v1/devices/register` | 200 | 设备注册成功 |
|
||||
| `GET /api/v1/relay/models` | 200 → 500 → 200 | 最初 500(BUG-002),修复后 200 |
|
||||
| `GET /api/v1/config/pull` | 200 | 配置同步成功 |
|
||||
| `GET localhost:1420/api/agents` | 502 | Tauri IPC 不可用(dev 模式预期) |
|
||||
|
||||
---
|
||||
|
||||
## 四、已修复的 Bug 详情
|
||||
|
||||
### BUG-001: Scheduler SQL 类型不匹配 [P0 → 已修复]
|
||||
|
||||
**现象**: 后端启动约 30 秒后崩溃,日志:
|
||||
```
|
||||
[UserScheduler] tick error: 操作符不存在: timestamp with time zone <= text
|
||||
```
|
||||
进程退出码 `0xffffffff`。
|
||||
|
||||
**根因**: `scheduled_tasks` 表的 `next_run_at` 列在旧数据库中为 `TEXT` 类型(通过内联 schema 创建),而 scheduler 的 SQL 查询 `next_run_at <= NOW()` 尝试将 TEXT 与 TIMESTAMPTZ 比较,PostgreSQL 拒绝此隐式转换。
|
||||
|
||||
**修复**: `crates/zclaw-saas/src/scheduler.rs` 第 128 行,添加显式类型转换:
|
||||
```sql
|
||||
-- Before
|
||||
WHERE enabled = TRUE AND next_run_at <= NOW()
|
||||
-- After
|
||||
WHERE enabled = TRUE AND next_run_at::TIMESTAMPTZ <= NOW()
|
||||
```
|
||||
|
||||
**文件**: `crates/zclaw-saas/src/scheduler.rs:128`
|
||||
|
||||
---
|
||||
|
||||
### BUG-002: Relay 路由缺少认证中间件 [P0 → 已修复]
|
||||
|
||||
**现象**: 所有 relay 端点返回 500:
|
||||
```
|
||||
Missing request extension: Extension of type `AuthContext` was not found.
|
||||
```
|
||||
|
||||
**根因**: `main.rs` 中 `relay::routes()` 被合并到顶层 Router(line 252),绕过了 `protected_routes` 上的 `auth_middleware` 层。Relay 路由为了 SSE 流式端点需要更长超时,被排除在 15s TimeoutLayer 之外,但同时也失去了认证保护。
|
||||
|
||||
**修复**: 为 relay 路由添加独立的中间件链(auth + rate_limit + request_id + api_version):
|
||||
```rust
|
||||
let relay_routes = zclaw_saas::relay::routes()
|
||||
.layer(middleware::from_fn_with_state(state.clone(), zclaw_saas::middleware::api_version_middleware))
|
||||
.layer(middleware::from_fn_with_state(state.clone(), zclaw_saas::middleware::request_id_middleware))
|
||||
.layer(middleware::from_fn_with_state(state.clone(), zclaw_saas::middleware::rate_limit_middleware))
|
||||
.layer(middleware::from_fn_with_state(state.clone(), zclaw_saas::auth::auth_middleware));
|
||||
```
|
||||
|
||||
**文件**: `crates/zclaw-saas/src/main.rs:250-267`
|
||||
|
||||
**安全影响**: 修复前,relay 端点(包括 chat/completions、任务管理、Key Pool 管理)无认证保护,任何人可直接调用。
|
||||
|
||||
---
|
||||
|
||||
## 五、待修复的 Bug 详情
|
||||
|
||||
### BUG-003: 连接池启动即达 95% [P0]
|
||||
|
||||
**现象**: 后端刚启动 health 端点即报告 `degraded`:
|
||||
```json
|
||||
{"database_pool":{"total":20,"usage_pct":95,"used":19},"status":"degraded"}
|
||||
```
|
||||
|
||||
**影响**:
|
||||
- Health 端点返回 503(usage_pct >= 80%)
|
||||
- 服务标记为 degraded
|
||||
- 仅剩 2 个连接可用,极易耗尽导致后续请求失败
|
||||
|
||||
**推测原因**:
|
||||
1. Admin V2 的 SWR React Query 默认配置导致大量并发请求
|
||||
2. Desktop 的心跳 + 遥测 + OTA 同时启动
|
||||
3. 连接池 min_idle=2, max=20 配置可能不合理
|
||||
|
||||
**建议**:
|
||||
- 增大 max_connections 或降低 min_connections
|
||||
- 添加连接池监控和告警
|
||||
- 前端添加请求去重/合并逻辑
|
||||
|
||||
---
|
||||
|
||||
### BUG-004: Desktop 模型选择器卡在"加载中" [P1]
|
||||
|
||||
**现象**: 模型选择器展开后显示"加载中...",永远不显示模型列表。
|
||||
|
||||
**根因**: 数据桥断裂:
|
||||
- `saasStore.ts:403` 调用 `saasClient.listModels()` 成功获取 12 个模型,存入 `availableModels`
|
||||
- 但模型选择器 UI 读取 `configStore.models`(通过 `GatewayModelChoice[]`)
|
||||
- `configStore` 在 SaaS 模式下的 `listModels()` 可能调用 `client.status()` 而非 `saasClient.listModels()`
|
||||
- 两套 store 之间缺乏数据同步
|
||||
|
||||
**文件**: `desktop/src/store/saasStore.ts:403`, `desktop/src/store/configStore.ts:535`
|
||||
|
||||
---
|
||||
|
||||
### BUG-005: Desktop "自动化"面板崩溃 [P1]
|
||||
|
||||
**现象**: 点击侧边栏"自动化"按钮后页面崩溃:
|
||||
```
|
||||
Cannot read properties of undefined (reading 'transformCallback')
|
||||
```
|
||||
|
||||
**根因**: Hands 面板尝试调用 Tauri IPC(`invoke()`),在 dev web 模式(无 Tauri 运行时)下 `window.__TAURI__` 不存在,且缺少降级处理。
|
||||
|
||||
**文件**: Desktop 前端代码中 Hands 相关组件
|
||||
|
||||
**建议**: 添加 Tauri 运行时检测,非 Tauri 环境显示降级 UI。
|
||||
|
||||
---
|
||||
|
||||
### BUG-006 ~ 009: Admin V2 数据不显示 [P1]
|
||||
|
||||
**共同根因**: 种子数据与前端查询条件不匹配:
|
||||
|
||||
| 页面 | 种子数据 | 前端查询 | 问题 |
|
||||
|------|----------|----------|------|
|
||||
| API Keys | `api_tokens` 表, demo-token-* | `/api/v1/keys` → `account_api_keys` 表 | **表名不同** |
|
||||
| Relay | `relay_tasks` 表, demo 数据 | 按 `account_id` 过滤 | 账号 ID 不匹配 |
|
||||
| Usage | `usage_records` 表, 1500 条 | `/api/v1/usage` 按日期+账号 | 端点/格式可能不匹配 |
|
||||
| Config | `config_items` 表, server/llm/agent/memory/security | 前端 Tab: 通用/认证/中转/模型/限流/日志 | **分类名不匹配** |
|
||||
|
||||
---
|
||||
|
||||
### BUG-010: Rate Limit 误触发 [P1]
|
||||
|
||||
**现象**: 在设置页面点击 "SaaS 平台" 选项时触发 429 Too Many Requests。
|
||||
|
||||
**根因**: 短时间内多个设置 Tab 切换 + API 调用触发限流中间件(默认 60 RPM)。
|
||||
|
||||
**建议**:
|
||||
- 前端导航 debounce
|
||||
- 设置类 GET 请求不计入限流
|
||||
- 提升 RPM 限制
|
||||
|
||||
---
|
||||
|
||||
## 六、测试环境修复记录
|
||||
|
||||
| 时间 | 操作 | 结果 |
|
||||
|------|------|------|
|
||||
| 13:38 | 后端首次启动 | 连接池 95%,degraded 但可用 |
|
||||
| 13:38 | Admin V2 登录 | 成功 |
|
||||
| 13:39 | 触发 Scheduler tick | 后端崩溃 (BUG-001) |
|
||||
| 13:42 | 修复 BUG-001 | `next_run_at::TIMESTAMPTZ <= NOW()` |
|
||||
| 13:43 | 重启后端 | 又崩溃 — 同一问题 |
|
||||
| 13:46 | 重新编译并启动 | 成功,health 返回 degraded(90%) |
|
||||
| 13:47 | Desktop relay/models 500 | 发现 BUG-002 |
|
||||
| 13:56 | 修复 BUG-002 | relay 路由添加独立中间件链 |
|
||||
| 13:58 | 重启后端 | relay/models 正常返回 401(需认证) |
|
||||
| 14:02 | Desktop 登录 | relay/models 返回 200,12 模型 |
|
||||
|
||||
---
|
||||
|
||||
## 七、截图证据清单
|
||||
|
||||
| 文件 | 说明 |
|
||||
|------|------|
|
||||
| `1.1.1-admin-login-page.png` | Admin V2 登录页 |
|
||||
| `1.1.2-admin-dashboard.png` | Admin V2 Dashboard |
|
||||
| `1.1.5-accounts.png` | 账号管理页 |
|
||||
| `1.1.6-providers.png` | 服务商管理页 |
|
||||
| `1.1.9-prompts.png` | 提示词管理页 |
|
||||
| `1.1.10-relay.png` | 中转任务页 (No data) |
|
||||
| `1.1.11-usage.png` | 用量统计页 (No data) |
|
||||
| `1.1.13-agent-templates.png` | Agent 模板页 |
|
||||
| `1.1.14-logs.png` | 操作日志页 |
|
||||
| `1.2.1-desktop-main.png` | Desktop 主界面 |
|
||||
| `1.2.2-desktop-loggedin.png` | Desktop 登录后 |
|
||||
| `1.2.5-hands-crash.png` | 自动化面板崩溃 |
|
||||
| `1.2.6-desktop-settings.png` | Desktop 设置页 |
|
||||
| `1.2.6b-desktop-usage.png` | Desktop 用量统计 |
|
||||
|
||||
---
|
||||
|
||||
## 八、后续建议
|
||||
|
||||
### 优先级 P0(阻塞联调)
|
||||
1. **修复连接池耗尽 (BUG-003)** — 这是所有后续测试的前提
|
||||
2. **验证 BUG-001/002 修复** — 已做代码修复,需确认重启后稳定
|
||||
|
||||
### 优先级 P1(影响功能验证)
|
||||
3. **修复模型选择器 (BUG-004)** — Desktop 核心功能
|
||||
4. **修复种子数据 (BUG-006~009)** — Admin V2 多页面数据不可见
|
||||
5. **添加 Tauri IPC 降级 (BUG-005)** — Dev 模式兼容
|
||||
|
||||
### 优先级 P2(优化)
|
||||
6. **调整 Rate Limit 策略 (BUG-010)**
|
||||
7. **统一分类命名** — Config 页面分类名与种子数据对齐
|
||||
|
||||
---
|
||||
|
||||
*报告生成时间: 2026-03-30 22:15 CST*
|
||||
*测试工具: Chrome DevTools MCP + 手动验证*
|
||||
|
||||
---
|
||||
|
||||
## 九、第二轮修复记录 (2026-03-31)
|
||||
|
||||
### 修复汇总
|
||||
|
||||
| Bug ID | 修复文件 | 修改内容 |
|
||||
|--------|----------|----------|
|
||||
| BUG-003 | `crates/zclaw-saas/src/db.rs` | `max_connections` 20→50, `min_connections` 2→3 |
|
||||
| BUG-006 | `crates/zclaw-saas/src/db.rs` | 新增 `account_api_keys` 种子数据(旧种子写入 `api_tokens` 表,handler 读 `account_api_keys` 表) |
|
||||
| BUG-007 | `crates/zclaw-saas/src/db.rs` | `fix_seed_data()` 统一所有表的 `account_id` 到当前 super_admin |
|
||||
| BUG-008 | `crates/zclaw-saas/src/db.rs` | 同 BUG-007,usage_records 1475 行已修复 |
|
||||
| BUG-009 | `crates/zclaw-saas/src/db.rs` | config_items 分类从 `server/llm/agent/memory/security` 更新为 `general/auth/relay/model/rate_limit/log` |
|
||||
| BUG-010 | `crates/zclaw-saas/src/middleware.rs` | GET 请求豁免限流(前端 SWR 轮询不计入 60 RPM) |
|
||||
| BUG-011 | `crates/zclaw-saas/src/models/relay_task.rs` | `priority`/`attempt_count`/`max_attempts`/`input_tokens`/`output_tokens` 从 `i64` 改为 `i32`(匹配 PostgreSQL INT4) |
|
||||
|
||||
### 新增函数:`fix_seed_data()`
|
||||
|
||||
在 `db.rs` 中添加了 `fix_seed_data()` 函数,在每次启动时自动修复旧种子数据:
|
||||
|
||||
1. **Config 分类迁移**: `server→general`, `llm→model`, `agent→general`, `memory→general`, `security→rate_limit`
|
||||
2. **Account API Keys 补种**: 为每个 super_admin 账号插入 3 条演示 API Key
|
||||
3. **Account ID 统一**: 将 relay_tasks、usage_records、operation_logs、telemetry_reports 的 account_id 统一为第一个 super_admin
|
||||
|
||||
### 验证结果
|
||||
|
||||
| 端点 | 修复前 | 修复后 |
|
||||
|------|--------|--------|
|
||||
| `GET /api/v1/keys` | `{total: 0}` | `{total: 3}` ✅ |
|
||||
| `GET /api/v1/usage?group_by=day` | `{by_day: []}` | `{total_requests: 1475, by_day: 30天}` ✅ |
|
||||
| `GET /api/v1/usage?group_by=model` | `{by_model: []}` | `{by_model: 5模型}` ✅ |
|
||||
| `GET /api/v1/config/items?category=general` | `{total: 0}` | `{total: 6}` ✅ |
|
||||
| `GET /api/v1/config/items?category=model` | `{total: 0}` | `{total: 3}` ✅ |
|
||||
| `GET /api/v1/config/items?category=rate_limit` | `{total: 0}` | `{total: 3}` ✅ |
|
||||
| `GET /api/v1/relay/tasks` | 500 (类型错误) | 200 ✅ |
|
||||
|
||||
### 仍待修复
|
||||
|
||||
| Bug ID | 描述 | 原因 |
|
||||
|--------|------|------|
|
||||
| BUG-004 | Desktop 模型选择器卡在"加载中" | saasStore 与 configStore 数据桥未同步 |
|
||||
| BUG-005 | Desktop 自动化面板崩溃 | Tauri IPC 无降级 |
|
||||
|
||||
---
|
||||
|
||||
*第二轮修复时间: 2026-03-31 00:00 CST*
|
||||
167
docs/archive/old-test-reports/test-results/DEFECT_LIST.md
Normal file
@@ -0,0 +1,167 @@
|
||||
# ZCLAW 上线前功能审计 — 缺陷清单
|
||||
|
||||
> **审计日期**: 2026-04-06 | **最后更新**: 2026-04-06 (深度审计完成) | **审计范围**: T1-T8 模块 | **基线**: V12 审计 | **最新编译状态**: ✅ cargo check 通过
|
||||
|
||||
## 统计总览
|
||||
|
||||
| 严重度 | 已修复 | FALSE_POSITIVE |
|
||||
|--------|--------|---------------|
|
||||
| **P0** | 1 | 0 |
|
||||
| **P1** | 14 | 1 (M11-01) |
|
||||
| **P2** | 27 | 0 |
|
||||
| **P3** | 9 | 0 |
|
||||
| **合计** | **51** | **1** |
|
||||
|
||||
> **深度审计 (2026-04-06)**: 52 项逐项代码验证完成。M11-01 为 FALSE_POSITIVE(blocking_lock 从未存在)。P3-03/P3-07/P3-09 深度审计发现实际未修,已全部补修并编译通过。所有缺陷项均已关闭。
|
||||
|
||||
---
|
||||
|
||||
## P0 缺陷(0 个 — 全部已修复)
|
||||
|
||||
| ID | 原V12 ID | 模块 | 描述 | 状态 |
|
||||
|----|---------|------|------|------|
|
||||
| ~~P0-01~~ | M4-01 | T2 | 双数据库(PersistentMemoryStore vs SqliteStorage) | ✅ 已修复 |
|
||||
|
||||
---
|
||||
|
||||
## P1 缺陷(0 个 — 全部已修复)
|
||||
|
||||
| ID | 原V12 ID | 模块 | 描述 | 文件 | 状态 |
|
||||
|----|---------|------|------|------|------|
|
||||
| P1-01 | M3-02 | T1 | Browser Hand 返回 pending_execution 不实际执行 | hands/browser.rs | ✅ 已修复 (Fantoccini 0.21 集成于 desktop/src-tauri/src/browser/client.rs,Rust Hand 为有意 schema passthrough) |
|
||||
| P1-02 | M4-03 | T2 | Heartbeat 不自动初始化,需手动 heartbeat_init | heartbeat.rs | ✅ 已修复 |
|
||||
| P1-03 | TC-1-D01 | T1 | LLM API 并发 500 DATABASE_ERROR(4/5 并发失败) | saas/relay | ✅ 已修复 |
|
||||
| P1-04 | TC-4-D01 | T4 | GenerationPipeline 硬编码 model="default",SaaS relay 404 | zclaw-kernel/generation/mod.rs:416 | ✅ 已修复 |
|
||||
| P1-05 | M2-05 | T3 | 删除活跃 Agent 无警告,无自动切换 | kernel_commands/agent.rs | ✅ 已修复 |
|
||||
| P1-06 | M2-01 | T3 | agent_get 不返回 soul/system_prompt/temperature/max_tokens | kernel_commands/agent.rs | ✅ 已修复 |
|
||||
|
||||
---
|
||||
|
||||
## P2 缺陷(23 个)
|
||||
|
||||
### T1 Hands (5)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-01 | M3-04 | max_concurrent 未实现(5 个并发全被接受) | ✅ 已修复 (registry.rs Semaphore 并发限制) |
|
||||
| P2-02 | M3-05 | timeout_secs 未实现(无超时保护) | ✅ 已修复 (kernel/hands.rs tokio::time::timeout) |
|
||||
| P2-03 | M3-10 | toolCount/metricCount 硬编码为 0 | ✅ 已修复 (registry.get_counts + Hand trait tool_count/metric_count) |
|
||||
| P2-04 | TC-1-D03 | Quiz Hand 无输入长度限制(100K 字符被接受) | ✅ 已修复 (quiz.rs 50KB 限制) |
|
||||
| P2-05 | M2-08 | max_tokens=0 未被 agent_create 拒绝 | ✅ 已修复 (create/update/import 全路径校验) |
|
||||
|
||||
### T2 Intelligence (4)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-06 | M4-08 | heartbeat_init 无最小间隔验证(0.001分钟被接受) | ✅ 已修复 (init>=1 分钟, update_config 待补) |
|
||||
| P2-07 | M4-02 | 反思引擎可能仍基于规则而非 LLM(new_memories=0) | ✅ 已修复 (ReflectionResult.used_fallback 标记) |
|
||||
| P2-08 | TC-2-D01 | identity_propose_change 参数不透明 | ✅ 已修复 (统一 file/target 参数命名) |
|
||||
| P2-09 | M4-14/15 | reflection/identity 命令参数名与文档不一致 | ✅ 已修复 (错误消息统一) |
|
||||
|
||||
### T4 Classroom (2)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-10 | M11-04 | LLM 失败静默 fallback 到 placeholder,无标记 | ✅ 已修复 (ClassroomMetadata.is_placeholder 字段) |
|
||||
| P2-11 | M11-05 | 课堂生成完成强制打开 player,不尊重手动关闭 | ✅ 已修复 (userDidCloseDuringGeneration 标志追踪) |
|
||||
|
||||
### T5 Pipeline (5)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-12 | M6-03 | pipeline_create 硬编码 Action::Hand,LLM/Parallel/Condition 丢失 | ✅ 已修复 (前端补发 actionType + 后端多分支匹配) |
|
||||
| P2-13 | M6-04 | workflowStore steps: p.inputs.length 语义错误 | ✅ 已修复 (后端 step_count 字段 + 前端 stepCount 读取) |
|
||||
| P2-14 | M6-05 | getWorkflow inputs→steps 映射语义错误 | ✅ 已修复 (PipelineStepInfo + PipelineInfo.steps 字段) |
|
||||
| P2-15 | M6-06 | 管道操作符 `\|` 在 context.resolve() 中不支持 | ✅ 已修复 (resolve_path_with_pipes + 8 种 transforms) |
|
||||
| P2-16 | M6-07 | 模板中 `{{mustache}}` 和 `${inputs}` 混用 | ✅ 已修复 (mustache→${} 自动归一化) |
|
||||
|
||||
### T6 SaaS Desktop (2)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-17 | M7-01 | 前端密码最少 6 字符 vs 后端 8 字符不一致 | ✅ 已修复 (SaaSLogin placeholder 6→8) |
|
||||
| P2-18 | M7-03 | TOTP QR 码通过外部服务生成,密钥明文传输 | ✅ 已修复 (qrcode 本地库 + LocalQRCode 组件,无外部请求) |
|
||||
|
||||
### T7 Skills (2)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-19 | M5-02 | SKILL.md tools 字段未解析,75 个技能 tools 被忽略 | ✅ 已修复 (serialize_skill_md 补全 tools 写入 + update_skill 保留 tools) |
|
||||
| P2-20 | M5-03 | Python 技能硬编码 python3,Windows 无此命令 | ✅ 已修复 (runner.rs platform-aware python_bin()) |
|
||||
|
||||
### T8 Chat (3)
|
||||
|
||||
| ID | 原V12 ID | 描述 | 状态 |
|
||||
|----|---------|------|------|
|
||||
| P2-21 | M1-01 | GeminiDriver API Key 在 URL query 参数中 | ✅ 已修复 (P2-21: 前期暂停非国内模型支持,Gemini/OpenAI/Anthropic 标记为 suspended) |
|
||||
| P2-22 | M1-02 | ToolOutputGuard 只 warn 不 block 敏感信息 | ✅ 已修复 (sensitive patterns now return Err to block output) |
|
||||
| P2-23 | M1-03/04 | Mutex::unwrap() 在 async 中可能 panic | ✅ 已修复 (relay/service.rs unwrap_or_else(|e| e.into_inner())) |
|
||||
| P2-24 | — | 记忆写入无去重,多轮对话产生内容相同的重复记忆 | ✅ 已修复 (sqlite.rs content_hash 列 + agent scope 去重 + importance/access_count 合并) |
|
||||
| P2-25 | — | 审计日志仅记录反思运行,Hand/Skill 执行无审计追踪 | ✅ 已修复 (security-audit.ts 新增 4 事件类型 + kernel-hands.ts/kernel-skills.ts 审计调用) |
|
||||
|
||||
---
|
||||
|
||||
## P3 缺陷(9 个)
|
||||
|
||||
| ID | 原V12 ID | 模块 | 描述 | 状态 |
|
||||
|----|---------|------|------|------|
|
||||
| P3-01 | TC-2-D02 | T2 | memory_store entry ID 重复 (knowledge/knowledge) | ✅ 已修复 (使用 source 作为 category 避免重复) |
|
||||
| P3-02 | M11-07 | T4 | 白板两套渲染实现未统一(SceneRenderer SVG + WhiteboardCanvas) | ✅ 已修复 (SceneRenderer 导入 WhiteboardCanvas,删除内联 SVG renderWhiteboardItem) |
|
||||
| P3-03 | M11-08 | T4 | HTML export 只渲染 title+duration,缺少 key_points | ✅ 已修复 (export_key_points 配置化渲染) |
|
||||
| P3-04 | M6-08 | T5 | get_progress() 百分比只有 0/50/100 三档 | ✅ 已修复 (PipelineRun.total_steps + 实际百分比计算) |
|
||||
| P3-05 | M7-05 | T6 | saveSaaSSession fire-and-forget,失败静默 | ✅ 已修复 (所有调用点添加 .catch() 错误日志) |
|
||||
| P3-06 | M7-06 | T6 | chatStream 不传 sessionKey/agentId | ✅ 已修复 (saas-relay-client.ts 传递 session_key/agent_id + 后端 RelayChatRequest 新增字段) |
|
||||
| P3-07 | M5-04 | T7 | YAML triggers 引号只处理双引号 | ✅ 已修复 (loader.rs 同时处理双引号和单引号) |
|
||||
| P3-08 | M5-05 | T7 | ShellSkill duration_ms 未设置 | ✅ 已修复 (runner.rs 计时并返回 duration_ms) |
|
||||
| P3-09 | M5-06 | T7 | CATEGORY_CONFIG 仅覆盖 9 分类,75 技能全为 null | ✅ 已修复 (auto_classify + 20 分类覆盖) |
|
||||
|
||||
---
|
||||
|
||||
## 修复确认清单
|
||||
|
||||
| 原V12 ID | 模块 | 描述 | 修复证据 |
|
||||
|----------|------|------|---------|
|
||||
| M4-01 P0 | T2 | 双数据库统一 | unified-client.ts isTauriRuntime() 路由到 SqliteStorage |
|
||||
| M3-01 P1 | T1 | run_id 丢失 | hand_execute 返回 runId 字段 |
|
||||
| M3-06 P1 | T1 | 返回值类型不匹配 | {success, output, error, durationMs, runId} |
|
||||
| M6-01 P1 | T5 | route_intent 未注册 | lib.rs:220 已注册 |
|
||||
| M6-02 P1 | T5 | v1/v2 解析器分裂 | helpers.rs:93-115 fallback 到 v2 |
|
||||
| M7-02 P1 | T6 | PUT 布尔值路径参数 | ConfigMigrationWizard.tsx:118 使用 existing.id |
|
||||
| M7-04 P1 | T6 | refreshToken 未传 body | saas-auth.ts:70-71 发送 refresh_token |
|
||||
| M11-01 P1 | T4 | blocking_lock 死锁 | generate.rs:141-147 改用 try_lock() |
|
||||
| M11-02 P1 | T4 | LLM 无 map_err | mod.rs:440,516 .map_err()(行号因后续提交偏移) |
|
||||
| M11-03 P1 | T4 | 数据仅存内存 | persist.rs SQLite 持久化 |
|
||||
| M11-06 P2 | T4 | Chat Message ID Date.now() | classroomStore.ts:187 crypto.randomUUID()(行号因后续提交偏移) |
|
||||
| M2-08 P2 | T3 | 部分参数验证 | 空 name + temperature 越界已拒绝 |
|
||||
| M5-01 P1 | T7 | tags→triggers 误映射 | skill-discovery.ts:117 优先使用 backend.triggers |
|
||||
| TC-4-D01 P1 | T4 | GenerationPipeline model 硬编码 | generation/mod.rs: model 字段 + with_driver(model) + generate_scene_with_llm_static(model) |
|
||||
| TC-1-D01 P1 | T1 | LLM API 并发 DATABASE_ERROR | relay/service.rs: 瞬态 DB 错误重试;min_connections 建议通过 ZCLAW_DB_MIN_CONNECTIONS=10 配置 |
|
||||
| P1-02 M4-03 | T2 | Heartbeat 不自动初始化 | lifecycle.rs: kernel_init 后自动 heartbeat_init + start |
|
||||
| P1-05 M2-05 | T3 | 删除活跃 Agent 无警告 | CloneManager.tsx: 活跃 agent 差异化警告 + syncAgents 自动切换 |
|
||||
| P1-06 M2-01 | T3 | agent_get 缺失字段 | AgentInfo + registry: 补全 soul/system_prompt/temperature/max_tokens |
|
||||
| P2-01 M3-04 | T1 | max_concurrent 未实现 | registry.rs: Semaphore 并发限制 + register 时创建 |
|
||||
| P2-03 M3-10 | T1 | toolCount/metricCount 硬编码 | hand.rs: tool_count()/metric_count() trait 方法 + registry.get_counts() |
|
||||
| P2-06 M4-08 | T2 | heartbeat_init 无最小间隔验证 | heartbeat.rs:718 init>=1 + heartbeat.rs:838 update_config>=1 |
|
||||
| P2-07 M4-02 | T2 | 反思引擎基于规则无标记 | reflection.rs: ReflectionResult.used_fallback 标记 |
|
||||
| P2-08 TC-2-D01 | T2 | identity 参数不透明 | identity.rs: 错误消息统一为 file type |
|
||||
| P2-10 M11-04 | T4 | LLM 失败静默 placeholder | ClassroomMetadata.is_placeholder + generate() 追踪 |
|
||||
| P2-11 M11-05 | T4 | classroom 强制打开 player | classroomStore.ts: userDidCloseDuringGeneration 意图追踪 |
|
||||
| P2-12 M6-03 | T5 | pipeline_create 硬编码 Action::Hand | workflowStore.ts: actionType 字段 + 后端多分支匹配 |
|
||||
| P2-13 M6-04 | T5 | workflowStore steps 计数错误 | PipelineInfo.step_count + PipelineStepInfo 后端返回实际步骤 |
|
||||
| P2-14 M6-05 | T5 | getWorkflow inputs→steps 映射 | PipelineInfo.steps + PipelineStepInfo 结构化步骤信息 |
|
||||
| P2-15 M6-06 | T5 | 管道操作符 \| 不支持 | context.rs: resolve_path_with_pipes + 8 种 transforms |
|
||||
| P2-16 M6-07 | T5 | {{mustache}} 和 ${inputs} 混用 | context.rs: mustache_regex 自动归一化为 ${...} |
|
||||
| P2-17 M7-01 | T6 | 前端密码最少 6 vs 后端 8 | SaaSLogin.tsx: placeholder 改为"至少 8 个字符" |
|
||||
| P2-19 M5-02 | T7 | SKILL.md tools 未序列化 | registry.rs: serialize_skill_md 补全 tools + update_skill 保留 |
|
||||
| P2-22 M1-02 | T8 | ToolOutputGuard 只 warn | tool_output_guard.rs: sensitive patterns 返回 Err 阻断 |
|
||||
| P2-23 M1-03/04 | T8 | Mutex::unwrap() panic | relay/service.rs: unwrap_or_else(\|e\| e.into_inner()) |
|
||||
| P3-01 TC-2-D02 | T2 | memory_store ID 重复 | memory_commands.rs: 使用 source 作为 category 避免重复 |
|
||||
| P3-03 M11-08 | T4 | HTML export 缺 key_points | html.rs: format_scene_content 添加 key_points 渲染 |
|
||||
| P3-07 M5-04 | T7 | YAML triggers 引号 | loader.rs: 同时处理双引号和单引号 |
|
||||
| P3-08 M5-05 | T7 | ShellSkill duration_ms | runner.rs: start.elapsed() 计时 + duration_ms: Some() |
|
||||
| P3-09 M5-06 | T7 | CATEGORY_CONFIG 9 分类 | skill.rs: auto_classify 关键词匹配 + 20 分类覆盖 |
|
||||
| P2-18 M7-03 | T6 | TOTP QR 码外部服务泄漏 | TOTPSettings.tsx: qrcode 本地库 + LocalQRCode 组件,零外部请求 |
|
||||
| P2-21 M1-01 | T8 | 非国内模型前期暂停 | ModelsAPI.tsx: OpenAI/Anthropic 标记 suspended + 过滤; config.rs: Gemini 注释暂停 |
|
||||
| P3-04 M6-08 | T5 | get_progress 硬编码百分比 | executor.rs: PipelineRun.total_steps + (completed/total)*100 实际计算 |
|
||||
| P3-05 M7-05 | T6 | saveSaaSSession 静默失败 | saasStore.ts: 所有调用点添加 .catch() + log.warn 错误日志 |
|
||||
| P3-06 M7-06 | T6 | chatStream 不传 sessionKey | saas-relay-client.ts: 传递 session_key/agent_id + RelayChatRequest 新增字段 |
|
||||
116
docs/archive/old-test-reports/test-results/RELEASE_READINESS.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# ZCLAW 发布就绪评估
|
||||
|
||||
> **评估日期**: 2026-04-05 | **基于**: T1-T8 功能审计(8 个模块)
|
||||
|
||||
## 总体评分
|
||||
|
||||
| 模块 | V12 基线 | 本次评分 | 变化 | 状态 |
|
||||
|------|---------|---------|------|------|
|
||||
| T1 Hands 自主能力 | 58 | **68** | +10 | ⚠️ 可用 |
|
||||
| T2 智能层 | 61 | **74** | +13 | ✅ 良好 |
|
||||
| T3 Agent 分身 | 67 | **73** | +6 | ✅ 良好 |
|
||||
| T4 课堂系统 | 70 | **75** | +5 | ⚠️ 受阻 |
|
||||
| T5 Pipeline 工作流 | 72 | **78** | +6 | ✅ 良好 |
|
||||
| T6 SaaS 桌面集成 | 85 | **89** | +4 | ✅ 良好 |
|
||||
| T7 技能生态 | 85 | **87** | +2 | ✅ 良好 |
|
||||
| T8 智能对话 | 91 | **91** | 0 | ✅ 优秀 |
|
||||
| **加权平均** | **73** | **79** | **+6** | - |
|
||||
|
||||
---
|
||||
|
||||
## 发布就绪判定
|
||||
|
||||
### 阻断项(必须修复才能发布)
|
||||
|
||||
~~全部已修复~~ ✅ 两个阻断项已修复(2026-04-05):
|
||||
|
||||
| # | 缺陷 | 状态 | 修复说明 |
|
||||
|---|------|------|---------|
|
||||
| 1 | **P1-04**: 课堂生成 model="default" 硬编码 | ✅ 已修复 | generation/mod.rs 添加 model 字段,从 kernel config 读取 |
|
||||
| 2 | **P1-03**: LLM API 并发 500 DATABASE_ERROR | ✅ 已修复 | relay/service.rs 瞬态 DB 错误重试 + min_connections 5→10 |
|
||||
|
||||
### 强烈建议修复(影响用户体验) — ✅ 全部已处理
|
||||
|
||||
| # | 缺陷 | 状态 | 说明 |
|
||||
|---|------|------|------|
|
||||
| 3 | P1-01: Browser Hand 不实际执行 | 🔬 实验性 | 需 Fantoccini 桥接,标注为实验性功能 |
|
||||
| 4 | P1-02: Heartbeat 不自动初始化 | ✅ 已修复 | lifecycle.rs kernel_init 自动初始化并启动 |
|
||||
| 5 | P1-05: 删除活跃 Agent 无警告 | ✅ 已修复 | CloneManager 差异化警告 + 自动切换 |
|
||||
| 6 | P1-06: agent_get 不返回完整配置 | ✅ 已修复 | AgentInfo 补全 soul/system_prompt/temperature/max_tokens |
|
||||
|
||||
### 可接受已知问题(P2/P3,可带缺陷发布)
|
||||
|
||||
- 23 个 P2 问题(大部分为边界条件、参数验证、API 一致性)
|
||||
- 9 个 P3 问题(UI 细节、日志、配置边缘情况)
|
||||
|
||||
---
|
||||
|
||||
## 模块风险评估
|
||||
|
||||
### HIGH RISK
|
||||
|
||||
**T1 Hands (68/100)**
|
||||
- 核心问题: Browser Hand 为实验性(需 Fantoccini 桥接)
|
||||
- 可缓解: Quiz/Slideshow/Whiteboard 等正常工作的 Hand 可用
|
||||
- 状态: 已标注为实验性功能
|
||||
|
||||
**T4 Classroom (75→80/100)**
|
||||
- 核心问题: ~~课堂生成不可用~~ ✅ 已修复(P1-04 model 硬编码已修复)
|
||||
- 可缓解: 持久化、死锁、错误处理已修复
|
||||
- 状态: 课堂生成现在可正常工作
|
||||
|
||||
### MEDIUM RISK → ✅ 已降级
|
||||
|
||||
**T2 Intelligence (74→80/100)**
|
||||
- 核心问题: ~~Heartbeat 不自动启动~~ ✅ 已修复(lifecycle.rs 自动初始化)
|
||||
- 状态: Heartbeat 随 kernel_init 自动启动
|
||||
|
||||
**T3 Agent (73→80/100)**
|
||||
- 核心问题: ~~agent_get 字段不全、删除无警告~~ ✅ 已修复
|
||||
- 状态: agent_get 返回完整配置 + 删除时差异化警告与自动切换
|
||||
|
||||
### LOW RISK
|
||||
|
||||
**T5-T8 (78-91/100)**
|
||||
- 核心功能正常,P2/P3 问题不影响主要用户流程
|
||||
|
||||
---
|
||||
|
||||
## 测试覆盖
|
||||
|
||||
| 类型 | 结果 |
|
||||
|------|------|
|
||||
| Rust cargo test | ✅ 511/511 全部通过(10 crates, 0 failures) |
|
||||
| Desktop vitest | ⚠️ 174/185 通过(11 失败在 chatStore 重构同步) |
|
||||
| Admin vitest | ⚠️ 36/71 通过(29 失败在 mock/API 依赖) |
|
||||
| 功能审计 (T1-T8) | ✅ 51 用例执行,19 已修复,P1 全部处理 |
|
||||
| 端到端 (T9-T12) | ⏭️ Phase 3/4,待执行 |
|
||||
|
||||
---
|
||||
|
||||
## 发布建议
|
||||
|
||||
### 推荐路径: 所有 P1 已修复/处理,可直接发布 Beta
|
||||
|
||||
1. ~~修复 P1-04~~ ✅ 已完成 (generation/mod.rs model 从 config 读取)
|
||||
2. ~~修复 P1-03~~ ✅ 已完成 (relay 瞬态重试 + min_connections 提升)
|
||||
3. ~~修复 P1-02~~ ✅ 已完成 (lifecycle.rs 自动初始化 heartbeat)
|
||||
4. ~~修复 P1-05~~ ✅ 已完成 (CloneManager 差异化警告 + 自动切换)
|
||||
5. ~~修复 P1-06~~ ✅ 已完成 (AgentInfo 补全 soul/system_prompt/temperature/max_tokens)
|
||||
6. **P1-01 Browser Hand** 🔬 标注为实验性(需 Fantoccini 桥接)
|
||||
7. **发布 Beta 版本** 标注已知限制
|
||||
|
||||
### 已知限制标注
|
||||
|
||||
发布时应在 release notes 中注明:
|
||||
- Browser Hand 为实验性功能(需 Fantoccini WebDriver 桥接)
|
||||
- 课堂生成需要正确的模型配置
|
||||
- Python 技能在 Windows 需手动配置 python3 命令
|
||||
- 23 个 P2 + 9 个 P3 已知问题(不影响主要用户流程)
|
||||
|
||||
### 不建议发布的场景
|
||||
|
||||
~~如果以下条件不满足,不建议正式发布~~
|
||||
两个阻断项已全部修复,以下场景已不再阻塞发布:
|
||||
- ~~SaaS 后端连接池未扩容~~ ✅ 已提升 min_connections 并添加重试
|
||||
- ~~课堂 model 硬编码未修复~~ ✅ 已从 kernel config 动态读取
|
||||
220
docs/archive/old-test-reports/test-results/T1-hands/REPORT.md
Normal file
@@ -0,0 +1,220 @@
|
||||
# T1 Hands 自主能力 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 58/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 18/23(5 个需 UI 交互或长时间等待,未执行)
|
||||
- **通过**: 11 ✅
|
||||
- **未修复(已知问题确认)**: 5 ⚠️
|
||||
- **已修复(V12 问题)**: 2 ✅
|
||||
- **未验证**: 5 ❓
|
||||
- **新发现缺陷**: 3
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 2 | LLM API 并发 DATABASE_ERROR; Browser Hand 不实际执行 |
|
||||
| P2 | 3 | 无输入长度限制; toolCount/metricCount 硬编码; max_concurrent 未实现 |
|
||||
| P3 | 1 | timeout_secs 未实现 |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M3-01 | run_id 丢失 | P1 | ✅ **已修复** | hand_execute 返回值含 `runId` 字段(如 `8267f7a0-...`) |
|
||||
| M3-02 | Browser Hand 只返回指令不执行 | P1 | ⚠️ **未修复** | 返回 `status: "pending_execution"` 但未实际操作浏览器 |
|
||||
| M3-03 | browserHandStore 绕过审批 | P1 | ✅ 行为正确 | supervised 模式正确进入审批流程,autonomous 直接执行 |
|
||||
| M3-04 | max_concurrent 未实现 | P2 | ⚠️ **未修复** | 5 个并发 quiz 全部被接受(`max_concurrent: 0`) |
|
||||
| M3-05 | timeout_secs 未实现 | P2 | ⚠️ **未修复** | `timeout_secs: 0`,无超时保护 |
|
||||
| M3-06 | hand_execute 返回值类型不匹配 | P2 | ✅ **已修复** | 返回 `{ success, output, error, durationMs, runId }` 完整结构 |
|
||||
| M3-07 | hand-execution-complete 事件未监听 | P1 | ❓ 未验证 | 需 UI 交互观察 |
|
||||
| M3-08 | 审批条目永不过期 | P2 | ❓ 未验证 | 需长时间等待 |
|
||||
| M3-09 | 重复审批路径 | P2 | ✅ 两条路径存在 | `hand_approve` 和 `approval_respond` 参数名不同但功能重叠 |
|
||||
| M3-10 | tool_count/metric_count 硬编码为 0 | P2 | ⚠️ **未修复** | 所有 Hand 的 `toolCount: 0, metricCount: 0` |
|
||||
| M3-11 | Hand 列举正常 | - | ✅ 通过 | 9 个 Hand 全部返回 |
|
||||
| M3-12 | hand_trigger 自主级别映射 | P1 | ⚠️ **部分修复** | supervised 正确要求审批,但 autonomous 下 Browser 返回 pending_execution |
|
||||
| M3-13 | Clip Hand 路径单引号 | P2 | ❓ 未验证 | 需 FFmpeg 环境 |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详细结果
|
||||
|
||||
### ✅ TC-1-01 | Hand 列举(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
`hand_list` 返回 9 个已启用 Hand:
|
||||
|
||||
| Hand | name | enabled | needsApproval | requirementsMet | dependencies |
|
||||
|------|------|---------|---------------|-----------------|-------------|
|
||||
| clip | 视频剪辑 | true | false | ❌ | ffmpeg |
|
||||
| twitter | Twitter 自动化 | true | true | ❌ | twitter_api_key |
|
||||
| researcher | 研究员 | true | false | ❌ | network |
|
||||
| browser | 浏览器 | true | true | ❌ | webdriver |
|
||||
| slideshow | 幻灯片 | true | false | ✅ | - |
|
||||
| quiz | 测验 | true | false | ✅ | - |
|
||||
| whiteboard | 白板 | true | false | ✅ | - |
|
||||
| collector | 数据采集器 | true | false | ❌ | network |
|
||||
| speech | 语音合成 | true | false | ✅ | - |
|
||||
|
||||
### ✅ TC-1-02 | Quiz Hand 直接触发(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- 输入: `{ action: "generate", topic: "Rust 基础测试" }`
|
||||
- 输出: 成功生成 5 道选择题,含 `runId: "58d296cc-1be3-4632-8325-f15b4a7708dc"`
|
||||
- 耗时: ~24 秒
|
||||
|
||||
### ✅ TC-1-03 | M3-01 run_id 丢失验证
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
hand_execute 返回值结构:
|
||||
```json
|
||||
{
|
||||
"success": true/false,
|
||||
"output": { ... },
|
||||
"error": null,
|
||||
"durationMs": 24499,
|
||||
"runId": "58d296cc-..."
|
||||
}
|
||||
```
|
||||
|
||||
`runId` 字段已稳定存在于所有返回值中。
|
||||
|
||||
### ⚠️ TC-1-05 | M3-02 Browser Hand 断裂
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
- 输入: `{ action: "navigate", url: "https://example.com" }`
|
||||
- 输出: `{ action: "navigate", status: "pending_execution", url: "https://example.com" }`
|
||||
- **问题**: 返回结构化指令但未实际执行浏览器操作
|
||||
|
||||
### ✅ TC-1-06 | 审批流程(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
1. **supervised 模式**: browser/twitter 正确进入 `pending_approval` 状态
|
||||
2. **approval_list**: 正确返回 2 条 pending 审批
|
||||
3. **approval_respond(approved: true)**: 审批通过后 Hand 开始执行
|
||||
4. **approval_respond(approved: false)**: 拒绝成功
|
||||
|
||||
### ⚠️ TC-1-08 | M3-04 max_concurrent 未实现
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
- 同时触发 5 个 quiz Hand
|
||||
- 5/5 全部被接受执行(1 个成功,4 个因 LLM API 500 失败)
|
||||
- `hand_get` 返回 `max_concurrent: 0` 表示无限制
|
||||
|
||||
### ✅ TC-1-12 | 不存在 Hand 触发(异常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- 输入: `id: "nonexistent-hand"`
|
||||
- 输出: `"Hand not found: nonexistent-hand"`
|
||||
- 错误信息明确
|
||||
|
||||
### ✅ TC-1-15 | Hand 执行状态查询(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
`hand_run_list` 返回 13 条历史记录,包含完整字段:
|
||||
- `id`, `hand_name`, `status`, `params`, `result`, `error`
|
||||
- `created_at`, `started_at`, `completed_at`, `duration_ms`
|
||||
- `trigger_source: "manual"`
|
||||
|
||||
### ✅ TC-1-16 | M3-06 返回值类型验证
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
返回值结构 `{ success, output, error, durationMs, runId }` 完整。
|
||||
|
||||
### ⚠️ TC-1-17 | M3-10 toolCount/metricCount 硬编码
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
所有 9 个 Hand 的 `toolCount: 0, metricCount: 0`。
|
||||
|
||||
### ✅ TC-1-18 | TOML 配置加载验证
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
`hand_get` 返回完整配置:
|
||||
```json
|
||||
{
|
||||
"dependencies": [],
|
||||
"description": "生成和管理测验题目...",
|
||||
"enabled": true,
|
||||
"id": "quiz",
|
||||
"input_schema": { "properties": { "action": ..., "quiz_id": ..., "topic": ... } },
|
||||
"max_concurrent": 0,
|
||||
"name": "测验",
|
||||
"needs_approval": false,
|
||||
"tags": ["assessment", "education"],
|
||||
"timeout_secs": 0
|
||||
}
|
||||
```
|
||||
|
||||
### ✅ TC-1-19 | Hand 错误处理(异常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- `input: null` → `"invalid type: null, expected internally tagged enum ResearcherAction"`
|
||||
- 错误信息明确,非 panic
|
||||
|
||||
### ⚠️ TC-1-20 | M3-12 自主级别映射
|
||||
|
||||
**结果**: PARTIAL
|
||||
|
||||
- supervised: ✅ 正确要求审批("监督模式下所有 Hand 执行需要用户审批")
|
||||
- autonomous: ⚠️ Browser 返回 pending_execution 而非实际执行
|
||||
- Quiz 在 autonomous 下正常执行
|
||||
|
||||
### ⚠️ TC-1-23 | 超长输入触发
|
||||
|
||||
**结果**: FAIL(无输入验证)
|
||||
|
||||
- 100K 字符 topic 被 quiz 接受并尝试执行
|
||||
- 最终因 LLM API 问题失败,但未在输入层拒绝
|
||||
|
||||
---
|
||||
|
||||
## 新发现问题
|
||||
|
||||
| TC-ID | 描述 | 场景类型 | 优先级 | 状态 | 备注 |
|
||||
|-------|------|---------|--------|------|------|
|
||||
| TC-1-D01 | LLM API 并发时 500 DATABASE_ERROR | 边界 | **P1** | 新发现 | 5 个并发 quiz 请求,4 个返回 `{"error":"DATABASE_ERROR"}`,仅第 1 个成功。SaaS 后端数据库连接池可能不足 |
|
||||
| TC-1-D02 | Browser Hand autonomous 返回 pending_execution | 正常 | **P1** | 已知(M3-02) | 即使 autonomous 模式也不实际执行浏览器操作 |
|
||||
| TC-1-D03 | Quiz 无输入长度限制 | 边界 | **P2** | 新发现 | 100K 字符 topic 被接受,应设上限 |
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| 功能完整性 | 58 | 68 | +10 |
|
||||
| 代码质量 | - | - | N/A |
|
||||
| 测试覆盖 | - | - | N/A |
|
||||
| 文档完备 | - | - | N/A |
|
||||
| 集成连通性 | - | - | N/A |
|
||||
| **综合** | **58/100** | **68/100** | **+10** |
|
||||
|
||||
**提升原因**:
|
||||
- M3-01 run_id 丢失已修复
|
||||
- M3-06 返回值类型已修复
|
||||
- 审批流程基本闭环(approval_list/respond 工作正常)
|
||||
- hand_run_list 历史记录功能完整
|
||||
- 错误处理改善(null input / 不存在 Hand 都返回明确错误)
|
||||
|
||||
**残留风险**:
|
||||
- Browser Hand 不实际执行(P1)
|
||||
- max_concurrent/timeout_secs 未实现(P2)
|
||||
- LLM API 并发问题(P1,SaaS 后端)
|
||||
- toolCount/metricCount 硬编码(P2)
|
||||
|
After Width: | Height: | Size: 906 B |
|
After Width: | Height: | Size: 906 B |
|
After Width: | Height: | Size: 906 B |
@@ -0,0 +1,142 @@
|
||||
# T2 智能层(记忆/反思/心跳/自主) 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 61/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 10/13(3 个需 UI 交互,未执行)
|
||||
- **通过**: 7 ✅
|
||||
- **未修复(已知问题确认)**: 2 ⚠️
|
||||
- **已修复(V12 P0 问题)**: 1 ✅
|
||||
- **新发现缺陷**: 1
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 1 | Heartbeat 未自动初始化 |
|
||||
| P2 | 2 | heartbeat 极短间隔无验证; identity_propose_change 参数不透明 |
|
||||
| P3 | 1 | memory_store entry ID 重复 (knowledge/knowledge) |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M4-01 | 双数据库(PersistentMemoryStore vs SqliteStorage) | **P0** | ✅ **已修复** | unified-client.ts 统一了路径:Tauri 模式下全部使用 Rust SqliteStorage(FTS5),不再 fallback 到 localStorage。fallback 仅在浏览器/dev 模式使用 |
|
||||
| M4-02 | 反思 LLM 驱动未接入 | **P0** | ⚠️ **部分修复** | reflection_reflect 返回了 improvements 和 suggestions,但需确认是否使用了 LLM(返回内容较短,可能仍基于规则) |
|
||||
| M4-03 | 心跳不自动启动 | P2 | ⚠️ **未修复** | `heartbeat_get_config` 返回 "Heartbeat engine not initialized",需手动调用 heartbeat_init |
|
||||
| M4-04 | 自主授权后端无强制 | P2 | ✅ T1 已验证 | supervised 模式正确拦截需审批 Hand |
|
||||
| M4-05 | 前端记忆搜索用 LIKE 非 FTS5 | P2 | ✅ **已修复** | unified-client 统一使用 Tauri 后端 FTS5 |
|
||||
| M4-06 | types 参数数组 vs 单值 | P2 | ❓ 未验证 | memory_search 的 options 参数结构需确认 |
|
||||
| M4-07 | 记忆内容无长度限制 | P2 | ⚠️ 需确认 | memory_store 未测试超长 content |
|
||||
| M4-08 | heartbeat interval 无下限 | P2 | ⚠️ **未修复** | heartbeat_init 接受 0.001 分钟间隔 |
|
||||
| M4-09 | 心跳 interval 下限验证 | P2 | 同 M4-08 | - |
|
||||
| M4-10 | memory_build_context 返回值 | P2 | ❓ 未验证 | - |
|
||||
| M4-11 | memory_export 格式 | P2 | ❓ 未验证 | - |
|
||||
| M4-12 | memory_import 去重 | P2 | ❓ 未验证 | - |
|
||||
| M4-13 | 两套压缩实现 | P2 | ✅ compactor 命令工作 | compactor_estimate_tokens 正确返回 |
|
||||
| M4-14 | reflection_reflect 参数不透明 | P2 | ⚠️ 确认 | 参数名 `memories` 而非文档中的 `agentId` |
|
||||
| M4-15 | identity 命令参数不一致 | P2 | ⚠️ 确认 | identity_propose_change 需要 `file` + `suggestedContent`,非直觉参数 |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详细结果
|
||||
|
||||
### ✅ TC-2-01 | M4-01 双数据库验证(P0)
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
- 数据库路径: `C:\Users\szend\AppData\Roaming\zclaw\memories\memories.db`
|
||||
- unified-client.ts 架构:
|
||||
- `isTauriRuntime()` → 调用 Rust SqliteStorage(FTS5)
|
||||
- 浏览器模式 → localStorage fallback
|
||||
- 记忆 CRUD 完整:store → search → stats 全链路通过
|
||||
|
||||
### ⚠️ TC-2-02 | M4-02 反思 LLM 验证(P0)
|
||||
|
||||
**结果**: PARTIAL
|
||||
|
||||
```json
|
||||
{
|
||||
"patterns": [],
|
||||
"improvements": [{
|
||||
"area": "用户理解",
|
||||
"suggestion": "主动在对话中了解用户偏好...",
|
||||
"priority": "medium"
|
||||
}],
|
||||
"identity_proposals": [],
|
||||
"new_memories": 0
|
||||
}
|
||||
```
|
||||
|
||||
- 返回了结构化分析结果(有 improvements)
|
||||
- 但 `new_memories: 0` 和 `patterns: []` 表明可能只基于规则分析
|
||||
- **需进一步检查**: Rust 端 reflection_reflect 是否获取了 LLM driver
|
||||
|
||||
### ✅ TC-2-03 | 记忆 CRUD(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- memory_store: ✅ 保存成功,返回 ID
|
||||
- memory_search: ✅ FTS5 搜索正确返回匹配记忆
|
||||
- memory_stats: ✅ 22 条记忆(10 preferences, 9 experience, 3 knowledge)
|
||||
- memory_db_path: ✅ 返回 SQLite 路径
|
||||
|
||||
### ⚠️ TC-2-05 | 身份演化(正常)
|
||||
|
||||
**结果**: PARTIAL
|
||||
|
||||
- identity_get: ✅ 返回完整的 soul/instructions/user_profile
|
||||
- identity_propose_change: ⚠️ 参数名不透明(需要 `file` + `suggestedContent`)
|
||||
- 实际变更提案未成功触发(参数格式问题)
|
||||
|
||||
### ⚠️ TC-2-06 | M4-03 心跳不自动启动
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
- `heartbeat_get_config` → "Heartbeat engine not initialized for agent: default"
|
||||
- 需手动调用 `heartbeat_init` + `heartbeat_start`
|
||||
|
||||
### ⚠️ TC-2-11 | M4-08/M4-09 心跳间隔下限
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
- `heartbeat_init(intervalMinutes: 0.001)` → 返回 null(被接受)
|
||||
- 无最小值验证
|
||||
|
||||
### ✅ TC-2-08 | 上下文压缩
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- `compactor_estimate_tokens` 正确返回 token 数(5 for "Hello world test")
|
||||
|
||||
---
|
||||
|
||||
## 新发现问题
|
||||
|
||||
| TC-ID | 描述 | 场景类型 | 优先级 | 状态 |
|
||||
|-------|------|---------|--------|------|
|
||||
| TC-2-D01 | identity_propose_change 参数不透明(file + suggestedContent) | 正常 | P2 | 新发现 |
|
||||
| TC-2-D02 | memory_store 重复 ID(knowledge/knowledge) | 边界 | P3 | 新发现 |
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **61/100** | **74/100** | **+13** |
|
||||
|
||||
**提升原因**:
|
||||
- M4-01 P0 双数据库已修复(unified-client 统一路径)
|
||||
- 记忆 CRUD 全链路工作正常
|
||||
- 上下文压缩命令工作
|
||||
- 反思引擎返回结构化分析
|
||||
|
||||
**残留风险**:
|
||||
- Heartbeat 不自动启动(P1)
|
||||
- 反思 LLM 驱动可能未完全接入
|
||||
- 部分命令参数不透明(API 文档缺失)
|
||||
137
docs/archive/old-test-reports/test-results/T3-agent/REPORT.md
Normal file
@@ -0,0 +1,137 @@
|
||||
# T3 Agent 分身 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js | **V12 基线**: 67/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 10/12
|
||||
- **通过**: 7 ✅
|
||||
- **未修复(已知问题确认)**: 2 ⚠️
|
||||
- **已修复**: 1 ✅
|
||||
- **新发现缺陷**: 2
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 1 | 删除活跃 Agent 无警告(M2-05 确认) |
|
||||
| P2 | 2 | agent_get 不返回 soul/system_prompt; max_tokens=0 未被拒绝 |
|
||||
| P3 | 0 | - |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M2-01 | KernelClient createClone 字段丢失 | P1 | ⚠️ **部分修复** | agent_create 接受 soul/system_prompt 但 agent_get 不返回这些字段 |
|
||||
| M2-02 | 双通路创建不对等 | P1 | ❓ 未验证 | Gateway 模式未测试 |
|
||||
| M2-03 | agent_list 不返回 emoji | P2 | ❓ 未验证 | agent_get 不含 emoji 字段 |
|
||||
| M2-04 | agent_create 不返回 config | P2 | ✅ 返回基本字段 | 但缺少 soul/system_prompt |
|
||||
| M2-05 | 删除活跃 Agent 无警告 | P1 | ⚠️ **未修复** | agent_delete 直接删除当前活跃 Agent,无警告 |
|
||||
| M2-06 | Agent 切换不通知 Kernel | P2 | ❓ 未验证 | 需 UI 测试 |
|
||||
| M2-07 | 切换不取消流 | P2 | ❓ 未验证 | 需 UI 测试 |
|
||||
| M2-08 | 无参数验证 | P2 | ⚠️ **部分修复** | 空 name 和 temperature 越界已拒绝 ✅,但 max_tokens=0 未拒绝 ⚠️ |
|
||||
| M2-09 | 删除后 selectedAgent 引用悬挂 | P2 | ⚠️ **未修复** | 删除活跃 Agent 后无自动切换 |
|
||||
| M2-10 | Agent export 不含 conversations | P2 | ❓ 未验证 | - |
|
||||
| M2-11 | Agent export 返回空 JSON | P2 | ❓ 未验证 | - |
|
||||
| M2-12 | SOUL.md 未集成到 system prompt | P2 | ❓ 未验证 | - |
|
||||
| M2-13 | agent_create 无默认 workspace | P2 | ❓ 未验证 | - |
|
||||
| M2-14 | agent_update 不触发 identity sync | P2 | ❓ 未验证 | - |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详细结果
|
||||
|
||||
### ✅ TC-3-01 | Agent 列举(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- agent_list 返回 1 个 default agent
|
||||
- 包含 id, name, description, model, provider, state, messageCount, createdAt, updatedAt
|
||||
|
||||
### ⚠️ TC-3-02 | M2-01 字段丢失验证
|
||||
|
||||
**结果**: PARTIAL(部分修复)
|
||||
|
||||
**agent_create** 接受完整字段:
|
||||
```json
|
||||
{
|
||||
"name": "审计测试 Agent",
|
||||
"description": "用于测试字段传递",
|
||||
"soul": "# 测试人格\n严谨、精确",
|
||||
"system_prompt": "你是一个审计测试助手",
|
||||
"model": "glm-4-flash",
|
||||
"provider": "glm",
|
||||
"max_tokens": 4096,
|
||||
"temperature": 0.7
|
||||
}
|
||||
```
|
||||
|
||||
**agent_get** 返回时丢失字段:
|
||||
```json
|
||||
{
|
||||
"id": "7f14a54e-...",
|
||||
"name": "审计测试 Agent",
|
||||
"description": "用于测试字段传递",
|
||||
"model": "glm-4-flash",
|
||||
"provider": "glm",
|
||||
"state": "Running"
|
||||
// ❌ 缺少: soul, system_prompt, temperature, max_tokens, workspace
|
||||
}
|
||||
```
|
||||
|
||||
**结论**: 字段写入成功但读取不返回 — **M2-01 部分修复**(数据已存储,但 API 不返回)
|
||||
|
||||
### ✅ TC-3-04 | Agent 更新(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- agent_update 成功更新 name, description
|
||||
- agent_get 返回更新后的值
|
||||
|
||||
### ✅ TC-3-08 | Agent 删除(正常)
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- agent_delete 返回 null(成功)
|
||||
- Agent 从列表消失
|
||||
|
||||
### ⚠️ TC-3-09 | M2-05 删除活跃 Agent
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
- 删除当前活跃 Agent(default agent)后:
|
||||
- 无警告、无确认
|
||||
- Agent 从列表消失
|
||||
- 无自动切换到其他 Agent
|
||||
- 需手动创建新 Agent
|
||||
|
||||
### ✅ TC-3-10 | 参数验证
|
||||
|
||||
**结果**: PARTIAL
|
||||
|
||||
| 验证项 | 输入 | 结果 | 预期 |
|
||||
|--------|------|------|------|
|
||||
| 空名 | name="" | ✅ `"Agent name cannot be empty"` | 拒绝 |
|
||||
| 温度越界 | temperature=5.0 | ✅ `"Temperature must be between 0 and 2"` | 拒绝 |
|
||||
| max_tokens=0 | max_tokens=0 | ⚠️ Agent 被成功创建 | 应拒绝 |
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **67/100** | **73/100** | **+6** |
|
||||
|
||||
**提升原因**:
|
||||
- agent_create 接受完整配置字段(soul, system_prompt, temperature 等)
|
||||
- 基本参数验证已实现(空名、温度越界)
|
||||
- CRUD 操作(create/get/update/delete)基本工作
|
||||
|
||||
**残留风险**:
|
||||
- agent_get 不返回完整配置(P2)
|
||||
- 删除活跃 Agent 无警告(P1)
|
||||
- max_tokens=0 未被验证(P2)
|
||||
@@ -0,0 +1,142 @@
|
||||
# T4 课堂系统 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 70/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 7/12(5 个需已生成课堂数据,因 P1 缺陷无法执行)
|
||||
- **代码审查确认**: 8 项 V12 问题验证
|
||||
- **已修复**: 4 ✅
|
||||
- **未修复**: 3 ⚠️
|
||||
- **新发现缺陷**: 1 (P1)
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 1 | GenerationPipeline 硬编码 model="default",SaaS relay 404(新发现) |
|
||||
| P2 | 2 | LLM 失败无 placeholder 标记; 生成完成强制打开 player |
|
||||
| P3 | 2 | HTML export 内容不完整; 白板两套渲染实现未统一 |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M11-01 | is_cancelled() blocking_lock 死锁 | P1 | ✅ **已修复** | generate.rs:141-147 改用 `try_lock()`,避免 tokio 死锁 |
|
||||
| M11-02 | LLM 调用无 map_err | P1 | ✅ **已修复** | mod.rs:431-434 已加 `.map_err`,错误正确传播 |
|
||||
| M11-03 | 课堂数据仅存内存 | P1 | ✅ **已修复** | persist.rs 实现了 SQLite 持久化(classrooms.db) |
|
||||
| M11-04 | LLM 失败静默 fallback | P2 | ⚠️ **未修复** | chat.rs:82-93 LLM 失败 fallback 到 placeholder 无标记 |
|
||||
| M11-05 | 生成完成强制打开 player | P2 | ⚠️ **未修复** | classroomStore.ts:124 无条件 `classroomOpen: true` |
|
||||
| M11-06 | Chat Message ID 用 Date.now() | P2 | ✅ **已修复** | classroomStore.ts:176 使用 `crypto.randomUUID()` |
|
||||
| M11-07 | 白板两套渲染实现 | P3 | ⚠️ **未修复** | SceneRenderer 内嵌 SVG + WhiteboardCanvas.tsx 独立组件 |
|
||||
| M11-08 | HTML export 内容不完整 | P3 | ⚠️ **未修复** | export.rs:97-103 只渲染 title+type+duration,缺 key_points/notes |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详细结果
|
||||
|
||||
### ❌ TC-4-01 | 课堂生成(正常)
|
||||
|
||||
**结果**: FAIL(新发现 P1 缺陷)
|
||||
|
||||
```
|
||||
Error: Outline generation failed: LLM error: API error 404 Not Found:
|
||||
{"error":"NOT_FOUND","message":"未找到: 模型 default 不存在或未启用"}
|
||||
```
|
||||
|
||||
**根因**: `zclaw-kernel/src/generation/mod.rs:416` — `CompletionRequest` 硬编码 `model: "default"`,SaaS relay 需要实际模型名(如 `glm-4-flash`)。Kernel driver 返回模型配置但 GenerationPipeline 未使用。
|
||||
|
||||
**影响**: 课堂生成完全不可用。
|
||||
|
||||
### ✅ TC-4-02 | M11-01 验证: blocking_lock 死锁
|
||||
|
||||
**结果**: PASS(已修复,代码审查确认)
|
||||
|
||||
generate.rs:141-147 使用 `try_lock()` + `Err(_)` fallback,不会阻塞 tokio runtime。
|
||||
|
||||
### ✅ TC-4-03 | M11-02 验证: LLM 无 map_err
|
||||
|
||||
**结果**: PASS(已修复,代码审查确认)
|
||||
|
||||
mod.rs:431-434 `.map_err(|e| ZclawError::LlmError(...))`,Stage 1/2 均有 `.map_err`。
|
||||
|
||||
### ⏭️ TC-4-04~TC-4-09 | 场景播放/TTS/白板/持久化/聊天/导出
|
||||
|
||||
**结果**: SKIP
|
||||
|
||||
依赖课堂生成成功。因 TC-4-01 P1 缺陷,无法执行端到端测试。
|
||||
|
||||
### ✅ TC-4-07 | M11-03 验证: 课堂数据持久化(代码审查)
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
- `classroom_commands/persist.rs`: SQLite 持久化实现完整
|
||||
- DB 路径: `{app_data_dir}/classroom/classrooms.db`
|
||||
- 表: `classrooms` + `classroom_chats`
|
||||
- 生成/聊天后自动保存(generate.rs:223, chat.rs:108)
|
||||
|
||||
### ✅ TC-4-10 | M11-04 验证: LLM 失败静默 fallback(代码审查)
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
chat.rs:82-93:
|
||||
```rust
|
||||
let agent_responses = match generate_llm_responses(...).await {
|
||||
Ok(responses) => responses,
|
||||
Err(e) => {
|
||||
tracing::warn!("LLM chat generation failed, using placeholders: {}", e);
|
||||
generate_placeholder_responses(...) // 无 isPlaceholder 标记
|
||||
}
|
||||
};
|
||||
```
|
||||
|
||||
### ✅ TC-4-11 | M11-05 验证: 生成完成强制打开(代码审查)
|
||||
|
||||
**结果**: FAIL(未修复)
|
||||
|
||||
classroomStore.ts:124:
|
||||
```typescript
|
||||
set({ classroomOpen: true }); // 无条件设置,不检查用户是否手动关闭
|
||||
```
|
||||
|
||||
### ✅ TC-4-12 | classroom_list/classroom_get 基本验证
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- `classroom_list` → `[]`(空列表,正确)
|
||||
- `classroom_get("nonexistent-id")` → `"Classroom 'nonexistent-id' not found"`(错误信息明确)
|
||||
|
||||
---
|
||||
|
||||
## 新发现问题
|
||||
|
||||
| TC-ID | 描述 | 场景类型 | 优先级 | 状态 |
|
||||
|-------|------|---------|--------|------|
|
||||
| TC-4-D01 | GenerationPipeline 硬编码 model="default",SaaS relay 404 | 正常 | **P1** | 新发现 |
|
||||
|
||||
**TC-4-D01 详情**:
|
||||
- 文件: `crates/zclaw-kernel/src/generation/mod.rs:416` 和 `:490`
|
||||
- `CompletionRequest { model: "default".to_string(), ... }` — SaaS relay 需要实际模型名
|
||||
- 修复建议: 从 kernel config 获取 `llm.model` 字段传入 GenerationPipeline
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **70/100** | **75/100** | **+5** |
|
||||
|
||||
**提升原因**:
|
||||
- M11-01 P1 死锁风险已修复(try_lock)
|
||||
- M11-02 P1 LLM 错误处理已修复(map_err)
|
||||
- M11-03 P1 数据持久化已修复(SQLite)
|
||||
- M11-06 Chat ID 碰撞已修复(crypto.randomUUID)
|
||||
|
||||
**残留风险**:
|
||||
- **P1**: GenerationPipeline 硬编码 "default" 模型 → 课堂生成完全不可用
|
||||
- P2: LLM 失败 placeholder 无标记(M11-04)
|
||||
- P2: 生成完成强制打开 player(M11-05)
|
||||
129
docs/archive/old-test-reports/test-results/T5-pipeline/REPORT.md
Normal file
@@ -0,0 +1,129 @@
|
||||
# T5 Pipeline 工作流 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 72/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 6/8(2 个需 UI 交互,未执行)
|
||||
- **代码审查确认**: 8 项 V12 问题验证
|
||||
- **已修复**: 2 ✅
|
||||
- **未修复**: 5 ⚠️
|
||||
- **新发现缺陷**: 0
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 0 | M6-01/M6-02 已修复 |
|
||||
| P2 | 4 | M6-03/M6-04/M6-05/M6-07 未修复 |
|
||||
| P3 | 1 | M6-08 进度百分比粗糙 |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M6-01 | route_intent Tauri 命令未注册 | P1 | ✅ **已修复** | lib.rs:220 已注册,调用成功返回推荐结果 |
|
||||
| M6-02 | pipeline_list 只用 v1 解析器 | P1 | ✅ **已修复** | helpers.rs:93-115 v1 失败 fallback 到 v2,15 个模板全部列出 |
|
||||
| M6-03 | pipeline_create Action 类型丢失 | P2 | ⚠️ **未修复** | crud.rs:82 硬编码 `Action::Hand`,LLM/Parallel/Condition 丢失 |
|
||||
| M6-04 | workflowStore inputs→steps 映射错误 | P2 | ⚠️ **未修复** | workflowStore.ts:389 `steps: p.inputs.length` 语义错误 |
|
||||
| M6-05 | getWorkflow inputs→steps 映射 | P2 | ⚠️ **未修复** | workflowStore.ts:405 将 inputs 映射为 WorkflowDetail.steps |
|
||||
| M6-06 | 管道操作符 `\|` 不支持 | P2 | ❓ 未验证 | 需端到端执行验证 |
|
||||
| M6-07 | `{{mustache}}` 和 `${inputs}` 混用 | P2 | ⚠️ **未修复** | campaign.yaml:87-90 等模板仍使用 `{{}}` 语法 |
|
||||
| M6-08 | get_progress() 百分比粗糙 | P3 | ⚠️ **未修复** | executor.rs:469-475 只有 0/50/100 三档 |
|
||||
|
||||
---
|
||||
|
||||
## 测试用例详细结果
|
||||
|
||||
### ✅ TC-5-01 | Pipeline 列举发现
|
||||
|
||||
**结果**: PASS
|
||||
|
||||
- `pipeline_list` 返回 15 个模板
|
||||
- 覆盖 5 个行业: design-shantou(4), education(5), healthcare(3), legal(1), marketing(1), productivity(1)
|
||||
- 每个模板包含完整元数据: id, displayName, description, category, industry, tags, icon, version, inputs
|
||||
|
||||
### ✅ TC-5-02 | M6-02 验证: v1/v2 解析器
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
helpers.rs:93-115 — v1 解析失败后自动尝试 v2 解析器。15 个模板全部成功列出(含 v1 和 v2 格式)。
|
||||
|
||||
### ✅ TC-5-05 | M6-01 验证: route_intent
|
||||
|
||||
**结果**: PASS(已修复)
|
||||
|
||||
```json
|
||||
{
|
||||
"type": "no_match",
|
||||
"suggestions": [
|
||||
{"id": "client-communication", "displayName": "客户沟通辅助", "matchReason": "推荐"},
|
||||
{"id": "supply-chain-collect", "displayName": "供应链信息采集", "matchReason": "推荐"},
|
||||
{"id": "healthcare-data-report", "displayName": "医疗数据报告生成", "matchReason": "推荐"}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
命令注册并工作正常。返回 "no_match" + 推荐列表符合预期(对课堂查询无精确匹配)。
|
||||
|
||||
### ✅ TC-5-03 | Pipeline 执行
|
||||
|
||||
**结果**: PASS(基本执行成功)
|
||||
|
||||
```json
|
||||
{
|
||||
"runId": "25d5dfc3-1f1b-4821-b0b0-3caecb35e6f6",
|
||||
"pipelineId": "research-to-quiz",
|
||||
"status": "running"
|
||||
}
|
||||
```
|
||||
|
||||
Pipeline 异步执行返回 runId,状态为 "running"。`pipeline_runs` 后续查询返回空(可能执行已完成被清理或内存状态问题)。
|
||||
|
||||
### ⏭️ TC-5-04 | Pipeline 监控
|
||||
|
||||
**结果**: SKIP
|
||||
|
||||
`pipeline_runs` 返回空数组,无法验证进度详情。可能与内存 RunStore 生命周期有关。
|
||||
|
||||
### ⏭️ TC-5-06 | Pipeline 取消
|
||||
|
||||
**结果**: SKIP
|
||||
|
||||
需 UI 交互触发取消操作。
|
||||
|
||||
### ⚠️ TC-5-07 | M6-03 验证: Action 类型丢失
|
||||
|
||||
**结果**: FAIL(未修复,代码审查确认)
|
||||
|
||||
crud.rs:78-92 — `WorkflowStepInput` 只有 `hand_name` 字段,所有步骤都被映射为 `Action::Hand`。
|
||||
|
||||
### ⚠️ TC-5-08 | Pipeline 导出
|
||||
|
||||
**结果**: PARTIAL
|
||||
|
||||
`pipeline_templates` 返回空数组(可能需要单独初始化),但 `pipeline_list` 返回完整的模板列表可视为有效的"发现"导出。
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **72/100** | **78/100** | **+6** |
|
||||
|
||||
**提升原因**:
|
||||
- M6-01 P1 route_intent 已注册(lib.rs:220)
|
||||
- M6-02 P1 v1/v2 解析器 fallback 已实现(helpers.rs:93-115)
|
||||
- Pipeline 列举和发现功能完整(15 个模板全部列出)
|
||||
- Pipeline 执行基本工作(run + runId 返回)
|
||||
- 模板覆盖 5+ 行业
|
||||
|
||||
**残留风险**:
|
||||
- pipeline_create 只支持 Hand Action(P2,M6-03)
|
||||
- workflowStore 前端映射语义错误(P2,M6-04/05)
|
||||
- 模板语法混用 `{{}}` vs `${}`(P2,M6-07)
|
||||
- 执行进度只有 0/50/100 三档(P3,M6-08)
|
||||
@@ -0,0 +1,64 @@
|
||||
# T6 SaaS 桌面集成 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 85/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 3/6(3 个需 UI 交互或长时间等待)
|
||||
- **已修复 P1**: 2 ✅
|
||||
- **未修复**: 2 ⚠️
|
||||
- **新发现缺陷**: 0
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 0 | M7-02/M7-04 已修复 |
|
||||
| P2 | 2 | M7-01 密码长度不一致; M7-03 QR码泄露密钥 |
|
||||
| P3 | 2 | M7-05 saveSaaSSession 静默失败; M7-06 chatStream 缺 sessionKey |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M7-01 | 前端密码 6 字符 vs 后端 8 字符 | P2 | ⚠️ **未修复** | SaaSLogin.tsx:58 使用 6,SaaSSettings.tsx:232 使用 8 |
|
||||
| M7-02 | ConfigMigrationWizard PUT 布尔值 | P1 | ✅ **已修复** | ConfigMigrationWizard.tsx:118 使用 `existing.id` 替代布尔值 |
|
||||
| M7-03 | QR 码外部服务泄露密钥 | P2 | ❓ 未验证 | 需 UI 交互验证 TOTP 设置 |
|
||||
| M7-04 | refreshToken 未传 body | P1 | ✅ **已修复** | saas-auth.ts:70-71 显式发送 `{ refresh_token: this.refreshTokenValue }` |
|
||||
| M7-05 | saveSaaSSession 静默失败 | P3 | ❓ 未验证 | 需端到端验证 |
|
||||
| M7-06 | chatStream 缺 sessionKey/agentId | P3 | ❓ 未验证 | 需端到端验证 |
|
||||
|
||||
## 运行时验证
|
||||
|
||||
### kernel_status
|
||||
|
||||
```json
|
||||
{
|
||||
"initialized": true,
|
||||
"agentCount": 1,
|
||||
"baseUrl": "http://127.0.0.1:8080/api/v1/relay",
|
||||
"model": "glm-4-flash"
|
||||
}
|
||||
```
|
||||
|
||||
SaaS Relay 连接正常。
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **85/100** | **89/100** | **+4** |
|
||||
|
||||
**提升原因**:
|
||||
- M7-02 P1 PUT 路径参数已修复
|
||||
- M7-04 P1 refreshToken body 已修复
|
||||
- SaaS Relay 连接正常
|
||||
|
||||
**残留风险**:
|
||||
- 密码长度前后端不一致(P2,M7-01)
|
||||
- TOTP QR 码外部服务(P2,M7-03)
|
||||
@@ -0,0 +1,69 @@
|
||||
# T7 技能生态 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: tauri-mcp execute_js + 代码审查 | **V12 基线**: 85/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 4/7(3 个需 UI 交互)
|
||||
- **已修复 P1**: 1 ✅(部分)
|
||||
- **未修复**: 4 ⚠️
|
||||
- **新发现缺陷**: 0
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 0 | M5-01 部分修复(triggers 正确,category 仍错) |
|
||||
| P2 | 3 | M5-02 tools 字段丢失; M5-03 Python3 硬编码; M5-06 分类不全 |
|
||||
| P3 | 2 | M5-04 YAML 引号; M5-05 duration_ms 未设置 |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M5-01 | tags 误映射为 triggers | P1 | ⚠️ **部分修复** | triggers 正确返回(skill_list 返回真实 triggers);但 category 仍从 tags[0] 映射,75 个技能全部 category=null |
|
||||
| M5-02 | SKILL.md tools 字段丢失 | P2 | ❓ 未验证 | 需检查 Rust loader |
|
||||
| M5-03 | Python3 硬编码 | P2 | ❓ 未验证 | Windows 兼容性问题 |
|
||||
| M5-04 | YAML 引号只处理双引号 | P3 | ❓ 未验证 | - |
|
||||
| M5-05 | ShellSkill duration_ms 未设置 | P3 | ❓ 未验证 | - |
|
||||
| M5-06 | CATEGORY_CONFIG 仅覆盖 9 分类 | P3 | ⚠️ **未修复** | 75 个技能全为 null,SkillCard 显示灰色 |
|
||||
|
||||
## 运行时验证
|
||||
|
||||
### skill_list
|
||||
|
||||
- **技能总数**: 75
|
||||
- **triggers 字段**: ✅ 正确返回(如 "品牌个性"、"微交互"、"截图验证")
|
||||
- **tags 字段**: 全部为 `[]`(空数组)
|
||||
- **category 字段**: 全部为 `null`
|
||||
|
||||
```json
|
||||
{
|
||||
"count": 75,
|
||||
"sample": [
|
||||
{"name": "whimsy-injector", "tags": [], "triggers": ["品牌个性","微交互","趣味设计"], "category": null},
|
||||
{"name": "evidence-collector", "tags": [], "triggers": ["证据收集","截图验证","QA验证"], "category": null},
|
||||
{"name": "github-deep-research", "tags": [], "triggers": ["分析仓库","GitHub分析"], "category": null}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **85/100** | **87/100** | **+2** |
|
||||
|
||||
**提升原因**:
|
||||
- M5-01 triggers 映射已修复(正确使用 backend.triggers)
|
||||
- 75 个技能全部成功加载
|
||||
|
||||
**残留风险**:
|
||||
- category 映射仍从 tags[0] 获取(P2)
|
||||
- 75 个技能全部无分类标签(P2)
|
||||
- Python 技能在 Windows 可能失败(P2)
|
||||
69
docs/archive/old-test-reports/test-results/T8-chat/REPORT.md
Normal file
@@ -0,0 +1,69 @@
|
||||
# T8 智能对话 测试报告
|
||||
|
||||
> **执行日期**: 2026-04-05 | **测试工具**: 代码审查 | **V12 基线**: 91/100
|
||||
|
||||
## 摘要
|
||||
|
||||
- **执行用例数**: 2/8(6 个需端到端 UI 交互,本次仅代码审查)
|
||||
- **代码审查确认**: 11 项 V12 问题验证
|
||||
- **已修复**: 0
|
||||
- **未修复**: 11 ⚠️(全部 P2/P3)
|
||||
- **新发现缺陷**: 0
|
||||
|
||||
### 缺陷统计
|
||||
|
||||
| 级别 | 数量 | 说明 |
|
||||
|------|------|------|
|
||||
| P0 | 0 | - |
|
||||
| P1 | 0 | - |
|
||||
| P2 | 4 | M1-01~04 |
|
||||
| P3 | 7 | M1-05~11 |
|
||||
|
||||
---
|
||||
|
||||
## V12 已知问题验证
|
||||
|
||||
| V12 ID | 描述 | V12 严重度 | 验证结果 | 备注 |
|
||||
|--------|------|-----------|---------|------|
|
||||
| M1-01 | GeminiDriver API Key 在 URL query | P2 | ❓ 需 Gemini 配置验证 | driver/gemini.rs:71-74 |
|
||||
| M1-02 | ToolOutputGuard 只 warn 不 block | P2 | ❓ 需端到端验证 | middleware/tool_output_guard.rs:99-128 |
|
||||
| M1-03 | Mutex::unwrap() 在 async 中 | P2 | ❓ 需 Rust 编译检查 | middleware/memory.rs:46 |
|
||||
| M1-04 | 同上 loop_guard | P2 | ❓ 需 Rust 编译检查 | middleware/loop_guard.rs:40 |
|
||||
| M1-05 | Loop 迭代上限硬编码 10 | P3 | ❓ 需端到端验证 | loop_runner.rs:298 |
|
||||
| M1-06 | TitleMiddleware 空 placeholder | P3 | ❓ 需检查 | middleware/title.rs |
|
||||
| M1-07 | OpenAI driver trace 日志含请求体 | P3 | ❓ 需日志检查 | driver/openai.rs:127 |
|
||||
| M1-08 | cancelStream 竞态条件 | P3 | ❓ 需压力测试 | streamStore.ts:476 |
|
||||
| M1-09 | LoopGuard 不重置跨 agent turns | P3 | ❓ 需多轮测试 | middleware/loop_guard.rs |
|
||||
| M1-10 | SecretString 转为 String | P3 | ❓ 需代码审查 | driver/openai.rs:130 |
|
||||
| M1-11 | unwrap_or_default() 吞错误 | P3 | ❓ 需代码审查 | loop_runner.rs:513,804 |
|
||||
|
||||
## 架构验证
|
||||
|
||||
### ChatStore 重构
|
||||
|
||||
✅ **完成**: 原有单一 chatStore 已拆分为 4 个 sub-store:
|
||||
- `streamStore.ts` — 流式编排
|
||||
- `conversationStore.ts` — 会话管理
|
||||
- `messageStore.ts` — 消息变更 + token 追踪
|
||||
- `artifactStore.ts` — 文件/制品状态
|
||||
|
||||
顶层 `chatStore.ts` 作为 facade 统一导出,通过跨 store 订阅和依赖注入连接。
|
||||
|
||||
### 中间件链
|
||||
|
||||
11 层中间件已确认存在:
|
||||
tool_output_guard, memory, loop_guard, guardrail, title, summarizer, extraction, growth_integration, context_window, mcp_bridge, system_prompt
|
||||
|
||||
---
|
||||
|
||||
## 健康度评估
|
||||
|
||||
| 维度 | V12 基线 | 本次评估 | 变化 |
|
||||
|------|---------|---------|------|
|
||||
| **综合** | **91/100** | **91/100** | **0** |
|
||||
|
||||
**评估说明**:
|
||||
- T8 健康度最高(91/100),无 P0/P1 问题
|
||||
- ChatStore 重构完成,架构质量提升
|
||||
- 全部 11 项 V12 问题为 P2/P3,无阻塞性缺陷
|
||||
- 需端到端验证的问题留待 Phase 3/4 或自动化测试覆盖
|
||||
@@ -0,0 +1,57 @@
|
||||
# ZCLAW 上线前功能审计 — 基线测试结果
|
||||
|
||||
> **执行日期**: 2026-04-05 | **环境**: Windows 11, PostgreSQL + SaaS + Tauri 已启动
|
||||
|
||||
## 自动化测试基线
|
||||
|
||||
### cargo test --workspace
|
||||
|
||||
- **状态**: ⚠️ 部分完成
|
||||
- **问题**: zclaw-saas.exe 被运行中的 SaaS 后端锁定,无法重新编译
|
||||
- **解决方案**: 排除 zclaw-saas 重跑,结果待补充
|
||||
- **cargo check**: ✅ 通过(0 error,仅 warnings)
|
||||
|
||||
### desktop vitest (174/185 passed)
|
||||
|
||||
- **通过**: 174
|
||||
- **失败**: 10
|
||||
- **跳过**: 1
|
||||
- **失败原因**: 全部在 `chatStore.test.ts`,因 ChatStore 4-sub-store 重构后测试未同步更新
|
||||
- **失败测试**:
|
||||
- `chatStore` > `createConversation` 相关 3 个
|
||||
- `chatStore` > `sendMessage` 相关 4 个
|
||||
- `chatStore` > `conversations` 相关 3 个
|
||||
|
||||
### admin-v2 vitest (36/71 passed)
|
||||
|
||||
- **通过**: 36
|
||||
- **失败**: 35
|
||||
- **失败分布**:
|
||||
- authStore.test.ts: 6/8 failed (localStorage mock 问题)
|
||||
- request.test.ts: 2/7 failed (Authorization header / 401 refresh)
|
||||
- accountStore.test.ts: 多个 CRUD 测试失败
|
||||
- 其他页面测试: relay, usage, prompt 等
|
||||
|
||||
## 环境验证
|
||||
|
||||
| 项目 | 状态 | 备注 |
|
||||
|------|------|------|
|
||||
| PostgreSQL | ✅ 运行中 | Docker 容器 |
|
||||
| SaaS 后端 | ✅ 运行中 | 0.0.0.0:8080 |
|
||||
| Tauri 桌面端 | ✅ 运行中 | http://localhost:1420/ |
|
||||
| tauri-mcp | ✅ 连接正常 | 可查询/交互 |
|
||||
| LLM Provider | ✅ 可用 | glm-4-flash (GLM) |
|
||||
|
||||
## 已知基线缺陷(非本轮引入)
|
||||
|
||||
1. **desktop chatStore 测试**: ChatStore 拆分为 4 个 sub-store 后测试未更新
|
||||
2. **admin authStore 测试**: jsdom 环境下 localStorage API 兼容问题
|
||||
3. **admin 多页面测试**: 依赖真实 API 端点,vitest 环境无法访问
|
||||
|
||||
## T1 Hands 测试已完成
|
||||
|
||||
详见 [T1-hands/REPORT.md](../T1-hands/REPORT.md)
|
||||
|
||||
- 通过: 11/18 执行用例
|
||||
- 健康度: 58 → 68 (+10)
|
||||
- 新发现 P1: 2 个 (LLM 并发 + Browser Hand)
|
||||
5932
docs/archive/old-test-reports/test-results/baseline/admin-vitest.txt
Normal file
@@ -0,0 +1,44 @@
|
||||
warning: G:\ZClaw_openfang\desktop\src-tauri\Cargo.toml: Found `debug_assertions` in `target.'cfg(...)'.dependencies`. This value is not supported for selecting dependencies and will not work as expected. To learn more visit https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
|
||||
Blocking waiting for file lock on package cache
|
||||
Blocking waiting for file lock on package cache
|
||||
Blocking waiting for file lock on package cache
|
||||
Blocking waiting for file lock on build directory
|
||||
warning: unused import: `parse_pipeline_v2_yaml`
|
||||
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
||||
|
|
||||
9 | parse_pipeline_v2_yaml,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: unused import: `pipeline_v2_to_info`
|
||||
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:19:118
|
||||
|
|
||||
19 | use super::helpers::{get_pipelines_directory, scan_pipelines_with_paths, scan_pipelines_full_sync, pipeline_to_info, pipeline_v2_to_info};
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: field `offset` is never read
|
||||
--> desktop\src-tauri\src\memory\persistent.rs:126:9
|
||||
|
|
||||
118 | pub struct MemorySearchQuery {
|
||||
| ----------------- field in this struct
|
||||
...
|
||||
126 | pub offset: Option<usize>,
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: `MemorySearchQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
|
||||
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: method `delete_classroom` is never used
|
||||
--> desktop\src-tauri\src\classroom_commands\persist.rs:104:18
|
||||
|
|
||||
21 | impl ClassroomPersistence {
|
||||
| ------------------------- method in this implementation
|
||||
...
|
||||
104 | pub async fn delete_classroom(&self, classroom_id: &str) -> Result<(), String> {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: `desktop` (lib) generated 4 warnings (run `cargo fix --lib -p desktop` to apply 2 suggestions)
|
||||
Finished `dev` profile [unoptimized + debuginfo] target(s) in 5m 38s
|
||||
warning: the following packages contain code that will be rejected by a future version of Rust: sqlx-postgres v0.7.4
|
||||
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
|
||||
@@ -0,0 +1,781 @@
|
||||
warning: G:\ZClaw_openfang\desktop\src-tauri\Cargo.toml: Found `debug_assertions` in `target.'cfg(...)'.dependencies`. This value is not supported for selecting dependencies and will not work as expected. To learn more visit https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#platform-specific-dependencies
|
||||
Compiling sqlx-core v0.7.4
|
||||
Compiling sqlx-postgres v0.7.4
|
||||
Compiling sqlx-sqlite v0.7.4
|
||||
Compiling sqlx-macros-core v0.7.4
|
||||
Compiling sqlx-macros v0.7.4
|
||||
Compiling sqlx v0.7.4
|
||||
Compiling tokio-rustls v0.26.4
|
||||
Compiling zclaw-growth v0.1.0 (G:\ZClaw_openfang\crates\zclaw-growth)
|
||||
Compiling hyper-rustls v0.27.7
|
||||
Compiling reqwest v0.12.28
|
||||
Compiling zclaw-memory v0.1.0 (G:\ZClaw_openfang\crates\zclaw-memory)
|
||||
Compiling zclaw-runtime v0.1.0 (G:\ZClaw_openfang\crates\zclaw-runtime)
|
||||
Compiling zclaw-protocols v0.1.0 (G:\ZClaw_openfang\crates\zclaw-protocols)
|
||||
Compiling tauri v2.10.3
|
||||
Compiling zclaw-hands v0.1.0 (G:\ZClaw_openfang\crates\zclaw-hands)
|
||||
Compiling interprocess v2.4.0
|
||||
Compiling image v0.24.9
|
||||
Compiling zclaw-kernel v0.1.0 (G:\ZClaw_openfang\crates\zclaw-kernel)
|
||||
Compiling zclaw-pipeline v0.1.0 (G:\ZClaw_openfang\crates\zclaw-pipeline)
|
||||
Compiling desktop v0.1.0 (G:\ZClaw_openfang\desktop\src-tauri)
|
||||
Compiling tauri-plugin-opener v2.5.3
|
||||
Compiling tauri-plugin-mcp v0.1.0 (https://github.com/P3GLEG/tauri-plugin-mcp?branch=main#ac709a71)
|
||||
Compiling criterion v0.5.1
|
||||
warning: unused import: `parse_pipeline_v2_yaml`
|
||||
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
||||
|
|
||||
9 | parse_pipeline_v2_yaml,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: unused import: `pipeline_v2_to_info`
|
||||
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:19:118
|
||||
|
|
||||
19 | use super::helpers::{get_pipelines_directory, scan_pipelines_with_paths, scan_pipelines_full_sync, pipeline_to_info, pipeline_v2_to_info};
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: field `offset` is never read
|
||||
--> desktop\src-tauri\src\memory\persistent.rs:126:9
|
||||
|
|
||||
118 | pub struct MemorySearchQuery {
|
||||
| ----------------- field in this struct
|
||||
...
|
||||
126 | pub offset: Option<usize>,
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: `MemorySearchQuery` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
|
||||
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: method `delete_classroom` is never used
|
||||
--> desktop\src-tauri\src\classroom_commands\persist.rs:104:18
|
||||
|
|
||||
21 | impl ClassroomPersistence {
|
||||
| ------------------------- method in this implementation
|
||||
...
|
||||
104 | pub async fn delete_classroom(&self, classroom_id: &str) -> Result<(), String> {
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unused import: `zclaw_growth::MemoryType`
|
||||
--> desktop\src-tauri\src\summarizer_adapter.rs:114:9
|
||||
|
|
||||
114 | use zclaw_growth::MemoryType;
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: unused import: `parse_pipeline_v2_yaml`
|
||||
--> desktop\src-tauri\src\pipeline_commands\discovery.rs:9:5
|
||||
|
|
||||
9 | parse_pipeline_v2_yaml,
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: struct `DummyDriver` is never constructed
|
||||
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:279:16
|
||||
|
|
||||
279 | struct DummyDriver;
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
warning: method `parse_response_test` is never used
|
||||
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:281:16
|
||||
|
|
||||
280 | impl TauriExtractionDriver {
|
||||
| -------------------------- method in this implementation
|
||||
281 | fn parse_response_test(
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
warning: non-local `impl` definition, `impl` blocks should be written at the same level as their item
|
||||
--> desktop\src-tauri\src\intelligence\extraction_adapter.rs:280:9
|
||||
|
|
||||
276 | fn test_parse_empty_response() {
|
||||
| ------------------------------ move the `impl` block outside of this function `test_parse_empty_response`
|
||||
...
|
||||
280 | impl TauriExtractionDriver {
|
||||
| ^^^^^---------------------
|
||||
| |
|
||||
| `TauriExtractionDriver` is not local
|
||||
|
|
||||
= note: an `impl` is never scoped, even when it is nested inside an item, as it may impact type checking outside of that item, which can be the case if neither the trait or the self type are at the same nesting level as the `impl`
|
||||
= note: `#[warn(non_local_definitions)]` on by default
|
||||
|
||||
warning: `desktop` (lib test) generated 8 warnings (3 duplicates) (run `cargo fix --lib -p desktop --tests` to apply 2 suggestions)
|
||||
warning: unused import: `compile_pattern`
|
||||
--> crates\zclaw-pipeline\src\intent.rs:631:26
|
||||
|
|
||||
631 | use crate::trigger::{compile_pattern, compile_trigger, Trigger};
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unused_imports)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: `desktop` (lib) generated 4 warnings (run `cargo fix --lib -p desktop` to apply 2 suggestions)
|
||||
warning: `zclaw-pipeline` (lib test) generated 1 warning (run `cargo fix --lib -p zclaw-pipeline --tests` to apply 1 suggestion)
|
||||
warning: function `test_context` is never used
|
||||
--> crates\zclaw-hands\src\hands\researcher.rs:583:8
|
||||
|
|
||||
583 | fn test_context() -> HandContext {
|
||||
| ^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default
|
||||
|
||||
warning: `zclaw-hands` (lib test) generated 1 warning
|
||||
Finished `test` profile [unoptimized + debuginfo] target(s) in 3m 33s
|
||||
warning: the following packages contain code that will be rejected by a future version of Rust: sqlx-postgres v0.7.4
|
||||
note: to see what the problems were, use the option `--future-incompat-report`, or run `cargo report future-incompatibilities --id 2`
|
||||
Running unittests src\lib.rs (target\debug\deps\desktop_lib-7e14a4a33859881e.exe)
|
||||
|
||||
running 36 tests
|
||||
test intelligence::compactor::tests::test_estimate_tokens_chinese ... ok
|
||||
test intelligence::compactor::tests::test_compaction_check ... ok
|
||||
test intelligence::heartbeat::tests::test_parse_time ... ok
|
||||
test intelligence::extraction_adapter::tests::test_parse_no_json_array ... ok
|
||||
test intelligence::extraction_adapter::tests::test_parse_empty_response ... ok
|
||||
test intelligence::reflection::tests::test_analyze_patterns ... ok
|
||||
test intelligence::heartbeat::tests::test_default_config ... ok
|
||||
test intelligence::compactor::tests::test_estimate_tokens_english ... ok
|
||||
test intelligence::extraction_adapter::tests::test_parse_valid_json_response ... ok
|
||||
test intelligence::extraction_adapter::tests::test_extraction_driver_not_configured_by_default ... ok
|
||||
test intelligence::reflection::tests::test_should_reflect_initial ... ok
|
||||
test intelligence::validation::tests::test_optional_identifier ... ok
|
||||
test intelligence::validation::tests::test_invalid_identifiers ... ok
|
||||
test intelligence::validation::tests::test_sanitize_for_logging ... ok
|
||||
test intelligence::validation::tests::test_string_length_validation ... ok
|
||||
test intelligence::validation::tests::test_valid_identifiers ... ok
|
||||
test llm::tests::test_llm_client_creation ... ok
|
||||
test llm::tests::test_provider_configs ... ok
|
||||
test memory::context_builder::tests::test_estimate_tokens ... ok
|
||||
test memory::persistent::tests::test_generate_memory_id ... ok
|
||||
test memory::extractor::tests::test_extraction_config_default ... ok
|
||||
test memory::crypto::tests::test_derive_key ... ok
|
||||
test memory::extractor::tests::test_uri_generation ... ok
|
||||
test memory::crypto::tests::test_encrypt_decrypt ... ok
|
||||
test memory::context_builder::tests::test_context_builder_config_default ... ok
|
||||
test memory::context_builder::tests::test_extract_category ... ok
|
||||
test summarizer_adapter::tests::test_summary_driver_configure_and_check ... ok
|
||||
test viking_commands::tests::test_invalid_uri ... ok
|
||||
test summarizer_adapter::tests::test_summary_driver_not_configured_by_default ... ok
|
||||
test memory::crypto::tests::test_encrypt_produces_different_ciphertext ... ok
|
||||
test viking_commands::tests::test_parse_uri ... ok
|
||||
test intelligence::identity::tests::test_get_identity_creates_default ... ok
|
||||
test intelligence::identity::tests::test_update_user_profile ... ok
|
||||
test intelligence::identity::tests::test_snapshots ... ok
|
||||
test intelligence::identity::tests::test_proposal_flow ... ok
|
||||
test intelligence::compactor::tests::test_generate_summary ... ok
|
||||
|
||||
test result: ok. 36 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
|
||||
|
||||
Running unittests src\main.rs (target\debug\deps\desktop-c3cc535c9683aa3d.exe)
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_growth-0cc62226cc107d52.exe)
|
||||
|
||||
running 66 tests
|
||||
test extractor::tests::test_prompts_available ... ok
|
||||
test injector::tests::test_injector_empty_memories ... ok
|
||||
test injector::tests::test_estimate_tokens ... ok
|
||||
test injector::tests::test_minimal_context ... ok
|
||||
test injector::tests::test_injector_with_preferences ... ok
|
||||
test injector::tests::test_inject_compact ... ok
|
||||
test injector::tests::test_injector_with_all_types ... ok
|
||||
test injector::tests::test_format_selection ... ok
|
||||
test injector::tests::test_inject_custom ... ok
|
||||
test injector::tests::test_inject_json ... ok
|
||||
test retrieval::query::tests::test_cjk_detection ... ok
|
||||
test extractor::tests::test_extractor_creation ... ok
|
||||
test retrieval::cache::tests::test_cache_miss ... ok
|
||||
test retrieval::cache::tests::test_cache_stats ... ok
|
||||
test retrieval::cache::tests::test_cache_eviction ... ok
|
||||
test retrieval::cache::tests::test_cache_put_and_get ... ok
|
||||
test retrieval::cache::tests::test_cache_remove ... ok
|
||||
test retrieval::query::tests::test_extract_keywords ... ok
|
||||
test retrieval::query::tests::test_chinese_keywords ... ok
|
||||
test retrieval::semantic::tests::test_cosine_similarity ... ok
|
||||
test extractor::tests::test_extract_memories ... ok
|
||||
test retrieval::query::tests::test_classify_intent_code ... ok
|
||||
test retrieval::cache::tests::test_get_hot_entries ... ok
|
||||
test retrieval::query::tests::test_classify_intent_knowledge ... ok
|
||||
test retrieval::cache::tests::test_cache_clear ... ok
|
||||
test retrieval::query::tests::test_classify_intent_preference ... ok
|
||||
test retrieval::query::tests::test_query_expansion ... ok
|
||||
test retrieval::query::tests::test_generate_search_queries ... ok
|
||||
test retrieval::semantic::tests::test_tf_computation ... ok
|
||||
test retrieval::semantic::tests::test_stop_words_removal ... ok
|
||||
test retrieval::semantic::tests::test_tokenize ... ok
|
||||
test retrieval::semantic::tests::test_index_and_score ... ok
|
||||
test retrieval::semantic::tests::test_stats ... ok
|
||||
test retriever::tests::test_memory_type_scope ... ok
|
||||
test retriever::tests::test_retrieval_config_default ... ok
|
||||
test retriever::tests::test_retriever_creation ... ok
|
||||
test summarizer::tests::test_abstract_prompt ... ok
|
||||
test summarizer::tests::test_clean_summary ... ok
|
||||
test summarizer::tests::test_generate_summaries ... ok
|
||||
test summarizer::tests::test_overview_prompt ... ok
|
||||
test summarizer::tests::test_generate_summaries_handles_error ... ok
|
||||
test tests::test_growth_config_default ... ok
|
||||
test tests::test_memory_type_reexport ... ok
|
||||
test types::tests::test_estimated_tokens ... ok
|
||||
test types::tests::test_memory_entry_creation ... ok
|
||||
test types::tests::test_memory_entry_touch ... ok
|
||||
test tracker::tests::test_agent_metadata_serialization ... ok
|
||||
test tracker::tests::test_learning_event_serialization ... ok
|
||||
test types::tests::test_memory_type_display ... ok
|
||||
test types::tests::test_retrieval_config_default ... ok
|
||||
test types::tests::test_retrieval_config_with_budget ... ok
|
||||
test types::tests::test_retrieval_result ... ok
|
||||
test types::tests::test_uri_builder ... ok
|
||||
test types::tests::test_uri_parser ... ok
|
||||
test viking_adapter::tests::test_in_memory_storage_delete ... ok
|
||||
test viking_adapter::tests::test_metadata_storage ... ok
|
||||
test viking_adapter::tests::test_viking_adapter_typed_metadata ... ok
|
||||
test viking_adapter::tests::test_in_memory_storage_store_and_get ... ok
|
||||
test viking_adapter::tests::test_viking_level_display ... ok
|
||||
test viking_adapter::tests::test_in_memory_storage_find ... ok
|
||||
test storage::sqlite::tests::test_metadata_storage ... ok
|
||||
test storage::sqlite::tests::test_sqlite_storage_store_and_get ... ok
|
||||
test storage::sqlite::tests::test_sqlite_storage_delete ... ok
|
||||
test storage::sqlite::tests::test_access_count ... ok
|
||||
test storage::sqlite::tests::test_sqlite_storage_semantic_search ... ok
|
||||
test storage::sqlite::tests::test_persistence ... ok
|
||||
|
||||
test result: ok. 66 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.07s
|
||||
|
||||
Running tests\integration_test.rs (target\debug\deps\integration_test-4b889886bf0ebf9e.exe)
|
||||
|
||||
running 9 tests
|
||||
test test_prompt_injection_token_budget ... ok
|
||||
test test_metadata_operations ... ok
|
||||
test test_chinese_text_handling ... ok
|
||||
test test_memory_deletion ... ok
|
||||
test test_semantic_search_ranking ... ok
|
||||
test test_find_by_prefix ... ok
|
||||
test test_agent_isolation ... ok
|
||||
test test_importance_and_access ... ok
|
||||
test test_memory_lifecycle ... ok
|
||||
|
||||
test result: ok. 9 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_hands-ddb5fe00a71de8d9.exe)
|
||||
|
||||
running 155 tests
|
||||
test hands::browser::tests::test_browser_config ... ok
|
||||
test hands::browser::tests::test_form_field_deserialize ... ok
|
||||
test hands::clip::tests::test_action_check_ffmpeg ... ok
|
||||
test hands::browser::tests::test_action_deserialize_screenshot ... ok
|
||||
test hands::browser::tests::test_action_deserialize_type ... ok
|
||||
test hands::clip::tests::test_action_info ... ok
|
||||
test hands::clip::tests::test_action_invalid ... ok
|
||||
test hands::browser::tests::test_action_deserialize_navigate ... ok
|
||||
test hands::clip::tests::test_action_convert ... ok
|
||||
test hands::clip::tests::test_action_resize ... ok
|
||||
test hands::browser::tests::test_action_deserialize_click ... ok
|
||||
test hands::clip::tests::test_action_thumbnail ... ok
|
||||
test hands::clip::tests::test_action_concat ... ok
|
||||
test hands::browser::tests::test_action_deserialize_scrape ... ok
|
||||
test hands::clip::tests::test_action_trim ... ok
|
||||
test hands::clip::tests::test_concat_config_deserialize ... ok
|
||||
test hands::browser::tests::test_all_major_actions_roundtrip ... ok
|
||||
test hands::clip::tests::test_convert_config_defaults ... ok
|
||||
test hands::browser::tests::test_browser_config_needs_approval ... ok
|
||||
test hands::clip::tests::test_convert_config_deserialize ... ok
|
||||
test hands::browser::tests::test_browser_sequence_builder ... ok
|
||||
test hands::browser::tests::test_browser_sequence_multiple_steps ... ok
|
||||
test hands::clip::tests::test_default_impl ... ok
|
||||
test hands::clip::tests::test_info_action_roundtrip ... ok
|
||||
test hands::clip::tests::test_hand_config ... ok
|
||||
test hands::clip::tests::test_resolution_custom ... ok
|
||||
test hands::clip::tests::test_resolution_default ... ok
|
||||
test hands::clip::tests::test_resolution_presets ... ok
|
||||
test hands::clip::tests::test_needs_approval ... ok
|
||||
test hands::clip::tests::test_execute_invalid_action ... ok
|
||||
test hands::clip::tests::test_resolution_serialize ... ok
|
||||
test hands::clip::tests::test_thumbnail_config_defaults ... ok
|
||||
test hands::clip::tests::test_thumbnail_config_deserialize ... ok
|
||||
test hands::clip::tests::test_trim_action_roundtrip ... ok
|
||||
test hands::clip::tests::test_trim_config_deserialize ... ok
|
||||
test hands::clip::tests::test_trim_config_minimal ... ok
|
||||
test hands::clip::tests::test_video_format_deserialize ... ok
|
||||
test hands::clip::tests::test_video_format_default ... ok
|
||||
test hands::clip::tests::test_video_info_deserialize ... ok
|
||||
test hands::clip::tests::test_video_format_serialize ... ok
|
||||
test hands::collector::tests::test_collection_target_deserialize ... ok
|
||||
test hands::collector::tests::test_collector_action_deserialize ... ok
|
||||
test hands::collector::tests::test_collector_config ... ok
|
||||
test hands::collector::tests::test_aggregate_action_empty_urls ... ok
|
||||
test hands::collector::tests::test_extract_visible_text_empty ... ok
|
||||
test hands::researcher::tests::test_action_fetch_deserialize ... ok
|
||||
test hands::collector::tests::test_extract_visible_text_basic ... ok
|
||||
test hands::collector::tests::test_extract_visible_text_strips_scripts ... ok
|
||||
test hands::researcher::tests::test_action_invalid_rejected ... ok
|
||||
test hands::collector::tests::test_extract_visible_text_strips_styles ... ok
|
||||
test hands::quiz::tests::test_quiz_creation ... ok
|
||||
test hands::quiz::tests::test_export_markdown ... ok
|
||||
test hands::collector::tests::test_output_format_serialize ... ok
|
||||
test hands::quiz::tests::test_submit_and_grade ... ok
|
||||
test hands::quiz::tests::test_generate_quiz ... ok
|
||||
test hands::researcher::tests::test_action_search_deserialize ... ok
|
||||
test hands::researcher::tests::test_action_report_deserialize ... ok
|
||||
test hands::quiz::tests::test_show_question ... ok
|
||||
test hands::researcher::tests::test_config_id ... ok
|
||||
test hands::researcher::tests::test_check_dependencies_ok ... ok
|
||||
test hands::researcher::tests::test_extract_text_empty_body ... ok
|
||||
test hands::researcher::tests::test_extract_text_basic ... ok
|
||||
test hands::researcher::tests::test_extract_text_strips_scripts ... ok
|
||||
test hands::researcher::tests::test_extract_text_strips_styles ... ok
|
||||
test hands::researcher::tests::test_research_depth_default_is_standard ... ok
|
||||
test hands::clip::tests::test_check_dependencies ... ok
|
||||
test hands::researcher::tests::test_research_depth_deserialize ... ok
|
||||
test hands::researcher::tests::test_research_depth_serialize ... ok
|
||||
test hands::researcher::tests::test_research_query_defaults ... ok
|
||||
test hands::researcher::tests::test_needs_approval_is_false ... ok
|
||||
test hands::researcher::tests::test_research_report_summary_is_some_when_results ... ok
|
||||
test hands::researcher::tests::test_search_engine_default_is_auto ... ok
|
||||
test hands::researcher::tests::test_search_engine_serialize_roundtrip ... ok
|
||||
test hands::clip::tests::test_execute_check_ffmpeg ... ok
|
||||
test hands::researcher::tests::test_search_result_serialization ... ok
|
||||
test hands::researcher::tests::test_url_encode_ascii ... ok
|
||||
test hands::researcher::tests::test_extract_text_truncates_long_content ... ok
|
||||
test hands::researcher::tests::test_url_encode_chinese ... ok
|
||||
test hands::researcher::tests::test_url_encode_empty ... ok
|
||||
test hands::clip::tests::test_status ... ok
|
||||
test hands::researcher::tests::test_url_encode_safe_chars ... ok
|
||||
test hands::researcher::tests::test_status_is_idle ... ok
|
||||
test hands::slideshow::tests::test_add_slide ... ok
|
||||
test hands::slideshow::tests::test_content_block_code ... ok
|
||||
test hands::slideshow::tests::test_autoplay_default_interval ... ok
|
||||
test hands::slideshow::tests::test_autoplay_pause_resume ... ok
|
||||
test hands::slideshow::tests::test_content_block_list ... ok
|
||||
test hands::slideshow::tests::test_content_block_table ... ok
|
||||
test hands::slideshow::tests::test_default_impl ... ok
|
||||
test hands::slideshow::tests::test_default_state ... ok
|
||||
test hands::slideshow::tests::test_content_block_text ... ok
|
||||
test hands::slideshow::tests::test_deserialize_autoplay ... ok
|
||||
test hands::slideshow::tests::test_deserialize_goto_slide ... ok
|
||||
test hands::slideshow::tests::test_deserialize_laser ... ok
|
||||
test hands::slideshow::tests::test_deserialize_next_slide ... ok
|
||||
test hands::slideshow::tests::test_deserialize_invalid_action ... ok
|
||||
test hands::slideshow::tests::test_goto_slide_out_of_range ... ok
|
||||
test hands::slideshow::tests::test_get_state ... ok
|
||||
test hands::slideshow::tests::test_goto_slide_returns_content ... ok
|
||||
test hands::slideshow::tests::test_hand_execute_dispatch ... ok
|
||||
test hands::slideshow::tests::test_hand_execute_invalid_action ... ok
|
||||
test hands::slideshow::tests::test_highlight_custom_color ... ok
|
||||
test hands::slideshow::tests::test_highlight_default_color ... ok
|
||||
test hands::slideshow::tests::test_needs_approval ... ok
|
||||
test hands::slideshow::tests::test_laser ... ok
|
||||
test hands::slideshow::tests::test_navigation ... ok
|
||||
test hands::slideshow::tests::test_next_slide_at_end ... ok
|
||||
test hands::slideshow::tests::test_play_animation ... ok
|
||||
test hands::slideshow::tests::test_prev_slide_at_beginning ... ok
|
||||
test hands::slideshow::tests::test_set_content_append ... ok
|
||||
test hands::slideshow::tests::test_slideshow_creation ... ok
|
||||
test hands::slideshow::tests::test_set_content_invalid_index ... ok
|
||||
test hands::slideshow::tests::test_set_content ... ok
|
||||
test hands::slideshow::tests::test_spotlight ... ok
|
||||
test hands::slideshow::tests::test_spotlight_default_duration ... ok
|
||||
test hands::speech::tests::test_speak ... ok
|
||||
test hands::slideshow::tests::test_status ... ok
|
||||
test hands::speech::tests::test_pause_resume ... ok
|
||||
test hands::speech::tests::test_set_voice ... ok
|
||||
test hands::speech::tests::test_list_voices ... ok
|
||||
test hands::speech::tests::test_speech_creation ... ok
|
||||
test hands::twitter::tests::test_check_credentials_action ... ok
|
||||
test hands::twitter::tests::test_check_dependencies ... ok
|
||||
test hands::twitter::tests::test_check_credentials_with_config ... ok
|
||||
test hands::twitter::tests::test_default_impl ... ok
|
||||
test hands::twitter::tests::test_delete_tweet_action ... ok
|
||||
test hands::twitter::tests::test_check_credentials_without_config ... ok
|
||||
test hands::twitter::tests::test_followers_action ... ok
|
||||
test hands::twitter::tests::test_following_action_no_max ... ok
|
||||
test hands::twitter::tests::test_get_tweet_action ... ok
|
||||
test hands::twitter::tests::test_invalid_action ... ok
|
||||
test hands::twitter::tests::test_get_user_action ... ok
|
||||
test hands::twitter::tests::test_hand_config ... ok
|
||||
test hands::twitter::tests::test_like_unlike_actions ... ok
|
||||
test hands::twitter::tests::test_media_info_deserialize ... ok
|
||||
test hands::twitter::tests::test_needs_approval ... ok
|
||||
test hands::twitter::tests::test_retweet_unretweet_actions ... ok
|
||||
test hands::twitter::tests::test_search_action_custom_max ... ok
|
||||
test hands::twitter::tests::test_search_action_defaults ... ok
|
||||
test hands::twitter::tests::test_search_action_roundtrip ... ok
|
||||
test hands::twitter::tests::test_tweet_action_deserialize ... ok
|
||||
test hands::twitter::tests::test_timeline_action_defaults ... ok
|
||||
test hands::twitter::tests::test_tweet_action_roundtrip ... ok
|
||||
test hands::twitter::tests::test_status ... ok
|
||||
test hands::twitter::tests::test_set_and_get_credentials ... ok
|
||||
test hands::twitter::tests::test_tweet_action_with_poll ... ok
|
||||
test hands::twitter::tests::test_tweet_action_with_reply ... ok
|
||||
test hands::twitter::tests::test_tweet_deserialize ... ok
|
||||
test hands::twitter::tests::test_twitter_user_deserialize ... ok
|
||||
test hands::whiteboard::tests::test_draw_shape ... ok
|
||||
test hands::whiteboard::tests::test_chart ... ok
|
||||
test hands::whiteboard::tests::test_undo_redo ... ok
|
||||
test hands::whiteboard::tests::test_whiteboard_creation ... ok
|
||||
test hands::whiteboard::tests::test_clear ... ok
|
||||
test hands::whiteboard::tests::test_draw_text ... ok
|
||||
|
||||
test result: ok. 155 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_kernel-2ce44e6daaebc1d9.exe)
|
||||
|
||||
running 48 tests
|
||||
test config::tests::test_interpolate_env_vars_basic ... ok
|
||||
test config::tests::test_interpolate_env_vars_missing ... ok
|
||||
test config::tests::test_interpolate_env_vars_no_vars ... ok
|
||||
test config::tests::test_interpolate_env_vars_multiple ... ok
|
||||
test export::html::tests::test_format_duration ... ok
|
||||
test export::html::tests::test_format_level ... ok
|
||||
test export::html::tests::test_html_escape ... ok
|
||||
test export::markdown::tests::test_capitalize_first ... ok
|
||||
test export::markdown::tests::test_format_duration ... ok
|
||||
test export::markdown::tests::test_slugify ... ok
|
||||
test export::pptx::tests::test_pptx_format ... ok
|
||||
test export::pptx::tests::test_xml_escape ... ok
|
||||
test export::markdown::tests::test_markdown_export ... ok
|
||||
test export::markdown::tests::test_include_notes ... ok
|
||||
test export::html::tests::test_html_export ... ok
|
||||
test export::tests::test_sanitize_filename ... ok
|
||||
test generation::agents::tests::test_agent_role_display ... ok
|
||||
test export::markdown::tests::test_include_answers ... ok
|
||||
test export::markdown::tests::test_table_of_contents ... ok
|
||||
test generation::agents::tests::test_default_request ... ok
|
||||
test export::html::tests::test_include_notes ... ok
|
||||
test generation::agents::tests::test_generate_chinese_profiles ... ok
|
||||
test generation::chat::tests::test_agent_message ... ok
|
||||
test generation::chat::tests::test_build_chat_prompt ... ok
|
||||
test generation::agents::tests::test_generate_english_profiles ... ok
|
||||
test generation::chat::tests::test_parse_chat_responses_fallback ... ok
|
||||
test generation::chat::tests::test_parse_chat_responses_valid_json ... ok
|
||||
test generation::chat::tests::test_user_message ... ok
|
||||
test generation::tests::test_generation_stage_order ... ok
|
||||
test generation::tests::test_teaching_style_default ... ok
|
||||
test scheduler::tests::test_cron_field_exact ... ok
|
||||
test scheduler::tests::test_cron_field_list ... ok
|
||||
test generation::tests::test_scene_action_serialization ... ok
|
||||
test scheduler::tests::test_cron_field_range ... ok
|
||||
test scheduler::tests::test_cron_field_step ... ok
|
||||
test generation::tests::test_pipeline_creation ... ok
|
||||
test generation::tests::test_generate_outline ... ok
|
||||
test scheduler::tests::test_cron_field_wildcard ... ok
|
||||
test generation::tests::test_generate_agent_profiles ... ok
|
||||
test generation::tests::test_generate_scenes ... ok
|
||||
test scheduler::tests::test_should_fire_every_minute ... ok
|
||||
test scheduler::tests::test_should_fire_cron_wildcard ... ok
|
||||
test scheduler::tests::test_should_not_fire_cron ... ok
|
||||
test skill_router::tests::test_extract_json_bare ... ok
|
||||
test skill_router::tests::test_extract_json_code_block ... ok
|
||||
test generation::tests::test_full_generation ... ok
|
||||
test skill_router::tests::test_extract_json_with_surrounding_text ... ok
|
||||
test export::pptx::tests::test_pptx_export ... ok
|
||||
|
||||
test result: ok. 48 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_memory-909b7cff59274e48.exe)
|
||||
|
||||
running 25 tests
|
||||
test fact::tests::test_fact_new_clamps_confidence ... ok
|
||||
test fact::tests::test_fact_with_source ... ok
|
||||
test fact::tests::test_is_empty_and_len ... ok
|
||||
test fact::tests::test_filter_by_confidence ... ok
|
||||
test fact::tests::test_deduplicate_keeps_higher_confidence ... ok
|
||||
test store::tests::test_in_memory_store_creation ... ok
|
||||
test store::tests::test_agent_with_empty_name ... ok
|
||||
test store::tests::test_kv_recall_nonexistent ... ok
|
||||
test store::tests::test_list_agents ... ok
|
||||
test store::tests::test_load_nonexistent_agent ... ok
|
||||
test store::tests::test_kv_store_and_recall ... ok
|
||||
test store::tests::test_delete_agent ... ok
|
||||
test store::tests::test_create_session ... ok
|
||||
test store::tests::test_agent_with_special_characters_in_name ... ok
|
||||
test store::tests::test_message_with_thinking ... ok
|
||||
test store::tests::test_kv_list ... ok
|
||||
test store::tests::test_append_and_get_messages ... ok
|
||||
test store::tests::test_delete_nonexistent_agent_succeeds ... ok
|
||||
test store::tests::test_kv_update_existing ... ok
|
||||
test store::tests::test_large_message_content ... ok
|
||||
test store::tests::test_message_ordering ... ok
|
||||
test store::tests::test_save_agent_updates_existing ... ok
|
||||
test store::tests::test_save_and_load_agent ... ok
|
||||
test store::tests::test_message_with_tool_result ... ok
|
||||
test store::tests::test_message_with_tool_use ... ok
|
||||
|
||||
test result: ok. 25 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.08s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_pipeline-a7d8a9f8b74018ea.exe)
|
||||
|
||||
running 59 tests
|
||||
test engine::stage::tests::test_stage_engine_creation ... ok
|
||||
test parser::tests::test_parse_empty_steps ... ok
|
||||
test parser::tests::test_parse_duplicate_step_ids ... ok
|
||||
test parser::tests::test_parse_invalid_kind ... ok
|
||||
test parser::tests::test_parse_invalid_version ... ok
|
||||
test parser::tests::test_parse_valid_pipeline ... ok
|
||||
test engine::context::tests::test_evaluate_condition_gt ... ok
|
||||
test engine::context::tests::test_resolve_param ... ok
|
||||
test engine::context::tests::test_resolve_stage_output ... ok
|
||||
test engine::context::tests::test_resolve_loop_context ... ok
|
||||
test executor::tests::test_evaluate_condition_bool ... ok
|
||||
test engine::context::tests::test_evaluate_condition_equal ... ok
|
||||
test executor::tests::test_evaluate_condition_equality ... ok
|
||||
test engine::context::tests::test_resolve_mixed_string ... ok
|
||||
test parser_v2::tests::test_parse_conditional_stage ... ok
|
||||
test parser_v2::tests::test_parse_all_stage_types ... ok
|
||||
test parser_v2::tests::test_parse_duplicate_stage_ids ... ok
|
||||
test parser_v2::tests::test_parse_empty_stages ... ok
|
||||
test parser_v2::tests::test_parse_invalid_kind ... ok
|
||||
test parser_v2::tests::test_parse_invalid_version ... ok
|
||||
test parser_v2::tests::test_parse_output_config ... ok
|
||||
test presentation::analyzer::tests::test_analyze_document_fallback ... ok
|
||||
test presentation::analyzer::tests::test_analyze_chart ... ok
|
||||
test presentation::analyzer::tests::test_analyze_slideshow ... ok
|
||||
test presentation::analyzer::tests::test_analyze_quiz ... ok
|
||||
test parser_v2::tests::test_parse_parallel_stage ... ok
|
||||
test presentation::analyzer::tests::test_can_render_as ... ok
|
||||
test engine::context::tests::test_child_context ... ok
|
||||
test parser_v2::tests::test_parse_valid_pipeline_v2 ... ok
|
||||
test parser_v2::tests::test_parse_sequential_stage ... ok
|
||||
test presentation::registry::tests::test_registry_defaults ... ok
|
||||
test parser_v2::tests::test_try_parse_v2 ... ok
|
||||
test presentation::registry::tests::test_all_available ... ok
|
||||
test presentation::registry::tests::test_renderer_info ... ok
|
||||
test presentation::registry::tests::test_get_export_formats ... ok
|
||||
test intent::tests::test_decide_mode_form ... ok
|
||||
test intent::tests::test_decide_mode_conversation ... ok
|
||||
test presentation::types::tests::test_presentation_type_display ... ok
|
||||
test presentation::types::tests::test_chart_data_deserialize ... ok
|
||||
test intent::tests::test_route_keyword_match ... ok
|
||||
test intent::tests::test_route_pattern_match ... ok
|
||||
test presentation::types::tests::test_presentation_type_icon ... ok
|
||||
test intent::tests::test_route_no_match ... ok
|
||||
test presentation::types::tests::test_quiz_data_deserialize ... ok
|
||||
test types_v2::tests::test_stage_id ... ok
|
||||
test state::tests::test_extract_outputs ... ok
|
||||
test state::tests::test_resolve_input ... ok
|
||||
test state::tests::test_resolve_step_output ... ok
|
||||
test state::tests::test_resolve_array_access ... ok
|
||||
test trigger::tests::test_trigger_parser_quick_match ... ok
|
||||
test types::tests::test_file_export_with_expression ... ok
|
||||
test state::tests::test_resolve_loop_context ... ok
|
||||
test types::tests::test_pipeline_deserialize ... ok
|
||||
test trigger::tests::test_compile_pattern_wildcard ... ok
|
||||
test trigger::tests::test_compile_pattern_mixed ... ok
|
||||
test state::tests::test_resolve_mixed_string ... ok
|
||||
test trigger::tests::test_compile_pattern_named_capture ... ok
|
||||
test trigger::tests::test_trigger_param_extraction ... ok
|
||||
test types_v2::tests::test_pipeline_v2_deserialize ... ok
|
||||
|
||||
test result: ok. 59 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_protocols-914eb6f2e427bb85.exe)
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_runtime-7276ff690990eead.exe)
|
||||
|
||||
running 42 tests
|
||||
test compaction::tests::test_compact_messages_under_threshold ... ok
|
||||
test compaction::tests::test_estimate_messages_tokens ... ok
|
||||
test compaction::tests::test_estimate_tokens_cjk ... ok
|
||||
test compaction::tests::test_estimate_tokens_empty ... ok
|
||||
test compaction::tests::test_extract_topic_long ... ok
|
||||
test compaction::tests::test_estimate_tokens_english ... ok
|
||||
test compaction::tests::test_extract_topic_sentence ... ok
|
||||
test compaction::tests::test_extract_topic_short ... ok
|
||||
test compaction::tests::test_compact_messages_over_threshold ... ok
|
||||
test compaction::tests::test_compact_preserves_leading_system ... ok
|
||||
test compaction::tests::test_generate_summary ... ok
|
||||
test compaction::tests::test_maybe_compact_under_threshold ... ok
|
||||
test tool::builtin::path_validator::tests::test_allows_with_explicit_allowed_paths ... ok
|
||||
test tool::builtin::path_validator::tests::test_allows_with_workspace_root ... ok
|
||||
test tool::builtin::path_validator::tests::test_default_deny_without_configuration ... ok
|
||||
test tool::builtin::path_validator::tests::test_denies_outside_workspace ... ok
|
||||
test tool::builtin::path_validator::tests::test_parse_size ... ok
|
||||
test tool::builtin::path_validator::tests::test_path_traversal ... ok
|
||||
test tool::builtin::path_validator::tests::test_blocked_paths ... ok
|
||||
test growth::tests::test_growth_integration_creation ... ok
|
||||
test growth::tests::test_disabled_growth ... ok
|
||||
test growth::tests::test_process_conversation_disabled ... ok
|
||||
test growth::tests::test_enhance_prompt_empty ... ok
|
||||
test tool::builtin::shell_exec::tests::test_parse_command_complex ... ok
|
||||
test tool::builtin::shell_exec::tests::test_parse_command_empty ... ok
|
||||
test tool::builtin::shell_exec::tests::test_command_allowed ... ok
|
||||
test tool::builtin::shell_exec::tests::test_parse_command_simple ... ok
|
||||
test tool::builtin::shell_exec::tests::test_parse_command_with_quotes ... ok
|
||||
test tool::builtin::shell_exec::tests::test_parse_command_with_single_quotes ... ok
|
||||
test tool::builtin::shell_exec::tests::test_security_config_default ... ok
|
||||
test tool::builtin::file_write::tests::test_write_new_file ... ok
|
||||
test tool::builtin::file_write::tests::test_create_mode_fails_on_existing ... ok
|
||||
test tool::builtin::path_validator::tests::test_expand_tilde ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_url_length ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_ipv6 ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_blocked_hostnames ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_cloud_metadata ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_localhost ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_scheme ... ok
|
||||
test tool::builtin::web_fetch::tests::test_validate_private_ips ... ok
|
||||
test tool::builtin::file_read::tests::test_read_file ... ok
|
||||
test tool::builtin::file_write::tests::test_overwrite_mode ... ok
|
||||
|
||||
test result: ok. 42 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_skills-9c40ca9299fa8d01.exe)
|
||||
|
||||
running 23 tests
|
||||
test orchestration::planner::tests::test_plan_builder ... ok
|
||||
test orchestration::auto_compose::tests::test_extract_types ... ok
|
||||
test orchestration::executor::tests::test_node_result_success ... ok
|
||||
test orchestration::types::tests::test_parse_input_ref ... ok
|
||||
test orchestration::types::tests::test_parse_literal ... ok
|
||||
test orchestration::types::tests::test_parse_node_output_ref ... ok
|
||||
test orchestration::planner::tests::test_planner_plan ... ok
|
||||
test orchestration::validation::tests::test_detect_no_cycle ... ok
|
||||
test orchestration::validation::tests::test_find_end_nodes ... ok
|
||||
test orchestration::validation::tests::test_find_start_nodes ... ok
|
||||
test orchestration::validation::tests::test_identify_parallel_groups ... ok
|
||||
test orchestration::validation::tests::test_detect_cycle ... ok
|
||||
test orchestration::validation::tests::test_topological_sort ... ok
|
||||
test semantic_router::tests::test_cosine_similarity ... ok
|
||||
test semantic_router::tests::test_llm_fallback_invoked_when_below_threshold ... ok
|
||||
test semantic_router::tests::test_no_llm_fallback_returns_best_match ... ok
|
||||
test semantic_router::tests::test_no_llm_fallback_when_high_confidence ... ok
|
||||
test semantic_router::tests::test_retrieve_candidates ... ok
|
||||
test semantic_router::tests::test_basic_routing ... ok
|
||||
test orchestration::context::tests::test_build_output ... ok
|
||||
test orchestration::context::tests::test_resolve_node_output_ref ... ok
|
||||
test orchestration::context::tests::test_resolve_input_ref ... ok
|
||||
test orchestration::context::tests::test_evaluate_condition_equality ... ok
|
||||
|
||||
test result: ok. 23 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Running unittests src\lib.rs (target\debug\deps\zclaw_types-0babceb0143df14c.exe)
|
||||
|
||||
running 57 tests
|
||||
test error::tests::test_config_error_display ... ok
|
||||
test error::tests::test_export_error_display ... ok
|
||||
test error::tests::test_hand_error_display ... ok
|
||||
test error::tests::test_invalid_input_display ... ok
|
||||
test error::tests::test_loop_detected_display ... ok
|
||||
test error::tests::test_mcp_error_display ... ok
|
||||
test error::tests::test_internal_error_display ... ok
|
||||
test error::tests::test_not_found_display ... ok
|
||||
test error::tests::test_llm_error_display ... ok
|
||||
test error::tests::test_permission_denied_display ... ok
|
||||
test error::tests::test_rate_limited_display ... ok
|
||||
test error::tests::test_tool_error_display ... ok
|
||||
test hand_run::tests::test_hand_run_id_display ... ok
|
||||
test error::tests::test_security_error_display ... ok
|
||||
test error::tests::test_serialization_error_from_json ... ok
|
||||
test error::tests::test_storage_error_display ... ok
|
||||
test error::tests::test_timeout_display ... ok
|
||||
test error::tests::test_result_type_err ... ok
|
||||
test error::tests::test_result_type_ok ... ok
|
||||
test hand_run::tests::test_hand_run_id_unique ... ok
|
||||
test hand_run::tests::test_hand_run_id_from_str ... ok
|
||||
test hand_run::tests::test_hand_run_serialization ... ok
|
||||
test id::tests::test_agent_id_display ... ok
|
||||
test hand_run::tests::test_hand_run_status_roundtrip ... ok
|
||||
test id::tests::test_agent_id_default ... ok
|
||||
test id::tests::test_agent_id_from_str_invalid ... ok
|
||||
test id::tests::test_agent_id_from_str_valid ... ok
|
||||
test id::tests::test_agent_id_new_creates_unique_ids ... ok
|
||||
test id::tests::test_agent_id_serialization ... ok
|
||||
test id::tests::test_run_id_display ... ok
|
||||
test id::tests::test_run_id_default ... ok
|
||||
test id::tests::test_run_id_new_creates_unique_ids ... ok
|
||||
test id::tests::test_session_id_default ... ok
|
||||
test id::tests::test_session_id_new_creates_unique_ids ... ok
|
||||
test id::tests::test_skill_id_new ... ok
|
||||
test id::tests::test_tool_id_display ... ok
|
||||
test id::tests::test_tool_id_from_string ... ok
|
||||
test id::tests::test_tool_id_from_str ... ok
|
||||
test message::tests::test_content_block_image ... ok
|
||||
test id::tests::test_tool_id_new ... ok
|
||||
test message::tests::test_content_block_text ... ok
|
||||
test message::tests::test_content_block_thinking ... ok
|
||||
test message::tests::test_content_block_tool_result ... ok
|
||||
test message::tests::test_content_block_tool_use ... ok
|
||||
test message::tests::test_image_source_base64 ... ok
|
||||
test message::tests::test_image_source_serialization ... ok
|
||||
test message::tests::test_image_source_url ... ok
|
||||
test message::tests::test_message_assistant_creation ... ok
|
||||
test message::tests::test_message_assistant_with_thinking ... ok
|
||||
test message::tests::test_message_deserialization_user ... ok
|
||||
test message::tests::test_message_serialization_assistant ... ok
|
||||
test message::tests::test_message_serialization_user ... ok
|
||||
test message::tests::test_message_system_creation ... ok
|
||||
test message::tests::test_message_tool_result_creation ... ok
|
||||
test message::tests::test_message_tool_result_error ... ok
|
||||
test message::tests::test_message_tool_use_creation ... ok
|
||||
test message::tests::test_message_user_creation ... ok
|
||||
|
||||
test result: ok. 57 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests desktop_lib
|
||||
|
||||
running 2 tests
|
||||
test desktop\src-tauri\src\intelligence\validation.rs - intelligence::validation::validate_identifier (line 112) ... ignored
|
||||
test desktop\src-tauri\src\intelligence\validation.rs - intelligence::validation::validate_string_length (line 173) ... ignored
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_growth
|
||||
|
||||
running 1 test
|
||||
test crates\zclaw-growth\src\lib.rs - (line 39) ... ignored
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_hands
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_kernel
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_memory
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_pipeline
|
||||
|
||||
running 1 test
|
||||
test crates\zclaw-pipeline\src\intent.rs - intent (line 21) ... ignored
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_protocols
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_runtime
|
||||
|
||||
running 1 test
|
||||
test crates\zclaw-runtime\src\tool\builtin\path_validator.rs - tool::builtin::path_validator (line 20) ... ignored
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_skills
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
Doc-tests zclaw_types
|
||||
|
||||
running 0 tests
|
||||
|
||||
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
|
||||
|
||||
@@ -0,0 +1,478 @@
|
||||
[vite:react-babel] We recommend switching to `@vitejs/plugin-react-oxc` for improved performance. More information at https://vite.dev/rolldown
|
||||
|
||||
[1m[7m[36m RUN [39m[27m[22m [36mv2.1.9 [39m[90mG:/ZClaw_openfang/desktop[39m
|
||||
|
||||
[90mstderr[2m | tests/lib/request-helper.test.ts[2m > [22m[2mrequest-helper[2m > [22m[2mrequestWithRetry[2m > [22m[2mshould retry on retryable status codes
|
||||
[22m[39m[RequestHelper] Request failed (503), retrying in 11ms (attempt 1/2)
|
||||
|
||||
[32m✓[39m tests/lib/crypto-utils.test.ts [2m([22m[2m10 tests[22m[2m)[22m[90m 69[2mms[22m[39m
|
||||
[90mstderr[2m | tests/lib/request-helper.test.ts[2m > [22m[2mrequest-helper[2m > [22m[2mrequestWithRetry[2m > [22m[2mshould throw after all retries exhausted
|
||||
[22m[39m[RequestHelper] Request failed (503), retrying in 12ms (attempt 1/2)
|
||||
|
||||
[90mstderr[2m | tests/lib/request-helper.test.ts[2m > [22m[2mrequest-helper[2m > [22m[2mrequestWithRetry[2m > [22m[2mshould throw after all retries exhausted
|
||||
[22m[39m[RequestHelper] Request failed (503), retrying in 22ms (attempt 2/2)
|
||||
|
||||
[90mstdout[2m | tests/lib/request-helper.test.ts[2m > [22m[2mrequest-helper[2m > [22m[2mRequestManager[2m > [22m[2mshould cancel all requests
|
||||
[22m[39m[RequestHelper] Cancelled request: test-1
|
||||
[RequestHelper] Cancelled request: test-2
|
||||
[RequestHelper] Cancelled request: test-3
|
||||
|
||||
[32m✓[39m tests/lib/request-helper.test.ts [2m([22m[2m30 tests[22m[2m | [22m[33m1 skipped[39m[2m)[22m[90m 101[2mms[22m[39m
|
||||
[90mstdout[2m | tests/lib/security.test.ts[2m > [22m[2mSecurity Utils[2m > [22m[2msanitizeJson[2m > [22m[2mshould return null for invalid JSON
|
||||
[22m[39m[SecurityUtils] JSON sanitize parse failed {
|
||||
error: SyntaxError: Unexpected token 'o', "not json" is not valid JSON
|
||||
at JSON.parse (<anonymous>)
|
||||
at Module.sanitizeJson [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\security-utils.ts:549:25[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\lib\security.test.ts:356:28
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:533:11
|
||||
at runWithTimeout [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:39:7[90m)[39m
|
||||
at runTest [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:1056:17[90m)[39m
|
||||
[90m at processTicksAndRejections (node:internal/process/task_queues:104:5)[39m
|
||||
at runSuite [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:1205:15[90m)[39m
|
||||
at runSuite [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:1205:15[90m)[39m
|
||||
}
|
||||
|
||||
[32m✓[39m tests/lib/security.test.ts [2m([22m[2m58 tests[22m[2m)[22m[90m 250[2mms[22m[39m
|
||||
[90mstderr[2m | tests/toml-utils.test.ts[2m > [22m[2mtomlUtils[2m > [22m[2mparse[2m > [22m[2mshould throw TomlParseError on invalid TOML
|
||||
[22m[39m[TOML] Parse error: TomlError: Invalid TOML document: incomplete key-value: cannot find end of key
|
||||
|
||||
2: [invalid
|
||||
^
|
||||
3: key = value
|
||||
|
||||
at parseKey [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/struct.js:38:15[90m)[39m
|
||||
at Object.parse [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/parse.js:104:21[90m)[39m
|
||||
at Object.parse [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\toml-utils.ts:61:19[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\toml-utils.test.ts:72:30
|
||||
at Proxy.<anonymous> [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+expect@2.1.9/node_modules/[4m@vitest/expect[24m/dist/index.js:1530:11[90m)[39m
|
||||
at Proxy.<anonymous> [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+expect@2.1.9/node_modules/[4m@vitest/expect[24m/dist/index.js:972:17[90m)[39m
|
||||
at Proxy.methodWrapper [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/chai@5.3.3/node_modules/[4mchai[24m/index.js:1686:25[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\toml-utils.test.ts:72:50
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:533:11 {
|
||||
line: [33m2[39m,
|
||||
column: [33m2[39m,
|
||||
codeblock: [32m'2: [invalid\n ^\n3: key = value\n'[39m
|
||||
}
|
||||
|
||||
[90mstderr[2m | tests/toml-utils.test.ts[2m > [22m[2mtomlUtils[2m > [22m[2mstringify[2m > [22m[2mshould throw TomlStringifyError on invalid data
|
||||
[22m[39m[TOML] Stringify error: Error: Could not stringify the object: maximum object depth exceeded
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:125:15[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
at stringifyTable [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/smol-toml@1.6.1/node_modules/[4msmol-toml[24m/dist/stringify.js:143:46[90m)[39m
|
||||
|
||||
[90mstderr[2m | tests/toml-utils.test.ts[2m > [22m[2mtomlUtils[2m > [22m[2mresolveEnvVars[2m > [22m[2mshould return empty string for missing env vars
|
||||
[22m[39m[TOML] Environment variable MISSING_VAR not resolved - no envVars provided
|
||||
|
||||
[32m✓[39m tests/toml-utils.test.ts [2m([22m[2m14 tests[22m[2m)[22m[90m 22[2mms[22m[39m
|
||||
[32m✓[39m tests/config-parser.test.ts [2m([22m[2m13 tests[22m[2m)[22m[90m 14[2mms[22m[39m
|
||||
[90mstderr[2m | tests/lib/secure-storage.test.ts[2m > [22m[2msecureStorage[2m > [22m[2merror handling[2m > [22m[2mshould handle corrupted encrypted data gracefully
|
||||
[22m[39m[SecureStorage] v2 decryption failed for key: corrupted-key
|
||||
[SecureStorage] v1 decryption failed for key: corrupted-key
|
||||
|
||||
[32m✓[39m tests/lib/secure-storage.test.ts [2m([22m[2m11 tests[22m[2m)[22m[90m 258[2mms[22m[39m
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts
|
||||
[22m[39m[IDBStorage] Migration from localStorage failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at migrateFromLocalStorage [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:56:22[90m)[39m
|
||||
at Object.getItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:98:15[90m)[39m
|
||||
at Object.getItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:292:33[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:305:20
|
||||
at hydrate [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:388:53[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:468:5
|
||||
at createStoreImpl [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/vanilla.mjs:19:32[90m)[39m
|
||||
at createStore [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/vanilla.mjs:22:53[90m)[39m
|
||||
[IDBStorage] IndexedDB getItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.getItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:102:26[90m)[39m
|
||||
[90m at processTicksAndRejections (node:internal/process/task_queues:104:5)[39m
|
||||
|
||||
[32m✓[39m tests/lib/gateway-security.test.ts [2m([22m[2m13 tests[22m[2m)[22m[33m 570[2mms[22m[39m
|
||||
[33m[2m✓[22m[39m WebSocket Security[2m > [22mSecurityError[2m > [22mshould be throwable with a message [33m413[2mms[22m[39m
|
||||
[31m❯[39m tests/stabilization.test.ts [2m([22m[2m0 test[22m[2m)[22m
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2msetCurrentModel[2m > [22m[2mshould update current model
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.setCurrentModel [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:324:39[90m)[39m
|
||||
at setCurrentModel [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:154:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:269:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mnewConversation[2m > [22m[2mshould clear messages and reset session
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:203:5[90m)[39m
|
||||
at newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:159:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:289:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mnewConversation[2m > [22m[2mshould save current messages to conversations before clearing
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:203:5[90m)[39m
|
||||
at newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:159:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:308:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mswitchConversation[2m > [22m[2mshould switch to existing conversation
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:203:5[90m)[39m
|
||||
at newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:159:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:328:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mdeleteConversation[2m > [22m[2mshould delete conversation by id
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:203:5[90m)[39m
|
||||
at newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:159:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:360:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mdeleteConversation[2m > [22m[2mshould clear messages if deleting current conversation
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.deleteConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:244:7[90m)[39m
|
||||
at deleteConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:173:30[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:397:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2msetCurrentAgent[2m > [22m[2mshould update current agent
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.setCurrentAgent [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:289:5[90m)[39m
|
||||
at setCurrentAgent [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:133:52[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:418:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2msetCurrentAgent[2m > [22m[2mshould save current conversation when switching agents
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.setCurrentAgent [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:252:7[90m)[39m
|
||||
at setCurrentAgent [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:133:52[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:444:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2msyncAgents[2m > [22m[2mshould sync agents from profiles
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.syncAgents [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:320:5[90m)[39m
|
||||
at syncAgents [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:141:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:455:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2msyncAgents[2m > [22m[2mshould use default agent when no profiles provided
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.syncAgents [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:320:5[90m)[39m
|
||||
at syncAgents [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:141:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:469:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[90mstderr[2m | tests/store/chatStore.test.ts[2m > [22m[2mchatStore[2m > [22m[2mconversation persistence[2m > [22m[2mshould derive title from first user message
|
||||
[22m[39m[IDBStorage] IndexedDB setItem failed: ReferenceError: indexedDB is not defined
|
||||
at Module.openDB [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/idb@8.0.3/node_modules/[4midb[24m/build/index.js:168:21[90m)[39m
|
||||
at getDB [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:34:17[90m)[39m
|
||||
at Object.setItem [90m(G:\ZClaw_openfang\desktop\[39msrc\lib\idb-storage.ts:117:26[90m)[39m
|
||||
at Object.setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:298:42[90m)[39m
|
||||
at setItem [90m(file:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:358:20[90m)[39m
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/[4mzustand[24m/esm/middleware.mjs:371:14
|
||||
at Object.newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chat\conversationStore.ts:203:5[90m)[39m
|
||||
at newConversation [90m(G:\ZClaw_openfang\desktop\[39msrc\store\chatStore.ts:159:37[90m)[39m
|
||||
at [90mG:\ZClaw_openfang\desktop\[39mtests\store\chatStore.test.ts:645:7
|
||||
at [90mfile:///G:/ZClaw_openfang/desktop/[39mnode_modules/[4m.pnpm[24m/@vitest+runner@2.1.9/node_modules/[4m@vitest/runner[24m/dist/index.js:146:14
|
||||
|
||||
[31m❯[39m tests/store/chatStore.test.ts [2m([22m[2m36 tests[22m[2m | [22m[31m10 failed[39m[2m)[22m[90m 36[2mms[22m[39m
|
||||
[31m [31m×[31m chatStore[2m > [22msetCurrentModel[2m > [22mshould update current model[90m 7[2mms[22m[31m[39m
|
||||
[31m → expected 'glm-5' to be 'gpt-4' // Object.is equality[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mnewConversation[2m > [22mshould clear messages and reset session[90m 4[2mms[22m[31m[39m
|
||||
[31m → expected 'old-session' to be null[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mnewConversation[2m > [22mshould save current messages to conversations before clearing[90m 1[2mms[22m[31m[39m
|
||||
[31m → expected 0 to be greater than 0[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mswitchConversation[2m > [22mshould switch to existing conversation[90m 1[2mms[22m[31m[39m
|
||||
[31m → Cannot read properties of undefined (reading 'id')[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mdeleteConversation[2m > [22mshould delete conversation by id[90m 1[2mms[22m[31m[39m
|
||||
[31m → Cannot read properties of undefined (reading 'id')[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mdeleteConversation[2m > [22mshould clear messages if deleting current conversation[90m 4[2mms[22m[31m[39m
|
||||
[31m → expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal [][39m
|
||||
[31m [31m×[31m chatStore[2m > [22msetCurrentAgent[2m > [22mshould update current agent[90m 2[2mms[22m[31m[39m
|
||||
[31m → expected { id: '1', name: 'ZCLAW', …(4) } to deeply equal { id: 'agent-2', …(5) }[39m
|
||||
[31m [31m×[31m chatStore[2m > [22msetCurrentAgent[2m > [22mshould save current conversation when switching agents[90m 1[2mms[22m[31m[39m
|
||||
[31m → expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal [][39m
|
||||
[31m [31m×[31m chatStore[2m > [22msyncAgents[2m > [22mshould sync agents from profiles[90m 2[2mms[22m[31m[39m
|
||||
[31m → expected [ { id: '1', name: 'ZCLAW', …(4) } ] to have a length of 2 but got 1[39m
|
||||
[31m [31m×[31m chatStore[2m > [22mconversation persistence[2m > [22mshould derive title from first user message[90m 1[2mms[22m[31m[39m
|
||||
[31m → Cannot read properties of undefined (reading 'title')[39m
|
||||
|
||||
[31m⎯⎯⎯⎯⎯⎯[1m[7m Failed Suites 1 [27m[22m⎯⎯⎯⎯⎯⎯⎯[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/stabilization.test.ts[2m [ tests/stabilization.test.ts ][22m
|
||||
[31m[1mTypeError[22m: Cannot read properties of undefined (reading 'hasHydrated')[39m
|
||||
[36m [2m❯[22m Object.onRehydrateStorage src/store/chatStore.ts:[2m265:42[22m[39m
|
||||
[90m263| [39m
|
||||
[90m264| [39m [90m// If conversationStore already hydrated (fast path), sync imm[39m…
|
||||
[90m265| [39m [35mif[39m (useConversationStore[33m.[39mpersist[33m.[39m[34mhasHydrated[39m()) {
|
||||
[90m | [39m [31m^[39m
|
||||
[90m266| [39m [34msyncMessages[39m()[33m;[39m
|
||||
[90m267| [39m [35mreturn[39m[33m;[39m
|
||||
[90m [2m❯[22m hydrate node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:[2m387:94[22m[39m
|
||||
[90m [2m❯[22m node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/middleware.mjs:[2m468:5[22m[39m
|
||||
[90m [2m❯[22m createStoreImpl node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:[2m19:32[22m[39m
|
||||
[90m [2m❯[22m createStore node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/vanilla.mjs:[2m22:53[22m[39m
|
||||
[90m [2m❯[22m createImpl node_modules/.pnpm/zustand@5.0.12_@types+react_8b11772aea488cca440c1215797a0d95/node_modules/zustand/esm/react.mjs:[2m15:15[22m[39m
|
||||
[90m [2m❯[22m src/store/chatStore.ts:[2m105:47[22m[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/11]⎯[22m[39m
|
||||
|
||||
[31m⎯⎯⎯⎯⎯⎯[1m[7m Failed Tests 10 [27m[22m⎯⎯⎯⎯⎯⎯⎯[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22msetCurrentModel[2m > [22mshould update current model
|
||||
[31m[1mAssertionError[22m: expected 'glm-5' to be 'gpt-4' // Object.is equality[39m
|
||||
|
||||
Expected: [32m"g[7mpt-4[27m"[39m
|
||||
Received: [31m"g[7mlm-5[27m"[39m
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m272:34[22m[39m
|
||||
[90m270| [39m
|
||||
[90m271| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m272| [39m [34mexpect[39m(state[33m.[39mcurrentModel)[33m.[39m[34mtoBe[39m([32m'gpt-4'[39m)[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m273| [39m })[33m;[39m
|
||||
[90m274| [39m })[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mnewConversation[2m > [22mshould clear messages and reset session
|
||||
[31m[1mAssertionError[22m: expected 'old-session' to be null[39m
|
||||
|
||||
[32m- Expected:[39m
|
||||
null
|
||||
|
||||
[31m+ Received:[39m
|
||||
"old-session"
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m293:32[22m[39m
|
||||
[90m291| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m292| [39m [34mexpect[39m(state[33m.[39mmessages)[33m.[39m[34mtoEqual[39m([])[33m;[39m
|
||||
[90m293| [39m [34mexpect[39m(state[33m.[39msessionKey)[33m.[39m[34mtoBeNull[39m()[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m294| [39m [34mexpect[39m(state[33m.[39misStreaming)[33m.[39m[34mtoBe[39m([35mfalse[39m)[33m;[39m
|
||||
[90m295| [39m [34mexpect[39m(state[33m.[39mcurrentConversationId)[33m.[39m[34mtoBeNull[39m()[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mnewConversation[2m > [22mshould save current messages to conversations before clearing
|
||||
[31m[1mAssertionError[22m: expected 0 to be greater than 0[39m
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m312:42[22m[39m
|
||||
[90m310| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m311| [39m [90m// Conversation should be saved[39m
|
||||
[90m312| [39m [34mexpect[39m(state[33m.[39mconversations[33m.[39mlength)[33m.[39m[34mtoBeGreaterThan[39m([34m0[39m)[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m313| [39m [34mexpect[39m(state[33m.[39mconversations[[34m0[39m][33m.[39mmessages[[34m0[39m][33m.[39mcontent)[33m.[39m[34mtoBe[39m([32m'Test me[39m…
|
||||
[90m314| [39m })[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mswitchConversation[2m > [22mshould switch to existing conversation
|
||||
[31m[1mTypeError[22m: Cannot read properties of undefined (reading 'id')[39m
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m338:66[22m[39m
|
||||
[90m336| [39m })[33m;[39m
|
||||
[90m337| [39m
|
||||
[90m338| [39m [35mconst[39m firstConvId [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m.[39mconversations[[34m0[39m][33m.[39mid[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m339| [39m
|
||||
[90m340| [39m [90m// Switch back to first conversation[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mdeleteConversation[2m > [22mshould delete conversation by id
|
||||
[31m[1mTypeError[22m: Cannot read properties of undefined (reading 'id')[39m
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m362:61[22m[39m
|
||||
[90m360| [39m [34mnewConversation[39m()[33m;[39m
|
||||
[90m361| [39m
|
||||
[90m362| [39m [35mconst[39m convId [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m.[39mconversations[[34m0[39m][33m.[39mid[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m363| [39m [34mexpect[39m(useChatStore[33m.[39m[34mgetState[39m()[33m.[39mconversations)[33m.[39m[34mtoHaveLength[39m([34m1[39m)[33m;[39m
|
||||
[90m364| [39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mdeleteConversation[2m > [22mshould clear messages if deleting current conversation
|
||||
[31m[1mAssertionError[22m: expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal [][39m
|
||||
|
||||
[32m- Expected[39m
|
||||
[31m+ Received[39m
|
||||
|
||||
[32m- Array [][39m
|
||||
[31m+ Array [[39m
|
||||
[31m+ Object {[39m
|
||||
[31m+ "content": "Test",[39m
|
||||
[31m+ "id": "msg-1",[39m
|
||||
[31m+ "role": "user",[39m
|
||||
[31m+ "timestamp": 2026-04-05T09:57:37.097Z,[39m
|
||||
[31m+ },[39m
|
||||
[31m+ ][39m
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m400:30[22m[39m
|
||||
[90m398| [39m
|
||||
[90m399| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m400| [39m [34mexpect[39m(state[33m.[39mmessages)[33m.[39m[34mtoEqual[39m([])[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m401| [39m [34mexpect[39m(state[33m.[39msessionKey)[33m.[39m[34mtoBeNull[39m()[33m;[39m
|
||||
[90m402| [39m [34mexpect[39m(state[33m.[39mcurrentConversationId)[33m.[39m[34mtoBeNull[39m()[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22msetCurrentAgent[2m > [22mshould update current agent
|
||||
[31m[1mAssertionError[22m: expected { id: '1', name: 'ZCLAW', …(4) } to deeply equal { id: 'agent-2', …(5) }[39m
|
||||
|
||||
[32m- Expected[39m
|
||||
[31m+ Received[39m
|
||||
|
||||
[2m Object {[22m
|
||||
[32m- "color": "bg-blue-500",[39m
|
||||
[32m- "icon": "A",[39m
|
||||
[32m- "id": "agent-2",[39m
|
||||
[32m- "lastMessage": "Hello",[39m
|
||||
[32m- "name": "New Agent",[39m
|
||||
[31m+ "color": "bg-gradient-to-br from-orange-500 to-red-500",[39m
|
||||
[31m+ "icon": "🦞",[39m
|
||||
[31m+ "id": "1",[39m
|
||||
[31m+ "lastMessage": "发送消息开始对话",[39m
|
||||
[31m+ "name": "ZCLAW",[39m
|
||||
[2m "time": "",[22m
|
||||
[2m }[22m
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m421:34[22m[39m
|
||||
[90m419| [39m
|
||||
[90m420| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m421| [39m [34mexpect[39m(state[33m.[39mcurrentAgent)[33m.[39m[34mtoEqual[39m(newAgent)[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m422| [39m })[33m;[39m
|
||||
[90m423| [39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22msetCurrentAgent[2m > [22mshould save current conversation when switching agents
|
||||
[31m[1mAssertionError[22m: expected [ { id: 'msg-1', role: 'user', …(2) } ] to deeply equal [][39m
|
||||
|
||||
[32m- Expected[39m
|
||||
[31m+ Received[39m
|
||||
|
||||
[32m- Array [][39m
|
||||
[31m+ Array [[39m
|
||||
[31m+ Object {[39m
|
||||
[31m+ "content": "Test message",[39m
|
||||
[31m+ "id": "msg-1",[39m
|
||||
[31m+ "role": "user",[39m
|
||||
[31m+ "timestamp": 2026-04-05T09:57:37.103Z,[39m
|
||||
[31m+ },[39m
|
||||
[31m+ ][39m
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m447:48[22m[39m
|
||||
[90m445| [39m
|
||||
[90m446| [39m [90m// Messages should be cleared for new agent[39m
|
||||
[90m447| [39m [34mexpect[39m(useChatStore[33m.[39m[34mgetState[39m()[33m.[39mmessages)[33m.[39m[34mtoEqual[39m([])[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m448| [39m })[33m;[39m
|
||||
[90m449| [39m })[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22msyncAgents[2m > [22mshould sync agents from profiles
|
||||
[31m[1mAssertionError[22m: expected [ { id: '1', name: 'ZCLAW', …(4) } ] to have a length of 2 but got 1[39m
|
||||
|
||||
[32m- Expected[39m
|
||||
[31m+ Received[39m
|
||||
|
||||
[32m- 2[39m
|
||||
[31m+ 1[39m
|
||||
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m461:28[22m[39m
|
||||
[90m459| [39m
|
||||
[90m460| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m461| [39m [34mexpect[39m(state[33m.[39magents)[33m.[39m[34mtoHaveLength[39m([34m2[39m)[33m;[39m
|
||||
[90m | [39m [31m^[39m
|
||||
[90m462| [39m [34mexpect[39m(state[33m.[39magents[[34m0[39m][33m.[39mname)[33m.[39m[34mtoBe[39m([32m'Agent One'[39m)[33m;[39m
|
||||
[90m463| [39m [34mexpect[39m(state[33m.[39magents[[34m1[39m][33m.[39mname)[33m.[39m[34mtoBe[39m([32m'Agent Two'[39m)[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/11]⎯[22m[39m
|
||||
|
||||
[31m[1m[7m FAIL [27m[22m[39m tests/store/chatStore.test.ts[2m > [22mchatStore[2m > [22mconversation persistence[2m > [22mshould derive title from first user message
|
||||
[31m[1mTypeError[22m: Cannot read properties of undefined (reading 'title')[39m
|
||||
[36m [2m❯[22m tests/store/chatStore.test.ts:[2m648:37[22m[39m
|
||||
[90m646| [39m
|
||||
[90m647| [39m [35mconst[39m state [33m=[39m useChatStore[33m.[39m[34mgetState[39m()[33m;[39m
|
||||
[90m648| [39m [34mexpect[39m(state[33m.[39mconversations[[34m0[39m][33m.[39mtitle)[33m.[39m[34mtoContain[39m([32m'This is a long m[39m…
|
||||
[90m | [39m [31m^[39m
|
||||
[90m649| [39m [34mexpect[39m(state[33m.[39mconversations[[34m0[39m][33m.[39mtitle[33m.[39mlength)[33m.[39m[34mtoBeLessThanOrEqual[39m(…
|
||||
[90m650| [39m })[33m;[39m
|
||||
|
||||
[31m[2m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/11]⎯[22m[39m
|
||||
|
||||
[2m Test Files [22m [1m[31m2 failed[39m[22m[2m | [22m[1m[32m7 passed[39m[22m[90m (9)[39m
|
||||
[2m Tests [22m [1m[31m10 failed[39m[22m[2m | [22m[1m[32m174 passed[39m[22m[2m | [22m[33m1 skipped[39m[90m (185)[39m
|
||||
[2m Start at [22m 17:56:49
|
||||
[2m Duration [22m 47.19s[2m (transform 1.84s, setup 57.03s, collect 16.08s, tests 1.32s, environment 222.17s, prepare 10.17s)[22m
|
||||
|
||||
|
After Width: | Height: | Size: 390 KiB |
|
After Width: | Height: | Size: 417 KiB |
|
After Width: | Height: | Size: 395 KiB |
|
After Width: | Height: | Size: 390 KiB |
|
After Width: | Height: | Size: 511 KiB |
|
After Width: | Height: | Size: 396 KiB |
BIN
docs/archive/old-test-reports/test-screenshots/07-team-page.png
Normal file
|
After Width: | Height: | Size: 346 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 380 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 64 KiB |