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
重构所有代码和文档中的项目名称,将OpenFang统一更新为ZCLAW。包括: - 配置文件中的项目名称 - 代码注释和文档引用 - 环境变量和路径 - 类型定义和接口名称 - 测试用例和模拟数据 同时优化部分代码结构,移除未使用的模块,并更新相关依赖项。
542 lines
16 KiB
Markdown
542 lines
16 KiB
Markdown
# ZCLAW 项目系统性深度分析报告 v2
|
||
|
||
> **分析日期:** 2026-03-21
|
||
> **分析范围:** 代码结构、架构设计、技术栈、业务逻辑、数据流、性能安全
|
||
|
||
---
|
||
|
||
## 一、项目概览
|
||
|
||
### 1.1 项目定位
|
||
|
||
ZCLAW 是一个基于 ZCLAW 的中文优先 AI Agent 桌面客户端,采用 **Tauri 2.0 (Rust + React 19)** 架构,目标对标智谱 AutoClaw 和腾讯 QClaw。
|
||
|
||
### 1.2 技术栈全景
|
||
|
||
| 层级 | 技术选型 | 成熟度 |
|
||
|------|----------|--------|
|
||
| 桌面框架 | Tauri 2.0 (Rust + React 19) | ✅ 合理 |
|
||
| 前端 | React 19 + TailwindCSS 4 + Zustand 5 + Framer Motion + Lucide | ✅ 现代 |
|
||
| 后端通信 | WebSocket (Gateway Protocol v3) + Tauri Commands | ✅ 完整 |
|
||
| 状态管理 | Zustand (13 个 Store) + Facade Pattern | ⚠️ 过度拆分但已收敛 |
|
||
| 配置格式 | TOML | ✅ 用户友好 |
|
||
| 测试 | Vitest + Playwright | ✅ 覆盖较好 |
|
||
| 依赖 | 精简 (React 19, Zustand 5, Tauri 2) | ✅ 轻量 |
|
||
|
||
### 1.3 规模数据
|
||
|
||
| 维度 | 数量 |
|
||
|------|------|
|
||
| 前端组件 | 50+ .tsx 文件 |
|
||
| Lib 工具 | 40+ 文件 |
|
||
| Store 文件 | 13 个 Zustand stores |
|
||
| 类型定义 | 13 个类型文件 |
|
||
| Skills | 68 个 SKILL.md |
|
||
| Hands | 7 个 HAND.toml |
|
||
| Rust 模块 | 8 个主要模块 |
|
||
| 测试文件 | 15+ 测试文件 |
|
||
|
||
---
|
||
|
||
## 二、架构深度分析
|
||
|
||
### 2.1 整体架构图
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ React UI Layer │
|
||
│ ChatArea, Sidebar, HandsPanel, WorkflowEditor, TeamView... │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ Zustand State Layer │
|
||
│ chatStore, connectionStore, agentStore, handStore, workflowStore│
|
||
│ configStore, securityStore, sessionStore, teamStore... │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ Client Layer │
|
||
│ GatewayClient │ IntelligenceClient │ TeamClient │ BrowserClient │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ Tauri IPC / WebSocket │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ Rust Backend │
|
||
│ browser │ intelligence │ memory │ llm │ viking │ secure_storage │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
↕
|
||
ZCLAW Kernel / OpenViking
|
||
```
|
||
|
||
### 2.2 前端架构分析
|
||
|
||
#### 2.2.1 组件层 (desktop/src/components/)
|
||
|
||
**组件分类:**
|
||
|
||
| 类别 | 组件数 | 代表组件 |
|
||
|------|--------|----------|
|
||
| 聊天/对话 | 8 | ChatArea, ConversationList, MessageSearch |
|
||
| Agent/Clone | 6 | CloneManager, AgentOnboardingWizard, PersonalitySelector |
|
||
| 自动化 Hands | 10 | HandsPanel, HandList, HandParamsForm, HandApprovalModal |
|
||
| 工作流 | 4 | WorkflowList, WorkflowEditor, WorkflowHistory |
|
||
| 团队协作 | 5 | TeamList, TeamCollaborationView, DevQALoop |
|
||
| 记忆/智能 | 6 | MemoryPanel, MemoryGraph, ActiveLearningPanel, ReflectionLog |
|
||
| 安全/审计 | 5 | SecurityLayersPanel, SecurityStatus, AuditLogsPanel |
|
||
| 浏览器自动化 | 8 | BrowserHandCard, ScreenshotPreview, TaskTemplateModal |
|
||
| 设置 | 12 | SettingsLayout, General, ModelsAPI, MCPServices... |
|
||
| UI 基础组件 | 15 | Button, Card, Input, Badge, Toast, EmptyState... |
|
||
|
||
**评价:** ✅ 组件职责划分清晰,分类合理
|
||
|
||
#### 2.2.2 状态管理层 (desktop/src/store/)
|
||
|
||
**13 个 Zustand Stores:**
|
||
|
||
| Store | 职责 | 状态 |
|
||
|-------|------|------|
|
||
| chatStore | 聊天消息、会话管理 | ✅ 活跃 |
|
||
| connectionStore | Gateway 连接状态 | ✅ 活跃 |
|
||
| agentStore | Clone/Agent 管理 | ✅ 活跃 |
|
||
| handStore | Hands/Triggers/Approvals | ✅ 活跃 |
|
||
| workflowStore | 工作流管理 | ✅ 活跃 |
|
||
| configStore | 配置/渠道/技能/模型 | ✅ 活跃 |
|
||
| securityStore | 安全状态/审计日志 | ✅ 活跃 |
|
||
| sessionStore | 会话管理 | ✅ 活跃 |
|
||
| teamStore | 团队协作 | ✅ 活跃 |
|
||
| skillMarketStore | 技能市场 | ✅ 活跃 |
|
||
| memoryGraphStore | 记忆图谱 | ✅ 活跃 |
|
||
| activeLearningStore | 主动学习 | ✅ 活跃 |
|
||
| browserHandStore | 浏览器自动化 | ✅ 活跃 |
|
||
|
||
**gatewayStore.ts 门面模式:**
|
||
- 从 1800+ 行缩减到 352 行
|
||
- 作为向后兼容的 facade 层
|
||
- 标记为 `@deprecated`,推荐使用领域 Store
|
||
|
||
**评价:** ✅ Store 架构已统一,拆分合理
|
||
|
||
#### 2.2.3 通信层 (desktop/src/lib/)
|
||
|
||
**核心客户端:**
|
||
|
||
| 客户端 | 规模 | 职责 |
|
||
|--------|------|------|
|
||
| gateway-client.ts | 65KB | WebSocket/REST 通信、认证、心跳 |
|
||
| intelligence-client.ts | ~15KB | 记忆/心跳/反思/身份统一API |
|
||
| team-client.ts | ~8KB | Team API REST 客户端 |
|
||
| browser-client.ts | ~5KB | 浏览器自动化客户端 |
|
||
| autonomy-manager.ts | ~15KB | L4 分层授权系统 |
|
||
|
||
**GatewayClient 核心功能:**
|
||
- ✅ WebSocket 连接管理(自动重连、心跳)
|
||
- ✅ REST API 降级(ZCLAW 模式)
|
||
- ✅ Ed25519 设备认证
|
||
- ✅ 流式响应处理(chatStream)
|
||
- ✅ 事件订阅机制
|
||
|
||
**问题:**
|
||
- ⚠️ 文件过大(65KB),职责过重
|
||
- ⚠️ 部分方法过长(如 handleZCLAWStreamEvent 100+ 行)
|
||
|
||
### 2.3 Rust 后端架构分析
|
||
|
||
#### 2.3.1 模块组织 (desktop/src-tauri/src/)
|
||
|
||
```
|
||
lib.rs (入口)
|
||
├── viking_commands.rs # OpenViking CLI sidecar
|
||
├── viking_server.rs # OpenViking 本地服务器管理
|
||
├── memory/ # 内存提取和上下文构建
|
||
│ ├── extractor.rs # LLM 驱动的记忆提取
|
||
│ ├── context_builder.rs # L0/L1/L2 分层上下文
|
||
│ └── persistent.rs # SQLite 持久化
|
||
├── llm/ # LLM 接口(Doubao/OpenAI/Anthropic)
|
||
├── browser/ # 浏览器自动化(Fantoccini)
|
||
├── secure_storage.rs # OS Keyring/Keychain
|
||
├── memory_commands.rs # 持久化内存命令
|
||
└── intelligence/ # 智能层(已从前端迁移)
|
||
├── heartbeat.rs # 心跳引擎
|
||
├── compactor.rs # 上下文压缩
|
||
├── reflection.rs # 反思引擎
|
||
└── identity.rs # Agent 身份管理
|
||
```
|
||
|
||
#### 2.3.2 状态管理模式
|
||
|
||
**Tauri State 注入:**
|
||
```rust
|
||
// 使用 Arc<Mutex<T>> 包装
|
||
pub struct BrowserState {
|
||
client: Arc<RwLock<BrowserClient>>,
|
||
}
|
||
|
||
// Tauri 命令中使用 State 管理
|
||
#[tauri::command]
|
||
async fn browser_navigate(
|
||
state: State<'_, BrowserState>,
|
||
url: String,
|
||
) -> Result<String, String>
|
||
```
|
||
|
||
**评价:** ✅ 线程安全,模式合理
|
||
|
||
#### 2.3.3 SQLite 持久化
|
||
|
||
**数据库架构:**
|
||
```sql
|
||
CREATE TABLE memories (
|
||
id TEXT PRIMARY KEY,
|
||
agent_id TEXT NOT NULL,
|
||
memory_type TEXT NOT NULL,
|
||
content TEXT NOT NULL,
|
||
importance INTEGER DEFAULT 5,
|
||
source TEXT DEFAULT 'auto',
|
||
tags TEXT DEFAULT '[]',
|
||
conversation_id TEXT,
|
||
created_at TEXT NOT NULL,
|
||
last_accessed_at TEXT NOT NULL,
|
||
access_count INTEGER DEFAULT 0,
|
||
embedding BLOB
|
||
);
|
||
-- 索引: agent_id, memory_type, created_at, importance
|
||
```
|
||
|
||
**评价:** ✅ 结构清晰,有索引优化
|
||
|
||
#### 2.3.4 安全存储
|
||
|
||
**keyring crate 使用:**
|
||
- Windows: Credential Manager
|
||
- macOS: Keychain
|
||
- Linux: libsecret
|
||
|
||
**评价:** ✅ 符合安全最佳实践
|
||
|
||
---
|
||
|
||
## 三、技术栈分析
|
||
|
||
### 3.1 框架选型
|
||
|
||
| 框架 | 选择 | 评价 |
|
||
|------|------|------|
|
||
| 桌面框架 | Tauri 2.0 | ✅ 体积小(~10MB),性能好 |
|
||
| 前端框架 | React 19 | ✅ 最新特性,但未充分利用 |
|
||
| 状态管理 | Zustand 5 | ✅ 轻量、类型安全 |
|
||
| 样式 | TailwindCSS 4 | ✅ 原子化,开发效率高 |
|
||
| 动画 | Framer Motion | ✅ 声明式动画 |
|
||
| 桌面封装 | Tauri 2 | ✅ 成熟稳定 |
|
||
|
||
### 3.2 依赖管理
|
||
|
||
**package.json 关键依赖:**
|
||
```json
|
||
{
|
||
"dependencies": {
|
||
"@tauri-apps/api": "^2",
|
||
"react": "^19.1.0",
|
||
"zustand": "^5.0.11",
|
||
"framer-motion": "^12.36.0",
|
||
"lucide-react": "^0.577.0"
|
||
}
|
||
}
|
||
```
|
||
|
||
**Cargo.toml 关键依赖:**
|
||
```toml
|
||
[dependencies]
|
||
tauri = { version = "2", features = [] }
|
||
tokio = { version = "1", features = ["full"] }
|
||
sqlx = { version = "0.7", features = ["runtime-tokio", "sqlite"] }
|
||
fantoccini = "0.21" # Browser automation
|
||
keyring = "3" # Secure storage
|
||
```
|
||
|
||
**评价:** ✅ 依赖精简,版本稳定
|
||
|
||
---
|
||
|
||
## 四、业务逻辑分析
|
||
|
||
### 4.1 聊天功能实现
|
||
|
||
**消息流程:**
|
||
```
|
||
用户输入 → sendMessage()
|
||
→ 上下文压缩检查 (compactor.checkThreshold)
|
||
→ 记忆增强 (intelligenceClient.memory.search)
|
||
→ 添加用户消息
|
||
→ 创建流式占位消息
|
||
→ gatewayClient.chatStream()
|
||
→ 收集 tool/hand/workflow 事件
|
||
→ 流结束 → 提取记忆 (memory-extractor)
|
||
→ 触发反思 (intelligenceClient.reflection)
|
||
```
|
||
|
||
**评价:** ✅ 流程完整,异常处理充分
|
||
|
||
### 4.2 记忆系统实现
|
||
|
||
**记忆提取模式:**
|
||
1. **LLM 提取** - 使用 `llmExtract()` 语义提取
|
||
2. **规则提取** - 正则匹配模式
|
||
|
||
**记忆分类:**
|
||
- fact: 用户事实
|
||
- preference: 用户偏好
|
||
- lesson: 经验教训
|
||
- context: 上下文
|
||
- task: 任务
|
||
|
||
**分层上下文加载(L0/L1/L2):**
|
||
```
|
||
L0 (Quick Scan): 向量相似度搜索,返回概览
|
||
L1 (Standard): 加载 top 候选的 overview
|
||
L2 (Deep): 加载最相关项的完整内容
|
||
```
|
||
|
||
**评价:** ✅ 设计完善,已迁移到 Rust 后端
|
||
|
||
### 4.3 自主能力系统
|
||
|
||
**L4 分层授权:**
|
||
|
||
| 级别 | 自动内存保存 | 自动压缩 | 自动反思 |
|
||
|------|-------------|---------|---------|
|
||
| supervised | ❌ | ❌ | ❌ |
|
||
| assisted | ✅ | ✅ | ✅ |
|
||
| autonomous | ✅ | ✅ | ✅ |
|
||
|
||
**风险评估:**
|
||
- ACTION_RISK_MAP 定义每种操作的风险等级
|
||
- importanceMax + riskMax 双重判断
|
||
- 所有操作记录审计日志
|
||
|
||
**评价:** ✅ 授权机制完善
|
||
|
||
---
|
||
|
||
## 五、数据流与接口分析
|
||
|
||
### 5.1 整体数据流
|
||
|
||
```
|
||
用户操作 → React UI → Zustand Store → GatewayClient
|
||
↓
|
||
WebSocket / REST
|
||
↓
|
||
ZCLAW Kernel
|
||
↓
|
||
Skills / Hands 执行
|
||
```
|
||
|
||
### 5.2 Gateway Protocol v3
|
||
|
||
**消息类型:**
|
||
- req/res: 请求/响应模式
|
||
- event: 事件推送
|
||
- stream: 流式响应
|
||
|
||
**认证:** Ed25519 签名
|
||
|
||
### 5.3 Tauri Commands
|
||
|
||
**70+ Commands 分类:**
|
||
|
||
| 类别 | 命令数 | 示例 |
|
||
|------|--------|------|
|
||
| Browser | 18 | browser_navigate, browser_click, browser_screenshot |
|
||
| Memory | 12 | memory_store, memory_search, memory_stats |
|
||
| Intelligence | 15 | heartbeat_*, reflection_*, identity_* |
|
||
| Viking | 9 | viking_status, viking_find, viking_read |
|
||
| Gateway | 8 | gateway_start, gateway_stop, gateway_status |
|
||
| LLM | 3 | llm_complete |
|
||
|
||
**评价:** ✅ 接口粒度合理,类型安全
|
||
|
||
---
|
||
|
||
## 六、性能与安全分析
|
||
|
||
### 6.1 性能分析
|
||
|
||
#### 6.1.1 渲染性能
|
||
|
||
**虚拟滚动:** 已使用 react-window
|
||
|
||
**潜在问题:**
|
||
- ⚠️ 大量消息时可能 re-render
|
||
- ⚠️ 某些 Store selector 未优化
|
||
|
||
#### 6.1.2 网络性能
|
||
|
||
**WebSocket 心跳:**
|
||
- 间隔:30 秒
|
||
- 超时:10 秒
|
||
- 最大丢失:3 次
|
||
|
||
**问题:**
|
||
- ⚠️ 单 WebSocket 连接,复用机制可优化
|
||
|
||
#### 6.1.3 计算性能
|
||
|
||
**Token 估算:**
|
||
```rust
|
||
// CJK: ~1.5 tokens/字符
|
||
// ASCII: ~0.3 tokens/字符
|
||
```
|
||
|
||
**评价:** ✅ 算法合理
|
||
|
||
### 6.2 安全分析
|
||
|
||
#### 6.2.1 认证机制
|
||
|
||
**Ed25519 设备认证:** ✅ 安全
|
||
|
||
#### 6.2.2 敏感数据
|
||
|
||
**存储:**
|
||
- API Key: OS Keyring ✅
|
||
- Token: OS Keyring ✅
|
||
- Theme: localStorage ⚠️
|
||
|
||
**问题:**
|
||
- ⚠️ localStorage 仍用于部分前端配置
|
||
- ⚠️ 日志可能包含敏感信息
|
||
|
||
#### 6.2.3 输入验证
|
||
|
||
**SQL 注入:** ✅ 使用参数化查询
|
||
**XSS:** ⚠️ 需要确认输出转义
|
||
|
||
---
|
||
|
||
## 七、测试覆盖分析
|
||
|
||
### 7.1 测试文件分布
|
||
|
||
| 测试文件 | 覆盖范围 |
|
||
|----------|----------|
|
||
| autonomy-manager.test.ts | L4 授权逻辑 |
|
||
| agent-memory.test.ts | 记忆系统 |
|
||
| context-compactor.test.ts | 上下文压缩 |
|
||
| heartbeat-reflection.test.ts | 心跳和反思 |
|
||
| gatewayStore.test.ts | Store 状态 |
|
||
| chatStore.test.ts | 聊天逻辑 |
|
||
| teamStore.test.ts | 团队协作 |
|
||
| browserHandStore.test.ts | 浏览器手 |
|
||
| ws-client.test.ts | WebSocket 客户端 |
|
||
|
||
**评价:** ✅ 核心逻辑有覆盖,但可增加更多边界测试
|
||
|
||
### 7.2 E2E 测试
|
||
|
||
**Playwright 配置:** ✅ 已配置 chromium/chromium-headed
|
||
|
||
---
|
||
|
||
## 八、代码质量分析
|
||
|
||
### 8.1 大型文件
|
||
|
||
| 文件 | 规模 | 问题 |
|
||
|------|------|------|
|
||
| gateway-client.ts | 65KB | 职责过重 |
|
||
| gatewayStore.ts | 352行 | 已是 facade,仍偏大 |
|
||
|
||
### 8.2 技术债务
|
||
|
||
**TODO/FIXME:**
|
||
- intelligence/mod.rs: Phase 3 迁移中
|
||
- viking_commands.rs: 平台二进制解析
|
||
|
||
**Rust unsafe:**
|
||
- context_builder.rs: 多处 unwrap()
|
||
|
||
### 8.3 localStorage 使用
|
||
|
||
**仍在使用 localStorage 的模块:**
|
||
- intelligence-client.ts: 降级模式
|
||
- skill-discovery.ts: 技能索引缓存
|
||
- agent-swarm.ts: 蜂群历史
|
||
- gateway-api.ts: 主题等配置
|
||
|
||
---
|
||
|
||
## 九、分析维度评分
|
||
|
||
| # | 维度 | 评分 | 主要发现 |
|
||
|---|------|------|----------|
|
||
| 1 | 代码结构 | 4/5 | 组件划分清晰,文件组织合理 |
|
||
| 2 | 架构设计 | 4/5 | 分层清晰,模块职责明确 |
|
||
| 3 | 技术选型 | 4/5 | 框架选择合理,依赖精简 |
|
||
| 4 | 业务实现 | 4/5 | 核心流程完整,异常处理充分 |
|
||
| 5 | 数据流设计 | 4/5 | 流向清晰,同步机制完善 |
|
||
| 6 | 接口设计 | 4/5 | Tauri Commands 粒度合理 |
|
||
| 7 | 性能表现 | 3/5 | 存在优化空间(re-render、WebSocket) |
|
||
| 8 | 安全合规 | 4/5 | 认证机制完善,部分数据需加强 |
|
||
| 9 | 测试覆盖 | 3/5 | 核心逻辑有覆盖,边界测试不足 |
|
||
| 10 | 文档质量 | 4/5 | 文档详尽,部分需更新 |
|
||
| 11 | 可维护性 | 4/5 | 架构清晰,部分大文件需重构 |
|
||
| 12 | 可扩展性 | 4/5 | Plugin 机制、Skills 系统完善 |
|
||
|
||
**综合评分:3.8 / 5.0**
|
||
|
||
---
|
||
|
||
## 十、关键问题清单
|
||
|
||
### 🔴 P0 - 需立即处理
|
||
|
||
1. **gateway-client.ts 过大** (65KB)
|
||
- 建议:拆分为 gateway-core.ts, gateway-ws.ts, gateway-rest.ts
|
||
|
||
2. **localStorage 降级风险**
|
||
- intelligence-client.ts 在非 Tauri 环境使用 localStorage
|
||
- 建议:统一使用 Rust 后端,移除 localStorage 降级
|
||
|
||
### 🟡 P1 - 应尽快处理
|
||
|
||
3. **Rust unwrap() 风险**
|
||
- context_builder.rs 多处 unsafe unwrap
|
||
- 建议:使用 expect() 并添加错误信息
|
||
|
||
4. **测试覆盖不足**
|
||
- E2E 测试不稳定
|
||
- 建议:增加边界测试,提高测试稳定性
|
||
|
||
### 🟢 P2 - 计划处理
|
||
|
||
5. **Store selector 优化**
|
||
- 避免不必要的 re-render
|
||
- 建议:使用 Zustand 的 shallow 比较
|
||
|
||
6. **WebSocket 连接池化**
|
||
- 当前单连接,可考虑连接池
|
||
- 建议:评估性能瓶颈后优化
|
||
|
||
---
|
||
|
||
## 十一、头脑风暴议题
|
||
|
||
详见 `BRAINSTORMING-SESSION.md`
|
||
|
||
---
|
||
|
||
## 十二、附录
|
||
|
||
### A. 关键文件索引
|
||
|
||
| 文件 | 位置 | 说明 |
|
||
|------|------|------|
|
||
| CLAUDE.md | 根目录 | 项目规范文档 |
|
||
| gateway-client.ts | desktop/src/lib/ | 核心通信客户端 |
|
||
| intelligence-client.ts | desktop/src/lib/ | 智能层统一 API |
|
||
| chatStore.ts | desktop/src/store/ | 聊天状态管理 |
|
||
| lib.rs | desktop/src-tauri/src/ | Rust 后端入口 |
|
||
| intelligence/ | desktop/src-tauri/src/ | 智能层 Rust 实现 |
|
||
| memory/ | desktop/src-tauri/src/ | 内存持久化 |
|
||
|
||
### B. 参考文档
|
||
|
||
- docs/analysis/ZCLAW-DEEP-ANALYSIS.md (2026-03-20)
|
||
- docs/features/00-architecture/
|
||
- docs/plans/INTELLIGENCE-LAYER-MIGRATION.md
|