# AgentsMeeting 代码清理方案

> 目标：消除 XMPP Bot 代码碎片化，统一架构。所有 Agent 共享同一份核心代码。

---

## 1. 现状问题

### 1.1 四套独立 Bot 实现

| # | 位置 | 行数 | 状态 | 用途 | LLM 调用 |
|---|------|-------|------|------|----------|
| 1 | `gateway/scripts/xmpp_bot.py` | 943 | 活跃 | xxm bot | chat_bridge |
| 2 | `xmpp_agent_core.py `（root） | 348 | 活跃 | mohe/zhiwei/xiaoguo | Hermes API |
| 3 | `bots/xmpp_bot.py` + 姐妹文件 | 359 | 孤儿 | mohe/zhiwei/xiaoguo（旧版） | Hermes API |
| 4 | `xmpp_bot_rest.py` | 72 | 废弃 | ejabberd REST 实验 | Hermes API |

**问题**：同样的 XMPP 连接、MUC join、消息处理逻辑，在 4 套代码中重复实现。修复了其中一个，其他三个还是坏的。

### 1.2 基础设施碎片化

bot_base.py（263 行）已经提炼出完善的 XMPP 基类，但没有任何 bot 实际使用它：

```
bot_base.py 有：
  ✓ PID 锁（proc_guard）
  ✓ 自动重连 + MUC join 重试
  ✓ 消息去重（dedup）
  ✓ 消息合并（batching）
  ✓ silence/shutup 协议
  ✓ send_group / send_private

没有被任何 bot 使用 ✗
```

### 1.3 重复/孤儿文件

| 文件 | 问题 |
|------|------|
| `xmpp_bot.py`（root） | `xmpp_agent_core.py` 的较旧副本 |
| `xmpp_bot_rest.py` | 废弃方案 |
| `bots/` 目录（3 文件） | 被 xmpp_agent_core.py 取代 |
| `hermes_state.py`（root） | 孤儿，import 已断 |
| `scripts/`（6 文件） | 一次性脚本 |
| `src/bots/{mohe,xiaoguo,xxm,zhiwei}/` | 空目录，重构未完成 |
| `src/channels/wechat/` | 空目录 |

---

## 2. 目标架构

```
AgentsMeeting/
├── xmpp_agent_core.py    ← 唯一 Bot 核心（统一架构）
│                           支持 --agent xxm|mohe|zhiwei|xiaoguo
│                           包含：PID锁/重连/MUC/dedup/batching/
│                           coordinator协议/HTTP桥
│
├── xxm_bot.py            ← 兼容入口（python xxm_bot.py = python xmpp_agent_core.py --agent xxm）
├── mohe_bot.py           ← 兼容入口
├── xiaoguo_bot.py        ← 兼容入口
├── zhiwei_bot.py          ← 兼容入口
│
└── gateway/
    └── scripts/
        ├── chat_bridge.py    ← xxm LLM 桥（不变）
        ├── session_router.py ← 消息路由（不变）
        └── ...（其他脚本不变）
```

**核心原则**：
- `xmpp_agent_core.py` = 唯一核心，所有 Agent 共享
- 每个 Agent 只有 LLM 调用方式不同（在配置中定义）
- coordinator/GRANT/REVOKE 协议只有一个实现，所有 bot 统一遵守
- `bot_base.py` 的基础设施合并进 `xmpp_agent_core.py`

---

## 3. 迁移步骤

### Phase 0：确认基线（先保证现有 bot 正常工作）

- [ ] 确认 `gateway/scripts/xmpp_bot.py` 当前运行正常，能收发群消息
- [ ] 确认 `xmpp_agent_core.py`（mohe）当前运行正常

### Phase 1：合并基础设施到 xmpp_agent_core.py

将 `bot_base.py` 和 `gateway/scripts/xmpp_bot.py` 中的公共功能合并进 `xmpp_agent_core.py`：

