Files
zclaw_openfang/docs/features/audit-v12/M2-agent-clones.md
iven 442ec0eeef
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
docs(audit): V12 模块化端到端审计报告 — 11 模块 + 总报告
混合矩阵式审计:10 个功能模块 × 五维检查清单
- 项目整体健康度: 76/100
- 2 个 P0 (M4 双数据库 + 反思引擎 LLM 未接入)
- 15 个 P1 (跨 M2/M3/M4/M5/M6/M7/M11)
- 三类断链模式: 写了没接/接了不对/双实现未统一
- 三阶段修复路线图: P0(2-3天) → P1(5-7天) → P2(5-7天)
2026-04-04 17:55:03 +08:00

150 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 模块 M2 Agent 分身 审计报告
> **审计版本**: V12
> **审计日期**: 2026-04-04
> **审计范围**: Agent 创建/切换/配置/删除 → agentStore → Kernel → SQLite
---
## 1. 模块概况
### 功能描述
多 Agent 创建/配置/管理,每个 Agent 拥有独立的身份、技能和配置SQLite 持久化。
### 涉及文件清单
**前端**
- Store: `desktop/src/store/agentStore.ts`, `desktop/src/store/chat/conversationStore.ts`
- Client: `desktop/src/lib/kernel-agent.ts`, `desktop/src/lib/gateway-api.ts`
- 类型: `desktop/src/lib/kernel-types.ts`
- UI: `desktop/src/components/AgentSelector.tsx`
**后端 (Rust)**
- Tauri 命令: `desktop/src-tauri/src/kernel_commands/agent.rs`
- Kernel 业务: `crates/zclaw-kernel/src/kernel/agents.rs`
- Registry: `crates/zclaw-kernel/src/registry.rs`
- SQLite 存储: `crates/zclaw-memory/src/store.rs`
- Schema: `crates/zclaw-memory/src/schema.rs`
- 类型: `crates/zclaw-types/src/agent.rs`, `crates/zclaw-types/src/config.rs`
### 调用链路图
```
用户操作 (创建/切换/配置/删除 Agent)
→ agentStore.createClone(opts) / updateClone() / deleteClone()
→ getClient().createClone() / updateClone() / deleteClone()
├─ [Kernel 模式] kernel-agent.ts → invoke('agent_create/update/delete')
│ → Rust: agent_create/update/delete → kernel.spawn/kill/update_agent()
│ → agents.rs: 验证 → MemoryStore.save_agent() → Registry 注册/移除
│ → store.rs: INSERT/UPDATE/DELETE agents 表 (SQLite)
└─ [Gateway 模式] gateway-api.ts → REST POST/PUT/DELETE /api/agents
```
---
## 2. 五维检查结果
### 2.1 链路完整性
| 链路 | 起点 | 终点 | 状态 | 备注 |
|------|------|------|------|------|
| 创建 Agent (Kernel) | agentStore.createClone() | store.rs INSERT | ⚠️ **字段丢失** | kernel-agent.ts 只传 3 字段,丢 7 个人格字段 |
| 创建 Agent (Gateway) | agentStore.createClone() | gateway-api.ts POST | ✅ 连通 | 传完整 TOML manifest |
| 列举 Agent | agentStore.loadClones() | Registry → SQLite | ✅ 连通 | |
| 更新 Agent | agentStore.updateClone() | store.rs UPDATE | ⚠️ **字段丢失** | 同创建,仅 7 字段可更新 |
| 删除 Agent | agentStore.deleteClone() | store.rs DELETE | ✅ 连通 | SQLite 外键级联删除 sessions |
| 切换 Agent | conversationStore.setCurrentAgent() | conversationStore state | ⚠️ **不通知 Kernel** | defaultAgentId 不更新 |
| 从模板创建 | agentStore.createFromTemplate() | SaaS + Kernel | ⚠️ **metadata 更新可能静默失败** | |
### 2.2 参数/类型一致性
| 接口 | 前端传递字段 | 后端期望字段 | 一致性 | 备注 |
|------|------------|------------|--------|------|
| agent_create request | name, description, model | agent_id, name, description, model, system_prompt, max_tokens, temperature, provider, ... | ❌ **不完整** | 前端丢 7+ 字段 |
| AgentInfo 返回 | id, name, description?, state, model?, provider? | id, name, description, model, provider, state, message_count, created_at, updated_at | ❌ **字段丢失** | 前端缺 message_count/created_at/updated_at |
| agent_update updates | name, description, systemPrompt, model, provider, maxTokens, temperature | 同左 (7 字段) | ✅ 一致 | 但缺 emoji/personality 等 |
| 默认 provider | kernel-agent.ts: `'openai'` | agent.rs: `'anthropic'` | ❌ **不一致** | JS 层覆盖所以不影响运行 |
### 2.3 边界与错误处理
| 场景 | 输入 | 预期行为 | 实际行为 | 级别 |
|------|------|---------|---------|------|
| 创建同名 Agent | 相同 name | 警告或拒绝 | ✅ 允许创建,无唯一约束 | P3 |
| 删除正在使用的 Agent | 当前 active agent | 阻止或警告 | ❌ 直接删除,不检查活跃状态 | P2 |
| 空名称创建 | name="" | 拒绝 | ❌ 允许,无验证 | P2 |
| temperature 越界 | 5.0 | 拒绝或 clamp | ❌ 无范围验证 | P2 |
| 切换 Agent 时流式进行中 | 中途切换 | 取消流再切换 | ❌ 流继续,消息可能追到错误对话 | P2 |
| 删除后 selectedAgent 引用 | 删除当前选中 | 清空选择 | ❌ conversationStore.currentAgent 可能指向已删除 Agent | P2 |
| 模板创建 metadata 失败 | updateClone 抛错 | 回滚或提示 | ⚠️ 仅 warn 日志Agent 已创建但配置不完整 | P2 |
### 2.4 状态管理
| Store | 状态机完整性 | 持久化 | 竞态风险 |
|-------|------------|--------|---------|
| agentStore | ⚠️ 共享 isLoading无操作级状态 | ❌ 无持久化 | ⚠️ 并发操作共享 isLoading |
| conversationStore (Agent 相关) | ✅ currentAgent/agentList | ✅ IndexedDB | ⚠️ 切换 Agent 不取消流 |
### 2.5 安全与资源
| 检查项 | 状态 | 说明 |
|--------|------|------|
| agent_id 格式验证 | ✅ | validate_agent_id 使用 UUID 格式 + validate_identifier |
| agent_import 大小限制 | ✅ | validate_string_length 限制 1MB |
| API Key 不存储在 Agent 配置 | ✅ | AgentConfig 仅存 env var 名 |
| 删除级联 | ⚠️ | 依赖 SQLite PRAGMA foreign_keys 启用 |
---
## 3. 问题清单
| ID | 描述 | 文件:行号 | 级别 | 修复建议 | 验证方法 |
|----|------|----------|------|---------|---------|
| M2-01 | **[P1] KernelClient createClone 字段丢失** — 仅传 name/description/model 3 字段,丢失 emoji/personality/communicationStyle/notes/nickname/scenarios/workspace 等 7+ 字段 | `kernel-agent.ts:74-97` | **P1** | 扩展 CreateAgentRequest 和 kernel-agent.ts 传递全部字段 | 通过 Kernel 创建 Agent 后检查 SQLite config 列 |
| M2-02 | **[P1] 两条通路创建逻辑严重不对等** — Gateway 构建完整 TOML manifestKernel 仅 3 字段 | `gateway-api.ts:60-106` vs `kernel-agent.ts:74-97` | **P1** | 统一两条通路的字段映射 | 分别用两种模式创建 Agent 对比结果 |
| M2-03 | AgentInfo 缺 message_count/created_at/updated_at | `kernel-types.ts:22-29` | P2 | 扩展前端 AgentInfo 类型 | 加载 Agent 列表检查字段 |
| M2-04 | updateClone 缺少人格/工作空间字段 | `kernel-agent.ts:109-134`, `agent.rs:50-61` | P2 | 扩展 AgentUpdateRequest | 更新 Agent 的 emoji/personality 验证生效 |
| M2-05 | 删除 Agent 不检查是否正在使用 | `agent.rs:143-160` | P2 | 检查活跃 session/流状态 | 删除正在聊天的 Agent |
| M2-06 | Agent 切换不通知 Kernel defaultAgentId | `conversationStore.ts:249-303` | P2 | 切换时调用 client.setDefaultAgentId() | 切换后发消息检查 agentId |
| M2-07 | 切换 Agent 不取消进行中的流 | `conversationStore.ts:249-303` | P2 | 切换前检查并 cancelStream | 流式中切换 Agent 验证 |
| M2-08 | 创建/更新无参数验证(空名/温度范围) | `agent.rs:70-104` | P2 | 添加 name 非空、temperature [0,2]、max_tokens >0 | 传入空名/异常温度 |
| M2-09 | 删除后 selectedAgent 可能指向已删除 Agent | `agentStore.ts` | P2 | 删除后自动切换到第一个可用 Agent | 删除当前选中 Agent |
| M2-10 | SQLite 外键级联依赖 PRAGMA foreign_keys | `schema.rs:22-24` | P2 | 确认初始化时执行 PRAGMA foreign_keys = ON | 检查 schema.rs 初始化代码 |
| M2-11 | 默认 provider/model 前后端不一致 | `kernel-agent.ts:39-43` vs `agent.rs:15-18` | P3 | 统一默认值为 config.rs 中的值 | 不传 provider 检查实际使用 |
| M2-12 | agentStore 共享 isLoading 无操作级状态 | `agentStore.ts` | P3 | 改为 per-operation loading | 同时触发 load + create |
| M2-13 | Agent 列表变更不自动同步 conversationStore | `agentStore.ts` | P3 | CRUD 后触发 conversationStore.syncAgents() | 创建 Agent 后检查选择器 |
| M2-14 | system_prompt 双重持久化可能不一致 | `agentStore.ts:218-235` | P3 | 明确单一数据源 | 分别更新两处检查同步 |
---
## 4. 改进建议
### 短期修复(按优先级)
1. **[P1]** 扩展 `kernel-agent.ts``createClone()` 传递全部字段(对齐 gateway-api.ts
2. **[P1]** 扩展 `CreateAgentRequest` struct 支持人格字段
3. **[P2]** 添加 Agent CRUD 参数验证
4. **[P2]** Agent 切换时同步 defaultAgentId + 取消流
### 长期架构建议
- 统一 Kernel 和 Gateway 两条通路的 Agent 创建逻辑
- 为 agentStore 添加 per-operation 状态机
- 明确 system_prompt 的单一数据源AgentConfig vs Identity 文件)
---
## 5. 健康度评分
| 维度 | 评分 | 说明 |
|------|------|------|
| 链路完整性 | **65/100** | Kernel 创建/更新通路字段丢失是核心断链 |
| 参数一致性 | **70/100** | 类型基本匹配但字段覆盖不完整 |
| 边界处理 | **55/100** | 缺少参数验证、删除不检查活跃状态、切换不取消流 |
| 状态管理 | **60/100** | 缺操作级状态、跨 Store 同步不完整 |
| 安全资源 | **85/100** | ID 验证完善,主要风险在级联删除 |
**综合健康度: 67/100**
两个 P1 级断链Kernel 创建字段丢失 + 双通路不对等)是此模块的核心问题。修复后预计可提升至 85+。