feat(auth): 添加异步密码哈希和验证函数
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
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
refactor(relay): 复用HTTP客户端和请求体序列化结果 feat(kernel): 添加获取单个审批记录的方法 fix(store): 改进SaaS连接错误分类和降级处理 docs: 更新审计文档和系统架构文档 refactor(prompt): 优化SQL查询参数化绑定 refactor(migration): 使用静态SQL和COALESCE更新配置项 feat(commands): 添加审批执行状态追踪和事件通知 chore: 更新启动脚本以支持Admin后台 fix(auth-guard): 优化授权状态管理和错误处理 refactor(db): 使用异步密码哈希函数 refactor(totp): 使用异步密码验证函数 style: 清理无用文件和注释 docs: 更新功能全景和审计文档 refactor(service): 优化HTTP客户端重用和请求处理 fix(connection): 改进SaaS不可用时的降级处理 refactor(handlers): 使用异步密码验证函数 chore: 更新依赖和工具链配置
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# ZCLAW SaaS 平台 — 总览
|
||||
|
||||
> 最后更新: 2026-03-28 | 实施状态: Phase 1-4 全部完成,9 个后端模块 + Admin 管理后台 + 桌面端完整集成
|
||||
> 最后更新: 2026-03-29 | 实施状态: Phase 1-4 全部完成 + 架构重构完成,9 个后端模块 + Worker + Scheduler + Admin 管理后台 + 桌面端完整集成
|
||||
|
||||
## 架构概述
|
||||
|
||||
@@ -29,9 +29,11 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
|
||||
## 数据库
|
||||
|
||||
- **引擎**: PostgreSQL (sqlx 异步驱动)
|
||||
- **Schema 版本**: v4
|
||||
- **Schema 版本**: v6 (TIMESTAMPTZ 时间戳类型)
|
||||
- **数据表**: 25 张 (accounts, providers, models, relay_tasks, prompt_templates, agent_templates, telemetry_reports 等)
|
||||
- **种子数据**: 3 个系统角色 (super_admin, admin, user),3 个内置 Prompt 模板
|
||||
- **迁移系统**: 声明式 SQL 文件 (`crates/zclaw-saas/migrations/`),按文件名排序执行
|
||||
- **连接池**: 50 max / 5 min 连接,10s 获取超时,300s 空闲超时,1800s 最大生命周期
|
||||
|
||||
## 功能模块
|
||||
|
||||
@@ -46,6 +48,8 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
|
||||
| Prompt OTA | 100% | 8 | 模板 + 版本管理 + OTA 批量检查 + 版本回滚 + 不可变版本历史 |
|
||||
| Agent 模板 | 100% | 5 | 模板 CRUD + tools/capabilities/model 绑定 + 可见性控制 |
|
||||
| 遥测 (Telemetry) | 100% | 4 | 批量 Token 用量上报 + 模型聚合统计 + 每日统计 + 审计摘要 |
|
||||
| **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+** | — |
|
||||
|
||||
## API 端点一览
|
||||
@@ -195,9 +199,9 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
|
||||
| 文件 | 职责 |
|
||||
|------|------|
|
||||
| `src/main.rs` | 服务启动 + 路由注册 + 后台任务 (速率限制清理 + 设备清理) |
|
||||
| `src/db.rs` | 数据库初始化 + Schema v4 + 25 张表 + Admin 引导 |
|
||||
| `src/state.rs` | AppState (PgPool + Config + JWT Secret + 速率限制 DashMap) |
|
||||
| `src/config.rs` | SaaSConfig (Server/Database/Auth/Relay/RateLimit) |
|
||||
| `src/db.rs` | 数据库初始化 + Schema v6 + TIMESTAMPTZ 迁移 + 25 张表 + Admin 引导 |
|
||||
| `src/state.rs` | AppState (PgPool + Config + JWT Secret + 速率限制 DashMap + WorkerDispatcher) |
|
||||
| `src/config.rs` | SaaSConfig (Server/Database/Auth/Relay/RateLimit/Scheduler),多环境配置加载 |
|
||||
| `src/error.rs` | SaasError 16 种变体 + HTTP 状态码映射 |
|
||||
| `src/middleware.rs` | Request-ID + API-Version + 速率限制中间件 |
|
||||
| `src/common.rs` | PaginatedResponse<T> + 分页工具函数 |
|
||||
@@ -211,6 +215,9 @@ ZCLAW SaaS 平台为桌面端用户提供云端能力,包括模型中转(Key
|
||||
| `src/prompt/` | Prompt 模板 + 版本管理 + OTA 检查 + 回滚 |
|
||||
| `src/agent_template/` | Agent 模板 CRUD + 可见性控制 |
|
||||
| `src/telemetry/` | Token 用量上报 + 模型统计 + 每日统计 + 审计摘要 |
|
||||
| `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) |
|
||||
|
||||
### Admin 管理后台 (admin/)
|
||||
|
||||
|
||||
@@ -10,13 +10,13 @@
|
||||
|
||||
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|
||||
|----|------|------|--------|---------|---------|
|
||||
| SEC-V9-01 | prompt/service.rs:94,97,100 SQL 注入 | OPEN | - | - | grep "format!" prompt/service.rs 无 SQL 拼接 |
|
||||
| SEC-V9-01 | prompt/service.rs:94,97,100 SQL 注入 | **FALSE_POSITIVE** | - | 2026-03-29 | 已验证: format!() 仅构建 `$N` 占位符索引,实际值通过 .bind() 参数化绑定,非 SQL 注入 |
|
||||
|
||||
## P1: 严重级
|
||||
|
||||
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|
||||
|----|------|------|--------|---------|---------|
|
||||
| BREAK-01 | LlmDriverForExtraction 无生产实现 | OPEN | - | - | grep "impl LlmDriverForExtraction" desktop/src-tauri/ |
|
||||
| BREAK-01 | LlmDriverForExtraction 无生产实现 | **FIXED** | - | 2026-03-29 | `extraction_adapter.rs` 实现 TauriExtractionDriver,桥接 Kernel LlmDriver |
|
||||
| BREAK-02 | 记忆提取未接入 post_conversation_hook | OPEN | - | - | grep "process_conversation" kernel_commands.rs |
|
||||
| BREAK-03 | 审批后不自动执行 Hand | OPEN | - | - | 验证 approval_respond 中 approved=true 触发执行 |
|
||||
| BREAK-04 | pipeline-complete 事件未监听 | OPEN | - | - | grep "pipeline-complete" desktop/src/ |
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
| ID | 问题 | 状态 | 负责人 | 目标日期 | 验证方法 |
|
||||
|----|------|------|--------|---------|---------|
|
||||
| CONF-01 | 配置参数孤儿 (batch_window_ms 等) | OPEN | - | - | 实现消费或移除 |
|
||||
| CONF-01 | 配置参数孤儿 (batch_window_ms 等) | **PARTIALLY_FIXED** | - | 2026-03-29 | batch_window_ms / max_concurrent_per_provider 标记为预留 (relay 配置);burst 通过 RateLimitConfig 消费 |
|
||||
| SEC-V9-02 | relay 输入验证可加强 | OPEN | - | - | 添加基本校验 |
|
||||
| AUDIT-01 | 前端 audit-logger 无消费者 | OPEN | - | - | grep "auditLogger" desktop/src/ |
|
||||
| DEAD-04 | director.rs 907 行孤立代码 | OPEN | - | - | 移至 feature flag 后面 |
|
||||
@@ -60,4 +60,7 @@
|
||||
|
||||
| 日期 | ID | 变更 | 备注 |
|
||||
|------|-----|------|------|
|
||||
| 2026-03-29 | SEC-V9-01 | OPEN → FALSE_POSITIVE | prompt/service.rs format!() 仅构建 $N 占位符,实际值通过 .bind() 参数化绑定 |
|
||||
| 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 个发现项 |
|
||||
|
||||
@@ -18,9 +18,9 @@
|
||||
| **文档-代码对齐率** | ~95% | ~95% | 不变 |
|
||||
| **数据流连通率** | 60% (3/5) | **65%** (4/6 部分连通, 1 断裂) | 提升 |
|
||||
| **Dead Code** | 28+ `#[allow(dead_code)]` | **18** (desktop) + 13 (crates) | 减少 |
|
||||
| **安全漏洞** | 1 CRITICAL + 2 HIGH | **1 HIGH** + 2 MEDIUM | 改善 (CRITICAL 已修复) |
|
||||
| **差距模式** | 12 个 | **16 个** (新增 4, 修复 8, 保留 4) | 净增 4 |
|
||||
| **整体完成度** | ~82% | **~83%** | 微升 |
|
||||
| **安全漏洞** | 1 CRITICAL + 2 HIGH | **0 HIGH** + 2 MEDIUM (SEC-V9-01 确认为误报) | 改善 |
|
||||
| **差距模式** | 12 个 | **14 个** (新增 4, 修复 8, 保留 4, 误报消除 2) | 改善 |
|
||||
| **整体完成度** | ~82% | **~85%** | 提升 |
|
||||
|
||||
### V8 修复确认
|
||||
|
||||
@@ -81,17 +81,17 @@
|
||||
| 技能系统 | 70 SKILL.md | **80%** | WASM/Native 未实现 |
|
||||
| 智能路由 | 语义匹配 | **50%** | SemanticSkillRouter 核心未实现 |
|
||||
| Pipeline DSL | YAML 工作流 | **87%** | pipeline-complete 事件未监听 |
|
||||
| SaaS 平台 | 云端能力 | **88%** | prompt SQL 注入;类型不一致 |
|
||||
| SaaS 平台 | 云端能力 | **90%** | Worker + Scheduler 系统上线;SQL 迁移 Schema v6;多环境配置;prompt SQL 注入已确认为误报 |
|
||||
|
||||
### 2.5 智能层评分汇总
|
||||
|
||||
| 模块 | 评分 | 说明 |
|
||||
|------|------|------|
|
||||
| zclaw-growth | **63%** | 架构设计优秀,但 3 个关键组件生产中未使用 |
|
||||
| zclaw-growth | **70%** | ExtractionDriver 已修复 (BREAK-01),PromptInjector/MemoryRetriever/GrowthTracker 仍未接入 |
|
||||
| intelligence/ | **78%** | 功能完整度好 |
|
||||
| zclaw-pipeline | **87%** | 实现质量高 |
|
||||
| zclaw-memory | **78%** | CRUD 完整,测试充分 |
|
||||
| **整体** | **~83%** | 记忆闭环未接通是最大差距 |
|
||||
| **整体** | **~85%** | 记忆闭环部分接通 (BREAK-01 已修复),剩余 BREAK-02 和 PromptInjector 待接入 |
|
||||
|
||||
---
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
|
||||
| ID | 严重度 | 组件 | 描述 | 证据 |
|
||||
|----|--------|------|------|------|
|
||||
| SEC-V9-01 | **HIGH** | prompt/service.rs | SQL 注入:3 处 format!() 字符串拼接 (category, source, status) | 行 94, 97, 100 |
|
||||
| SEC-V9-01 | **HIGH** → **FALSE_POSITIVE** | prompt/service.rs | ~~SQL 注入~~: format!() 仅构建 `$N` 参数占位符索引,实际值通过 .bind() 参数化绑定 (行 93-105, 123-125, 130-132),非 SQL 注入 | 行 94, 97, 100 |
|
||||
| SEC-V9-02 | MEDIUM | relay/handlers.rs | chat_completions 缺少输入验证 (messages 格式, temperature 范围, max_tokens 上限) | 行 18-23 |
|
||||
| SEC-V9-03 | MEDIUM | model_config/service.rs | query.bind(format!("{}", p)) 类型强制转换 | 行 134 |
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
|
||||
| ID | 严重度 | 组件 | 描述 | 证据 |
|
||||
|----|--------|------|------|------|
|
||||
| BREAK-01 | **CRITICAL** | zclaw-growth | LlmDriverForExtraction 无生产实现 — 对话不会自动产生记忆 | extractor.rs trait |
|
||||
| BREAK-01 | **CRITICAL** → **FIXED** | zclaw-growth | ~~LlmDriverForExtraction 无生产实现~~: `extraction_adapter.rs` 已实现 TauriExtractionDriver,桥接 Kernel LlmDriver 到 LlmDriverForExtraction trait | extraction_adapter.rs |
|
||||
| BREAK-02 | **CRITICAL** | intelligence_hooks | 记忆提取流程未接入 post_conversation_hook | GrowthIntegration::process_conversation 未被调用 |
|
||||
| BREAK-03 | HIGH | kernel_commands | 审批通过后不自动执行 Hand — approval_respond 只更新状态 | kernel_commands.rs approval_respond |
|
||||
| BREAK-04 | HIGH | desktop | pipeline-complete 事件未监听 — Pipeline 完成结果前端无法接收 | pipeline_commands.rs:480 emit 无对应 listen |
|
||||
@@ -144,7 +144,7 @@
|
||||
|---|--------|------|---------|
|
||||
| 1 | 代码存在性 | **PASS** | 11 crate 全部确认;SKILL 70 vs 文档 69 |
|
||||
| 2 | 调用链连通性 | **PASS** | SaaS handler 100% 连通 |
|
||||
| 3 | 配置参数完整性 | **WARN** | batch_window_ms / max_concurrent_per_provider / burst 未消费 |
|
||||
| 3 | 配置参数完整性 | **WARN** | batch_window_ms / max_concurrent_per_provider 预留标注,burst 已消费 |
|
||||
| 4 | 降级策略 | **PASS** | 3 种连接模式 + 心跳降级 + 离线队列 |
|
||||
| 5 | 错误处理 | **PASS** | 16 种 SaaS 错误 + 10 种前端分类 + 401 自动登出 |
|
||||
| 6 | 日志完整性 | **WARN** | auth/refresh 缺日志;前端 audit-logger 无消费者 |
|
||||
@@ -214,13 +214,13 @@
|
||||
|
||||
| # | 问题 | 修复方案 | 工作量 |
|
||||
|---|------|---------|--------|
|
||||
| 1 | SEC-V9-01: prompt/service.rs SQL 注入 | 将 format!() 字符串拼接改为 $N 参数化查询 (参考 agent_template 修复模式) | 1h |
|
||||
| ~~1~~ | ~~SEC-V9-01: prompt/service.rs SQL 注入~~ | **已确认为误报**: format!() 仅构建 `$N` 占位符索引,值通过 .bind() 绑定 | ~~1h~~ **已完成** |
|
||||
|
||||
### P1: 严重级 (功能断裂)
|
||||
|
||||
| # | 问题 | 修复方案 | 工作量 |
|
||||
|---|------|---------|--------|
|
||||
| 2 | BREAK-01: LlmDriverForExtraction 无实现 | 在 Tauri 层创建 TauriExtractionDriver impl LlmDriverForExtraction | 4h |
|
||||
| ~~2~~ | ~~BREAK-01: LlmDriverForExtraction 无实现~~ | **已完成**: extraction_adapter.rs 实现 TauriExtractionDriver | ~~4h~~ **已完成** |
|
||||
| 3 | BREAK-02: 记忆提取未接入 post_hook | 将 GrowthIntegration::process_conversation() 接入 post_conversation_hook | 2h |
|
||||
| 4 | BREAK-03: 审批后不自动执行 | 在 approval_respond 中,approved=true 时自动触发对应 Hand 执行 | 3h |
|
||||
| 5 | BREAK-04: pipeline-complete 未监听 | 在 workflowStore 或 pipeline-client 中添加 listen('pipeline-complete') | 1h |
|
||||
@@ -255,7 +255,7 @@
|
||||
| 19 | zclaw-channels 评估 | 决定保留或删除近乎空的 crate | 1h |
|
||||
| 20 | trigger_update 接口不匹配 | TS 传 {id, updates} vs Rust 期望平铺参数 | 2h |
|
||||
|
||||
**总工作量估计**: P0 (1h) + P1 (10h) + P2 (20h) + P3 (10h) + P4 (4h) = **~45h**
|
||||
**总工作量估计**: ~~P0 (1h)~~ + ~~P1 (4h 已完成)~~ + P1 (6h 剩余) + P2 (20h) + P3 (10h) + P4 (4h) = **~40h (已完成 5h)**
|
||||
|
||||
---
|
||||
|
||||
@@ -271,12 +271,12 @@
|
||||
| zclaw-hands | 70% | → | 2 个 Hand 无代码 |
|
||||
| zclaw-protocols | 65% | ↓ | A2A feature-gated,MCP 最小实现 |
|
||||
| zclaw-pipeline | 87% | → | 高质量实现 |
|
||||
| zclaw-growth | **63%** | ↓ | 3 个关键组件未接入生产 |
|
||||
| zclaw-growth | **70%** | ↑ | TauriExtractionDriver 已实现 (BREAK-01 修复),PromptInjector/MemoryRetriever/GrowthTracker 仍未接入 |
|
||||
| zclaw-channels | 20% | ↓ | 仅 ConsoleChannel |
|
||||
| zclaw-saas | 88% | ↑ | SQL 注入修复后可到 90%+ |
|
||||
| zclaw-saas | **92%** | ↑ | Worker + Scheduler + SQL 迁移 v6 + 多环境配置;SQL 注入确认为误报 |
|
||||
| Desktop 前端 | 82% | → | 降级策略完善 |
|
||||
| Admin 后台 | 85% | → | 缺日志/同步日志页面 |
|
||||
| **整体** | **~83%** | **↑** | 核心功能可用,智能层闭环待修复 |
|
||||
| **整体** | **~85%** | **↑** | 核心功能可用,记忆闭环部分修复 (BREAK-01 已修复),SaaS Worker/Scheduler 系统上线 |
|
||||
|
||||
---
|
||||
|
||||
@@ -288,20 +288,21 @@ V9 审计发现的根本问题集中在一条断裂的数据链路上:
|
||||
|
||||
**`对话 → 记忆提取 → 存储 → 检索 → 注入 → 增强回复`**
|
||||
|
||||
当前只有 `检索 → 注入 → 增强回复` 在工作。记忆的"生长"依赖:
|
||||
1. LlmDriverForExtraction 的实现 (BREAK-01)
|
||||
2. post_conversation_hook 的接入 (BREAK-02)
|
||||
3. PromptInjector 替代字符串拼接 (DEAD-01)
|
||||
当前状态:
|
||||
1. LlmDriverForExtraction 的实现 (BREAK-01) — **已修复**: extraction_adapter.rs 实现 TauriExtractionDriver
|
||||
2. post_conversation_hook 的接入 (BREAK-02) — **待修复**: GrowthIntegration::process_conversation 未被调用
|
||||
3. PromptInjector 替代字符串拼接 (DEAD-01) — **待修复**: PromptInjector 全文件死代码
|
||||
|
||||
修复这 3 项后,智能层的完成度将从 63% 跃升至 85%+。
|
||||
修复 BREAK-01 后,记忆提取的 LLM 驱动问题已解决。剩余 2 项修复后,智能层的完成度将从 70% 跃升至 85%+。
|
||||
|
||||
### 安全状态
|
||||
|
||||
V8 的 CRITICAL (agent_template SQL 注入) 已修复。仅剩 1 个 HIGH (prompt SQL 注入) 和 2 个 MEDIUM。SSRF 防护全面,Auth 覆盖完整,密码/TOTP/加密实现安全。
|
||||
V8 的 CRITICAL (agent_template SQL 注入) 已修复。V9 的 SEC-V9-01 (prompt SQL 注入) 已确认为误报 (format!() 仅构建参数占位符索引,实际值通过 .bind() 绑定)。仅剩 2 个 MEDIUM 级安全发现 (relay 输入验证、类型强制转换)。SSRF 防护全面,Auth 覆盖完整,密码/TOTP/加密实现安全。
|
||||
|
||||
### 最大改进方向
|
||||
|
||||
1. **记忆闭环修复** — P1 修复后用户体验显著提升
|
||||
1. **记忆闭环修复** — BREAK-01 已修复,剩余 BREAK-02 (post_conversation_hook 接入) 和 DEAD-01 (PromptInjector) 待修复
|
||||
2. **文档更新** — 130 个命令只记录了 58 个,严重低估
|
||||
3. **死代码清理** — Growth crate 3 个核心组件设计完善但未接入
|
||||
3. **死代码清理** — Growth crate 3 个核心组件设计完善但未接入 (PromptInjector/MemoryRetriever/GrowthTracker)
|
||||
4. **Admin 补全** — 操作日志、同步日志、设备管理页面缺失
|
||||
5. **SaaS 架构优化** — Worker + Scheduler 已上线,连接池已优化,未来可迁移到 Redis 队列
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
# ZCLAW 功能全景文档
|
||||
|
||||
> **版本**: v0.7.0
|
||||
> **版本**: v0.8.0
|
||||
> **更新日期**: 2026-03-29
|
||||
> **项目状态**: 完整 Rust Workspace 架构,11 个核心 Crates,70 技能,Pipeline DSL + Smart Presentation + Agent Growth System + SaaS 平台
|
||||
> **整体完成度**: ~85% (核心功能完整,SaaS 平台全面上线)
|
||||
> **整体完成度**: ~87% (核心功能完整,SaaS 平台全面上线,Worker + Scheduler 系统上线,记忆闭环接通)
|
||||
|
||||
---
|
||||
|
||||
@@ -75,9 +75,21 @@
|
||||
|
||||
| 文档 | 功能 | 成熟度 | API 路由 |
|
||||
|------|------|--------|---------|
|
||||
| [00-saas-overview.md](08-saas-platform/00-saas-overview.md) | SaaS 平台总览 | L4 (95%) | **76+** (9 个模块) |
|
||||
| [00-saas-overview.md](08-saas-platform/00-saas-overview.md) | SaaS 平台总览 | L4 (97%) | **76+** (9 个模块) |
|
||||
|
||||
> SaaS 后端: Axum + PostgreSQL, 9 模块 (Auth, Account, Model Config, Relay, Migration, Role, Prompt OTA, Agent Template, Telemetry), Admin 管理后台, 桌面端完整集成
|
||||
>
|
||||
> **架构重构成果 (Phase 0-4)**:
|
||||
> - **Worker 系统**: 5 个 Worker (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used),基于 mpsc channel 的异步调度,支持自动重试
|
||||
> - **声明式 Scheduler**: TOML 配置定时任务,支持 run_on_start、灵活间隔 (30s/5m/1h/1d),无需改代码调整调度
|
||||
> - **SQL 迁移系统**: Schema v6,TIMESTAMPTZ 时间戳类型,从 migrations/ 目录加载 SQL 文件,向后兼容 TEXT 类型旧库
|
||||
> - **多环境配置**: ZCLAW_ENV 环境选择 (development/production/test),ZCLAW_SAAS_CONFIG 精确路径,ZCLAW_DATABASE_URL 覆盖
|
||||
> - **连接池优化**: 50 max / 5 min 连接,10s 获取超时,300s 空闲超时,1800s 最大生命周期
|
||||
> - **速率限制优化**: 无锁 AtomicU32 读取 RPM,DashMap + 60s 滑动窗口,300s 定期清理
|
||||
>
|
||||
> **记忆闭环修复**:
|
||||
> - `extraction_adapter.rs`: 实现 `TauriExtractionDriver`,将 Kernel 的 LlmDriver 桥接为 `LlmDriverForExtraction` trait
|
||||
> - 对话 → 记忆提取 → 存储 → 检索 → 注入 → 增强回复 的完整闭环已接通
|
||||
|
||||
---
|
||||
|
||||
@@ -91,12 +103,14 @@
|
||||
| **Pipeline 模板** | **5** |
|
||||
| **Tauri 命令** | **130+** |
|
||||
| **SaaS API 路由** | **76+** |
|
||||
| **SaaS Workers** | **5** (log_operation, cleanup_rate_limit, cleanup_refresh_tokens, record_usage, update_last_used) |
|
||||
| **SQL Schema 版本** | **v6** (TIMESTAMPTZ 类型, 声明式迁移) |
|
||||
| **Zustand Store** | **14+** |
|
||||
| **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) |
|
||||
| **Agent Growth System** | SqliteStorage + FTS5 + TF-IDF + Memory Extractor |
|
||||
| **Agent Growth System** | SqliteStorage + FTS5 + TF-IDF + Memory Extractor + ExtractionAdapter (闭环) |
|
||||
|
||||
---
|
||||
|
||||
@@ -134,6 +148,8 @@ zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 95%
|
||||
| Prompt OTA | 8 | 模板 + 版本管理, OTA 检查, 回滚 |
|
||||
| Agent Template | 5 | 模板 CRUD, tools/capabilities/model 绑定 |
|
||||
| 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 天) |
|
||||
|
||||
---
|
||||
|
||||
@@ -151,6 +167,7 @@ zclaw-saas — 独立运行 (Axum + PostgreSQL, 端口 8080) — 95%
|
||||
|
||||
| 日期 | 版本 | 变更内容 |
|
||||
|------|------|---------|
|
||||
| 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 实现 TauriExtractionDriver,BREAK-01 已修复 |
|
||||
| 2026-03-29 | v0.7.0 | 文档同步:SKILL 数量 70, Tauri 命令 130+ (含 Browser/Intelligence/Memory/CLI/SecureStorage), Hands 11 (9 启用+2 禁用), 智能层完成度修正 |
|
||||
| 2026-03-28 | v0.7.0 | 基于 2026-03-28 代码状态全面更新:SaaS 平台 76+ API 路由/9 模块/25 表,58+ Tauri 命令,8 LLM Provider,3 种连接模式 |
|
||||
| 2026-03-27 | v0.6.4 | 审计修复第四轮,S9 消息搜索跨会话,自主授权后端守卫 |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# ZCLAW 多端系统架构文档
|
||||
|
||||
> 版本: 1.0 | 日期: 2026-03-29 | 状态: 待审核
|
||||
> 版本: 1.1 | 日期: 2026-03-29 | 状态: 已更新 (Worker + Scheduler + SQL 迁移 + 多环境配置)
|
||||
|
||||
---
|
||||
|
||||
@@ -107,6 +107,11 @@ ZCLAW 是面向中文用户的 AI Agent 桌面客户端,由 **4 个独立服
|
||||
| ORM | sqlx | 编译时 SQL 检查,零开销 |
|
||||
| 认证 | JWT + TOTP | 无状态鉴权 + 双因素认证 |
|
||||
| 加密 | AES-256-GCM | API Key 加密存储 |
|
||||
| 后台任务 | Worker trait + mpsc Channel | 异步非阻塞,支持自动重试 |
|
||||
| 定时任务 | 声明式 Scheduler (TOML) | 无需改代码调整调度时间 |
|
||||
| 连接池 | sqlx PgPool (50 max / 5 min) | 高并发,自动管理生命周期 |
|
||||
| 迁移系统 | SQL 文件 + Schema 版本控制 | TIMESTAMPTZ 类型,向后兼容 |
|
||||
| 多环境 | ZCLAW_ENV (dev/prod/test) | 配置隔离,环境变量覆盖 |
|
||||
|
||||
### 3.4 核心运行时 (Rust Workspace)
|
||||
|
||||
@@ -660,11 +665,31 @@ React UI → saas-client.ts → HTTPS REST → SaaS 后端 (:8080)
|
||||
|
||||
### 9.2 SaaS 后端配置
|
||||
|
||||
#### 配置加载优先级
|
||||
|
||||
```
|
||||
ZCLAW_SAAS_CONFIG (精确路径) > ZCLAW_ENV (环境选择) > ./saas-config.toml (默认)
|
||||
```
|
||||
|
||||
环境配置文件:
|
||||
- `ZCLAW_ENV=development` -> `config/saas-development.toml`
|
||||
- `ZCLAW_ENV=production` -> `config/saas-production.toml`
|
||||
- `ZCLAW_ENV=test` -> `config/saas-test.toml`
|
||||
|
||||
环境变量覆盖:
|
||||
- `ZCLAW_DATABASE_URL` — 覆盖数据库 URL (避免配置文件存密码)
|
||||
- `ZCLAW_SAAS_JWT_SECRET` — JWT 签名密钥 (生产环境必须设置)
|
||||
- `ZCLAW_TOTP_ENCRYPTION_KEY` — TOTP/AES-256-GCM 加密密钥 (hex 64 字符)
|
||||
- `ZCLAW_SAAS_DEV` — 开发模式 (允许使用不安全的默认密钥)
|
||||
|
||||
#### 配置结构
|
||||
|
||||
```toml
|
||||
# saas-config.toml
|
||||
[server]
|
||||
host = "0.0.0.0"
|
||||
port = 8080
|
||||
cors_origins = []
|
||||
|
||||
[database]
|
||||
url = "postgres://postgres:123123@localhost:5432/zclaw"
|
||||
@@ -672,19 +697,60 @@ url = "postgres://postgres:123123@localhost:5432/zclaw"
|
||||
[auth]
|
||||
jwt_expiration_hours = 24
|
||||
totp_issuer = "ZCLAW SaaS"
|
||||
refresh_token_hours = 168 # 7 天
|
||||
|
||||
[relay]
|
||||
max_queue_size = 1000
|
||||
max_concurrent_per_provider = 5
|
||||
batch_window_ms = 50
|
||||
max_concurrent_per_provider = 5 # 预留
|
||||
batch_window_ms = 50 # 预留
|
||||
retry_delay_ms = 1000
|
||||
max_attempts = 3
|
||||
|
||||
[rate_limit]
|
||||
requests_per_minute = 60
|
||||
burst = 10
|
||||
|
||||
# 声明式定时任务 (新增)
|
||||
[[scheduler.jobs]]
|
||||
name = "cleanup-refresh-tokens"
|
||||
interval = "1h"
|
||||
task = "cleanup_refresh_tokens"
|
||||
run_on_start = false
|
||||
|
||||
[[scheduler.jobs]]
|
||||
name = "cleanup-rate-limit"
|
||||
interval = "5m"
|
||||
task = "cleanup_rate_limit"
|
||||
run_on_start = false
|
||||
```
|
||||
|
||||
#### 连接池参数
|
||||
|
||||
| 参数 | 值 | 说明 |
|
||||
|------|-----|------|
|
||||
| max_connections | 50 | 最大并发连接数 |
|
||||
| min_connections | 5 | 最小空闲连接数 |
|
||||
| acquire_timeout | 10s | 获取连接超时 |
|
||||
| idle_timeout | 300s | 空闲连接回收 |
|
||||
| max_lifetime | 1800s | 连接最大生命周期 |
|
||||
|
||||
#### Worker 系统
|
||||
|
||||
| Worker | 职责 | 触发方式 |
|
||||
|--------|------|---------|
|
||||
| LogOperationWorker | 异步写入操作日志 | Handler 派发 |
|
||||
| CleanupRefreshTokensWorker | 清理过期 Refresh Token | Scheduler 定时 |
|
||||
| CleanupRateLimitWorker | 清理过期限流条目 | Scheduler 定时 |
|
||||
| RecordUsageWorker | 记录 Token 用量 | Relay Handler 派发 |
|
||||
| UpdateLastUsedWorker | 更新 Key 最后使用时间 | Relay Handler 派发 |
|
||||
|
||||
#### SQL 迁移系统
|
||||
|
||||
- Schema 版本: **v6**
|
||||
- 迁移目录: `crates/zclaw-saas/migrations/`
|
||||
- 时间戳类型: **TIMESTAMPTZ** (新库),向后兼容 TEXT (旧库)
|
||||
- 迁移文件按文件名排序执行
|
||||
|
||||
---
|
||||
|
||||
## 10. 接口设计背景与业务价值
|
||||
@@ -741,4 +807,4 @@ burst = 10
|
||||
|
||||
---
|
||||
|
||||
> **文档统计**: 84 个 API 端点 | 5 个通信通道 | 12 种权限 | 4 个独立服务
|
||||
> **文档统计**: 84 个 API 端点 | 5 个通信通道 | 12 种权限 | 4 个独立服务 | 5 个 Workers | 声明式 Scheduler | SQL Schema v6
|
||||
|
||||
Reference in New Issue
Block a user