| 功能 | 来源 | 说明 |
|------|------|------|
| PID 锁（proc_guard） | bot_base.py / gateway | 防重复启动 |
| 消息去重（dedup） | bot_base.py / gateway | 防重复处理同一条消息 |
| 消息合并（batching） | bot_base.py / gateway | 3s debounce，附近消息合并一次 LLM 调用 |
| 自动重连 | bot_base.py / gateway | slixmpp auto_reconnect + reconnect_max_delay |
| MUC join 双重保证 | gateway | `join_muc()` + `send_raw(presence)` |
| MAM 启动恢复 | gateway | 启动时拉取最近 50 条历史消息补上下文 |
| HTTP 桥丰富 API | gateway | /health, /presence, /messages, POST /send |
| sub-agent exec | gateway | `##exec:command##` 用于工具调用 |
| delayed reply | gateway | `##delay:N##` 延迟回复 |

### Phase 2：统一 coordinator 协议

gateway/scripts/xmpp_bot.py 已经实现了 coordinator/GRANT/REVOKE 协议。将这套实现整合进 `xmpp_agent_core.py`，确保所有 Agent 使用同一份协议代码。

### Phase 3：添加 xxm 作为支持 Agent

在 `xmpp_agent_core.py` 的 AGENTS 配置中添加 xxm：

```python
AGENTS = {
    "mohe":   {..., "gateway": "http://localhost:8642/v1/chat/completions"},
    "zhiwei": {..., "gateway": "http://localhost:8643/v1/chat/completions"},
    "xiaoguo":{..., "gateway": "http://localhost:8645/v1/chat/completions"},
    "xxm":    {..., "bridge": "chat_bridge"},  # xxm 走本地 chat_bridge
}
```

xxm 的 LLM 调用方式不同（不走 HTTP Hermes API，走本地 `chat_bridge.py`），所以需要在核心中抽象 LLM 调用层：

```python
def _call_llm(self, content: str) -> str:
    if self.cfg.get("bridge") == "chat_bridge":
        return _call_chat_bridge(content)    # 本地调用
    else:
        return _call_hermes_api(content, self.cfg["gateway"])  # HTTP 调用
```

### Phase 4：删除孤儿文件

| 文件 | 操作 |
|------|------|
| `xmpp_bot.py`（root） | 移到 trashbox |
| `xmpp_bot_rest.py` | 移到 trashbox |
| `bots/` 整个目录 | 移到 trashbox |
| `hermes_state.py`（root） | 移到 trashbox |
| `scripts/gen_prd.py` | 移到 trashbox |
| `scripts/write_prd.py` | 移到 trashbox |
| `scripts/gen_prd_v02.py` | 移到 trashbox |
| `scripts/write_prd_v02.py` | 移到 trashbox |
| `scripts/build_prd.py` | 移到 trashbox |
| `scripts/test_echo.py` | 移到 trashbox |
| `scripts/gen_b64.py` | 保留（可能是通用工具） |

### Phase 5：清理空目录

| 目录 | 操作 |
|------|------|
| `src/bots/mohe/` | 删除 |
| `src/bots/xiaoguo/` | 删除 |
| `src/bots/xxm/` | 删除 |
| `src/bots/zhiwei/` | 删除 |
| `src/channels/wechat/` | 删除 |
| `gateway/assets/` | 删除 |

### Phase 6：整理 gateway/temp/

保留：PID 文件、活跃缓存（.bridge_context.jsonl、.model_cache.json）
其余 >200 个临时文件：移到 temp/archive/ 或按需清理。

### Phase 7：文档更新

- [ ] 更新 `docs/ARCHITECTURE.md` —— 反映统一架构
- [ ] 更新 `README.md` —— 更新项目结构描述
- [ ] 更新 `config/agents.yaml` —— 保持准确

---

## 4. 核心文件变更清单

### 修改：xmpp_agent_core.py

从 348 行扩展为 ~600 行，新增：

