Phase 1 - Security: - Add AES-GCM encryption for localStorage fallback - Enforce WSS protocol for non-localhost WebSocket connections - Add URL sanitization to prevent XSS in markdown links Phase 2 - Domain Reorganization: - Create Intelligence Domain with Valtio store and caching - Add unified intelligence-client for Rust backend integration - Migrate from legacy agent-memory, heartbeat, reflection modules Phase 3 - Core Optimization: - Add virtual scrolling for ChatArea with react-window - Implement LRU cache with TTL for intelligence operations - Add message virtualization utilities Additional: - Add OpenFang compatibility test suite - Update E2E test fixtures - Add audit logging infrastructure - Update project documentation and plans Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
15 KiB
15 KiB
ZCLAW 项目全面架构优化方案
头脑风暴日期: 2026-03-21 目标: 全面优化 | 时间: 3个月+ | 策略: 激进架构优先
一、当前架构分析
1.1 现有问题总结
| 类别 | 问题 | 严重性 | 影响 |
|---|---|---|---|
| 安全 | 浏览器 eval() XSS 风险 | 🔴 HIGH | 用户数据泄露 |
| 安全 | localStorage 凭据回退 | 🟠 MEDIUM | 密钥暴露 |
| 性能 | 流式更新重建整个数组 | 🟠 MEDIUM | 渲染卡顿 |
| 性能 | 无界消息数组 | 🟠 MEDIUM | 内存泄漏 |
| 架构 | 50+ lib 模块缺乏统一抽象 | 🟡 LOW | 维护困难 |
| 测试 | 核心模块无测试覆盖 | 🟠 MEDIUM | 回归风险 |
1.2 技术债务分布
desktop/src/
├── lib/ [50+ 模块] ← 需要模块化重组
├── store/ [15 stores] ← 需要统一模式
├── components/ [60+ 组件] ← 需要分层
└── types/ [分散] ← 需要集中管理
二、三种优化方案
方案 A: 渐进式模块化重构 (推荐)
核心理念: 保持现有架构,逐步提取抽象层
Phase 1 (4周): 安全加固 + 测试基础
├─ 修复 XSS/凭据存储问题
├─ 添加 chatStore/gateway-client 测试
└─ 建立测试覆盖率门禁
Phase 2 (4周): 性能优化
├─ 引入 Immer 优化状态更新
├─ 实现虚拟滚动 (react-window)
└─ 消息分页 + 惰性加载
Phase 3 (6周): 架构分层
├─ 提取 Core Layer (协议无关)
├─ 提取 Adapter Layer (Tauri/Web)
└─ 统一错误处理和日志
Phase 4 (4周): Intelligence 增强
├─ Rust 层功能完善
├─ TypeScript 适配器优化
└─ 记忆/心跳/反思/身份 全链路
优点:
- 风险可控,每阶段可独立验证
- 不影响现有功能交付
- 团队可并行工作
缺点:
- 改动分散,可能产生中间态
- 总体周期较长
方案 B: 激进架构重写
核心理念: 重新设计核心架构,一次性解决所有问题
Step 1: 定义新架构规范
├─ 分层架构: UI → Application → Domain → Infrastructure
├─ 依赖注入容器
└─ 统一事件总线
Step 2: 核心层重写
├─ 新 State Manager (基于 Immer + Middleware)
├─ 新 Client Layer (统一协议抽象)
└─ 新 Error System (分类 + 恢复)
Step 3: 迁移现有功能
├─ Store 逐个迁移
├─ 组件适配新 API
└─ 测试同步跟进
Step 4: 清理旧代码
优点:
- 一次性解决所有架构问题
- 代码质量飞跃式提升
- 未来扩展性最佳
缺点:
- 高风险,可能引入新 bug
- 开发周期不可控
- 需要冻结功能开发
方案 C: 领域驱动分层
核心理念: 按业务领域重组,每个领域独立优化
Domain 1: Chat (对话系统)
├─ ChatStore 重构 (Immer + 分页)
├─ 流式响应优化
└─ 虚拟滚动 + 记忆增强
Domain 2: Hands (自动化)
├─ HandStore 状态机模式
├─ 审批流程增强
└─ 执行引擎隔离
Domain 3: Intelligence (智能层)
├─ Rust 后端完善
├─ 心跳/压缩/反思/身份
└─ 缓存策略优化
Domain 4: Skills (技能系统)
├─ 技能发现/搜索优化
├─ 执行沙箱隔离
└─ 依赖管理
Cross-Cutting:
├─ 安全层 (统一加解密)
├─ 测试层 (领域测试套件)
└─ 监控层 (性能/错误追踪)
优点:
- 领域边界清晰
- 可独立演进
- 易于并行开发
缺点:
- 跨领域逻辑复杂
- 共享代码可能重复
- 需要重新规划目录结构
三、方案对比
| 维度 | 方案 A (渐进) | 方案 B (激进) | 方案 C (领域) |
|---|---|---|---|
| 风险 | 🟢 低 | 🔴 高 | 🟡 中 |
| 速度 | 🟡 中 | 🔴 慢 | 🟢 快 |
| 效果 | 🟡 中等提升 | 🟢 飞跃提升 | 🟢 显著提升 |
| 并行度 | 🟡 部分并行 | 🔴 串行 | 🟢 完全并行 |
| 推荐度 | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
四、确认方案: A + C 混合 (用户已确认)
关键决策:
- 状态管理: VZustand (Proxy 细粒度响应)
- 安全策略: Web Worker 隔离执行 (最安全)
结合渐进式和领域驱动的优点:
┌─────────────────────────────────────────────────────────────┐
│ Phase 1: 安全 + 测试 (2周) │
│ • 实现 Web Worker 隔离执行引擎 │
│ • 修复凭据存储问题 (加密回退) │
│ • 建立测试框架和覆盖率门禁 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Phase 2: 领域重组 (4周) │
│ • 按领域重组目录结构 │
│ • 迁移到 VZustand (Proxy 响应式) │
│ • 提取领域接口和抽象 │
│ • 统一错误处理 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Phase 3: 核心优化 (并行) (6周) │
│ Track A: Chat Track B: Hands Track C: Intelligence │
│ • VZustand 重写 • 状态机模式 • Rust 增强 │
│ • 虚拟滚动 • Web Worker • 缓存策略 │
│ • 流式优化 • 审批流增强 • 性能调优 │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Phase 4: 集成 + 清理 (2周) │
│ • 跨领域集成测试 │
│ • 清理旧代码 │
│ • 文档更新 │
└─────────────────────────────────────────────────────────────┘
总周期: 约 14 周 (3.5 个月)
五、各领域详细优化点
5.1 智能对话系统 (Chat Domain)
| 优化项 | 当前问题 | 解决方案 | 预期收益 |
|---|---|---|---|
| 状态更新 | 每次重建数组 | VZustand (Proxy 细粒度) | 70% 性能提升 |
| 长对话 | 无界数组 | 分页 + 惰性加载 | 内存降低 80% |
| 虚拟滚动 | 全量渲染 | react-window | 首屏快 3x |
| 流式响应 | 回调嵌套 | AsyncGenerator | 代码简洁 |
VZustand 架构:
// 基于 Proxy 的细粒度响应
const useChatStore = create(
proxy({
messages: [],
addMessage: (msg) => { messages.push(msg); } // 直接 mutate
})
);
// 组件只订阅使用的字段
function MessageList() {
const messages = useChatStore(s => s.messages); // 仅 messages 变化时重渲染
}
关键改动文件:
desktop/src/store/chatStore.ts→ 重写为 VZustanddesktop/src/components/ChatArea/MessageList.tsxdesktop/src/lib/gateway-client.ts
5.2 Hands 自动化 (Hands Domain)
| 优化项 | 当前问题 | 解决方案 | 预期收益 |
|---|---|---|---|
| 状态管理 | 简单状态 | 状态机模式 (XState) | 可预测性提升 |
| 审批流程 | 硬编码 | 可配置审批链 | 灵活性提升 |
| 执行隔离 | 共享上下文 | Web Worker 隔离 | 安全性最大化 |
| 错误恢复 | 无 | 检查点 + 重试 | 可靠性提升 |
Web Worker 隔离架构:
┌─────────────────────────────────────────────────────────────┐
│ Main Thread │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ HandStore │←→│ WorkerPool │←→│ UI 更新 │ │
│ └─────────────┘ └──────┬──────┘ └─────────────┘ │
└────────────────────────────┼────────────────────────────────┘
│ postMessage
▼
┌─────────────────────────────────────────────────────────────┐
│ Web Worker (隔离) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Browser Executor │ │
│ │ • 无 DOM 访问 │ │
│ │ • 受限 API │ │
│ │ • 超时控制 │ │
│ │ • 错误隔离 │ │
│ └─────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
关键改动文件:
desktop/src/store/handStore.ts→ 状态机模式desktop/src/workers/browser-worker.ts(新建)desktop/src/lib/worker-pool.ts(新建)desktop/src-tauri/src/browser/
5.3 Intelligence 层 (Intelligence Domain)
| 优化项 | 当前问题 | 解决方案 | 预期收益 |
|---|---|---|---|
| Rust 完善 | 部分功能未实现 | 补全所有命令 | 功能完整 |
| 缓存策略 | 无缓存 | LRU + TTL | 响应快 2x |
| 离线支持 | 依赖网络 | 本地优先 | 可用性提升 |
| 记忆搜索 | 简单匹配 | 向量检索 | 准确率提升 |
关键改动文件:
desktop/src-tauri/src/intelligence/*.rsdesktop/src-tauri/src/memory/*.rsdesktop/src/lib/intelligence-client.ts
5.4 技能系统 (Skills Domain)
| 优化项 | 当前问题 | 解决方案 | 预期收益 |
|---|---|---|---|
| 搜索效率 | 遍历文件 | 索引 + 缓存 | 搜索快 10x |
| 执行沙箱 | 无隔离 | iframe/Worker | 安全性提升 |
| 依赖管理 | 手动 | 自动解析 | 易用性提升 |
关键改动文件:
desktop/src/lib/skill-loader.ts(新建)desktop/src/store/skillStore.tsskills/*/SKILL.md规范更新
六、安全加固专项
6.1 XSS 防护 - Web Worker 隔离
// 当前问题: browser.eval() 直接在主线程执行用户输入
// 解决方案: Web Worker 完全隔离执行
// 主线程: worker-pool.ts
class BrowserWorkerPool {
private workers: Worker[] = [];
async execute(script: string, args: unknown[]): Promise<unknown> {
const worker = this.getAvailableWorker();
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
worker.terminate();
reject(new Error('Execution timeout'));
}, 30000);
worker.onmessage = (e) => {
clearTimeout(timeout);
if (e.data.error) reject(new Error(e.data.error));
else resolve(e.data.result);
};
worker.postMessage({ type: 'eval', script, args });
});
}
}
// Worker: browser-worker.ts
self.onmessage = async (e) => {
const { type, script, args } = e.data;
try {
// 无 DOM 访问,受限 API
const result = await executeScript(script, args);
self.postMessage({ result });
} catch (error) {
self.postMessage({ error: error.message });
}
};
6.2 凭据存储
// 当前问题: localStorage 明文回退
// 解决方案: 加密回退 + 密钥派生
const ENCRYPTION_KEY = await deriveKey(userPassword, salt);
const encrypted = await encrypt(privateKey, ENCRYPTION_KEY);
localStorage.setItem(KEY, encrypted);
6.3 WebSocket 安全
// 当前问题: 非 localhost 允许 ws://
// 解决方案: 强制 wss:// + 证书验证
if (!url.startsWith('wss://') && !isLocalhost(url)) {
throw new SecurityError('Non-localhost must use WSS');
}
七、测试策略
7.1 测试金字塔
/\
/ \ E2E Tests (Playwright)
/────\ - 关键用户流程
/ \ - 10-15 个核心场景
/────────\
/ \ Integration Tests (Vitest)
/────────────\ - Store + Client 集成
/ \- API 契约测试
/────────────────\
/ \ Unit Tests (Vitest)
──────────────────── - 纯函数/工具
- 80%+ 覆盖率目标
7.2 覆盖率目标
| 模块 | 当前 | 目标 |
|---|---|---|
chatStore.ts |
0% | 90% |
gateway-client.ts |
0% | 85% |
handStore.ts |
0% | 85% |
intelligence-client.ts |
0% | 80% |
| 工具函数 | ~40% | 95% |
八、验证计划
8.1 功能验证
- 聊天流式响应正常
- Hands 触发和审批正常
- Intelligence 层功能完整
- 技能搜索和执行正常
- 配置读写正常
8.2 性能验证
- 首屏加载 < 2s
- 消息渲染 60fps
- 1000+ 消息流畅滚动
- 内存占用 < 500MB
8.3 安全验证
- XSS 攻击防护有效
- 凭据存储安全
- WebSocket 加密传输
九、风险与缓解
| 风险 | 概率 | 影响 | 缓解措施 |
|---|---|---|---|
| 引入新 bug | 中 | 高 | 每阶段充分测试 |
| 进度延期 | 中 | 中 | 预留 buffer |
| 架构决策失误 | 低 | 高 | 原型验证 |
| 团队不熟悉新架构 | 中 | 中 | 培训 + 文档 |
十、下一步行动
- 确认方案: 用户选择最终方案
- 创建详细计划: 使用 writing-plans skill
- 开始执行: Phase 1 安全加固