docs: audit reports + feature docs + skills + admin-v2 + config sync
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

Update audit tracker, roadmap, architecture docs,
add admin-v2 Roles page + Billing tests,
sync CLAUDE.md, Cargo.toml, docker-compose.yml,
add deep-research / frontend-design / chart-visualization skills

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
iven
2026-04-02 19:25:00 +08:00
parent 28299807b6
commit 8898bb399e
48 changed files with 7388 additions and 173 deletions

View File

@@ -3,7 +3,7 @@
> **分类**: 架构层
> **优先级**: P0 - 决定性
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-28
> **最后更新**: 2026-04-01
> **验证状态**: 代码已验证
---
@@ -20,10 +20,10 @@
| 优先级 | P0 |
| 成熟度 | L4 |
| 依赖 | Tauri Runtime 2.x |
| Tauri 命令数量 | **58+** (kernel 29 + pipeline 13 + viking 13 + llm 3) |
| Rust Crates | 11 个 (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, channels, saas) |
| Tauri 命令数量 | **175** (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4 + classroom 27) |
| Rust Crates | 10 个 (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, saas) |
| 连接模式 | 3 种 (Tauri Kernel / Gateway WebSocket / SaaS Cloud) |
| SaaS API 路由 | 76+ (Axum + PostgreSQL) |
| SaaS API 路由 | 58 (Axum + PostgreSQL, 10 模块 + 1 health) |
### 1.2 相关文件
@@ -367,4 +367,4 @@ try {
---
**最后更新**: 2026-03-28
**最后更新**: 2026-04-01

View File

@@ -3,7 +3,7 @@
> **分类**: 架构层
> **优先级**: P0 - 决定性
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-25
> **最后更新**: 2026-04-01
> **验证状态**: ✅ 代码已验证
---
@@ -20,32 +20,29 @@
| 优先级 | P0 |
| 成熟度 | L4 |
| 依赖 | 无 |
| Store 数量 | **18+** |
| Domains 数量 | 4 (chat, hands, intelligence, shared) |
| Store 数量 | **14** |
| Domains 数量 | 4 (chat, hands, intelligence, saas) |
| 匁久化策略 | localStorage + IndexedDB (计划中) |
### 1.2 Store 清单 (18+)
### 1.2 Store 清单 (14 个实际存在的 Store)
| Store | 路径 | 用途 | 验证状态 |
|------|------|------|---------|
| connectionStore | `desktop/src/store/connectionStore.ts` | 连接状态管理 | ✅ 存在 |
| chatStore | `desktop/src/store/chatStore.ts` | 消息和会话管理 | ✅ 存在 |
| configStore | `desktop/src/store/configStore.ts` | 配置持久化 | ✅ 存在 |
| agentStore | `desktop/src/store/agentStore.ts` | Agent 克隆管理 | ✅ 存在 |
| browserHandStore | `desktop/src/store/browserHandStore.ts` | Browser Hand 状态 | ✅ 存在 |
| chatStore | `desktop/src/store/chatStore.ts` | 消息和会话管理 (DeerFlow 视觉) | ✅ 存在 |
| configStore | `desktop/src/store/configStore.ts` | 配置持久化 | ✅ 存在 |
| connectionStore | `desktop/src/store/connectionStore.ts` | 连接状态管理 | ✅ 存在 |
| handStore | `desktop/src/store/handStore.ts` | Hands 触发管理 | ✅ 存在 |
| workflowStore | `desktop/src/store/workflowStore.ts` | 工作流管理 | ✅ 存在 |
| workflowBuilderStore | `desktop/src/store/workflowBuilderStore.ts` | 工作流构建器状态 | ✅ 存在 |
| teamStore | `desktop/src/store/teamStore.ts` | 团队协作管理 | ✅ 存在 |
| gatewayStore | `desktop/src/store/gatewayStore.ts` | Gateway 客户端状态 | ✅ 存在 |
| securityStore | `desktop/src/store/securityStore.ts` | 安全配置管理 | ✅ 存在 |
| sessionStore | `desktop/src/store/sessionStore.ts` | 会话持久化 | ✅ 存在 |
| memoryGraphStore | `desktop/src/store/memoryGraphStore.ts` | 记忆图谱状态 | ✅ 存在 |
| offlineStore | `desktop/src/store/offlineStore.ts` | 离线模式管理 | ✅ 存在 |
| activeLearningStore | `desktop/src/store/activeLearningStore.ts` | 主动学习状态 | ✅ 存在 |
| browserHandStore | `desktop/src/store/browserHandStore.ts` | Browser Hand 状态 | ✅ 存在 |
| skillMarketStore | `desktop/src/store/skillMarketStore.ts` | 技能市场状态 | ✅ 存在 |
| meshStore | `desktop/src/store/meshStore.ts` | 自适应智能网格状态 | ✅ 存在 |
| personaStore | `desktop/src/store/personaStore.ts` | Persona 演化状态 | ✅ 存在 |
| saasStore | `desktop/src/store/saasStore.ts` | SaaS 平台集成 (登录/配置/Prompt OTA) | ✅ 存在 |
| securityStore | `desktop/src/store/securityStore.ts` | 安全配置管理 | ✅ 存在 |
| sessionStore | `desktop/src/store/sessionStore.ts` | 会话持久化 | ✅ 存在 |
| workflowBuilderStore | `desktop/src/store/workflowBuilderStore.ts` | 工作流构建器状态 | ✅ 存在 |
| workflowStore | `desktop/src/store/workflowStore.ts` | 工作流管理 | ✅ 存在 |
> **注**: 以下 Store 在早期文档中出现但已被移除或合并: teamStore (多 Agent 功能 feature-gated), meshStore, personaStore (合并到 identity 系统), activeLearningStore, skillMarketStore, gatewayStore (功能合并到 connectionStore)
### 1.3 Domain Stores (领域状态)

View File

@@ -3,7 +3,7 @@
> **分类**: 架构层
> **优先级**: P0 - 决定性
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-16
> **最后更新**: 2026-04-01
---
@@ -11,7 +11,7 @@
### 1.1 基本信息
安全认证模块负责 ZCLAW 与 ZCLAW 之间的身份验证和凭证安全存储,支持 Ed25519 设备认证JWT 会话令牌。
安全认证模块负责 ZCLAW 的身份验证和凭证安全存储,支持 Ed25519 设备认证JWT 会话令牌、TOTP 2FA、HttpOnly Cookie 等多种安全机制
| 属性 | 值 |
|------|-----|
@@ -172,7 +172,34 @@ async function storeDeviceKeys(publicKey: string, privateKey: string) {
- [x] JWT Token 管理
- [x] 设备注册和审批
- [x] 跨平台支持
- [x] localStorage 降级
- [x] localStorage 降级 (AES-GCM 加密)
### 5.1.1 安全渗透测试 V1 修复 (2026-03-31)
> 整体评级: **B+** (良好) | 5 HIGH + 10 MEDIUM 全部已修复 | 12 个安全控制项全部 PASS
**SaaS 后端安全修复:**
- [x] JWT `password_version` 机制 — 密码修改自动使所有已签发 JWT 失效
- [x] 账户锁定 — 5 次登录失败后锁定 15 分钟
- [x] 邮箱验证 — RFC 5322 正则 + 254 字符长度限制
- [x] JWT 密钥保护 — `#[cfg(debug_assertions)]` 保护的 fallbackrelease 模式拒绝启动
- [x] TOTP 加密密钥独立化 — 生产环境强制 `ZCLAW_TOTP_ENCRYPTION_KEY` (64 hex)
- [x] TOTP/API Key 加密 — AES-256-GCM + 随机 Nonce
- [x] 密码存储 — Argon2id + OsRng 随机盐
- [x] Refresh Token 轮换 — 单次使用 + 撤销校验
**网络安全:**
- [x] Cookie 安全 — HttpOnly + Secure + SameSite=Strict + 路径作用域
- [x] CORS 白名单 — 生产强制白名单,缺失拒绝启动
- [x] 限流持久化 — PostgreSQL 滑动窗口,重启不丢失
- [x] XFF 信任链 — 仅信任配置的代理 IP
**前端安全:**
- [x] CSP 加固 — 移除 `unsafe-inline` script
- [x] Admin Token — HttpOnly Cookie 传递JS 不存储 token
- [x] Pipeline 日志脱敏 — Debug 日志截断 + 仅记录 keys
**详细报告**: [SECURITY_PENETRATION_TEST_V1.md](../SECURITY_PENETRATION_TEST_V1.md)
### 5.2 测试覆盖
@@ -194,11 +221,21 @@ async function storeDeviceKeys(publicKey: string, privateKey: string) {
## 六、演化路线
### 6.1 短期计划1-2 周)
### 6.1 已完成
- [x] TOTP 双因素认证 (AES-256-GCM 加密存储)
- [x] JWT password_version 密码修改使旧 token 失效
- [x] 账户锁定机制 (5 次失败 → 锁 15 分钟)
- [x] HttpOnly Cookie 认证模式
- [x] CSP 加固 (移除 unsafe-inline)
- [x] CORS 白名单强制
- [x] 限流持久化 (PostgreSQL)
### 6.2 短期计划1-2 周)
- [ ] 添加生物识别支持 (Touch ID / Windows Hello)
### 6.2 中期计划1-2 月)
### 6.3 中期计划1-2 月)
- [ ] 支持 FIDO2 硬件密钥
- [ ] 速率限制从 DashMap 迁移到 Redis (多实例部署)
### 6.3 长期愿景
- [ ] 去中心化身份 (DID)

View File

@@ -1,7 +1,7 @@
# 上下文压缩系统 (Context Compaction)
> **成熟度**: L3 - 成熟 (内核 AgentLoop 已集成,前端重复压缩已移除)
> **最后更新**: 2026-03-27
> **成熟度**: L4 - 生产 (内核 AgentLoop 已集成,前端重复压缩已移除)
> **最后更新**: 2026-04-01
> **负责人**: Intelligence Layer Team
## 概述

View File

@@ -3,9 +3,9 @@
> **分类**: Skills 生态
> **优先级**: P1 - 重要
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-25
> **最后更新**: 2026-04-01
> ✅ **实现更新**: Skills 动态扫描已实现。Kernel 集成了 `SkillRegistry`,支持通过 Tauri 命令 `skill_list` 和 `skill_refresh` 动态发现所有 **78+** 技能。**新增 `execute_skill` 工具**,允许 Agent 在对话中直接调用技能。
> ✅ **实现更新**: Skills 动态扫描已实现。Kernel 集成了 `SkillRegistry`,支持通过 Tauri 命令 `skill_list` 和 `skill_refresh` 动态发现所有 **75** 技能。**新增 `execute_skill` 工具**,允许 Agent 在对话中直接调用技能。
---
@@ -21,8 +21,8 @@ Skills 系统是 ZCLAW 的核心扩展机制,通过 SKILL.md 文件定义 Agen
| 优先级 | P1 |
| 成熟度 | L4 |
| 依赖 | SkillRegistry (Rust), SkillDiscoveryEngine (TypeScript) |
| SKILL.md 文件 | **78+** |
| **动态发现技能** | **78+ (100%)** |
| SKILL.md 文件 | **75** |
| **动态发现技能** | **75 (100%)** |
| **execute_skill 工具** | **✅ 已实现** |
| **Crate 完整度** | **80%** |
@@ -67,7 +67,7 @@ kernel_init()
| 文件 | 路径 | 用途 |
|------|------|------|
| 技能目录 | `skills/` | 69 个 SKILL.md |
| 技能目录 | `skills/` | 75 个 SKILL.md |
| Rust 注册中心 | `crates/zclaw-skills/src/registry.rs` | 技能注册和发现 |
| Rust 加载器 | `crates/zclaw-skills/src/loader.rs` | SKILL.md 解析 |
| Kernel 集成 | `crates/zclaw-kernel/src/kernel.rs` | Kernel 集成 SkillRegistry |
@@ -271,7 +271,7 @@ const collaborationTriggers = [
| 指标 | 基线 | 目标 | 当前 |
|------|------|------|------|
| 技能数量 | 0 | 50+ | 69 |
| 技能数量 | 0 | 50+ | 75 |
| 发现准确率 | 0% | 80% | 75% |
| 技能使用率 | 0% | 60% | 50% |
@@ -281,9 +281,9 @@ const collaborationTriggers = [
### 5.1 已实现功能
- [x] 78+ SKILL.md 技能定义
- [x] 75 SKILL.md 技能定义
- [x] 标准化模板
- [x] 发现引擎 (动态扫描 78+ 技能)
- [x] 发现引擎 (动态扫描 75 技能)
- [x] 触发词匹配
- [x] 协作规则
- [x] Playbooks 集成

View File

@@ -1,5 +1,6 @@
# 智能技能路由系统
> **最后更新**: 2026-04-01
> **设计目标**: 让 ZCLAW 能智能地理解用户意图,自动选择和调用合适的技能,而不是依赖硬编码的触发词。
---
@@ -58,7 +59,7 @@
┌─────────────────────────────────────────────────────────────────┐
│ Skill Registry │
│ - 77 个技能的元数据 │
│ - 75 个技能的元数据 │
│ - 描述、能力、示例 │
│ - 向量索引 │
└─────────────────────────────────────────────────────────────────┘
@@ -398,7 +399,7 @@ fn build_skill_aware_system_prompt(&self, base_prompt: Option<&String>) -> Strin
| **SQLite + vec** | 持久化简单 |
| **Qdrant/Chroma** | 大规模需要过滤 |
**推荐**: 对于 77 个技能内存 HashMap 足够
**推荐**: 对于 75 个技能内存 HashMap 足够
---

View File

@@ -3,7 +3,7 @@
> **分类**: Hands 系统
> **优先级**: P1 - 重要
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-25
> **最后更新**: 2026-04-01
> **验证状态**: ✅ 代码已验证
> ✅ **实现状态更新**: 11 个 Hands 中有 **9 个** 已有完整 Rust 后端实现。所有 9 个已实现 Hands 均已在 Kernel 中注册并可通过 `hand_execute` 命令调用。

View File

@@ -3,7 +3,7 @@
> **分类**: Tauri 后端
> **优先级**: P0 - 决定性
> **成熟度**: L4 - 生产
> **最后更新**: 2026-03-29
> **最后更新**: 2026-04-01
> **验证状态**: 代码已验证
> **架构**: 内部 Kernel无需外部进程
@@ -21,8 +21,8 @@ ZCLAW Tauri 后端是桌面应用的核心,集成内部 ZCLAW Kernel提供
| 优先级 | P0 |
| 成熟度 | L4 |
| 依赖 | Tauri Runtime 2.x, zclaw-kernel crate |
| Tauri 命令总数 | **130+** (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4) |
| Rust Crates | 11 个 (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, channels, saas) |
| Tauri 命令总数 | **175** (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4 + classroom 27) |
| Rust Crates | 10 个 (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, saas) |
### 1.2 相关文件
@@ -59,7 +59,6 @@ ZCLAW Tauri 后端是桌面应用的核心,集成内部 ZCLAW Kernel提供
+-----------+---------+----------+----------+---------+
|
zclaw-saas (独立运行, Axum + PostgreSQL)
zclaw-channels (L5: 通道适配, 规划中)
```
### 2.2 各 Crate 职责
@@ -70,13 +69,12 @@ ZCLAW Tauri 后端是桌面应用的核心,集成内部 ZCLAW Kernel提供
| zclaw-memory | L2 | SQLite 存储层 | Session 持久化, KV Store, Schema 管理 |
| zclaw-runtime | L3 | LLM 运行时 | 4 个 Driver (Anthropic/OpenAI/Gemini/Local), 5 个内置工具, AgentLoop, LoopGuard, Compaction |
| zclaw-kernel | L4 | 核心协调 | Agent 注册/调度, EventBus, SkillRegistry, HandRegistry (11 Hands), TriggerManager, Approval |
| zclaw-skills | L5 | 技能系统 | SKILL.md 解析, 70 个技能, PromptOnly/Python/Shell 三种模式 |
| zclaw-skills | L5 | 技能系统 | SKILL.md 解析, 76 个技能, PromptOnly/Python/Shell 三种模式 |
| zclaw-hands | L5 | 自主能力 | Hand trait, 11 个 Hand (9 启用: Browser/Slideshow/Speech/Quiz/Whiteboard/Researcher/Collector/Clip/Twitter; 2 禁用: Predictor/Lead) |
| zclaw-protocols | L5 | 协议支持 | MCP (stdio transport), A2A (基础协议定义) |
| zclaw-pipeline | L5 | 工作流 DSL | YAML 声明式, 状态管理, 5 类模板 |
| zclaw-growth | L5 | 记忆增长 | SqliteStorage + FTS5 + TF-IDF + MemoryExtractor |
| zclaw-saas | 独立 | SaaS 后端 | Axum + PostgreSQL, 9 个模块, 76+ API 路由 |
| zclaw-channels | L5 | 通道适配器 | ConsoleChannel (测试) |
| zclaw-saas | 独立 | SaaS 后端 | Axum + PostgreSQL, 10 个模块, 58 API 路由 |
### 2.3 核心工具实现
@@ -435,4 +433,4 @@ Embedding Providers: OpenAI, Zhipu, Doubao, Qwen, DeepSeek, Local/TF-IDF
---
**最后更新**: 2026-03-29
**最后更新**: 2026-04-01

View File

@@ -1,7 +1,7 @@
# Pipeline DSL 系统
> **版本**: v0.4.0
> **更新日期**: 2026-03-25
> **版本**: v0.10.0
> **更新日期**: 2026-04-01
> **状态**: ✅ 完整实现 (90% 完整度)
> **架构**: Rust 后端 (zclaw-pipeline crate) + React 前端
> **Crate 完整度**: **90%**

View File

@@ -1,6 +1,6 @@
# ZCLAW SaaS 平台 — 总览
> 最后更新: 2026-03-31 | 实施状态: Phase 1-4 全部完成 + 架构重构完成,9 个后端模块 + Worker + Scheduler + Admin V2 (Ant Design Pro) + 桌面端完整集成
> 最后更新: 2026-04-01 | 实施状态: Phase 1-4 全部完成 + 架构重构完成,10 个后端模块 + Worker + Scheduler + Admin V2 (Vite + Ant Design Pro) + 桌面端完整集成
## 架构概述
@@ -48,9 +48,10 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力包括模型中转Key
| Prompt OTA | 100% | 8 | 模板 + 版本管理 + OTA 批量检查 + 版本回滚 + 不可变版本历史 |
| Agent 模板 | 100% | 5 | 模板 CRUD + tools/capabilities/model 绑定 + 可见性控制 |
| 遥测 (Telemetry) | 100% | 4 | 批量 Token 用量上报 + 模型聚合统计 + 每日统计 + 审计摘要 |
| 定时任务 (Scheduled Task) | 100% | 2 | 用户定时任务 CRUD (创建/列表/更新/删除)30s 轮询执行 |
| **Worker 系统** | 100% | — | 5 个 Worker (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used)mpsc 异步调度,自动重试 |
| **声明式 Scheduler** | 100% | — | TOML 配置定时任务,灵活间隔 (30s/5m/1h/1d)run_on_start内置 DB 清理 |
| **合计** | — | **76+** | — |
| **合计** | — | **58** | — |
## API 端点一览
@@ -149,6 +150,12 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力包括模型中转Key
- `GET /api/v1/telemetry/daily` — 每日使用量聚合 (按设备去重)
- `POST /api/v1/telemetry/audit` — 批量审计日志摘要 (仅动作类型和计数)
### 定时任务 (Scheduled Task)
- `POST /api/scheduler/tasks` — 创建定时任务 (支持 cron/interval 两种调度模式)
- `GET /api/scheduler/tasks` — 列出当前用户的定时任务
- `PATCH /api/scheduler/tasks/:id` — 更新定时任务 (名称/调度/启用状态)
- `DELETE /api/scheduler/tasks/:id` — 删除定时任务
## 安全特性
| 特性 | 实现 |
@@ -240,6 +247,7 @@ llm_routing=local:
| `src/prompt/` | Prompt 模板 + 版本管理 + OTA 检查 + 回滚 |
| `src/agent_template/` | Agent 模板 CRUD + 可见性控制 |
| `src/telemetry/` | Token 用量上报 + 模型统计 + 每日统计 + 审计摘要 |
| `src/scheduled_task/` | 用户定时任务 CRUD (创建/列表/更新/删除) + 30s 轮询执行 |
| `src/workers/` | Worker 系统 (5 Worker: log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used) |
| `src/scheduler.rs` | 声明式 Scheduler (TOML 定时任务配置 + DB 清理任务) |
| `migrations/` | SQL 迁移文件 (Schema v6, TIMESTAMPTZ) |
@@ -282,4 +290,4 @@ llm_routing=local:
---
**最后更新**: 2026-03-31
**最后更新**: 2026-04-01

View File

@@ -0,0 +1,347 @@
# ZCLAW SaaS + Tauri 系统性功能审计报告 V10
> 审计日期: 2026-03-31
> 审计范围: SaaS 后端 (68 路由/22 表) + Tauri 桌面端 (107 命令/13 Store) + admin-v2 管理后台 (14 服务/11 页面)
> 审计方法: 静态代码分析 + 数据流追踪 + 交叉索引
> 修复状态: P0 已修复, P1 已处理, P2 已处理
---
## 1. 执行摘要
### 1.1 整体完成度
| 层级 | 总数 | 活跃 | 未使用 | 利用率 |
|------|------|------|--------|-------|
| SaaS 路由 | 92 | 84 | 8 | **91.3%** |
| Tauri 命令 | 107 | 79 | 28 | **73.8%** |
| Zustand Store | 13 | 13 | 0 | **100%** |
| admin-v2 服务 | 14 | 14 | 0 | **100%** |
### 1.2 问题统计
| 严重级别 | 数量 | 描述 |
|---------|------|------|
| **P0 (阻塞)** | 1 | trigger_update 参数不匹配导致所有 Trigger 更新失效 |
| **P1 (严重)** | 3 | sessionStore 无 Kernel 适配器、定时任务执行器为 stub、配置同步未传播到 kernel |
| **P2 (高)** | 5 | 8 个孤立路由、2 个写而不读 DB 表、Workflow→Pipeline 元数据丢失、Role 管理无 admin 页面、8+ 个 saas-admin 方法无消费者 |
| **P3 (中)** | 6 | CleanupRateLimitWorker stub、CacheKey 死代码、pipeline-client 缺少 probe 检测、GET 请求无速率限制、SSRF DNS 失败不阻断、connectionStore 客户端切换未重新注入 |
| **P4 (低)** | 4 | 7 个 @deprecated TS 标记、a2a feature-gated 代码、ScheduledTaskRow 部分字段、director.rs 休眠代码 |
---
## 2. 功能交叉索引
### 2.1 SaaS 路由 ↔ 前端消费者映射
#### 路由状态分布
| 状态 | 数量 | 说明 |
|------|------|------|
| CONNECTED (两端消费) | 27 | SaaS 路由同时被 desktop 和 admin-v2 调用 |
| DESKTOP_ONLY | 31 | 仅桌面端消费(含 auth、role、device 等) |
| ADMIN_ONLY | 16 | 仅 admin-v2 消费(含 key 管理、prompt 写操作等) |
| ORPHANED | 8 | 无前端消费者 |
| INTERNAL | 1 | health 端点 |
#### 8 个孤立路由(无前端消费者)
| 路由 | 模块 | 建议 |
|------|------|------|
| `GET /api/v1/providers/:id/models` | model_config | 可通过 `GET /api/v1/models?provider_id=X` 替代,考虑移除 |
| `GET /api/v1/config/items/:id` | migration | 无单条配置查询需求,考虑移除 |
| `DELETE /api/v1/config/items/:id` | migration | 无删除配置 UI考虑移除或添加到 admin-v2 |
| `GET /api/v1/config/analysis` | migration | 配置分析功能未接入,添加到 admin-v2 或移除 |
| `POST /api/v1/config/seed` | migration | 配置种子引导未接入,内部工具保留 |
| `GET /api/v1/config/sync-logs` | migration | 同步日志查询无 UI添加到 admin-v2 Config 页面 |
| `GET /api/v1/roles/:id/permissions` | role | 角色权限查询无消费者,整合到角色管理 UI |
| `GET /api/scheduler/tasks/:id` | scheduled_task | 单条任务查询无消费者 |
#### 按模块路由覆盖度
| 模块 | 路由数 | Connected | Desktop Only | Admin Only | Orphaned |
|------|-------|-----------|-------------|------------|----------|
| auth | 9 | 3 | 5 | 1 | 0 |
| account | 12 | 5 | 6 | 0 | 0 |
| model_config | 14 | 9 | 3 | 0 | 1 |
| relay | 9 | 2 | 3 | 4 | 0 |
| migration | 11 | 1 | 5 | 0 | 4 |
| role | 11 | 0 | 10 | 0 | 1 |
| prompt | 10 | 3 | 1 | 5 | 0 |
| agent_template | 7 | 1 | 1 | 4 | 0 |
| scheduled_task | 5 | 0 | 4 | 0 | 1 |
| telemetry | 4 | 0 | 2 | 2 | 0 |
| health | 1 | - | - | - | 1 (internal) |
### 2.2 Tauri 命令 ↔ 前端调用映射
#### 28 个未使用命令
| 分类 | 命令 | 原因 |
|------|------|------|
| **遗留 Gateway (11)** | zclaw_status/start/stop/restart/local_auth/prepare_for_tauri/approve_device_pairing/doctor/process_list/process_logs/version + zclaw_health_check + zclaw_ping | Gateway 已被 Kernel 替代,全部遗留代码 |
| **LLM 内部 (3)** | llm_complete, embedding_create, embedding_providers | 后端内部使用,非前端直接调用 |
| **Agent 导出导入 (2)** | agent_export, agent_import | 后端已实现,前端 UI 未接入 |
| **Kernel 管理 (1)** | kernel_shutdown | 无关闭路径 |
| **Hand (1)** | hand_run_cancel | 取消单次运行未接入 UI |
| **定时任务 (2)** | scheduled_task_create, scheduled_task_list | 整个模块未使用 |
| **Pipeline (1)** | pipeline_templates | 模板列表未接入 |
| **Viking (2)** | viking_add_with_metadata, viking_store_with_summaries | 高级存储功能未接入 |
| **Memory (2)** | memory_configure_embedding, memory_is_embedding_configured | 已有 viking 命令替代 |
| **Context (1)** | estimate_content_tokens | 已有 compactor 命令替代 |
---
## 3. 核心数据流追踪
### 3.1 聊天流 + 记忆提取 (BREAK-02 验证)
**结论: PARTIALLY WORKING — 前端正常,后端缺失**
| 层级 | 记忆提取 | 状态 |
|------|---------|------|
| 前端 (chatStore.ts:509) | `onComplete` 回调调用 `getMemoryExtractor().extractFromConversation()` | **WORKING** |
| Rust (intelligence_hooks.rs:50-108) | 仅调用 `reflect()`,不调用 `extract_and_store_memories()` | **NO extraction** |
| Rust Tauri 命令 (lib.rs:204-205) | 仅注册为手动命令 | **Manual only** |
**影响**: 桌面用户通过前端回调正常工作。但任何绕过前端直接调用 Tauri 命令的路径(如 headless/gateway relay将缺失记忆提取。
**建议**: 在 `post_conversation_hook` 中添加可选的 `extract_and_store_memories` 调用,或在文档中明确说明设计意图。
### 3.2 Hand 触发 + 审批 (BREAK-03 验证)
**结论: CONFIRMED WORKING**
kernel.rs:1118-1193 的 `respond_to_approval` 实现:
- 状态更新为 "approved"
- `tokio::spawn` 创建后台任务
- 调用 `hands.execute(&hand_id, &context, input).await` 执行 Hand
- 更新 HandRun 结果和 approval 状态为 "completed"/"failed"
BREAK-03 **不是问题**,审批后自动执行机制完整。
### 3.3 Agent CRUD 一致性
**结论: INTENTIONAL GAP — 设计意图**
| 路径 | Create | Read | Update | Delete | Export/Import |
|------|--------|------|--------|--------|--------------|
| Kernel (Tauri) | ✅ | ✅ | ✅ | ✅ | ✅ |
| Gateway (REST) | ✅ | ✅ | ✅ | ✅ | ❌ |
| SaaS | 仅 template | 仅 template | 仅 template | 仅 template | ❌ |
SaaS 仅存储 agent 模板(蓝图),运行时 Agent 是本地状态,由 Kernel/Gateway 管理。这是正确的架构决策。
### 3.4 配置同步流
**结论: PARTIALLY WORKING**
| 方向 | 路径 | 状态 |
|------|------|------|
| SaaS → localStorage | `pullConfig()``localStorage.setItem()` | ✅ WORKING |
| localStorage → SaaS | `syncConfig()` + dirty tracking | ✅ WORKING |
| localStorage → Kernel | 无传播机制 | ❌ **GAP** |
**影响**: SaaS 同步的配置仅影响前端 UI 设置(如主题),不会传播到运行中的 Rust kernel。kernel 从磁盘 TOML 读取配置,与 localStorage 无关。
---
## 4. 差距模式分析
### 4.1 "写了没接" — 代码存在但未接入
| ID | 项目 | 文件 | 严重性 |
|----|------|------|--------|
| WNC-01 | CleanupRateLimitWorker (空 stub) | `crates/zclaw-saas/src/workers/cleanup_rate_limit.rs` | P3 |
| WNC-02 | 定时任务执行器 (仅状态管理,无实际执行) | `crates/zclaw-saas/src/scheduler.rs:134-192` | P1 |
| WNC-03 | Role 管理 (无 admin-v2 页面) | `admin-v2/src/` 无 roles 服务/页面 | P2 |
| WNC-04 | Agent export/import (前端未接入) | `desktop/src-tauri/src/kernel_commands/agent.rs:213-235` | P4 |
| WNC-05 | pipeline_templates 命令 (无调用) | `desktop/src-tauri/src/pipeline_commands/presentation.rs` | P4 |
### 4.2 "接了没传" — 接口不匹配
| ID | 项目 | 文件 | 严重性 | 详情 |
|----|------|------|--------|------|
| **MSH-01** | **trigger_update 参数不匹配** | `trigger.rs:183` vs `kernel-triggers.ts:92` | **P0** | **前端发 `{id, updates: {name, enabled, handId}}` 嵌套结构Rust 期望 `{id, name, enabled, hand_id}` 扁平参数。所有 trigger 更新实际为 no-op** |
| MSH-02 | Workflow→Pipeline 元数据丢失 | `workflowStore.ts:379-502` | P2 | 丢失 category/industry/tags/icon/version/author 等字段 |
### 4.3 "传了没存" — 数据接收但未持久化
| ID | 项目 | 文件 | 严重性 |
|----|------|------|--------|
| PTS-01 | 定时任务执行结果 | `scheduler.rs:134-192` | P1 |
### 4.4 "存了没用" — 写入但无读路径
| ID | 表 | 写入位置 | 读路径 | 严重性 |
|----|-----|---------|--------|--------|
| SUN-01 | `prompt_sync_status` | `prompt/service.rs:272` | **无** | P2 |
| SUN-02 | `config_sync_log` | `migration/service.rs:425` | 有 handler 但 handler 本身孤立 | P2 |
### 4.5 "双系统不同步" — SaaS vs Tauri 功能差异
| 领域 | Gateway | Kernel | SaaS | 差距性质 |
|------|---------|--------|------|---------|
| Agent CRUD | REST | invoke | 仅 template | **INTENTIONAL** |
| Session | REST | ❌ 无命令 | ❌ 无路由 | sessionStore 无 Kernel 适配器 |
| Trigger | REST | invoke | ❌ 无路由 | 仅本地,不同步 |
| Browser | ❌ | invoke | ❌ 无路由 | Tauri-only 特性 |
| Pipeline | ❌ | invoke | ❌ 无路由 | Tauri-only 特性 |
| Role 管理 | ❌ | ❌ | REST | 仅 desktop 消费,无 admin UI |
---
## 5. 安全审计
### 5.1 安全控制验证(全部 PASS
| 控制项 | 状态 | 证据 |
|--------|------|------|
| JWT secret 管理 | ✅ | debug 模式 fallbackrelease 模式强制要求环境变量 (`config.rs:236-248`) |
| SSRF 防护 | ✅ | 多层验证主机名黑名单、DNS 解析检查、私有 IP 段、混淆防护 (`relay/service.rs:452-565`) |
| 速率限制 | ✅ | 公开端点分级限流 (login 5/min, register 3/hour)、认证端点 RPM 限制 (`middleware.rs:56-162`) |
| Relay 认证 | ✅ | `relay:use` 权限检查 (`relay/handlers.rs:24`)、key pool 隔离 |
| 请求体大小限制 | ✅ | MAX_BODY_BYTES = 1MB (`relay/handlers.rs:47-50`) |
| IP 提取安全 | ✅ | 不信任 X-Forwarded-For仅从 TCP 层获取 (`middleware.rs:133-138`) |
### 5.2 安全注意事项
| 项 | 严重性 | 说明 |
|----|--------|------|
| GET 请求无速率限制 | P3 | GET 免于限流 (middleware.rs:62),可被利用但 GET 无副作用 |
| SSRF DNS 失败不阻断 | P3 | DNS 解析失败时不阻断请求 (service.rs:530-533),存在窄 TOCTOU 窗口 |
| sessionStore 类型不安全转换 | P3 | `setSessionStoreClient` 无条件 cast 为 GatewayClient (sessionStore.ts:225-228) |
---
## 6. Store 适配器一致性
| Store | Gateway 适配器 | Kernel 适配器 | SaaS 适配器 | 问题 |
|-------|---------------|-------------|------------|------|
| connectionStore | ✅ | ✅ | ✅ | P3: 客户端切换后未重新注入其他 store |
| chatStore | ✅ (via conn) | ✅ (via conn) | ✅ (relay) | 无 |
| agentStore | ✅ | ✅ | ❌ | 无 |
| handStore | ✅ | ✅ | ❌ | P3: fallback 为 stub client |
| workflowStore | ✅ | ✅ | ❌ | P2: Pipeline→Workflow 元数据丢失 |
| configStore | ✅ | ✅ | ✅ | 无 |
| securityStore | ✅ | ✅ | ❌ | 无 |
| **sessionStore** | ✅ | **❌** | ❌ | **P1: 无 Kernel 适配器Tauri 模式下 session 失效** |
| saasStore | ❌ | ❌ | ✅ | 无 (SaaS 专用) |
| memoryGraphStore | ❌ | ✅ (invoke) | ❌ | 无 |
| browserHandStore | ❌ | ✅ (invoke) | ❌ | P3: Tauri-only 特性 |
| offlineStore | ✅ (via conn) | ✅ (via conn) | ❌ | 无 |
| workflowBuilderStore | ❌ | ❌ | ❌ | 纯本地存储 |
---
## 7. 死代码审计
### 7.1 已验证的假阳性AUDIT_TRACKER V9 纠正)
| ID | 项目 | 实际状态 |
|----|------|---------|
| DEAD-01 | PromptInjector | **活跃** — 在 zclaw-runtime/growth.rs 和 viking_commands.rs 中使用 |
| DEAD-02 | MemoryRetriever | **活跃** — 在 zclaw-runtime/growth.rs 和 create_growth_system() 中使用 |
| DEAD-03 | GrowthTracker | **活跃** — 在 zclaw-runtime/growth.rs 和 create_growth_system() 中使用 |
| DEAD-04 | director.rs (897 行) | **Feature-gated** — multi-agent 特性,默认不编译 |
| DEAD-05 | saas-admin.ts Role 方法 | **确认死代码** — 8+ 个方法无前端消费者 |
### 7.2 真正的死代码
| 项目 | 文件 | 说明 |
|------|------|------|
| 11 个 Gateway 命令 | `desktop/src-tauri/src/gateway/commands.rs` | Gateway 已被 Kernel 替代 |
| 8+ Role/Permission 方法 | `desktop/src/lib/saas-admin.ts:183-220` | 完整实现但无调用者 |
| CacheKey 结构体 | `crates/zclaw-growth/src/retrieval/cache.rs:22` | 整个结构体从未使用 |
| CleanupRateLimitWorker | `crates/zclaw-saas/src/workers/cleanup_rate_limit.rs` | 空 stub |
---
## 8. 优先修复清单
### P0 — 阻塞(已修复 ✅)
| ID | 问题 | 文件 | 修复方案 | 状态 |
|----|------|------|---------|------|
| MSH-01 | trigger_update 参数不匹配 | `trigger.rs:183` / `kernel-triggers.ts:92` | Rust 端改为接受 `{ id, updates: {...} }` 结构体,匹配前端格式 | ✅ 已修复 |
### P1 — 严重(已处理 ✅)
| ID | 问题 | 文件 | 修复方案 | 状态 |
|----|------|------|---------|------|
| WNC-02 | 定时任务执行器为 stub | `scheduler.rs:134-192` | 添加 TODO(STUB) 标注 + 运行时 warn 日志 | ✅ 已标注 |
| GAP-01 | sessionStore 无 Kernel 适配器 | `sessionStore.ts:225-228` | 添加类型检测KernelClient 使用 stub 适配器 | ✅ 已修复 |
| GAP-02 | 配置同步未传播到 kernel | `saasStore.ts:528-531` | 评估为设计意图SaaS 配置为 UI-only`llm_routing` 通过 account data 已传播 | ✅ 确认设计意图 |
### P2 — 高(下个迭代)
| ID | 问题 | 修复方案 |
|----|------|---------|
| ORPHAN | 8 个孤立路由 | 评估移除或添加 admin-v2 UI |
| SUN-01 | prompt_sync_status 写而不读 | 添加 admin 读路径或移除表 |
| SUN-02 | config_sync_log 写而不读 | 添加 admin-v2 Config 页面 tab |
| MSH-02 | Pipeline→Workflow 元数据丢失 | 扩展 Workflow 类型或标注忽略字段 |
| ADMIN-01 | Role 管理无 admin 页面 | 添加 admin-v2 角色管理页面 |
| DEAD-05 | 8+ saas-admin 方法无消费者 | 接入 UI 或移除 |
### P3 — 中(后续迭代)
| ID | 问题 | 修复方案 |
|----|------|---------|
| STUB-01 | CleanupRateLimitWorker 空实现 | 移除或实现 |
| DEAD-06 | CacheKey 死结构体 | 移除 |
| GAP-03 | pipeline-client 缺少 probe 检测 | 复用 kernel-client 的 probeTauriAvailability |
| GAP-04 | connectionStore 切换后未重新注入 store | 在 connect() 后重新调用 initializeStores() |
| SEC-01 | GET 请求无速率限制 | 监控 GET 量,必要时添加 |
| SEC-02 | SSRF DNS 失败不阻断 | 考虑 DNS 失败时阻断请求 |
### P4 — 低(维护时处理)
| ID | 问题 |
|----|------|
| CLEANUP-01 | 11 个遗留 Gateway 命令移除 |
| CLEANUP-02 | 7 个 @deprecated TS 标记清理 |
| CLEANUP-03 | 4 个 CANDIDATE 级 dead_code 评估 |
| FEATURE-01 | Agent export/import 前端接入 |
| FEATURE-02 | multi-agent (director.rs) 激活准备 |
---
## 9. 验证命令
```bash
# 编译验证
cargo build -p zclaw-saas
# TypeScript 类型检查
cd desktop && pnpm tsc --noEmit
# admin-v2 类型检查
cd admin-v2 && pnpm tsc --noEmit
# Rust 测试
cargo test -p zclaw-saas
# 搜索 trigger_update 不匹配 (P0 验证)
grep -n "trigger_update" desktop/src-tauri/src/kernel_commands/trigger.rs desktop/src/lib/kernel-triggers.ts
# 搜索孤立路由 (P2 验证)
grep -rn "config/analysis\|config/seed\|config/sync-logs" desktop/src/ admin-v2/src/
# 搜索写而不读表 (P2 验证)
grep -rn "prompt_sync_status" crates/zclaw-saas/src/ --include="*.rs"
```
---
## 10. 审计方法总结
本次审计使用了以下技术:
1. **交叉索引** — 92 条 SaaS 路由 × 107 个 Tauri 命令 × 14 个 admin 服务 全量匹配
2. **数据流追踪** — 4 条核心业务流端到端追踪聊天、Agent CRUD、Hand 审批、配置同步)
3. **差距模式扫描** — 5 种已知差距模式逐一验证
4. **安全面审计** — JWT/SSRF/rate-limit/auth 中间件逐项检查
5. **死代码检测**`#[allow(dead_code)]` + `#[deprecated]` + 无引用代码全量扫描
6. **接口一致性** — Tauri 命令签名 vs 前端 invoke 参数逐个比对
总审计代码量:~150,000 行 Rust + ~45,000 行 TypeScript + ~8,000 行 SQL

View File

@@ -0,0 +1,214 @@
# ZCLAW 第三轮全面审计报告
> **审计日期**: 2026-04-02
> **基线**: V11 全面审计 + 深度二次审计 + Sprint 1-4 修复
> **方法**: 5 维并行审计(前端状态一致性、数据库 Schema、API 契约、并发安全、代码质量)
> **完成代理**: 前端状态一致性1/5其余 4 维因 API 限流由主线程直接执行
---
## 1. 前端状态一致性 + 内存泄漏审计(代理完成)
### HIGH
| ID | 问题 | 文件 | 描述 |
|----|------|------|------|
| AUD3-FE-01 | **chatStore.sendMessage 无并发保护** | `chatStore.ts:403-675` | `isStreaming` 仅在 UI 层守卫store 函数本身无互斥。快速双击可在 React re-render 前触发两次发送,导致双重 assistant placeholder + stream 竞态 |
| AUD3-FE-02 | **SaaS client token refresh 无并发锁** | `saas-client.ts:217-229` | 多个并发请求同时收到 401 时,各自独立调用 `refreshToken()`,导致多次 refresh 请求。应使用 refresh mutex共享 Promise |
### MEDIUM
| ID | 问题 | 文件 | 描述 |
|----|------|------|------|
| AUD3-FE-03 | initializeStores 可能被调用 3 次 | `connectionStore.ts:415,589` + `index.ts:99` | 模块加载 + connect() 双路径,异步操作中切换 client 可能导致请求失败 |
| AUD3-FE-04 | window 全局变量存储 interval | `App.tsx:257-258` | `@ts-expect-error` + `window.__ZCLAW_STATS_SYNC_INTERVAL__`React StrictMode 双重 mount 时第一个 interval 无法清理 |
| AUD3-FE-05 | GatewayClient mixin 25+ 处 `as any` | `gateway-heartbeat.ts` 等 | prototype 动态方法通过 `as any` 绕过类型检查,属性名拼写错误无编译时报警 |
| AUD3-FE-06 | PropertyPanel 17 处 `as any` 访问联合类型 | `PropertyPanel.tsx:100-276` | WorkflowNodeData 联合类型的字段直接 `as any` 访问,节点类型不匹配时 undefined |
### LOW
| ID | 问题 | 文件 |
|----|------|------|
| AUD3-FE-07 | offlineStore 全局变量存储 timer多次调用可能泄漏 | `offlineStore.ts:87-88` |
| AUD3-FE-08 | agentStore 一次性读取 chatStore 可能读到中间态 | `agentStore.ts:254` |
| AUD3-FE-09 | retryAllMessages 无并发锁,可能重复发送 | `offlineStore.ts:188-233` |
### POSITIVE FINDINGS做得好的地方
- **无 Store 循环依赖**: 依赖方向是单向树状结构
- **事件监听器清理完善**: classroomStore、useAutomationEvents、chatStore 的 listen 全部有 cleanup
- **React useEffect cleanup 规范**: ConnectionStatus、HandApprovalModal、SaaSStatus 全部正确清理
---
## 2. 数据库 Schema + Migration 审计(主线程执行)
### Migration 文件清单13 个)
| 编号 | 文件 | 内容 |
|------|------|------|
| 20260329-001 | initial_schema.sql | 21 个核心表 |
| 20260329-002 | seed_data.sql | 种子数据 |
| 20260330-001 | scheduled_tasks.sql | 定时任务表 |
| 20260331-001 | accounts_llm_routing.sql | LLM 路由字段 |
| 20260331-002 | agent_templates_extensions.sql | 模板扩展 |
| 20260401-001 | provider_keys_last_used.sql | key 最近使用时间 |
| 20260401-002 | remove_quota_reset_interval.sql | 移除配额重置 |
| 20260401-003 | models_is_embedding.sql | embedding 标记 |
| 20260401-004 | accounts_password_version.sql | 密码版本 |
| 20260401-005 | rate_limit_events.sql | 限流事件 |
| 20260402-001 | billing_tables.sql | 计费 5 表 |
| 20260402-002 | knowledge_base.sql | 知识库 5 表 |
| 20260402-003 | scheduled_task_results.sql | 任务结果列 |
### MEDIUM
| ID | 问题 | 描述 |
|----|------|------|
| AUD3-DB-01 | 无 down migration | 所有 migration 只有 UP无回滚脚本。生产环境需要回滚时只能手动操作 |
| AUD3-DB-02 | agent_template/service.rs:136 format! 构建 SQL | `format!("SELECT COUNT(*) FROM agent_templates {}", where_clause)``where_clause` 虽然是硬编码常量(非用户输入),但模式本身违反防御原则 |
### POSITIVE FINDINGS
- **编号连续无冲突**: 13 个 migration 编号连续
- **无 DELETE/UPDATE 缺少 WHERE**: 全量扫描确认所有写操作都有 WHERE 子句
- **仅 2 处 format! SQL**: `agent_template/service.rs``db.rs`,两者 where_clause/table 均为硬编码
- **zclaw-growth 和 zclaw-memory 无 migration 目录**: 使用代码内 schema 初始化SQLite
---
## 3. API 契约 + 错误恢复审计(主线程执行)
### HIGH
| ID | 问题 | 文件 | 描述 |
|----|------|------|------|
| AUD3-API-01 | **SaaS token refresh 并发竞态** | `saas-client.ts:217-229` | 多个并发请求同时收到 401各自独立调用 `refreshToken()`。无 `_refreshPromise` 或 mutex。refresh token 可能被第一个请求消耗,后续 refresh 请求失败(单次使用 token |
### MEDIUM
| ID | 问题 | 描述 |
|----|------|------|
| AUD3-API-02 | 前端错误处理不统一 | 部分 invoke() 调用用 try/catch + log静默部分直接 throw用户看到错误部分 fallback 默认值。无全局错误提示机制 |
| AUD3-API-03 | 37 处 `as any` 类型断言 | 前端大量绕过类型检查,重构时容易引入运行时错误 |
### POSITIVE FINDINGS
- **AbortController 使用规范**: `request-helper.ts` 有完整的 AbortController 管理Map<string, AbortController>),支持请求取消
- **认证端点跳过 refresh**: `_isAuthEndpoint()` 正确避免 login/register 端点的无限 refresh 循环
- **timeout 配置**: 所有 fetch 调用使用 `AbortSignal.timeout()`
---
## 4. 并发安全 + 资源管理审计(主线程执行)
### MEDIUM
| ID | 问题 | 文件 | 描述 |
|----|------|------|------|
| AUD3-CONC-01 | kernel_commands 每个命令单独获取 kernel_lock | `kernel_commands/*.rs` | 每个 Tauri 命令独立 `state.lock().await`,无嵌套锁获取。设计安全但串行化所有命令执行 |
| AUD3-CONC-02 | ~15 处 fire-and-forget tokio::spawn | `main.rs:108-151`, `relay/handlers.rs:389`, `scheduler.rs:62-140` | 无 JoinHandle无优雅停机。shutdown 时运行中的任务可能被截断 |
| AUD3-CONC-03 | approval polling 循环持有 kernel_lock | `approval.rs:96` | `kernel_state.lock().await` 在 sleep 循环中反复获取,每次循环释放后重新获取。设计安全但增加锁竞争 |
### POSITIVE FINDINGS
- **无嵌套锁获取**: 每个 kernel_command 只获取一个 MutexLock不存在 ABBA 死锁风险
- **DashMap 操作规范**: 所有 RefMut 在 `.await` 前释放(已确认)
- **CancellationToken 用于 SSE**: relay 的 SSE 流有取消机制
---
## 5. 代码质量审计(主线程执行)
### 统计数据
| 指标 | 数值 |
|------|------|
| Rust 测试总数 | 584 |
| 前端测试 | 0 (desktop) + 322 (admin-v2) |
| `as any` 使用 | 37 处 |
| `@ts-expect-error` | 3 处 |
| 未使用 Cargo 依赖 | 0已清理 hmac/sha1 |
| Feature gate 一致性 | 正确 |
| 编译警告 | 1 (private_interfaces) + 1 (sqlx future-incompat) |
---
## 6. 综合发现汇总
### 新增 HIGH需立即修复
| ID | 问题 | 影响 |
|----|------|------|
| AUD3-FE-01 | chatStore.sendMessage 无并发保护 | 快速双击导致双重发送 + stream 竞态 |
| AUD3-FE-02 / AUD3-API-01 | SaaS token refresh 无并发锁 | 并发 401 → 多次 refresh → refresh token 被消耗 → 后续请求全部失败 |
### 新增 MEDIUM
| ID | 问题 | 影响 |
|----|------|------|
| AUD3-FE-03 | initializeStores 可能调用 3 次 | 异步操作中 client 切换 |
| AUD3-FE-04 | window 全局变量存 interval | StrictMode 泄漏 |
| AUD3-FE-05 | 25+ 处 mixin `as any` | 类型安全缺口 |
| AUD3-FE-06 | PropertyPanel 17 处 `as any` | 联合类型不安全 |
| AUD3-DB-01 | 无 down migration | 生产回滚困难 |
| AUD3-DB-02 | format! SQL硬编码安全但模式差 | 防御性编程 |
| AUD3-API-02 | 前端错误处理不统一 | 用户体验不一致 |
| AUD3-CONC-02 | ~15 处 fire-and-forget spawn | 优雅停机问题 |
### 新增 LOW
| ID | 问题 |
|----|------|
| AUD3-FE-07 | offlineStore 全局变量存储 timer |
| AUD3-FE-08 | agentStore 读取中间态 |
| AUD3-FE-09 | retryAllMessages 无并发锁 |
| AUD3-CONC-03 | approval polling 增加锁竞争 |
---
## 7. 三轮审计累计发现总览
| 来源 | P0 | HIGH/P1 | MEDIUM/P2 | LOW/P3/P4 |
|------|-----|---------|-----------|-----------|
| V11 初次审计 | 0 | 3 | 14 | 13 |
| V11 深度二次 | 2 | 9 | 13 | 3 |
| V11 第三轮 | 0 | **2** | **8** | **4** |
| **合计(去重后)** | **2** | **14** | **35** | **20** |
### 已修复 vs 未修复
| 状态 | 数量 |
|------|------|
| **已修复** | 132 P0 + 8 P1 + 3 P2 |
| **未修复** | 40 |
### 未修复中按优先级排序的 TOP 10
1. **AUD3-FE-01**: chatStore.sendMessage 并发保护HIGH
2. **AUD3-FE-02/API-01**: token refresh mutexHIGH
3. **SEC2-P1-01**: FactStore trait 零实现P1
4. **SEC2-P1-08**: Desktop 前端零测试P1
5. **AUD3-FE-03**: initializeStores 重复调用MEDIUM
6. **AUD3-FE-05**: mixin 模式类型安全MEDIUM
7. **SEC2-P2-03**: sqlx-postgres 未来兼容性P2
8. **SEC2-P2-05**: ~10 处 tokio::spawn 未绑定P2
9. **AUD3-DB-01**: 无 down migrationMEDIUM
10. **SEC2-P1-01**: FactStore trait 零实现P1
---
## 8. 积极发现总结
三轮审计确认以下方面**设计良好、实现规范**
1. **无 Store 循环依赖** — 单向树状依赖结构
2. **事件监听器全部有 cleanup** — listen/unlisten 配对完整
3. **认证中间件全覆盖** — 公共/受保护/Relay 三层路由无遗漏
4. **SQL 参数化规范** — 除 2 处硬编码 format! 外全部使用 bind()
5. **Lock ordering 安全** — 无嵌套锁获取
6. **Feature gate 一致** — 传播链正确
7. **Admin API 100% 对齐** — 前后端路由完全匹配
8. **编译通过** — cargo check 仅 1 warning
9. **密码安全** — Argon2id + password_version + JWT 失效
10. **SSE 背压设计** — 有界 channel + 信号量 + CancellationToken

View File

@@ -1,7 +1,8 @@
# ZCLAW 审计追踪表 (V9)
# ZCLAW 审计追踪表 (V10)
> **创建日期**: 2026-03-29
> **审计版本**: V9
> **审计版本**: V11 + 深度二次审计
> **最后更新**: 2026-04-02
> **追踪规则**: 每个发现项记录状态变更,修复后需附验证方法
---
@@ -25,9 +26,9 @@
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|----|------|------|--------|---------|---------|
| DEAD-01 | PromptInjector 全文件死代码 | OPEN | - | - | 决策:接入或清理 |
| DEAD-02 | MemoryRetriever 全文件死代码 | OPEN | - | - | 决策:接入或清理 |
| DEAD-03 | GrowthTracker 全文件死代码 | OPEN | - | - | 决策:接入或清理 |
| DEAD-01 | PromptInjector 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| DEAD-02 | MemoryRetriever 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| DEAD-03 | GrowthTracker 全文件死代码 | **FALSE_POSITIVE** | - | 2026-04-01 | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| DEAD-05 | 39 个未调用 saas-client 方法 | OPEN | - | - | 评估是否需要桌面端入口 |
| DOC-01 | Tauri 命令数文档 58+ vs 实际 130 | OPEN | - | - | 更新 06-tauri-backend 文档 |
| DOC-02 | 智能层文档引用已删除模块 | OPEN | - | - | 更新 02-intelligence-layer 文档 |
@@ -64,3 +65,168 @@
| 2026-03-29 | BREAK-01 | OPEN → FIXED | extraction_adapter.rs 实现 TauriExtractionDriver桥接 Kernel LlmDriver 到 LlmDriverForExtraction trait |
| 2026-03-29 | CONF-01 | OPEN → PARTIALLY_FIXED | Worker 系统 + Scheduler 系统上线部分配置参数已消费relay 预留参数已标注 |
| 2026-03-29 | - | V9 审计创建 | 20 个发现项 |
| 2026-04-01 | DEAD-01 | OPEN → FALSE_POSITIVE | V10 确认: PromptInjector 已通过 PromptBuilder 重构接入,非死代码 |
| 2026-04-01 | DEAD-02 | OPEN → FALSE_POSITIVE | V10 确认: MemoryRetriever 已通过 MemoryMiddleware 接入,非死代码 |
| 2026-04-01 | DEAD-03 | OPEN → FALSE_POSITIVE | V10 确认: GrowthTracker 已通过 GrowthIntegration 桥接接入,非死代码 |
| 2026-04-01 | - | V10 审计更新 | DEAD-01/02/03 确认为误报 |
| 2026-04-02 | BREAK-02 | OPEN → CLOSED | V11 确认: MemoryMiddleware.after_completion 正常触发记忆提取,非断链 |
| 2026-04-02 | BREAK-03 | OPEN → CLOSED | V11 确认: approval_respond 自动 spawn tokio task 执行 Hand非断链 |
| 2026-04-02 | BREAK-04 | OPEN → CLOSED | V11 确认: pipeline-complete 在 discovery.rs:165 emit前端有监听器 |
| 2026-04-02 | IFACE-01 | OPEN → CONFIRMED_P1 | trigger_update 前端发嵌套 updates 对象Rust 期望扁平参数,更新静默失败 |
| 2026-04-02 | - | V11 全面审计 | 22 项新发现3 P1 + 6 P2 + 8 P3 + 5 P43 项 V10 关闭 |
---
## V11 新增发现项 (2026-04-02)
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P1-01 | trigger_update 参数嵌套导致更新失败 | **IN_PROGRESS** | 修复前端(扁平参数) |
| V11-P1-02 | SaaS 配置同步不传播到 Rust Kernel | **IN_PROGRESS** | 立即修复完整链路 |
| V11-P1-03 | 3 个 SQL 表零读取 (prompt_sync_status, telemetry_reports, key_usage_window) | OPEN | grep SELECT FROM 在 SaaS crate |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P2-01 | saas-admin.ts 30 方法零消费者 | OPEN | grep 方法名在 desktop/src/ |
| V11-P2-02 | 7 个 Role/Permission 路由无前端消费者 | OPEN | admin-v2 无 roles service |
| V11-P2-03 | deprecated gateway-storage sync 方法仍被生产代码调用 | OPEN | gateway-client.ts:44,71,211 |
| V11-P2-04 | ToolDefinition 在 types 和 runtime 重复定义 | OPEN | 比较两个定义 |
| V11-P2-05 | 62 个 Tauri 命令无前端调用 | OPEN | 逐一 grep invoke 调用 |
| V11-P2-06 | migration SQL 查询缺少 LIMIT | OPEN | 检查 config_items SELECT |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P3-01 | audit-logger.ts 导出但零 import | OPEN | grep "from.*audit-logger" |
| V11-P3-02 | OFP 能力定义无消费者 | OPEN | grep OfpDiscover |
| V11-P3-03 | extract_structured_facts() deprecated 未移除 | OPEN | grep 调用者 |
| V11-P3-04 | SaaS knowledge 3 个 handler 返回空数据 | OPEN | admin-v2 Knowledge 测试 |
| V11-P3-05 | Director 912 行 feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P3-06 | 定时任务执行结果未持久化 | OPEN | scheduled_tasks schema |
| V11-P3-07 | secure-storage sync deprecated 零调用 | OPEN | grep 调用者 |
| V11-P3-08 | config 2 个预留参数未消费 | OPEN | grep batch_window_ms |
### P4: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| V11-P4-01 | ContentBlock 4 处定义(不同域) | OPEN | 比较各定义用途 |
| V11-P4-02 | Desktop ↔ Admin 13+ 类型名称不一致 | OPEN | 比对类型文件 |
| V11-P4-03 | 文档数字不一致 (Skills 76 vs 66/75/77) | OPEN | ls skills/ |
| V11-P4-04 | A2A/WASM feature-gated 未启用 | OPEN | Cargo.toml 检查 |
| V11-P4-05 | embedding 生成已禁用 | OPEN | generate_embedding.rs:92 |
---
## 深度二次审计新增发现 (2026-04-02)
### P0: 阻断级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P0-01 | skill_execute 空 context 反序列化崩溃 | **FIXED** | kernel-skills.ts — 填充空 context 字段 |
| SEC2-P0-02 | TaskTool::default() 调用 unimplemented!() | **FIXED** | task.rs — 移除 Default impl |
### P1: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P1-01 | FactStore trait 定义但全 workspace 无 impl | OPEN | grep "impl FactStore" crates/ |
| SEC2-P1-02 | agent-templates API 缺少 /api/v1 前缀 → 404 | **FIXED** | saas-client.ts — 添加 /api/v1 前缀 |
| SEC2-P1-03 | hand-execution-complete 无前端 listener| **FIXED** | kernel-hands.ts — 添加 onHandExecutionComplete listener |
| SEC2-P1-04 | InMemoryStorage 6 处 RwLock unwrap() 级联 panic | **FIXED** | viking_adapter.rs — 替换为 expect() |
| SEC2-P1-05 | HandRun 持久化错误 3 处静默忽略 | **FIXED** | approvals.rs — 添加 tracing::warn 日志 |
| SEC2-P1-06 | FTS 索引更新失败 3 处静默忽略 | **FIXED** | sqlite.rs — 添加 tracing::warn 日志 |
| SEC2-P1-07 | Worker dispatch 失败 4 处静默忽略 | **FIXED** | knowledge/handlers.rs — 替换为 if let Err 日志 |
| SEC2-P1-08 | Desktop 前端零测试覆盖 | OPEN | ls desktop/src/**/*.test.* |
| SEC2-P1-09 | record_key_usage 错误忽略 → 计费数据丢失 | **FIXED** | relay/service.rs — 添加 tracing::warn 日志 |
### P2: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P2-01 | hmac/sha1 unused deps in zclaw-hands | **FIXED** | Cargo.toml — 移除 unused deps |
| SEC2-P2-02 | serde_yaml 版本不一致 (desktop 0.9 vs pipeline 2) | OPEN | 比对各 Cargo.toml |
| SEC2-P2-03 | sqlx-postgres v0.7.4 未来 Rust 兼容性风险 | OPEN | cargo check 警告 |
| SEC2-P2-04 | embedding 生成被注释掉 (generate_embedding.rs:107) | OPEN | TODO 注释 |
| SEC2-P2-05 | ~10 处 tokio::spawn JoinHandle 未绑定 | OPEN | grep "tokio::spawn" 无 let 绑定 |
| SEC2-P2-06 | Telemetry 批量 INSERT bind 不匹配风险 | OPEN | telemetry/service.rs:205-213 |
| SEC2-P2-07 | Scheduler 串行执行 → 长 hand 阻塞后续调度 | OPEN | scheduler.rs:117-153 |
| SEC2-P2-08 | format!("FROM {}", table) SQL 模式违反防御原则 | OPEN | db.rs:874,880 |
| SEC2-P2-09 | hand_run_status 多传 handName 参数 | **FIXED** | kernel-hands.ts — 移除多余参数 |
| SEC2-P2-10 | kernel_apply_saas_config TOML 多行值 edge case | **FIXED** | lifecycle.rs — 添加三引号多行值支持 |
### P3: 中优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| SEC2-P3-01 | A2A Router 4 RwLock 锁顺序未文档化 | OPEN | a2a.rs:239-245 |
| SEC2-P3-02 | Admin Role 类型轻微不一致 (is_system) | OPEN | 比对 types/index.ts vs role/types.rs |
| SEC2-P3-03 | Admin Billing/Knowledge/Roles 页面缺测试 | OPEN | ls admin-v2/tests/pages/ |
---
## 二次审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | SEC2-P0-01 | NEW | skill_execute 空 context 反序列化崩溃 |
| 2026-04-02 | SEC2-P0-02 | NEW | TaskTool::default() unimplemented!() |
| 2026-04-02 | SEC2-P1-01 | NEW | FactStore trait 零实现 |
| 2026-04-02 | SEC2-P1-02 | NEW | agent-templates API 路径缺 /api/v1 |
| 2026-04-02 | SEC2-P1-03 | NEW | hand-execution-complete 无前端 listener |
| 2026-04-02 | SEC2-P1-04 | NEW | InMemoryStorage RwLock unwrap 级联 panic |
| 2026-04-02 | SEC2-P1-05 | NEW | HandRun 持久化 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-06 | NEW | FTS 索引 3 处静默忽略 |
| 2026-04-02 | SEC2-P1-07 | NEW | Worker dispatch 4 处静默忽略 |
| 2026-04-02 | SEC2-P1-08 | NEW | Desktop 前端零测试 |
| 2026-04-02 | SEC2-P1-09 | NEW | record_key_usage 错误忽略 |
| 2026-04-02 | SEC2-P2-01~10 | NEW | 10 项 P2 发现 |
| 2026-04-02 | SEC2-P3-01~03 | NEW | 3 项 P3 发现 |
| 2026-04-02 | - | 深度二次审计 | 5 维并行审计24 项新发现 |
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | chatStore.sendMessage 添加 isStreaming store 级互斥检查 |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 refreshMutex() 共享 Promise 并发锁 |
## 第三轮审计新增发现 (2026-04-02)
### HIGH: 严重级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-01 | chatStore.sendMessage 无并发保护 | **FIXED** | chatStore.ts — 添加 isStreaming store 级 guard |
| AUD3-FE-02/API-01 | SaaS token refresh 无并发锁 | **FIXED** | saas-client.ts — refreshMutex() 共享 Promise |
### MEDIUM: 高优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-03 | initializeStores 可能调用 3 次 | OPEN | connectionStore.ts:415,589 + index.ts:99 |
| AUD3-FE-04 | window 全局变量存 interval | OPEN | App.tsx:257-258 |
| AUD3-FE-05 | 25+ 处 mixin `as any` | OPEN | gateway-heartbeat.ts 等 |
| AUD3-FE-06 | PropertyPanel 17 处 `as any` | OPEN | PropertyPanel.tsx:100-276 |
| AUD3-DB-01 | 无 down migration | OPEN | crates/zclaw-saas/migrations/ |
| AUD3-DB-02 | format! SQL 模式 | OPEN | agent_template/service.rs:136 |
| AUD3-API-02 | 前端错误处理不统一 | OPEN | desktop/src/ |
| AUD3-CONC-02 | ~15 处 fire-and-forget tokio::spawn | OPEN | main.rs, relay/handlers.rs, scheduler.rs |
### LOW: 低优先级
| ID | 问题 | 状态 | 验证方法 |
|----|------|------|----------|
| AUD3-FE-07 | offlineStore 全局变量存储 timer | OPEN | offlineStore.ts:87-88 |
| AUD3-FE-08 | agentStore 读取中间态 | OPEN | agentStore.ts:254 |
| AUD3-FE-09 | retryAllMessages 无并发锁 | OPEN | offlineStore.ts:188-233 |
| AUD3-CONC-03 | approval polling 增加锁竞争 | OPEN | approval.rs:96 |
## 第三轮审计状态变更日志
| 日期 | ID | 变更 | 备注 |
|------|-----|------|------|
| 2026-04-02 | AUD3-FE-01 | NEW → FIXED | sendMessage 入口添加 `if (get().isStreaming) return` |
| 2026-04-02 | AUD3-FE-02/API-01 | NEW → FIXED | SaaSClient 添加 `_refreshPromise` + `refreshMutex()` 共享 Promise |
| 2026-04-02 | - | 第三轮审计 | 5 维并行审计14 项新发现2 HIGH + 8 MEDIUM + 4 LOW

View File

@@ -0,0 +1,236 @@
# ZCLAW 全面功能审计报告 V11
> **审计日期**: 2026-04-02
> **审计范围**: 10 Rust crate + desktop 前端 + admin-v2 管理后台
> **基线**: V10 审计追踪20 项发现)
---
## 1. 执行摘要
### 关键指标
| 指标 | 数值 | 文档值 | 状态 |
|------|------|--------|------|
| Tauri 命令(注册) | 175 | 58+ / 130+ | 文档不一致 |
| Tauri 命令(有前端调用) | ~90 | - | 51% 利用率 |
| SKILL.md | 76 | 66/75/77 | 文档不一致 |
| Hands | 9 目录 | 11 | CLAUDE.md 与实际不一致 |
| Zustand Stores | 15 | 14 | 文档偏差 |
| SaaS API 路由 | 58 | 72+ | 文档偏高 |
| Admin-v2 页面 | 12 | 11 | 文档偏低 |
| 源文件 | 233 (.rs) + 122 (.tsx) + 15 (.ts store) | - | - |
### V10→V11 状态变更
| V10 ID | V11 状态 | 说明 |
|--------|----------|------|
| BREAK-02 | **关闭** | 记忆提取通过 MemoryMiddleware.after_completion 正常触发 |
| BREAK-03 | **关闭** | approval_respond 自动 spawn tokio task 执行 Hand |
| BREAK-04 | **关闭** | pipeline-complete 在 discovery.rs:165 emit前端有监听器 |
| BREAK-01 | 已修复 | 保持 CLOSED |
---
## 2. 发现项索引
### P1: 严重级3 项)
| ID | 问题 | 文件 | 验证方法 |
|----|------|------|----------|
| V11-P1-01 | trigger_update 参数不匹配,更新静默失败 | `desktop/src/lib/kernel-triggers.ts:99``desktop/src-tauri/src/kernel_commands/trigger.rs:183-189` | 前端发 `{id, updates:{...}}` 但 Rust 期望扁平参数 |
| V11-P1-02 | SaaS 配置同步不传播到 Rust Kernel | `desktop/src/store/saasStore.ts:484-541` | localStorage 写入但 Kernel 无读取路径 |
| V11-P1-03 | 3 个 SQL 表零读取prompt_sync_status, telemetry_reports, key_usage_window | `crates/zclaw-saas/src/db.rs` 迁移定义 | `grep -rn "SELECT.*FROM.*<table>" crates/zclaw-saas/src/` 零结果 |
### P2: 高优先级6 项)
| ID | 问题 | 文件 |
|----|------|------|
| V11-P2-01 | saas-admin.ts 30 方法零消费者admin-v2 独立 Axios 实现) | `desktop/src/lib/saas-admin.ts` |
| V11-P2-02 | 7 个 Role/Permission 路由无前端消费者 | `crates/zclaw-saas/src/role/mod.rs` |
| V11-P2-03 | deprecated gateway-storage sync 方法仍被生产代码调用 | `desktop/src/lib/gateway-storage.ts:129,196` |
| V11-P2-04 | ToolDefinition 在 types 和 runtime 重复定义 | `crates/zclaw-types/src/tool.rs:8` vs `crates/zclaw-runtime/src/driver/mod.rs:94` |
| V11-P2-05 | 62 个 Tauri 命令无前端调用(含 8 classroom 命令中 7 个未调用) | `desktop/src-tauri/src/lib.rs:124-323` |
| V11-P2-06 | migration/service.rs config_items 查询缺少 LIMIT | `crates/zclaw-saas/src/migration/service.rs` |
### P3: 中优先级8 项)
| ID | 问题 | 文件 |
|----|------|------|
| V11-P3-01 | audit-logger.ts 导出但零 import | `desktop/src/lib/audit-logger.ts` |
| V11-P3-02 | OFP 能力定义无消费者 | `crates/zclaw-types/src/capability.rs:28-32` |
| V11-P3-03 | deprecated extract_structured_facts() 零调用但未移除 | `crates/zclaw-runtime/src/growth.rs:224` |
| V11-P3-04 | SaaS knowledge 模块 3 个 handler 返回空数据 | `crates/zclaw-saas/src/knowledge/handlers.rs:91,293,321` |
| V11-P3-05 | Director (multi-agent) 912 行 feature-gated 未启用 | `crates/zclaw-kernel/src/director.rs` |
| V11-P3-06 | 定时任务执行结果未持久化 | `crates/zclaw-saas/src/scheduler.rs:147-225` |
| V11-P3-07 | secure-storage.ts 3 个 deprecated sync 方法零调用 | `desktop/src/lib/secure-storage.ts:309,317,325` |
| V11-P3-08 | SaaS config 2 个预留参数未消费 | `crates/zclaw-saas/src/config.rs:122,125` |
### P4: 低优先级5 项)
| ID | 问题 | 文件 |
|----|------|------|
| V11-P4-01 | ContentBlock 4 处定义(不同域,非 bug 但名称混淆) | types/message.rs, runtime/driver/mod.rs, hands/slideshow.rs, protocols/mcp_types.rs |
| V11-P4-02 | Desktop ↔ Admin 13+ 类型名称不一致 | `desktop/src/lib/saas-types.ts` vs `admin-v2/src/types/index.ts` |
| V11-P4-03 | 文档数字不一致Skills 76 vs 66/75/77 | 多个文档 |
| V11-P4-04 | A2A/WASM feature-gated 代码未启用 | `crates/zclaw-protocols/src/a2a.rs`, `crates/zclaw-skills/src/wasm_runner.rs` |
| V11-P4-05 | embedding 生成已禁用(注释掉) | `crates/zclaw-saas/src/workers/generate_embedding.rs:92` |
### Info: 保留不变V10 继承)
| V10 ID | 状态 | 说明 |
|--------|------|------|
| DEAD-01 | FALSE_POSITIVE | PromptInjector 已通过 PromptBuilder 接入 |
| DEAD-02 | FALSE_POSITIVE | MemoryRetriever 已通过 MemoryMiddleware 接入 |
| DEAD-03 | FALSE_POSITIVE | GrowthTracker 已通过 GrowthIntegration 接入 |
| SEC-V9-01 | FALSE_POSITIVE | SQL 仅构建 $N 占位符 |
---
## 3. Rust Crate 能力矩阵
| Crate | 源文件 | 行数 | 公开项 | Feature-Gate | Dead Code | Deprecated | 测试 |
|-------|--------|------|--------|-------------|-----------|------------|------|
| zclaw-types | 10 | 1,741 | 86 | 0 | 0 | 0 | 57 |
| zclaw-memory | 5 | 1,333 | 36 | 0 | 0 | 0 | 25 |
| zclaw-runtime | 35 | 9,145 | 188 | 0 | 5 | 1 | 42 |
| zclaw-kernel | 25 | 8,185 | 225 | 22 (multi-agent) | 3 | 0 | 52 |
| zclaw-skills | 15 | 4,057 | 116 | 4 (wasm) | 0 | 0 | 22 |
| zclaw-hands | 14 | 7,501 | 140 | 0 | 0 | 0 | 155 |
| zclaw-protocols | 5 | 1,697 | 104 | 2 (a2a) | 1 | 0 | 5 |
| zclaw-pipeline | 23 | 7,502 | 200 | 0 | 1 | 0 | 59 |
| zclaw-growth | 14 | 4,732 | 137 | 0 | 2 | 0 | 66 |
| zclaw-saas | 87 | 14,949 | 489 | 0 | 2 | 0 | 17 |
| **合计** | **233** | **64,842** | **1,621** | **28** | **14** | **1** | **500** |
### Trait 实现完整性
| Trait | 定义位置 | 实现数 | 状态 |
|-------|----------|--------|------|
| LlmDriver | zclaw-runtime/driver/mod.rs | 4 | 完整 |
| Tool | zclaw-runtime/tool.rs | 7 | 完整 |
| Hand | zclaw-hands/hand.rs | 9 | 完整 |
| Exporter | zclaw-kernel/export/mod.rs | 4 | 完整 |
| McpClient | zclaw-protocols/mcp.rs | 2 | 完整 |
| A2aClient | zclaw-protocols/a2a.rs | 1 (gated) | Feature-gated |
| FactStore | zclaw-memory/fact.rs | **0** | **未实现** |
| Worker | zclaw-saas/workers/mod.rs | 7 | 完整 |
---
## 4. 数据流验证结果
### Flow A: 聊天 → 记忆提取 ✅ WORKING
```
chat.rs:246 (LoopEvent::Complete)
→ loop_runner.rs:798 (run_after_completion)
→ MemoryMiddleware.after_completion (middleware/memory.rs:101)
→ GrowthIntegration.extract_combined (growth.rs:279)
→ MemoryExtractor.extract + store_memories
```
Tauri `post_conversation_hook` 不重复提取,仅处理心跳+反思。
### Flow B: 审批 → Hand 自动执行 ✅ WORKING
```
approval.rs:52 → kernel.respond_to_approval (approvals.rs:55)
→ tokio::spawn (approvals.rs:71)
→ hands.execute (approvals.rs:99)
→ emit "hand-execution-complete" (approval.rs:84-137)
```
### Flow C: Pipeline 完成事件 ✅ WORKING
```
Rust emit: discovery.rs:165 → app.emit("pipeline-complete", ...)
Frontend listen: pipeline-client.ts:257 → PipelinesPanel.tsx:383
```
### Flow D: SaaS 配置同步 ❌ BROKEN
```
saasStore.ts:484 → saasClient.pullConfig → localStorage write
⚠️ 无传播路径到 Rust Kernel
```
配置变更停留在 `localStorage`Kernel 独立读取 TOML 文件,不受 SaaS 配置同步影响。
---
## 5. Admin-v2 审计
### 页面与 API 对齐
| 页面 | Service 文件 | API 调用数 | 状态 |
|------|-------------|-----------|------|
| Login | auth.ts | 2 | 完整 |
| Dashboard | stats.ts | 1 | 完整 |
| Accounts | accounts.ts | 4 | 完整 |
| ModelServices | providers.ts + models.ts | 11 | 完整 |
| Config | config.ts | 2 | 完整 |
| Relay | relay.ts | 2 | 完整 |
| Logs | logs.ts | 1 | 完整 |
| Prompts | prompts.ts | 7 | 完整 |
| Usage | usage.ts | 2 | 完整 |
| Billing | billing.ts | 6 | 完整 |
| AgentTemplates | agent-templates.ts | 5 | 完整 |
| Knowledge | knowledge.ts | 15 | 完整(后端有 3 个 stub handler |
### 类型一致性
Desktop ↔ Admin-v2 之间存在 13+ 类型名称不一致(详见 V11_GAP_ANALYSIS.md
3 个有意义的字段差异:
1. `AccountPublic.llm_routing`: desktop 可选 vs admin 必填
2. `TokenInfo` nullability: `string | null` vs `string | undefined`
3. `PromptVariable.type`: `string` vs `'string'|'number'|'select'|'boolean'`
---
## 6. 孤立路由清单
| 路由 | 模块 | 原因 |
|------|------|------|
| POST /api/v1/auth/logout | auth | 无消费者 |
| GET /api/v1/config/analysis | migration | 无消费者 |
| POST /api/v1/config/seed | migration | 无消费者 |
| GET /api/v1/config/sync-logs | migration | 无消费者 |
| GET /api/v1/usage (model_config) | model_config | 无消费者 |
| GET/POST /api/v1/roles | role | 无 admin-v2 service |
| GET/PUT/DELETE /api/v1/roles/:id | role | 无 admin-v2 service |
| GET/POST /api/v1/permission-templates | role | 无 admin-v2 service |
| GET/DELETE /api/v1/permission-templates/:id | role | 无 admin-v2 service |
| POST /api/v1/permission-templates/:id/apply | role | 无 admin-v2 service |
| GET /api/v1/roles/:id/permissions | role | 无 admin-v2 service |
---
## 7. 验证命令
```bash
# Skills 计数
ls skills/ | wc -l # 预期: 76
# Hands 计数
ls hands/ | wc -l # 预期: 9
# Tauri 命令计数
grep -c "#\[tauri::command\]" desktop/src-tauri/src/ -r --include="*.rs" # 预期: 175
# 死代码验证
grep -rn "from.*audit-logger" desktop/src/ --include="*.ts" # 预期: 0 结果
# 孤立表验证
grep -rn "SELECT.*FROM.*prompt_sync_status" crates/zclaw-saas/src/ # 预期: 0 结果
grep -rn "SELECT.*FROM.*telemetry_reports" crates/zclaw-saas/src/ # 预期: 0 结果
grep -rn "SELECT.*FROM.*key_usage_window" crates/zclaw-saas/src/ # 预期: 0 结果
# deprecated 函数调用者
grep -rn "extract_structured_facts" crates/ --include="*.rs" # 仅定义和注释引用
# trigger_update 参数不匹配
grep -A5 "trigger_update" desktop/src/lib/kernel-triggers.ts
grep -A5 "trigger_update" desktop/src-tauri/src/kernel_commands/ -r --include="*.rs"
```

View File

@@ -0,0 +1,129 @@
# ZCLAW 全栈 QA 与代码审查报告
> 日期: 2026-03-31 ~ 2026-04-01
> 审查方法: 模块垂直扫描 (4 Tracks) + 后续测试补充 + 大文件拆分
> 审查范围: Rust 后端 + Admin V2 前端 + Desktop 前端 + 配置/部署
---
## 1. 审查发现与修复汇总
### 1.1 已修复问题
| # | 问题 | 严重级 | 模块 | 状态 |
|---|------|--------|------|------|
| 1 | `relay_enqueue()` 重复调用 (探索阶段报告) | P0 | SaaS 后端 | **误报** — 实际只有一次调用 |
| 2 | 密码策略无复杂度要求 | P2 | SaaS 后端 | **已修复** — 大写+小写+数字验证 |
| 3 | JWT 缺少 `aud` (受众) claim | P3 | SaaS 后端 | **已修复**`aud: "zclaw-saas"` + 验证 |
| 4 | JWT 缺少 `pwv` (密码版本) | P1 | SaaS 后端 | **已修复** — 用户修改 |
| 5 | 17 处 `println!`/`eprintln!` 生产代码 | P1 | Rust crates | **已修复** — 全部替换为 `tracing::*` |
| 6 | Desktop 49 处 `any` 用法 | P1 | Desktop | **已修复** — gateway-api-types.ts 类型化 |
| 7 | Desktop 80+ 裸 `console.*` 调用 | P1 | Desktop | **已修复** — 26 处替换为 logger |
| 8 | Desktop tsconfig 排除 ErrorBoundary/ErrorAlert | P2 | Desktop | **已修复** — 修复类型错误后移除排除 |
| 9 | Docker Compose 默认密码 + 端口暴露 | P2 | 部署 | **已修复** — 用户进一步加固 |
| 10 | 缺少 `.dockerignore` | P3 | 部署 | **已修复** |
| 11 | Admin V2 测试覆盖不足 (3/10 页面) | P1 | Admin V2 | **已修复** — 71 个测试全部通过 |
### 1.2 确认良好的方面
| 模块 | 良好实践 |
|------|----------|
| Admin V2 | 零 `any` 用法、无 `dangerouslySetInnerHTML`、ErrorBoundary 完善 |
| SaaS 后端 | Argon2id 密码哈希、AES-256-GCM 加密、参数化 SQL、SSRF 防护完善 |
| 认证系统 | HttpOnly + Secure + SameSite=Strict Cookie、refresh token 轮换、pwv 密码版本追踪 |
| RBAC | `admin:full` 超级权限、IDOR 防护、权限缓存 |
---
## 2. 后续工作完成情况
### 2.1 Admin V2 测试补充 (71 个测试12 个测试文件)
| 测试文件 | 测试数 | 覆盖内容 |
|----------|--------|----------|
| `Accounts.test.tsx` | 已有 | 账号 CRUD |
| `AgentTemplates.test.tsx` | 已有 | 模板管理 |
| `authStore.test.ts` | 已有 | 认证状态 |
| `request.test.ts` | 已有 | HTTP 客户端 |
| `Dashboard.test.tsx` | 8 新增 | 统计数据 + 日志展示 |
| `Login.test.tsx` | 7 新增 | 登录 + TOTP + 错误处理 |
| `Config.test.tsx` | 7 新增 | 配置项 + 分类标签页 |
| `Logs.test.tsx` | 7 新增 | 日志分页 + 筛选 + ErrorState |
| `Relay.test.tsx` | 7 新增 | 中转任务 + 状态标签 |
| `Usage.test.tsx` | 6 新增 | 统计卡片 + 每日/模型表 |
| `Prompts.test.tsx` | 5 新增 | 提示词模板 + CRUD |
| `ModelServices.test.tsx` | 5 新增 | 供应商列表 + 状态标签 |
### 2.2 大文件拆分
| 文件 | 原始行数 | 拆分结果 | 状态 |
|------|----------|----------|------|
| `kernel.rs` | 1486 | 9 个子模块 (mod.rs + adapters/agents/messaging/skills/hands/triggers/approvals/a2a) | **完成** |
| `intelligence-client.ts` | 1475 | 9 个子模块 (index/types/type-conversions/unified-client + 5 个 fallback) | **完成** |
| `db.rs` | 891 | 保持原样 (拆分风险大于收益) | **跳过** |
### 2.3 kernel.rs 拆分详情
```
kernel/
├── mod.rs (~200L) — Kernel struct + boot + 中间件 + 访问器
├── adapters.rs (~95L) — LlmDriverAdapter + KernelSkillExecutor + AgentInbox
├── agents.rs (~100L) — Agent CRUD
├── messaging.rs (~150L) — 消息发送 + 技能提示构建
├── skills.rs (~70L) — 技能管理
├── hands.rs (~200L) — Hand 执行 + 运行追踪
├── triggers.rs (~45L) — 触发器 CRUD
├── approvals.rs (~140L) — 审批管理
└── a2a.rs (~265L) — A2A 多智能体 (cfg multi-agent)
```
### 2.4 intelligence-client.ts 拆分详情
```
intelligence-client/
├── index.ts (~65L) — 统一重导出
├── types.ts (~175L) — 前端类型 + Mesh + Persona Evolver
├── type-conversions.ts (~95L) — 前后端类型转换
├── unified-client.ts (~440L) — 主 intelligenceClient 对象
├── fallback-memory.ts (~165L) — localStorage 内存回退
├── fallback-compactor.ts (~60L) — 压缩回退
├── fallback-reflection.ts (~165L) — 反思回退
├── fallback-identity.ts (~235L) — 身份管理回退
└── fallback-heartbeat.ts (~55L) — 心跳回退
```
---
## 3. 验证结果
| 检查项 | 结果 |
|--------|------|
| `cargo check -p zclaw-saas` | **通过** |
| `cargo check -p zclaw-kernel` | **通过** (runtime 有预存类型问题) |
| `cargo test -p zclaw-saas --lib -- jwt` | **6/6 通过** (含 aud + pwv 测试) |
| Desktop `tsc --noEmit` | **通过** (0 errors) |
| Admin V2 `tsc --noEmit` | **通过** (0 errors) |
| Admin V2 `vitest run` | **71/71 通过** (12 个测试文件) |
---
## 4. 遗留项与后续建议
### 4.1 db.rs 拆分 (891L)
保持原样。原因:
- `init_db()` 是唯一的公共入口,所有 seed/migration 函数都是内部实现
- 函数间有较强耦合migration 调用 seed_rolesinit_db 编排所有步骤)
- 拆分收益有限(不像 kernel.rs 有多个独立领域)
### 4.2 安全增强建议
- Docker Compose 生产部署时考虑 Redis-backed 分布式限流
- 考虑将邮箱验证改为使用 email 验证库
- 生产环境日志写入 WAF
### 4.3 代码质量持续改进
- Desktop 仍有约 50 处裸 `console.*` 调用在非重点文件中
- `zclaw-runtime` 有预存的 `Message` enum 类型错误需修复
- Admin V2 coverage thresholds 已设置 (60%),持续补充测试达到目标

View File

@@ -1,9 +1,9 @@
# ZCLAW 功能全景文档
> **版本**: v0.9.0
> **版本**: v0.10.0
> **更新日期**: 2026-04-01
> **项目状态**: 完整 Rust Workspace 架构10 个核心 Crates70 技能Pipeline DSL + Smart Presentation + Agent Growth System + SaaS 平台 + DeerFlow 视觉风格
> **整体完成度**: ~89% (核心功能完整SaaS 平台全面上线DeerFlow 前端视觉复刻完成,Worker + Scheduler 系统上线,记忆闭环接通)
> **项目状态**: 完整 Rust Workspace 架构10 个核心 Crates76 技能Pipeline DSL + Smart Presentation + Agent Growth System + SaaS 平台 + DeerFlow 视觉风格 + 安全审计 V1 完成
> **整体完成度**: ~90% (核心功能完整SaaS 平台全面上线DeerFlow 前端视觉复刻完成,安全渗透测试 15 项修复完成Admin V2 迁移完成)
---
@@ -14,27 +14,27 @@
| 文档 | 功能 | 成熟度 | 测试覆盖 |
|------|------|--------|---------|
| [01-communication-layer.md](00-architecture/01-communication-layer.md) | 通信层 (3 种连接模式) | L4 (90%) | 高 |
| [02-state-management.md](00-architecture/02-state-management.md) | 状态管理 | L3 (80%) | 高 |
| [03-security-auth.md](00-architecture/03-security-auth.md) | 安全认证 | L3 (75%) | 高 |
| [02-state-management.md](00-architecture/02-state-management.md) | 状态管理 | L4 (90%) | 高 |
| [03-security-auth.md](00-architecture/03-security-auth.md) | 安全认证 | L4 (95%) | 高 |
### 1.2 核心功能 (Core Features)
| 文档 | 功能 | 成熟度 | 测试覆盖 |
|------|------|--------|---------|
| [00-chat-interface.md](01-core-features/00-chat-interface.md) | 聊天界面 | L4 (92%) | 高 |
| [01-agent-clones.md](01-core-features/01-agent-clones.md) | Agent 分身 | L3 (85%) | 高 |
| [02-hands-system.md](01-core-features/02-hands-system.md) | Hands 系统 | L3 (60%) | |
| [01-agent-clones.md](01-core-features/01-agent-clones.md) | Agent 分身 | L4 (90%) | 高 |
| [02-hands-system.md](01-core-features/02-hands-system.md) | Hands 系统 | L4 (85%) | |
### 1.3 智能层 (Intelligence Layer)
| 文档 | 功能 | 成熟度 | 聊天集成 |
|------|------|--------|---------|
| [00-agent-memory.md](02-intelligence-layer/00-agent-memory.md) | Agent 记忆 | L4 (90%) | pre-hook (FTS5+TF-IDF+Embedding) |
| [01-identity-evolution.md](02-intelligence-layer/01-identity-evolution.md) | 身份演化 | L3 (90%) | pre-hook (SOUL.md) |
| [01-identity-evolution.md](02-intelligence-layer/01-identity-evolution.md) | 身份演化 | L4 (90%) | pre-hook (SOUL.md) |
| [06-context-compaction.md](02-intelligence-layer/06-context-compaction.md) | 上下文压缩 | L4 (90%) | 内核中间件链集成 (CompactionMiddleware) |
| [03-reflection-engine.md](02-intelligence-layer/03-reflection-engine.md) | 自我反思 | L3 (85%) | post-hook (自动触发) |
| [04-heartbeat-engine.md](02-intelligence-layer/04-heartbeat-engine.md) | 心跳巡检 | L3 (90%) | post-hook (持久化) |
| [05-autonomy-manager.md](02-intelligence-layer/05-autonomy-manager.md) | 自主授权 | L3 (75%) | RightPanel UI |
| [03-reflection-engine.md](02-intelligence-layer/03-reflection-engine.md) | 自我反思 | L4 (85%) | post-hook (自动触发) |
| [04-heartbeat-engine.md](02-intelligence-layer/04-heartbeat-engine.md) | 心跳巡检 | L4 (90%) | post-hook (持久化) |
| [05-autonomy-manager.md](02-intelligence-layer/05-autonomy-manager.md) | 自主授权 | L4 (80%) | RightPanel UI |
### 1.4 上下文数据库 (Context Database)
@@ -46,16 +46,16 @@
| 文档 | 功能 | 成熟度 | UI 集成 |
|------|------|--------|---------|
| [00-skill-system.md](04-skills-ecosystem/00-skill-system.md) | Skill 系统概述 | L3 (80%) | Tauri 命令 |
| [01-intelligent-routing.md](04-skills-ecosystem/01-intelligent-routing.md) | 智能路由 | L2 (50%) | 意图路由 |
| [00-skill-system.md](04-skills-ecosystem/00-skill-system.md) | Skill 系统概述 | L4 (85%) | Tauri 命令 |
| [01-intelligent-routing.md](04-skills-ecosystem/01-intelligent-routing.md) | 智能路由 | L3 (60%) | 意图路由 |
> 技能总数: **70** 个 SKILL.md3 种执行模式 (PromptOnly/Shell/Python)Wasm/Native 待实现
> 技能总数: **76** 个 SKILL.md3 种执行模式 (PromptOnly/Shell/Python)Wasm/Native 待实现
### 1.6 Hands 系统
| 文档 | 功能 | 成熟度 | 可用 Hands |
|------|------|--------|-----------|
| [00-hands-overview.md](05-hands-system/00-hands-overview.md) | Hands 概述 | L3 (60%) | 11 个 (9 启用 + 2 禁用) |
| [00-hands-overview.md](05-hands-system/00-hands-overview.md) | Hands 概述 | L4 (85%) | 11 个 (9 启用 + 2 禁用) |
> 11 Hands (9 启用): Browser, Slideshow, Speech, Quiz, Whiteboard, Researcher, Collector, Clip, Twitter (需 API Key); 2 禁用: Predictor, Lead
@@ -63,7 +63,7 @@
| 文档 | 功能 | 成熟度 | Tauri 命令 |
|------|------|--------|-----------|
| [00-backend-integration.md](06-tauri-backend/00-backend-integration.md) | 后端集成 | L4 (85%) | **130+** (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4) |
| [00-backend-integration.md](06-tauri-backend/00-backend-integration.md) | 后端集成 | L4 (85%) | **175** (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4 + classroom 27) |
### 1.8 Pipeline DSL
@@ -75,9 +75,9 @@
| 文档 | 功能 | 成熟度 | API 路由 |
|------|------|--------|---------|
| [00-saas-overview.md](08-saas-platform/00-saas-overview.md) | SaaS 平台总览 | L4 (97%) | **76+** (9 个模块) |
| [00-saas-overview.md](08-saas-platform/00-saas-overview.md) | SaaS 平台总览 | L4 (98%) | **58** (10 个模块) |
> SaaS 后端: Axum + PostgreSQL, 9 模块 (Auth, Account, Model Config, Relay, Migration, Role, Prompt OTA, Agent Template, Telemetry), Admin 管理后台, 桌面端完整集成
> SaaS 后端: Axum + PostgreSQL, 10 模块 (Auth, Account, Model Config, Relay, Migration, Role, Prompt OTA, Agent Template, Scheduled Task, Telemetry), Admin V2 管理后台 (Ant Design Pro), 桌面端完整集成
>
> **架构重构成果 (Phase 0-4)**:
> - **Worker 系统**: 5 个 Worker (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used),基于 mpsc channel 的异步调度,支持自动重试
@@ -98,19 +98,22 @@
| 指标 | 数值 |
|------|------|
| **Rust Crates** | **10** (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, saas) —
| **SKILL.md 文件** | **70** |
| **SKILL.md 文件** | **76** |
| **Hands 总数** | **11** (9 启用, 2 禁用: Predictor, Lead) |
| **Pipeline 模板** | **5** |
| **Tauri 命令** | **130+** |
| **SaaS API 路由** | **76+** |
| **Tauri 命令** | **175** |
| **SaaS API 路由** | **58** |
| **SaaS Workers** | **5** (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used) |
| **SQL Schema 版本** | **v6** (TIMESTAMPTZ 类型, 声明式迁移) |
| **Zustand Store** | **14+** |
| **SQL Schema 版本** | **v8** (TIMESTAMPTZ 类型, 声明式迁移, password_version, rate_limit_events, is_embedding) |
| **Zustand Store** | **15** |
| **LLM Provider** | **8** (Kimi, Qwen, DeepSeek, Zhipu, OpenAI, Anthropic, Gemini, Local) |
| **Embedding Provider** | **6** (OpenAI, Zhipu, Doubao, Qwen, DeepSeek, Local/TF-IDF) |
| **SaaS 数据表** | **25** (PostgreSQL) |
| **内置工具** | **5** (file_read, file_write, shell_exec, web_fetch, execute_skill) |
| **内置工具** | **7** (file_read, file_write, shell_exec, web_fetch, execute_skill, skill_load, task) |
| **Agent Growth System** | SqliteStorage + FTS5 + TF-IDF + Memory Extractor + ExtractionAdapter (闭环) |
| **安全审计** | 渗透测试 V1: 5 HIGH + 10 MEDIUM 全部修复, 整体评级 B+ |
| **Admin V2** | Vite + React + Ant Design Pro, 11 页面, 71 测试, HttpOnly Cookie 认证 |
| **运行时中间件** | 11 层: Compaction, Memory, LoopGuard, TokenCalibration, SkillIndex, Title, DanglingTool, ToolError, ToolOutputGuard, Guardrail, SubagentLimit |
---
@@ -119,18 +122,18 @@
```
zclaw-types (L1: 基础类型, 无依赖) — 95%
zclaw-memory (L2: 存储层, SQLite) — 90%
zclaw-memory (L2: 存储层, SQLite + FactStore) — 92%
zclaw-runtime (L3: 运行时, 4 Driver, 5 工具) — 90%
zclaw-runtime (L3: 运行时, 4 Driver, 7 工具, 11 层中间件) — 92%
zclaw-kernel (L4: 核心协调, 11 Hands, 70 Skills) — 85%
zclaw-kernel (L4: 核心协调, 9 Hands, 76 Skills, Trigger, Export) — 88%
┌───┴───┬───────┬───────────┬──────────┬────────
│ │ │ │ │
┌───┴───┬───────┬───────────┬──────────┐
│ │ │ │ │
skills hands protocols pipeline growth
(80%) (85%) (75%) (90%) (95%) (已移除)
(85%) (88%) (80%) (95%) (95%)
zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 97%
zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 98%
```
---
@@ -139,14 +142,15 @@ zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 97%
| 模块 | API 路由 | 核心能力 |
|------|---------|---------|
| Auth | 8 | JWT + API Token 双认证, TOTP 2FA (AES-256-GCM), 密码修改 |
| Auth | 9 | JWT + API Token 双认证, TOTP 2FA (AES-256-GCM), 密码修改, HttpOnly Cookie |
| Account | 12 | CRUD, 角色管理, 设备注册/心跳, Dashboard, API Token |
| Model Config | 14 | Provider/Model/Key CRUD, Key 轮换, 用量统计 |
| Model Config | 9 | Provider/Model/Key CRUD, Key 轮换, 用量统计 |
| Relay | 9 | SSE 流式中转, Key 池 (RPM/TPM), 重试策略, SSRF 防护 |
| Migration | 9 | 配置 CRUD, 种子数据, push/merge/diff/pull 同步 |
| Role | 7 | 角色 CRUD, 权限模板, 批量应用 |
| Prompt OTA | 8 | 模板 + 版本管理, OTA 检查, 回滚 |
| Agent Template | 5 | 模板 CRUD, tools/capabilities/model 绑定 |
| Migration | 8 | 配置 CRUD, 种子数据, push/merge/diff/pull 同步 |
| Role | 6 | 角色 CRUD, 权限模板, 批量应用 |
| Prompt OTA | 6 | 模板 + 版本管理, OTA 检查, 回滚 |
| Agent Template | 6 | 模板 CRUD, tools/capabilities/model 绑定, SOUL.md |
| Scheduled Task | 2 | 定时任务 CRUD |
| Telemetry | 4 | Token 用量上报, 统计聚合, 审计摘要 |
| **Worker 系统** | — | 5 个后台 Worker (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used)mpsc 异步调度,自动重试 |
| **声明式 Scheduler** | — | TOML 配置定时任务,灵活间隔 (30s/5m/1h/1d)run_on_start内置 DB 清理 (设备 90 天) |
@@ -167,6 +171,7 @@ zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 97%
| 日期 | 版本 | 变更内容 |
|------|------|---------|
| 2026-04-01 | v0.10.0 | 文档全面更新SKILL 数量 75、Tauri 命令 130+、API 路由 72+、Admin V2 (Ant Design Pro) 迁移记录、安全渗透测试 V1 修复记录、Schema v8、11 层中间件链、kernel.rs 拆分为 9 子模块、intelligence-client.ts 拆分为 9 子模块 |
| 2026-04-01 | v0.9.0 | DeerFlow 前端视觉复刻:卡片式输入框、下拉模式选择器(闪速/思考/Pro/Ultra、彩色快捷操作芯片、极简顶栏+token计数+导出、暖灰色系全局样式(#faf9f6/#f5f4f1/#e8e6e1、DeerFlow 风格侧边栏、推理/工具链/子任务可视化、Artifact 右侧面板、虚拟化消息列表、Gateway 流式 hang 修复onclose code 1000 → onComplete、WebView2 textarea 边框修复CSS !important |
| 2026-03-30 | v0.8.1 | Sprint 5 "稳定清扫": Axum CLOSE_WAIT 修复 (CancellationToken + TCP keepalive + SO_LINGER)E2E 测试重新启用 (去掉 test.skip)dead code 注解审计 (36→<10) |
| 2026-03-29 | v0.8.0 | SaaS 后端架构重构完成Worker 系统 (5 Worker + mpsc 异步调度)声明式 Scheduler (TOML 配置)SQL 迁移系统 (Schema v6 + TIMESTAMPTZ)多环境配置 (ZCLAW_ENV)连接池优化 (50 max/5 min)速率限制优化 (无锁 AtomicU32)记忆闭环修复extraction_adapter.rs 实现 TauriExtractionDriverBREAK-01 已修复 |

View File

@@ -0,0 +1,329 @@
# ZCLAW 深度二次审计补充报告
> **审计日期**: 2026-04-02
> **基线**: V11 全面审计报告22 项发现)
> **方法**: 5 维并行深度审计
> **新增发现**: 22 项2 P0 + 9 P1 + 10 P2 + 3 P3 + 1 确认项)
---
## 1. 审计维度
| # | 维度 | 发现数 |
|---|------|--------|
| 1 | Rust crate 交叉依赖 + 编译状态 | 5 |
| 2 | 前端 Store ↔ Tauri 命令参数签名全量比对 | 5 |
| 3 | Sprint 1-4 修复代码质量验证 | 1 |
| 4 | 安全/竞态/资源泄漏扫描 | 9 |
| 5 | 测试覆盖缺口 + admin-v2 API 对齐 | 4 |
---
## 2. 新增 P0 发现2 项)
### SEC2-P0-01: skill_execute 反序列化崩溃
| 维度 | 详情 |
|------|------|
| **问题** | 前端传递空 `context: {}`,但 Rust `SkillContext` 要求 `agent_id: String``session_id: String`(非 Option。空 JSON 无法反序列化。 |
| **前端** | `desktop/src/lib/kernel-skills.ts:110-114` |
| **Rust** | `desktop/src-tauri/src/kernel_commands/skill.rs:290-296` |
| **触发条件** | 用户在前端执行任何 Skill |
| **影响** | 运行时 serde 反序列化失败Skill 执行必然报错 |
### SEC2-P0-02: TaskTool::default() 潜在 panic
| 维度 | 详情 |
|------|------|
| **问题** | `TaskTool` 实现了 `Default` trait`default()` 调用 `unimplemented!()` |
| **文件** | `crates/zclaw-runtime/src/tool/builtin/task.rs:59` |
| **触发条件** | 任何泛型约束 `T: Default` 触发 `TaskTool::default()` 时 |
| **影响** | 运行时 panic虽然正常路径使用 `TaskTool::new()` 规避) |
| **建议** | 移除 `impl Default for TaskTool`,或提供合理的默认值 |
---
## 3. 新增 P1 发现9 项)
### SEC2-P1-01: FactStore trait 零实现
| 维度 | 详情 |
|------|------|
| **问题** | `FactStore` trait 在 `zclaw-memory/src/fact.rs:141` 定义,全 workspace 无任何 `impl FactStore for T``MemoryStore` 有同名方法但未实现 trait。`dyn FactStore` 模式完全不可用。 |
| **文件** | `crates/zclaw-memory/src/fact.rs` |
| **影响** | 架构层面功能缺口——trait 接口已定义但无法使用 |
### SEC2-P1-02: agent-templates API 路径缺少 /api/v1 前缀
| 维度 | 详情 |
|------|------|
| **问题** | 前端 saas-client.ts 中 agent-templates 路径缺少 `/api/v1` 前缀 |
| **前端** | `desktop/src/lib/saas-client.ts:376,384``'/agent-templates/available'``'/agent-templates/${id}/full'` |
| **后端** | 路由注册在 `/api/v1/agent-templates/...` |
| **影响** | 请求发送到错误 URL必然返回 404 |
### SEC2-P1-03: hand-execution-complete 事件无前端监听
| 维度 | 详情 |
|------|------|
| **问题** | Rust 在 `hand.rs:279``approval.rs:130` emit `hand-execution-complete`,但前端无任何 `listen()` 调用 |
| **影响** | Hand 异步执行完成后,前端无法收到通知,用户不知道执行结果 |
### SEC2-P1-04: InMemoryStorage RwLock unwrap() 级联 panic 风险
| 维度 | 详情 |
|------|------|
| **问题** | `InMemoryStorage` 中 6 处 `std::sync::RwLock``.unwrap()`。若锁被 poisoned某线程 panic后续所有调用级联崩溃 |
| **文件** | `crates/zclaw-growth/src/viking_adapter.rs:137,143,148,190,202,208,214` |
| **风险** | 低概率但后果严重 |
### SEC2-P1-05: HandRun 持久化错误静默忽略3 处)
| 维度 | 详情 |
|------|------|
| **问题** | `let _ = memory.save_hand_run(&run).await` 等 3 处 HandRun 持久化错误被忽略 |
| **文件** | `crates/zclaw-kernel/src/kernel/approvals.rs:88,91,120` |
| **影响** | DB 不可用时 run 状态丢失UI 无法显示执行结果 |
| **建议** | 至少 log warning |
### SEC2-P1-06: FTS 索引更新失败静默忽略3 处)
| 维度 | 详情 |
|------|------|
| **问题** | 全文搜索索引 DELETE/INSERT 操作失败被 `let _ =` 忽略 |
| **文件** | `crates/zclaw-growth/src/storage/sqlite.rs:384,390,605` |
| **影响** | 搜索结果不一致stale index |
### SEC2-P1-07: Worker dispatch 失败静默忽略4 处)
| 维度 | 详情 |
|------|------|
| **问题** | `let _ = state.worker_dispatcher.dispatch(...)` 4 处忽略 |
| **文件** | `crates/zclaw-saas/src/knowledge/handlers.rs:220,262,331,539` |
| **影响** | embedding 生成等后台任务可能静默丢失 |
### SEC2-P1-08: Desktop 前端零测试
| 维度 | 详情 |
|------|------|
| **问题** | `desktop/src/` 中零个 `.test.ts`/`.test.tsx` 文件,包括 chatStore、agentStore 等核心 store |
| **影响** | 前端任何回归只能通过手工测试发现 |
### SEC2-P1-09: record_key_usage 错误忽略导致计费数据丢失风险
| 维度 | 详情 |
|------|------|
| **问题** | `let _ = record_key_usage(...)` 忽略写入错误 |
| **文件** | `crates/zclaw-saas/src/relay/service.rs:376` |
| **影响** | 可能导致计费数据丢失 |
---
## 4. 新增 P2 发现10 项)
| ID | 问题 | 文件 |
|----|------|------|
| SEC2-P2-01 | `hmac`/`sha1` 在 zclaw-hands Cargo.toml 中声明但代码零引用 | `crates/zclaw-hands/Cargo.toml` |
| SEC2-P2-02 | `serde_yaml` 版本不一致desktop 用 0.9pipeline 用 2不同 package | 各 `Cargo.toml` |
| SEC2-P2-03 | `sqlx-postgres v0.7.4` 使用了未来 Rust 版本将拒绝的语法 | `Cargo.lock` |
| SEC2-P2-04 | `generate_embedding.rs:107` embedding 生成被注释掉(`// TODO` | `crates/zclaw-saas/src/workers/generate_embedding.rs` |
| SEC2-P2-05 | ~10 处 `tokio::spawn` 返回 JoinHandle 未绑定,无法优雅停止 | kernel + saas 多处 |
| SEC2-P2-06 | Telemetry 审计日志批量 INSERT 绑定可能与 SQL 模板不匹配 | `crates/zclaw-saas/src/telemetry/service.rs:205-213` |
| SEC2-P2-07 | Scheduler 串行执行 trigger长 hand 阻塞后续调度 | `crates/zclaw-kernel/src/scheduler.rs:117-153` |
| SEC2-P2-08 | `format!("FROM {}", table)` 模式虽当前安全(硬编码),但违反防御原则 | `crates/zclaw-saas/src/db.rs:874,880` |
| SEC2-P2-09 | `hand_run_status` 前端传递多余 `handName` 参数Rust 只接收 `run_id` | `desktop/src/lib/kernel-hands.ts:95` |
| SEC2-P2-10 | `kernel_apply_saas_config` TOML 写入不支持多行值 | `desktop/src-tauri/src/kernel_commands/lifecycle.rs` |
---
## 5. 新增 P3 发现3 项)
| ID | 问题 | 文件 |
|----|------|------|
| SEC2-P3-01 | A2A Router 4 个 RwLock 获取顺序未文档化 | `crates/zclaw-protocols/src/a2a.rs:239-245` |
| SEC2-P3-02 | Admin-v2 Role 类型:后端 `is_system` 字段前端未映射,前端 `account_count` 后端无字段 | `admin-v2/src/types/index.ts` vs `role/types.rs` |
| SEC2-P3-03 | Admin-v2 Billing/Knowledge/Roles 三个页面缺测试Billing、Knowledge 页面 + Roles 新页面) | `admin-v2/tests/` |
---
## 6. 确认项(审计验证结果)
### 6.1 编译状态
- `cargo check --workspace` **编译成功**33.60s
- 2 个 warning`RegisterDeviceRequest` 可见性P2`sqlx-postgres` 未来兼容性P1
### 6.2 Sprint 1-4 修复验证
| 修复 | 验证结果 |
|------|---------|
| trigger_update 参数扁平化 | **通过** — 前后端参数完全匹配 |
| SaaS config sync 传播 | **通过** — kernel_apply_saas_config 正确桥接 |
| Deprecated 代码清理 | **通过** — 无残留引用 |
| Admin Roles 页面 | **通过** — API 路径与 SaaS 路由匹配 |
| ToolDefinition 去重 | **通过** — 使用 pub use |
| Knowledge handler 修复 | **通过** — 连接到 service 层 |
| Task 结果持久化 | **通过** — migration + 读写一致 |
### 6.3 Admin-v2 ↔ SaaS API 对齐
**结论100% 对齐。** 所有 admin-v2 前端调用的 API 端点在后端都有对应路由注册,包括:
- 9 个 knowledge 路径categories/items/analytics/search/recommend/import/versions/rollback/batch
- 5 个 role 路径 + 5 个 permission-template 路径
- 6 个 billing 路径
- 2 个 telemetry 路径
### 6.4 Feature Gate 一致性
传播链完全正确:
```
desktop --multi-agent--> zclaw-kernel --multi-agent--> zclaw-protocols --a2a--> [a2a module]
zclaw-skills --wasm--> [wasmtime, wasmtime-wasi]
```
### 6.5 认证覆盖
SaaS 后端三层路由分离无遗漏:公共路由 + 受保护路由 + Relay 独立中间件链。
---
## 7. 测试覆盖统计
### 7.1 Rust 测试分布
| Crate | 测试数 | 关键缺口 |
|-------|--------|----------|
| zclaw-hands | 155 | - |
| zclaw-saas | 92 | 集中在工具函数handler/scheduler 0 测试 |
| zclaw-growth | 75 | - |
| zclaw-pipeline | 59 | - |
| zclaw-types | 57 | - |
| zclaw-kernel | 52 | capabilities/registry/trigger_manager 0 测试 |
| zclaw-runtime | 42 | - |
| zclaw-memory | 25 | - |
| zclaw-skills | 22 | - |
| zclaw-protocols | 5 | 极低 |
| **总计** | **584** | |
### 7.2 零测试关键模块
| 模块 | 公开函数数 | 严重度 |
|------|-----------|--------|
| kernel_commands/ (41 Tauri 命令) | 41 | P0 |
| browser/commands.rs (23 命令) | 23 | P0 |
| SaaS scheduler.rs | 3 公开函数 | P1 |
| SaaS knowledge/handlers.rs (561 行) | ~15 | P1 |
| SaaS relay/service.rs | ~20 | P1 |
| SaaS billing/ | ~10 | P1 |
| Desktop frontend | 全部 | P1 |
### 7.3 Admin-v2 测试
- **测试框架**: Vitest + jsdom + MSW
- **测试用例**: 322 个
- **覆盖页面**: 10/13缺失 Billing、Knowledge、Roles
- **覆盖 service**: 1/17仅 request.ts
---
## 8. 积极发现
1. **SQL 参数化规范**SaaS 层绝大多数 SQL 使用 `sqlx::query(...).bind(...)` 参数化
2. **密钥保护**JWT secret 使用 `secrecy::SecretString`API key 日志仅输出 ID
3. **DashMap 死锁已规避**:所有 DashMap RefMut 在 `.await` 前释放
4. **SSE 背压设计**:有界 channel + 信号量限制 + CancellationToken
5. **密码版本控制**password_version 确保 JWT 失效
6. **MCP Transport**:实现 Drop trait 清理子进程
7. **DB 连接池监控**30s 周期日志 + 80% 告警
8. **Admin-v2 API 对齐**:所有前端调用都有后端路由对应
---
## 9. 综合风险矩阵V11 + 二次审计合并)
| 严重度 | V11 原始 | 二次审计新增 | 合计 |
|--------|----------|-------------|------|
| P0 | 1 (误报) | **2** | 2 |
| P1 | 3 | **9** | 12 |
| P2 | 6 | **10** | 16 |
| P3 | 8 | **3** | 11 |
| P4 | 5 | 0 | 5 |
| **总计** | **23** | **24** | **46** |
---
## 10. 支付安全深度审计 V32026-04-02
> **审计范围**: `crates/zclaw-saas/src/billing/` 全部文件payment.rs, service.rs, handlers.rs, types.rs, mod.rs
> **审计方法**: 3 维并行Security Engineer + Code Reviewer + Senior Developer
> **基线**: V2 审计后的 25 项修复全部落地
### 10.1 审计结论
| 指标 | 结果 |
|------|------|
| **CRITICAL** | **0** |
| **HIGH** | **0** |
| **MEDIUM** | **1**(已修复) |
| **LOW** | **3**pre-existing / cosmetic |
### 10.2 已修复项(本次修复)
| ID | 严重度 | 问题 | 修复 |
|----|--------|------|------|
| PAY-FIX-01 | MEDIUM | `truncate_str` 使用 `s.len()`(字节数)判断是否截断,但 `chars().take()` 按字符截断。中文等多字节字符串在 200 字节内但超过 200 字符时截断错误 | 改为先 `chars().collect::<Vec<char>>()` 再按 `.len()` 判断字符数 |
### 10.3 已验证通过的关键安全措施25 项)
#### 事务与竞态保护6 项)
- [x] `create_payment` 在事务中创建 invoice + payment原子性
- [x] `handle_payment_callback` 使用 `SELECT ... FOR UPDATE` 锁定行(防 TOCTOU
- [x] `get_or_create_usage` 使用 `INSERT ON CONFLICT DO NOTHING`(防重复创建)
- [x] 金额交叉验证:生产环境 `callback_amount` 为 None 时拒绝
- [x] 幂等保护:已处理的 paymentstatus != pending直接返回
- [x] 事务失败时正确 rollback
#### 支付回调安全6 项)
- [x] Alipay 验签:生产环境强制 RSA2 验签,缺公钥拒绝
- [x] WeChat 解密AES-256-GCM + nonce 长度校验12 字节)
- [x] trade_no 缺失时返回错误而非静默忽略
- [x] 日志安全:`sanitize_log` 只保留字母数字和 `-` `_`
- [x] 通用错误对外返回(不泄露内部细节)
- [x] 回调路由正确分离到 public_routes无需认证
#### 密钥保护4 项)
- [x] `PaymentConfig` 自定义 Debug impl敏感字段显示 `***REDACTED***`
- [x] `alipay_private_key``alipay_public_key``wechat_api_v3_key` 标记 `skip_serializing`
- [x] JWT 密钥使用 `secrecy::SecretString`
- [x] API key 日志仅输出 ID 不输出值
#### 货币精度2 项)
- [x] 分→元转换使用整数运算(`amount_cents / 100` + `amount_cents % 100`
- [x] WeChat 金额保持整数分(无浮点转换)
#### HTML 安全2 项)
- [x] Mock 支付页面使用 `html_escape()` 转义用户输入
- [x] Mock 确认页面的 `msg` 变量由服务端控制(安全)
#### SQL 安全3 项)
- [x] 所有 SQL 使用参数化查询(`sqlx::query(...).bind(...)`
- [x] `increment_dimension` 使用白名单分支(非动态列名)
- [x] `failure_reason` 截断到 200 字符
#### 整体架构2 项)
- [x] 路由分离:`routes()` 需认证,`callback_routes()` 公开
- [x] 批量递增 `increment_dimension_by` 替代循环查询
### 10.4 剩余 LOW 项(不影响安全,可后续优化)
| ID | 说明 | 建议 |
|----|------|------|
| PAY-LOW-01 | `reqwest::Client::new()` 每次 WeChat 支付创建新实例 | 改为 AppState 中共享 Client |
| PAY-LOW-02 | `BootstrapScreen` 缺少 dark mode 变体 | 添加 `dark:bg-gray-900` |
| PAY-LOW-03 | `aside.w-64.sidebar-open` class 定义但无 JS 切换逻辑 | 添加汉堡菜单或移除 |
### 10.5 审计签名
- **Security Engineer**: 0 CRITICAL, 0 HIGH — 支付链路安全措施完备
- **Code Reviewer**: 25 项修复全部正确实现,无回归
- **Senior Developer**: 1 MEDIUM 已修复truncate_str代码质量良好

View File

@@ -1,6 +1,6 @@
# ZCLAW 多端系统架构文档
> 版本: 1.1 | 日期: 2026-03-29 | 状态: 已更新 (Worker + Scheduler + SQL 迁移 + 多环境配置)
> 版本: 1.2 | 日期: 2026-04-01 | 状态: 已更新 (DeerFlow 视觉复刻 + 安全审计 V1 修复 + Admin V2 迁移)
---
@@ -29,9 +29,9 @@ ZCLAW 是面向中文用户的 AI Agent 桌面客户端,由 **4 个独立服
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Desktop App │ │ Admin Web │ │ SaaS Backend │ │
│ │ (Tauri+React)│ │ (Next.js) │ │ (Axum + PostgreSQL) │ │
│ │ Port: 1420 │ │ Port: 3000 │ │ Port: 8080 │ │
│ │ Desktop App │ │ Admin V2 │ │ SaaS Backend │ │
│ │ (Tauri+React)│ │ (Vite+AntD) │ │ (Axum + PostgreSQL) │ │
│ │ Port: 1420 │ │ Port: 5173 │ │ Port: 8080 │ │
│ │ │ │ │ │ │ │
│ │ 内核模式: │ │ 管理后台 │ │ REST API │ │
│ │ Tauri IPC │ │ JWT 鉴权 │ │ JWT + API Token │ │
@@ -67,7 +67,8 @@ ZCLAW 是面向中文用户的 AI Agent 桌面客户端,由 **4 个独立服
| 端口 | 服务 | 协议 | 用途 | 启动方式 |
|------|------|------|------|----------|
| 1420 | Vite Dev Server | HTTP | 桌面端前端开发服务 (仅 dev) | `pnpm tauri dev` |
| 3000 | Next.js Dev Server | HTTP | Admin 管理后台开发服务 | `pnpm dev` (admin/) |
| 3000 | ~~Next.js Dev Server~~ | HTTP | ~~旧 Admin 管理后台~~ (已废弃) | ~~`pnpm dev` (admin/)~~ |
| 5173 | Vite Dev Server | HTTP | Admin V2 管理后台开发服务 | `pnpm dev` (admin-v2/) |
| 4200 | ZCLAW Gateway/Kernel | WebSocket + REST | 网关备用端口 | ZCLAW 二进制 |
| 50051 | ZCLAW Gateway | WebSocket + REST | 网关主端口 | ZCLAW 二进制 |
| 5432 | PostgreSQL | PostgreSQL Wire | SaaS 后端数据库 | Docker/start-all.ps1 |
@@ -89,14 +90,21 @@ ZCLAW 是面向中文用户的 AI Agent 桌面客户端,由 **4 个独立服
| 样式方案 | Tailwind CSS | 原子化 CSS暗色主题友好 |
| 数据存储 | SQLite (本地) | 离线优先FTS5 全文搜索 |
### 3.2 Admin 管理后台
### 3.2 Admin V2 管理后台
| 层级 | 技术 | 选型理由 |
|------|------|----------|
| 框架 | Next.js 14 (App Router) | SSR/CSR 灵活切换API 代理 |
| 数据获取 | SWR 2.x | 缓存+去重+自动重验证stale-while-revalidate |
| UI 组件 | shadcn/ui | 暗色主题原生支持,可定制 |
| 图表 | Recharts | React 原生集成,轻量 |
| 框架 | React 19 + Vite 8 | 纯 SPA快速构建 |
| 语言 | TypeScript 5.9 | 类型安全 |
| UI 组件 | Ant Design 6 + Pro Components | 企业级组件库,暗色主题 |
| 状态管理 | Zustand 5 | 轻量灵活 |
| 数据获取 | TanStack React Query 5 | 缓存+去重+自动重验证 |
| 路由 | React Router 7 | SPA 路由 |
| HTTP | Axios | 拦截器 + 401 自动刷新 |
| 样式 | Tailwind CSS v4 | 原子化 CSS |
| 测试 | Vitest + Testing Library + MSW | 完整测试覆盖 |
> **Admin V2 迁移说明**: 从 Next.js + SWR + shadcn/ui 迁移到 Vite + React Query + Ant Design Pro认证改为 HttpOnly Cookie 模式11 个管理页面全部重写,含 71 个测试用例。
### 3.3 SaaS 后端
@@ -118,30 +126,33 @@ ZCLAW 是面向中文用户的 AI Agent 桌面客户端,由 **4 个独立服
```
zclaw-types → 基础类型 (AgentId, Message, Error)
zclaw-memory → 存储层 (SQLite, FTS5, TF-IDF, Embeddings)
zclaw-runtime → 运行时 (LLM 驱动, 工具, Agent 循环)
zclaw-kernel → 核心协调 (注册, 调度, 事件, 工作流)
zclaw-skills → 技能系统 (SKILL.md 解析, WASM 执行器)
zclaw-hands → 自主能力 (Hand/Trigger 注册管理)
zclaw-runtime → 运行时 (LLM 驱动, 11 层中间件, 工具, Agent 循环)
zclaw-kernel → 核心协调 (注册, 调度, 事件, 9 Hands, 76 Skills)
zclaw-skills → 技能系统 (SKILL.md 解析, 语义路由, DAG 编排)
zclaw-hands → 自主能力 (9 个内置 Hand 实现)
zclaw-protocols → 协议支持 (MCP, A2A)
zclaw-saas → SaaS 后端 (独立服务, 8080 端口)
zclaw-pipeline → 流水线引擎 (v1/v2 DSL, Smart Presentation)
zclaw-growth → 成长系统 (记忆提取/检索/注入, OpenViking 分层)
zclaw-saas → SaaS 后端 (独立服务, 8080 端口, 58 API)
```
---
## 4. 数据流向
### 4.1 Admin 管理后台数据流
### 4.1 Admin V2 管理后台数据流
```
用户操作 → React UI → SWR Hook → api-client.ts → Next.js Rewrites → SaaS 后端 (:8080)
用户操作 → React UI → React Query → request.ts (Axios) → Vite Proxy → SaaS 后端 (:8080)
↑ ↓
└── SWR Cache ←── JSON Response ←── PostgreSQL (:5432) ←─┘
└── React Query Cache ←── JSON Response ←── PostgreSQL (:5432) ←─┘
```
**关键路径:**
- Admin 前端所有请求通过 `next.config.js rewrites` 代理到 `localhost:8080`
- Admin V2 所有请求通过 `vite.config.ts proxy` 代理到 `localhost:8080`
- API 基路径: `/api/v1/*` (前端) → `http://localhost:8080/api/v1/*` (后端)
- SWR 缓存: 页面切换后缓存 5s 去重,stale-while-revalidate 模式
- React Query 缓存: 自动去重 + stale-while-revalidate 模式
- SSE 端点 (`/relay/chat/completions`) 超时配置 10 分钟
### 4.2 桌面端数据流 (Tauri 模式)
@@ -546,11 +557,15 @@ React UI → saas-client.ts → HTTPS REST → SaaS 后端 (:8080)
| 命令组 | 文件 | 命令数 | 用途 |
|--------|------|--------|------|
| 进程管理 | lib.rs | 10 | zclaw_start/stop/restart, doctor, health_check |
| 内核操作 | kernel_commands.rs | 20+ | agent_create/chat_stream, skill_execute, hand_execute |
| 工作流 | pipeline_commands.rs | 9 | pipeline_run/progress/cancel, route_intent |
| 持久记忆 | memory_commands.rs | 12 | memory_store/get/search/export |
| Viking 存储 | viking_commands.rs | 9 | viking_add/find/grep/read |
| 智能钩子 | intelligence_hooks.rs | 2 | pre/post_conversation_hook |
| 内核操作 | kernel_commands.rs | 34 | agent_create/chat_stream, skill_execute, hand_execute, trigger, workflow |
| 工作流 | pipeline_commands.rs | 10 | pipeline_run/progress/cancel, route_intent |
| 浏览器自动化 | browser_commands.rs | 22 | navigate/click/fill/screenshot/evaluate |
| 智能层 | intelligence_commands.rs | 35 | memory/identity/reflection/heartbeat/autonomy |
| 持久记忆 | memory_commands.rs | 14 | memory_store/get/search/export/graph |
| Viking 存储 | viking_commands.rs | 13 | viking_add/find/grep/read |
| CLI 工具 | cli_commands.rs | 13 | doctor/health/export/import |
| 安全存储 | secure_storage.rs | 4 | store/get/delete/list |
| LLM 管理 | llm_commands.rs | 3 | list_providers/test_connection |
### 6.2 WebSocket 事件类型
@@ -602,16 +617,16 @@ React UI → saas-client.ts → HTTPS REST → SaaS 后端 (:8080)
```
┌───────────────────────────────────────────────────────────┐
│ Admin 浏览器 (localhost:3000)
│ Admin V2 浏览器 (localhost:5173)
│ │
│ ┌──────────┐ SWR Cache ┌──────────────┐
│ │ React UI │◄────────────►│ api-client
│ │ 11 页面 │ JWT 鉴权
│ └──────────┘ └──────┬───────┘
│ │ fetch() │
│ ┌──────────┐ React Query ┌──────────────┐ │
│ │ React UI │◄────────────►│ Axios │ │
│ │ 11 页面 │ CacheCookie 认证 │ │
│ └──────────┘ └──────┬───────┘ │
│ │ axios() │
└──────────────────────────────────┼────────────────────────┘
Next.js Rewrite│ /api/* → localhost:8080/api/*
Vite Proxy │ /api/* → localhost:8080/api/*
┌──────────────────────────────────┼────────────────────────┐
│ SaaS Backend (:8080) │ │
@@ -625,7 +640,7 @@ React UI → saas-client.ts → HTTPS REST → SaaS 后端 (:8080)
│ └──────┬───────┘ │
│ │ │
│ ┌─────────────▼──────────────┐ │
│ │ Handlers (72 个端点) │ │
│ │ Handlers (58 个端点) │ │
│ │ auth/account/model/relay/ │ │
│ │ config/prompt/telemetry/ │ │
│ └─────────────┬──────────────┘ │
@@ -807,4 +822,4 @@ run_on_start = false
---
> **文档统计**: 84 个 API 端点 | 5 个通信通道 | 12 种权限 | 4 个独立服务 | 5 个 Workers | 声明式 Scheduler | SQL Schema v6
> **文档统计**: 58 个 API 端点 | 5 个通信通道 | 12 种权限 | 4 个独立服务 | 5 个 Workers | 声明式 Scheduler | SQL Schema v8

View File

@@ -0,0 +1,296 @@
# ZCLAW V11 差距分析报告
> **生成日期**: 2026-04-02
> **审计基线**: V10 AUDIT_TRACKER + V11 全面扫描
---
## 1. 五种差距模式总览
| 模式 | 数量 | 最高严重度 |
|------|------|-----------|
| 写了没接 | 8 项 | P3 |
| 接了没传 | 2 项 | **P1** |
| 传了没存 | 2 项 | P3 |
| 存了没用 | 3 项 | **P2** |
| 双系统不同步 | 5 项 | P3 |
---
## 2. 模式 1: "写了没接" (Wrote but Not Connected)
### 2.1 audit-logger.ts — 170 行完全孤立
**文件**: `desktop/src/lib/audit-logger.ts`
**严重度**: P3
完整的前端审计日志系统,包含 `FrontendAuditEntry` 类型、`AuditLogger`log/logSuccess/logFailure/getLogs/clearLogs/exportLogs、导出单例。
**验证**:
```bash
grep -rn "from.*audit-logger\|import.*audit-logger" desktop/src/ --include="*.ts" --include="*.tsx"
# 结果: 0 匹配
```
**影响**: 审计日志功能完全不可用,用户无法追溯操作历史。
**建议**:
- 方案 A: 在关键组件ApprovalsPanel, AutonomyConfig, SecurityStore中接入
- 方案 B: 如果当前不需要,标记为 `@internal reserved` 并从 barrel export 中移除
---
### 2.2 OFP 能力 — 类型定义无消费者
**文件**: `crates/zclaw-types/src/capability.rs:28-32`
**严重度**: P4
```rust
OfpDiscover,
OfpConnect { peer: String },
OfpAdvertise,
```
`Capability::grants()` 方法将这些变体匹配到 `_ => false`,意味着它们无法被授予或验证。
**建议**: 移除或添加 `// Reserved for OpenFang Protocol` 注释。
---
### 2.3 Director (multi-agent) — Feature-gated 912 行
**文件**: `crates/zclaw-kernel/src/director.rs`
**严重度**: P4 (保持 V10 DEAD-04)
22 个 `cfg(feature = "multi-agent")` 条目,完整的 Director 实现5 种调度策略)。未在 Cargo.toml 中启用。
**建议**: 延后到产品路线图中多 Agent 功能启动时启用。
---
### 2.4 saas-admin.ts — 30 方法零消费者
**文件**: `desktop/src/lib/saas-admin.ts`
**严重度**: P2
30 个 Admin API 包装方法providers/models/keys/accounts/tokens/roles/permissions
- Desktop 前端不调用这些方法
- Admin-v2 有自己的 Axios service 层,不使用 saas-admin.ts
**文件头注释** (line 7-9):
> "Reserved for future admin UI (Next.js admin dashboard)."
**建议**: 删除整个文件admin-v2 已有独立实现。避免维护两套代码。
---
### 2.5 Feature-gated 代码汇总
| 特性 | Crate | 代码量 | 状态 |
|------|-------|--------|------|
| multi-agent | zclaw-kernel | 22 cfg sites | 未启用 |
| a2a | zclaw-protocols | 2 cfg sites | 未启用 |
| wasm | zclaw-skills | 4 cfg sites | 未启用 |
---
### 2.6 62 个 Tauri 命令无前端调用
**分布**:
| 模块 | 未调用命令数 | 备注 |
|------|-------------|------|
| viking_commands | 11 | 完整 Viking 模块无 UI |
| pipeline_commands | 11 | 完整 Pipeline 模块无直接 invoke |
| gateway::commands | 11 | Gateway 连接管理 |
| classroom_commands | 7 (8 中仅 1 个被调用) | Classroom 功能 |
| LLM commands | 3 | llm_complete, embedding_create, embedding_providers |
| memory extractor | 2 | extract_session_memories, extract_and_store_memories |
| agent commands | 3 | export, import, agent_chat |
| kernel lifecycle | 2 | kernel_init, kernel_shutdown |
| 其他 | 12 | health, hand_run_cancel, scheduled_task 等 |
**注意**: pipeline 和 classroom 的 invoke 调用可能通过 store 或 client lib 间接调用,但 grep 未找到匹配。需手动验证。
---
## 3. 模式 2: "接了没传" (Connected but Not Passed)
### 3.1 trigger_update 参数嵌套问题 ⚠️ P1
**前端**: `desktop/src/lib/kernel-triggers.ts:99`
```typescript
return await invoke<TriggerItem>('trigger_update', { id, updates });
// updates = { name, enabled, handId, triggerType }
```
**Rust**: `desktop/src-tauri/src/kernel_commands/trigger.rs:183-189`
```rust
pub async fn trigger_update(
state: State<'_, KernelState>,
id: String,
name: Option<String>, // 期望扁平参数
enabled: Option<bool>,
hand_id: Option<String>,
) -> Result<TriggerResponse, String>
```
**问题**: 前端传递 `{ id, updates: { name, ... } }` 嵌套结构,但 Rust 期望 `{ id, name, enabled, hand_id }` 扁平参数。Tauri 的 serde 反序列化会忽略嵌套的 `updates` 对象,导致 name/enabled/hand_id 始终为 `None`
**此外**: Rust 硬编码 `trigger_type: None`trigger.rs:198前端传递的 `triggerType` 永远被丢弃。
**影响**: Trigger 更新功能静默失败 — 用户修改 trigger 配置后不会生效。
**修复方案**: 前端改为扁平传递:
```typescript
await invoke('trigger_update', { id, name: updates.name, enabled: updates.enabled, handId: updates.handId });
```
---
### 3.2 hand_execute 参数名映射
**前端**: `desktop/src/lib/kernel-hands.ts:82`
```typescript
const result = await invoke('hand_execute', {
id: name, // 前端字段名 "id"
input: params || {},
...(autonomyLevel ? { autonomyLevel } : {}),
});
```
需验证 Rust 端是否接受 `id` 还是 `hand_name`。Tauri 自动做 camelCase ↔ snake_case 转换,但如果 Rust 使用 `name` 而前端使用 `id`,可能导致映射失败。
---
## 4. 模式 3: "传了没存" (Passed but Not Stored)
### 4.1 定时任务执行结果未持久化
**文件**: `crates/zclaw-saas/src/scheduler.rs:147-225`
`execute_scheduled_task` 执行任务后只更新 `last_run_at``next_run_at``run_count`,但不存储执行结果(成功/失败、输出、错误消息)。
`scheduled_tasks` 表 schema 缺少 `last_result`/`last_error` 列。
**影响**: 无法查看定时任务历史执行结果,无法诊断失败原因。
**建议**: 添加 `last_result TEXT``last_error TEXT` 列到 scheduled_tasks 表。
---
### 4.2 前端审计日志滞留 localStorage
`audit-logger.ts` 写入 localStorage但无路径发送到后端或展示在 UI。数据在 `MAX_LOCAL_LOGS = 500` 条后循环覆盖。
---
## 5. 模式 4: "存了没用" (Stored but Not Used)
### 5.1 prompt_sync_status 表 — 零读取
**迁移**: `20260329000001_initial_schema.sql:244`
数据由 OTA 同步流程写入,但全代码库中无 `SELECT FROM prompt_sync_status`
**可能原因**: OTA check 端点直接比较版本号而不查询此表。
**建议**: 移除死表,或实现读取路径。
---
### 5.2 telemetry_reports 表 — 零读取
**迁移**: `20260329000001_initial_schema.sql:305`
数据通过 telemetry 批量上报写入,但无查询路径。
**可能原因**: Admin dashboard 统计数据从 usage_records 聚合,不从此表读取。
**建议**: 实现读取端点供 admin-v2 telemetry 页面使用。
---
### 5.3 key_usage_window 表 — 零读取
**迁移**: `20260329000001_initial_schema.sql:274`
写入用于限流窗口追踪,但无 SELECT 查询。限流中间件可能使用内存中的 DashMap 而非数据库查询。
**建议**: 确认是否仍需要此表,或改用纯内存方案。
---
## 6. 模式 5: "双系统不同步" (Dual System Out of Sync)
### 6.1 Desktop ↔ Admin-v2 类型名称不一致13+ 组)
| Admin-v2 名称 | Desktop 名称 | 实际差异 |
|---------------|-------------|----------|
| `AccountPublic` | `SaaSAccountInfo` | 命名 + llm_routing required/optional |
| `Provider` | `ProviderInfo` | 仅命名 |
| `Model` | `ModelInfo` | 仅命名 |
| `RelayTask` | `RelayTaskInfo` | 仅命名 |
| `ConfigItem` | `SaaSConfigItem` | 仅命名 |
| `OperationLog` | `OperationLogInfo` | 仅命名 |
| `PromptTemplate` | `PromptTemplateInfo` | 仅命名 |
| `PromptVersion` | `PromptVersionInfo` | 仅命名 |
| `AgentTemplate` | `AgentTemplateFull` | 命名 + 字段差异admin 多 5 个字段) |
| `ApiError` | `SaaSErrorResponse` | 命名 + admin 多 status 字段 |
| `LoginResponse` | `SaaSLoginResponse` | 结构差异cookie vs token |
| `TokenInfo` | `TokenInfo` | nullability 差异 |
| `PaginatedResponse` | `PaginatedResponse` | **一致** |
### 6.2 有意义的字段差异
**AccountPublic.llm_routing**:
- Desktop: `llm_routing?: 'relay' | 'local'` (optional)
- Admin: `llm_routing: 'relay' | 'local'` (required)
**TokenInfo nullability**:
- Desktop: `last_used_at: string | null`, `expires_at: string | null`
- Admin: `last_used_at?: string`, `expires_at?: string`
**PromptVariable.type**:
- Desktop: `type: string`
- Admin: `type: 'string' | 'number' | 'select' | 'boolean'`
**AgentTemplate 字段差异**:
- Admin 额外: `visibility`, `status`, `current_version`, `version`, `capabilities`
- Desktop 缺少以上字段
### 6.3 文档数字不一致
| 指标 | 实际值 | 文档值 | 差异文件 |
|------|--------|--------|----------|
| Skills | 76 | 66/75/77 | SYSTEM_ARCHITECTURE.md, roadmap.md, troubleshooting.md |
| Hands | 9 目录 | 11 (CLAUDE.md) | CLAUDE.md 列出 11 个 Hand 配置 |
| Tauri 命令 | 175 | 58+ / 130+ | 06-tauri-backend/00-backend-integration.md |
| SaaS 路由 | 58 | 72+ | 08-saas-platform/00-saas-overview.md |
| Stores | 15 | 14 | 00-architecture/02-state-management.md |
---
## 7. Dead Code 完整清单
| 项 | 位置 | 行数 | 严重度 | 建议 |
|----|------|------|--------|------|
| audit-logger.ts | desktop/src/lib/ | 170 | P3 | 接入或删除 |
| saas-admin.ts | desktop/src/lib/ | 234 | P2 | 删除admin-v2 已替代) |
| extract_structured_facts() | crates/zclaw-runtime/src/growth.rs:224 | ~30 | P4 | 删除 deprecated 方法 |
| secure-storage sync 方法 | desktop/src/lib/secure-storage.ts:309-325 | ~20 | P4 | 删除 |
| OFP 能力变体 | crates/zclaw-types/src/capability.rs:28-32 | 5 | P4 | 注释或移除 |
| Director feature-gated | crates/zclaw-kernel/src/director.rs | 912 | P4 | 保持,等路线图激活 |
| A2A feature-gated | crates/zclaw-protocols/src/a2a.rs | ~400 | P4 | 保持,等路线图激活 |
| WASM feature-gated | crates/zclaw-skills/src/wasm_runner.rs | ~200 | P4 | 保持,等路线图激活 |
---
## 8. Deprecated 代码状态
| 函数 | 位置 | 调用者 | 操作 |
|------|------|--------|------|
| `extract_structured_facts()` | growth.rs:224 | 0 | 删除 |
| `getStoredGatewayToken()` | gateway-storage.ts:129 | **3 活跃调用** | 先迁移调用者再删除 |
| `setStoredGatewayToken()` | gateway-storage.ts:196 | **1 活跃调用** | 先迁移调用者再删除 |
| `getSync()/setSync()/deleteSync()` | secure-storage.ts:309-325 | 0 | 删除 |

View File

@@ -0,0 +1,209 @@
# ZCLAW V11 修复优先级计划
> **生成日期**: 2026-04-02
> **关联审计**: COMPREHENSIVE_AUDIT_V11.md + V11_GAP_ANALYSIS.md
---
## Sprint 分配建议
### Sprint 1 (P1 — 紧急修复)
#### V11-P1-01: trigger_update 参数修复
- **影响**: Trigger 配置更新静默失败
- **修复复杂度**: 低1 文件修改)
- **文件**: `desktop/src/lib/kernel-triggers.ts:99`
- **方案**: 将嵌套 `updates` 对象展开为扁平参数
```typescript
// 修复前:
await invoke('trigger_update', { id, updates });
// 修复后:
await invoke('trigger_update', {
id,
name: updates.name,
enabled: updates.enabled,
handId: updates.handId,
});
```
- **同时修复**: Rust 端添加 `trigger_type` 参数支持trigger.rs:183-189
- **验证**: 修改 trigger 配置后检查 Kernel 状态
#### V11-P1-02: SaaS 配置同步传播
- **影响**: SaaS 管理员修改配置后不影响 Kernel 运行时
- **修复复杂度**: 中(需要新增 Tauri 命令或事件机制)
- **方案**:
- 选项 A: saasStore.pullConfig 完成后调用 Tauri command 通知 Kernel 重新加载配置
- 选项 B: Kernel 定期检查配置文件变更watcher
- 选项 C: 明确记录为 "前端缓存同步,不影响 Kernel"
- **建议**: 先选 C文档对齐后续迭代实现 A
- **验证**: 在 SaaS 后台修改配置 → 检查 Kernel 日志是否反映变更
#### V11-P1-03: 孤立 SQL 表处理
- **影响**: 数据写入但无法读取,浪费存储
- **修复复杂度**: 低
- **方案**:
- `prompt_sync_status`: 实现读取查询OTA 端点需要)
- `telemetry_reports`: 添加 admin-v2 查询端点
- `key_usage_window`: 确认是否需要(限流可能已改用内存方案)
- **验证**: `grep -rn "SELECT.*FROM.*<table>" crates/zclaw-saas/src/` 有结果
---
### Sprint 2 (P2 — 高优先级)
#### V11-P2-01: 删除 saas-admin.ts
- **修复复杂度**: 低(删除 1 文件 + saas-client.ts 中的 install 调用)
- **前置条件**: 确认 admin-v2 完全不依赖此文件
- **验证**: admin-v2 所有页面功能正常
#### V11-P2-02: Role/Permission 管理
- **选项 A**: 为 admin-v2 添加 roles service 和页面
- **选项 B**: 移除 SaaS role 路由(如果当前不需要 RBAC
- **建议**: 评估业务需求后决定
#### V11-P2-03: 迁移 deprecated gateway-storage 调用者
- **文件**: `gateway-client.ts:44,71,211`, `configStore.ts:252`
- **方案**: 将 sync 方法调用替换为 async 版本
- **验证**: Gateway 连接功能测试
#### V11-P2-04: ToolDefinition 去重
- **文件**: `zclaw-runtime/src/driver/mod.rs:94`
- **方案**: 重导出 `zclaw-types::tool::ToolDefinition`
- **验证**: `cargo build` 通过
#### V11-P2-05: 未调用 Tauri 命令评估
- **62 个命令**需逐一评估:
- classroom_*: 确认 classroomStore 是否真正调用(可能是 store 中调用的)
- pipeline_*: 确认 workflowStore 是否调用
- gateway_*: 确认是否有侧车进程调用
- viking_*: 确认 Settings 页面是否调用
- **验证**: 对每个命令 grep `invoke('command_name'`
#### V11-P2-06: SQL LIMIT 添加
- **文件**: `migration/service.rs`, `knowledge/service.rs`
- **方案**: 为 config_items SELECT 添加 LIMIT 1000knowledge_categories 添加 LIMIT 100
- **验证**: SQL 执行计划验证
---
### Sprint 3 (P3 — 中优先级)
#### V11-P3-01: audit-logger 接入
- **方案**: 在 ApprovalsPanel、AutonomyConfig、chatStore 的关键操作中添加 logAudit 调用
- **或**: 标记为 reserved 并从 index 导出中移除
#### V11-P3-02: OFP 能力处理
- **方案**: 添加 `// Reserved for OpenFang Protocol` 注释或移除变体
#### V11-P3-03: 移除 deprecated extract_structured_facts
- **方案**: 删除 growth.rs:224 的 deprecated 方法
- **验证**: `cargo build` 通过
#### V11-P3-04: SaaS knowledge stub 实现
- **文件**: knowledge/handlers.rs:91,293,321
- **方案**: 实现真正的分页查询、回滚、推荐算法
- **验证**: admin-v2 Knowledge 页面功能测试
#### V11-P3-05: 定时任务执行结果持久化
- **方案**: 添加 last_result/last_error 列到 scheduled_tasks 表
- **迁移**: 新增 SQL migration
- **验证**: 创建定时任务 → 执行 → 检查结果是否存储
#### V11-P3-06 ~ P3-08: 其他清理
- 移除 secure-storage sync 方法
- 启用 embedding 生成或注释
- 清理 config 预留参数注释
---
### Sprint 4 (P4 — 低优先级 / 文档)
#### V11-P4-01: ContentBlock 命名规范
- **方案**: 为每个 crate 的 ContentBlock 添加 crate 前缀注释
- `zclaw_types::ContentBlock` = LLM 消息内容
- `zclaw_hands::ContentBlock` = 幻灯片渲染
- `zclaw_protocols::ContentBlock` = MCP 协议格式
#### V11-P4-02: 类型名称统一
- **方案**: 建立共享类型包 `@zclaw/types` 或使用 OpenAPI schema 生成
- 13+ 类型名称不一致需要协调
#### V11-P4-03: 文档数字更新
- Skills: 76
- Hands: 9 目录CLAUDE.md 应更新 "11" → "9 目录 + 2 禁用配置"
- Tauri 命令: 175
- SaaS 路由: 58
- Stores: 15
#### V11-P4-04/05: Feature-gated 代码保持现状
- Director/A2A/WASM: 等产品路线图决定
- Embedding 生成: 等 OpenViking 集成完成后启用
---
## 依赖关系图
```
V11-P1-01 (trigger_update 修复)
└── 无依赖,可独立完成
V11-P1-02 (配置同步传播)
└── 依赖设计决策(选项 A/B/C
V11-P1-03 (孤立表处理)
└── V11-P2-06 (SQL LIMIT) 可同时处理
V11-P2-01 (删除 saas-admin.ts)
└── V11-P2-04 (ToolDefinition 去重) 可同时完成
V11-P2-03 (迁移 deprecated 调用)
└── 需要先确认 async 版本稳定性
V11-P3-04 (knowledge stub 实现)
└── 依赖 V11-P1-03确认表用途后实现读取
V11-P4-02 (类型统一)
└── 长期任务,不阻塞其他修复
```
---
## 修复工作量估算
| Sprint | 项数 | 预估工作量 | 风险等级 |
|--------|------|-----------|----------|
| Sprint 1 (P1) | 3 | 中 | 高P1-02 需设计决策) |
| Sprint 2 (P2) | 6 | 高 | 中P2-05 工作量大) |
| Sprint 3 (P3) | 8 | 中 | 低 |
| Sprint 4 (P4) | 5 | 低 | 低 |
---
## 验证检查清单
### 编译验证
```bash
cargo build --workspace
pnpm tsc --noEmit
```
### 功能验证
- [ ] 创建/更新/删除 Trigger → 检查 Kernel 状态
- [ ] SaaS 后台修改配置 → 检查 desktop 前端行为
- [ ] Admin-v2 Knowledge 页面 CRUD
- [ ] 定时任务执行 → 检查结果存储
- [ ] Agent 审批 → Hand 自动执行
- [ ] Pipeline 运行 → 完成事件通知
### 回归验证
```bash
# Rust 测试
cargo test --workspace
# 前端测试
pnpm vitest run
# Admin-v2 测试
cd admin-v2 && pnpm test
```

