- OutboundDispatcher 改用 ChannelManager 获取通道,不再维护独立注册表 - CliChatChannel 通过控制消息通道操作 SessionStore,移除独立引用 - MessageBus 统一通过 ChannelManager 创建,避免重复实例 - GatewayState 移除冗余字段,统一通过 ChannelManager 访问 - 新增 ControlInbound/ControlOutbound/ControlMessage 类型支持会话管理操作 - 添加 ARCHITECTURE_REVIEW.md 记录架构问题与修复状态
129 lines
3.2 KiB
Markdown
129 lines
3.2 KiB
Markdown
# 架构审查报告
|
||
|
||
> 生成时间: 2026-04-26
|
||
> 更新时间: 2026-04-26
|
||
|
||
## 审查摘要
|
||
|
||
本报告识别了当前代码库中的架构不合理、冗余和无效代码的问题。
|
||
|
||
---
|
||
|
||
## 问题清单
|
||
|
||
### 已修复
|
||
|
||
#### ✅ #1 OutboundDispatcher 重复维护 Channel 注册表
|
||
|
||
**修复方案**: `OutboundDispatcher` 现在从 `ChannelManager` 获取 channels,而不是自己维护一份注册表。
|
||
|
||
**修改文件**:
|
||
- `src/bus/dispatcher.rs` - 移除 `channels` 字段,改用 `ChannelManager`
|
||
- `src/channels/manager.rs` - 添加 `register_channel` 方法
|
||
- `src/gateway/mod.rs` - 简化 dispatcher 初始化
|
||
|
||
---
|
||
|
||
#### ✅ #2 CliChatChannel 持有独立的 SessionStore
|
||
|
||
**修复方案**: `CliChatChannel` 的 `SessionStore` 通过依赖注入从 `ChannelManager` 获取,而不是独立持有。
|
||
|
||
**修改文件**:
|
||
- `src/channels/cli_chat.rs` - 添加 `set_store()` 方法
|
||
- `src/channels/manager.rs` - 添加 `cli_chat_channel` 字段
|
||
- `src/gateway/mod.rs` - 重构 channel 初始化流程
|
||
|
||
---
|
||
|
||
#### ✅ #3 MessageBus 被创建两次引用
|
||
|
||
**修复方案**: 移除 `GatewayState.bus` 字段,直接使用 `channel_manager.bus()`。
|
||
|
||
**修改文件**:
|
||
- `src/gateway/mod.rs` - 移除冗余的 `bus` 字段
|
||
|
||
---
|
||
|
||
#### ✅ #4 GatewayState 同时持有 channel_manager 和 cli_chat_channel
|
||
|
||
**修复方案**: `cli_chat_channel` 只通过 `ChannelManager` 管理,`GatewayState` 不再单独持有。
|
||
|
||
**修改文件**:
|
||
- `src/gateway/mod.rs` - 移除 `cli_chat_channel` 字段,添加 `cli_chat_channel()` getter 方法
|
||
|
||
---
|
||
|
||
### 高优先级(待修复)
|
||
|
||
#### ❌ Session 每次重建都创建新的 LLM Provider
|
||
|
||
**文件**: `src/gateway/session.rs:349-361`
|
||
|
||
**问题**: 每当 session TTL 过期(默认4小时),就会销毁并重建 session,同时创建新的 LLM provider 连接。
|
||
|
||
**建议**: Provider 应该池化复用,不随 session 销毁而重建。
|
||
|
||
---
|
||
|
||
#### ❌ CliChatChannel::send 广播给所有客户端
|
||
|
||
**文件**: `src/channels/cli_chat.rs:279-289`
|
||
|
||
**问题**: `OutboundMessage` 有 `chat_id` 字段用于路由,但实现广播给所有客户端,而不是只发给对应 chat_id 的客户端。
|
||
|
||
**建议**: 根据 `chat_id` 过滤客户端,只发送给对应的客户端。
|
||
|
||
---
|
||
|
||
### 中优先级(待修复)
|
||
|
||
#### ❌ default_tools() 每次调用创建新 ToolRegistry
|
||
|
||
**文件**: `src/gateway/session.rs:212-227`
|
||
|
||
**建议**: 如果工具列表是只读的,直接 clone Arc;如果需要修改,需要澄清设计意图。
|
||
|
||
---
|
||
|
||
### 低优先级(待修复)
|
||
|
||
#### ❌ FeishuChannel::new 接收未使用的 provider_config
|
||
|
||
**文件**: `src/channels/feishu.rs:175-178`
|
||
|
||
---
|
||
|
||
#### ❌ OutboundDispatcher::send_with_retry 永不执行的 unreachable
|
||
|
||
**文件**: `src/bus/dispatcher.rs:81`
|
||
|
||
---
|
||
|
||
#### ❌ Channel trait 的 `is_running` 使用 std::sync::Mutex
|
||
|
||
**文件**: `src/channels/base.rs:38` vs `src/channels/cli_chat.rs:265-267`
|
||
|
||
---
|
||
|
||
#### ❌ LoopDetector 硬编码在 AgentLoop 中
|
||
|
||
**文件**: `src/agent/agent_loop.rs:88-172`
|
||
|
||
---
|
||
|
||
#### ❌ InboundMessage 和 OutboundMessage 结构重复
|
||
|
||
**文件**: `src/bus/message.rs`
|
||
|
||
---
|
||
|
||
## 问题统计
|
||
|
||
| 状态 | 优先级 | 数量 |
|
||
|------|--------|------|
|
||
| ✅ 已修复 | - | 4 |
|
||
| ❌ 待修复 | 高 | 2 |
|
||
| ❌ 待修复 | 中 | 1 |
|
||
| ❌ 待修复 | 低 | 5 |
|
||
| **总计** | - | **12** |
|