# ZCLAW Tauri 端功能测试报告 **日期:** 2026-04-05 **测试环境:** Windows 11, Tauri 2.x, React 19, pnpm start:dev **测试方法:** UI 交互 + JS 注入探针 + localStorage/Store 数据验证 **测试人员:** Claude (自动化) --- ## 测试总结 | 模块 | 状态 | P0 | P1 | P2 | 备注 | |------|------|----|----|-----|------| | T1 聊天核心 | ⚠️ 部分通过 | 1 | 0 | 0 | LLM 500 错误导致消息发送失败 | | T2 会话管理 | ⚠️ 部分通过 | 0 | 1 | 0 | 消息持久化位置不明 | | T3 Agent 人格 | ⚠️ 部分通过 | 0 | 1 | 0 | 侧边栏切换 Bug | | T4 记忆系统 | ⚠️ 部分通过 | 0 | 0 | 1 | 记忆去重缺失 | | T5 自动化 | ✅ 通过 | 0 | 0 | 1 | 审计日志单一 | | T6 技能市场 | ✅ 通过 | 0 | 0 | 0 | 12 个技能正常 | | 登录系统 | ✅ 通过 | 0 | 0 | 0 | SaaS 登录正常 | | **总计** | | **1** | **2** | **2** | | --- ## 详细测试结果 ### 登录系统 ✅ 通过 **测试操作:** 1. 启动应用后显示 SaaS 登录页面(用户名/密码表单) 2. 输入 `admin / admin123`,点击登录 3. 登录成功,跳转到主聊天界面 **验证结果:** - [x] 登录页面正常渲染(表单、按钮、Logo) - [x] 用户名密码输入正常 - [x] SaaS 后端(8080 端口)响应正常 - [x] 登录成功后 `isLoggedIn` 状态更新 - [x] Cookie/Token 持久化到 localStorage(加密存储 `enc_zclaw-saas-token`) - [x] 会话恢复机制(`restoreSession`)存在 **状态数据:** ```json { "connectionMode": "saas", "saasUrl": "http://127.0.0.1:8080", "username": "admin", "tokenStorage": "encrypted (AES)" } ``` --- ### T1: 聊天核心功能 ⚠️ 部分通过 (P0 x1) **测试操作:** 1. 在 textarea 中输入测试消息 2. 通过 React nativeInputValueSetter 设置值并触发 input/change 事件 3. 点击发送按钮(aria-label="发送消息") 4. 等待 LLM 流式响应 **验证结果:** - [x] Textarea 输入框正常渲染,placeholder "今天我能为你做些什么?" - [x] React 受控组件输入正常(需用 nativeInputValueSetter) - [x] 发送按钮在空输入时 disabled,有内容时 enabled - [x] 消息发送后 textarea 自动清空 - [x] 思考模式(Thinking)已启用 - [x] 当前模型显示: `glm-4-flash` - [ ] **P0: LLM 响应 500 错误** — 发送消息后收到 `API error 500 Internal Server Error: {"error":"INTERNAL_ERROR","message":"服务内部错误"}` - [x] 历史消息中有成功回复("收到"),说明 LLM 调用链路本身是通的 **LLM 调用链路:** ``` 用户输入 → KernelClient → SaaS Relay (8080) → GLM API → 流式响应 ``` **错误日志:** ``` [KernelClient] Stream error: LLM error: API error 500 Internal Server Error ``` **流式存储状态:** ```json { "chatMode": "thinking" } ``` --- ### T2: 会话管理 ⚠️ 部分通过 (P1 x1) **测试操作:** 1. 查看侧边栏对话列表 2. 检查 localStorage 中的对话存储 **验证结果:** - [x] 侧边栏显示对话列表("你叫什么名字 — 2小时前5条消息") - [x] 对话搜索框存在(placeholder "搜索对话...") - [x] "新对话" 按钮存在(2个位置:顶部和主内容区) - [ ] **P1: 消息持久化位置不明** — `zclaw-chat-storage` 为 `{state:{}, version:0}`,但页面上能看到历史消息 - 消息可能存储在 IndexedDB 或内存中 - 刷新页面后消息是否能恢复未验证 **存储数据:** ```json { "zclaw-chat-storage": "{\"state\":{},\"version\":0}", "zclaw-stream-storage": "{\"state\":{\"chatMode\":\"thinking\"}}" } ``` --- ### T3: Agent 人格系统 ⚠️ 部分通过 (P1 x1) **测试操作:** 1. 检查 localStorage 中 Agent 身份数据 2. 点击侧边栏"智能体"按钮 3. 验证 CloneManager 组件是否渲染 **验证结果:** - [x] 5 个 Agent 身份存储在 `zclaw-agent-identities` - [x] 每个 Agent 有完整的三件套: `soul` + `instructions` + `userProfile` - [x] Soul 内容完整(ZCLAW 人格定义,含核心特质和语气) - [x] Instructions 完整(操作规范、记忆管理) - [x] UserProfile 初始状态:"尚未收集到用户偏好信息" - [ ] **P1: 侧边栏 "智能体" tab 切换失效** — 点击"智能体"按钮后: - 按钮样式变为 active(font-medium class 已添加) - 但内容区仍显示 ConversationList 而不是 CloneManager - `activeTab` 状态确实切换到了 'clones'(通过按钮样式确认) - **根因**: AnimatePresence mode="wait" 可能导致渲染问题,或 CloneManager 组件渲染失败 **Soul 内容示例:** ```markdown # ZCLAW 人格 你是 ZCLAW(小龙虾),一个基于 OpenClaw 定制的中文 AI 助手。 ## 核心特质 - **高效执行**: 你不只是出主意,你会真正动手完成任务 - **中文优先**: 默认使用中文交流,必要时切换英文 - **专业可靠**: 对技术问题给出精确答案,不确定时坦诚说明 - **持续成长**: 你会记住与用户的交互,不断改进自己的服务方式 ## 语气 简洁、专业、友好。避免过度客套,直接给出有用信息。 ``` **问题:** - 所有 5 个 Agent 共享相同的 Soul 模板(没有个性化差异) - 新创建的 Agent 没有独特的 personality/communicationStyle 设置 --- ### T4: 记忆系统 ⚠️ 部分通过 (P2 x1) **测试操作:** 1. 检查 `zclaw-intelligence-fallback`(本地降级记忆) 2. 检查 `zclaw-agent-memories`(Agent 记忆) 3. 检查 `zclaw-memory-stats`(记忆统计) 4. 检查 `zclaw-memory-graph`(记忆图谱过滤器) **验证结果:** - [x] Fallback 记忆: 4 条,存储在 localStorage - [x] Agent 记忆: 3 条任务类型记忆 - [x] 记忆统计: 4 entries, 1337 bytes - [x] 记忆图谱过滤器支持 5 种类型: fact/preference/lesson/context/task - [x] 记忆图谱有 minImportance 和 dateRange 过滤 - [ ] **P2: 记忆去重缺失** — 同一内容 "用户偏好: 不用进行人格设置么" 重复存储 4 次(ID 不同) - 时间戳递增说明是多次独立写入 - 缺少基于内容的去重检查 **记忆数据:** ``` Fallback 记忆 (4条): - mem_...a0s5z9: "用户偏好: 不用进行人格设置么" (preference) - mem_...pbx96r: "用户偏好: 不用进行人格设置么" (preference) ← 重复 - mem_...q6rqwo: "用户偏好: 不用进行人格设置么" (preference) ← 重复 - mem_...u8mger: "用户偏好: 不用进行人格设置么" (preference) ← 重复 Agent 记忆 (3条): - "帮我起草一份产品需求文档" (task) - "帮我写一个 Python 脚本处理 Excel 文件" (task) - "帮我梳理服饰公司的业务SOP" (task) ``` --- ### T5: 自动化系统 ✅ 通过 (P2 x1) **测试操作:** 1. 检查自主配置(`zclaw-autonomy-config`) 2. 检查反思引擎(`zclaw-reflection-*`) 3. 检查心跳系统(`zclaw-heartbeat-*`) 4. 检查审计日志(`zclaw-autonomy-audit-log`) 5. 点击"自动化"按钮,验证 Pipeline 列表 **验证结果:** - [x] 自主等级: `autonomous`(最高级别) - [x] 所有自主操作均已启用: - memoryAutoSave: true - identityAutoUpdate: true - skillAutoInstall: true - selfModification: true - autoCompaction: true - autoReflection: true - [x] 反思引擎配置完整: - 每 5 次对话触发 - 允许修改 Soul - 需要用户批准 - 支持 LLM 增强分析 - [x] 反思历史: 8 条记录 - [x] 反思状态: 距上次反思已过 2 次对话 - [x] 心跳系统: 已启用,30 分钟间隔,3 个检查项 - 待办任务检查 - 记忆健康检查 - 空闲问候 - [x] Pipeline 模板: 15 个,支持 7 个行业分类 - [x] 自动化面板 UI 渲染正常(Pipeline/Hands/Workflows 三个标签) - [ ] **P2: 审计日志单一** — 6 条日志全部是 `reflection_run`,没有 Hands 触发或技能执行记录 - 可能是因为没有触发过 Hands - 也可能是审计日志记录不完整 **Prompt Cache 验证:** ``` 已缓存 3 个 prompt 模板: - reflection: 反思引擎系统提示 - compaction: 上下文压缩提示 - extraction: 记忆提取提示 ``` --- ### T6: 技能市场 ✅ 通过 **测试操作:** 1. 检查 `zclaw-skill-index` 数据 2. 点击"技能市场"按钮 **验证结果:** - [x] 12 个技能已安装 - [x] 覆盖 8 个分类 - [x] 每个技能有 5-6 个触发器 - [x] 技能列表: | 技能 | 分类 | 触发器数 | |------|------|----------| | Code Review | development | 5 | | Frontend Developer | development | 6 | | Backend Architect | development | 5 | | Security Engineer | security | 5 | | Data Analysis | analytics | 5 | | Chinese Writing | content | 5 | | DevOps Automator | ops | 6 | | Senior PM | management | 5 | | Git Operations | development | 6 | | API Tester | testing | 5 | | Finance Tracker | business | 5 | | Social Media Strategist | marketing | 6 | --- ## 额外发现 ### 环境信息 | 项目 | 值 | |------|-----| | 运行时 | Tauri (桌面端) | | 连接模式 | SaaS relay | | SaaS 后端 | http://127.0.0.1:8080 (运行中) | | Dev Server | 端口 50051 (未监听) | | MCP 插件 | 端口 4000 (未监听) | | 当前模型 | glm-4-flash | | 用户 | admin | ### 已知但未测试的功能 - [ ] 新建对话流程(点击"新对话"后的完整流程) - [ ] 切换对话(点击侧边栏不同对话) - [ ] 删除对话 - [ ] 创建新 Agent(因 CloneManager 未渲染无法测试) - [ ] Agent 人格编辑 - [ ] 记忆搜索功能 - [ ] Pipeline 运行 - [ ] Hand 触发执行 - [ ] 技能安装/卸载 - [ ] 模型切换(点击 glm-4-flash 按钮) ### Dev Server 端口 50051 问题 `dev-server` feature 已添加到 `tauri:dev` 命令(本次测试中修改了 `desktop/package.json`),但重启后 50051 端口仍未监听。可能原因: 1. Cargo 需要重新编译才能识别新 feature(增量编译可能跳过) 2. `dev_server::start_dev_server()` 可能在绑定端口时失败但静默吞掉了错误 3. 需要完全重新构建:`cargo clean && pnpm start:dev` --- ## 缺陷清单 ### P0 (阻塞性) | ID | 模块 | 描述 | 复现步骤 | |----|------|------|----------| | P0-1 | T1 聊天 | SaaS relay 模式下 glm-4-flash 偶发 500 错误 | 发送消息后 LLM 返回 INTERNAL_ERROR | ### P1 (严重) | ID | 模块 | 描述 | 复现步骤 | |----|------|------|----------| | P1-1 | T3 Agent | 侧边栏"智能体"tab 切换后内容区不更新 | 点击"智能体"按钮 → 内容区仍显示对话列表 | | P1-2 | T2 会话 | 消息持久化位置不明确 | 检查 zclaw-chat-storage 为空,但页面有历史消息 | ### P2 (一般) | ID | 模块 | 描述 | 复现步骤 | |----|------|------|----------| | P2-1 | T4 记忆 | 记忆写入无去重 | 多次对话产生相同内容的重复记忆 | | P2-2 | T5 自动化 | 审计日志仅记录反思运行 | 无 Hands/技能执行日志 |