View File

@@ -1,9 +1,9 @@
# ZCLAW 后续工作计划
> **版本**: v0.7.0
> **更新日期**: 2026-03-30
> **基于**: 2026-03-30 审计后代码分析
> **状态**: 核心功能完整,审计修复完成SaaS 平台上线
> **版本**: v0.10.0
> **更新日期**: 2026-04-01
> **基于**: 2026-04-01 代码状态全面梳理
> **状态**: 核心功能完整,安全审计 V1 通过 (B+), Admin V2 迁移完成, DeerFlow 视觉复刻完成
---
@@ -14,31 +14,32 @@
| 指标 | 状态 |
|------|------|
| Rust Crates | **10 个** (types, memory, runtime, kernel, skills, hands, protocols, pipeline, growth, saas) |
| 功能完成度 | 核心功能 90-95%,整体 ~85% |
| 技能数量 | 69 SKILL.md |
| Hands 可用 | 9 (7 完整 + Speech/Twitter 真实实现2 个标记 demo) |
| Pipeline DSL | 完整实现 (5 模板 + Smart Presentation) |
| SaaS 平台 | 完整实现 (76+ API, 9 模块, 25 数据表, 连接池断路器) |
| Tauri 命令 | 58+ (kernel 29 + pipeline 13 + viking 13 + llm 3) |
| LLM Provider | 8 个 (含 Gemini) |
| 功能完成度 | 核心功能 92-98%,整体 ~90% |
| 技能数量 | 75 SKILL.md |
| Hands 可用 | 9 启用 (Browser/Slideshow/Speech/Quiz/Whiteboard/Researcher/Collector/Clip/Twitter) + 2 禁用 (Predictor/Lead) |
| Pipeline DSL | 完整实现 (v1/v2 DSL, 5 模板 + Smart Presentation) |
| SaaS 平台 | 完整实现 (58 API, 10 模块, 25+ 数据表, 5 Workers, 声明式 Scheduler) |
| Tauri 命令 | 175 (kernel 34 + pipeline 10 + browser 22 + intelligence 35 + memory 14 + cli 13 + viking 13 + llm 3 + secure_storage 4 + classroom 27) |
| LLM Provider | 8 个 (Kimi, Qwen, DeepSeek, Zhipu, OpenAI, Anthropic, Gemini, Local) |
| 连接模式 | 3 种 (Kernel / Gateway / SaaS) |
| 测试覆盖 | ~135 tests |
| Admin V2 | Vite + React + Ant Design Pro (11 页面, 71 测试) |
| 安全评级 | B+ (渗透测试 V1: 5 HIGH + 10 MEDIUM 全部已修复) |
| 中间件链 | 11 层 (Compaction/Memory/LoopGuard/TokenCalibration/SkillIndex/Title/DanglingTool/ToolError/ToolOutputGuard/Guardrail/SubagentLimit) |
### 1.2 Crate 完整度
| Crate | 层级 | 完整度 | 说明 |
|-------|------|--------|------|
| zclaw-types | L1 | 95% | 完全可用 |
| zclaw-memory | L2 | 90% | SQLite WAL |
| zclaw-runtime | L3 | 90% | 4 Driver, 5 工具, LoopGuard |
| zclaw-kernel | L4 | 85% | 9 Hands, 69 Skills, Trigger, Approval |
| zclaw-skills | L5 | 80% | Wasm/Native 待实现 |
| zclaw-hands | L5 | 85% | 9 Hands, 2 demo |
| zclaw-protocols | L5 | 75% | MCP 可用, A2A 待完善 |
| zclaw-pipeline | L5 | 95% | DSL + Smart Presentation |
| zclaw-growth | L5 | 95% | FTS5 + TF-IDF + Memory Extractor |
| zclaw-saas | 独立 | 95% | Axum + PostgreSQL, 76+ API |
| ~~zclaw-channels~~ | ~~L5~~ | **已移除** | Batch 7 清理,功能通过飞书 API 实现 |
| zclaw-memory | L2 | 92% | SQLite WAL + FactStore |
| zclaw-runtime | L3 | 92% | 4 Driver, 7 工具, 11 层中间件, PromptBuilder |
| zclaw-kernel | L4 | 88% | 9 Hands, 75 Skills, Trigger, Approval, Scheduler, Export |
| zclaw-skills | L5 | 85% | 语义路由 + DAG 编排, Wasm/Native 待实现 |
| zclaw-hands | L5 | 88% | 9 Hands 全部实现 (含 Twitter 12 API) |
| zclaw-protocols | L5 | 80% | MCP 完整, A2A 消息路由+群组+发现 |
| zclaw-pipeline | L5 | 95% | v1/v2 DSL + Smart Presentation + 意图路由 |
| zclaw-growth | L5 | 95% | FTS5 + TF-IDF + 记忆闭环 (提取/检索/注入) |
| zclaw-saas | 独立 | 98% | Axum + PostgreSQL, 58 API, 安全审计 B+ |
---
@@ -57,7 +58,7 @@
| ID | 任务 | 预估 | 状态 |
|----|------|------|------|
| S5 | 提升 SaaS 测试覆盖率 | 8h | 待开始 |
| S5 | 提升 SaaS 测试覆盖率 | 8h | ✅ 已完成 (Admin V2: 71 测试) |
| S6 | 完善 MCP 协议工具验证 | 3h | 待开始 |
| S7 | Browser Hand 稳定性增强 | 4h | 待开始 |
| S8 | 定时任务后端持久化 | 4h | ✅ 已完成 (migration v7 + CRUD + scheduler loop) |