```
新增功能模块：
├── proc_guard PID 锁
├── 消息去重（_dedup_cache）
├── 消息合并（_batch_* 系统，3s debounce）
├── MAM 启动恢复（_fetch_mam_history）
├── HTTP 桥丰富版（/health, /presence, /messages, POST /send）
├── sub-agent exec（##exec:command##）
├── delayed reply（##delay:N##）
├── 抽象 LLM 调用层（支持 chat_bridge + Hermes API）
└── coordinator/GRANT/REVOKE 协议（从 gateway 版提升）
```

新增 AGENTS 配置条目：

```python
"xxm": {
    "jid": "xxm@yoin.fun",
    "password": "hermes123",
    "nick": "xxm",
    "name_cn": "笑笑",
    "bridge": "chat_bridge",           # 使用本地 chat_bridge
    "http_port": 5802,                  # HTTP 桥端口
    "muc_rooms": [
        "coregroup@conference.yoin.fun",
        "jujidina@conference.yoin.fun",
    ],
    "server": "192.168.1.246",          # LAN 直连
    "port": 5222,
    "session_id": "ses_xxm_xmpp",
    "mention": "@xxm/@笑笑",
}
```

### 创建：xxm_bot.py

```
#!/usr/bin/env python3
"""Wrapper for xmpp_agent_core.py --agent xxm"""
import sys, os
sys.argv = [sys.argv[0], '--agent', 'xxm']
exec(open(os.path.join(os.path.dirname(__file__), 'xmpp_agent_core.py')).read())
```

（与现有的 mohe_bot.py / zhiwei_bot.py / xiaoguo_bot.py 模式一致）

### 保留不变

| 文件 | 说明 |
|------|------|
| `gateway/scripts/chat_bridge.py` | xxm LLM 桥，不迁移 |
| `gateway/scripts/session_router.py` | 消息路由，不迁移 |
| `gateway/scripts/wechat_agent.py` | 微信桥接，独立组件 |
| `gateway/scripts/qq_bot.py` | QQ bot，独立组件 |
| `gateway/scripts/vc_webhook.py` | VoceChat webhook，独立组件 |
| `gateway/scripts/dashboard.py` | 管理门户，独立组件 |
| `gateway/scripts/health_check_xxm.py` | 健康检查，独立组件 |
| `gateway/scripts/xmpp_watchdog.py` | 看门狗，独立组件 |
| `gateway/scripts/mohe_watcher.py` | 莫荷消息监控，独立组件 |
| `gateway/scripts/api_proxy.py` | API 代理，独立组件 |

---

## 5. 测试计划

### 5.1 单元测试

- [ ] `python tests/test_core.py` —— bot_base 测试保持通过
- [ ] 新增测试：合并后的 xmpp_agent_core.py 的 LLM 抽象层

### 5.2 集成测试

- [ ] `python xmpp_agent_core.py --agent xxm` 能启动、连接、加入 MUC
- [ ] `python xmpp_agent_core.py --agent mohe` 能启动、连接、加入 MUC
- [ ] 各 Agent 在 coregroup 中能正确响应 @mention
- [ ] coordinator/GRANT/REVOKE 协议各 Agent 一致

### 5.3 部署验证

- [ ] `python tests/verify_deploy.py` pass
- [ ] gateway/scripts/xmpp_bot.py → 改为调用 xmpp_agent_core.py --agent xxm
- [ ] Linux 端 update systemd service 指向新路径

---

## 6. 风险与回滚

| 风险 | 缓解 |
|------|------|
| 合并后 xxm bot 不工作 | Phase 0 先备份当前 `gateway/scripts/xmpp_bot.py` |
| 协议行为不一致 | coordinator 协议从 gateway 版提取，与 xmpp_agent_core 现有逻辑逐行对比 |
| 启动命令需要改 | 兼容入口（xxm_bot.py 等）保持 CLI 不变 |

**回滚方案**：Phase 1-4 每步完成后验证。出问题从 trashbox 恢复删除的文件。
