# Hermes-Agent 上游升级参考

> 项目位置：`backend/hermes-agent/`（第三方仓库 `NousResearch/hermes-agent` 的本地克隆，已通过父项目 `.gitignore` 排除）
> 文档目的：记录一次 hermes-agent 上游升级（`git pull`）带来的总量数据、关键变更、与本项目的兼容性影响，便于后续评估升级风险、规划适配工作。
> 评估时点：2026-08-03
> 评估范围：基线 `021ed69141`（2026-06-11）→ HEAD `f4604f89`（2026-08-02）

---

## 0. 一句话定位

Hermes-Agent 是 [`NousResearch/hermes-agent`](https://github.com/NousResearch/hermes-agent) 仓库提供的智能体运行时，本项目（`agent-management`）通过 `backend/hermes-bridge/` 内的 Python Bridge 进程托管它，再由 Java 侧 `HermesBridgeClient` 通过 SSE 通信完成工作流编排。Bridge 与 hermes-agent 的耦合点主要包括：`agent.clarify_callback` 钩子、`tools.clarify_gateway` 模块、`tools.file_tools` 中的路径解析函数（由 `sandbox_patch.py` 做 monkey-patch 实现沙箱隔离）。

**本次升级的核心影响**：上游已原生支持 clarify 永久等待（`timeout=None`/`<=0`），本项目对 `tools/clarify_gateway.py` 的私有 patch 已被覆盖、可废弃。

---

## 1. 总量数据

| 维度 | 数值 |
|---|---|
| 基线 commit | `021ed6914162416522462b009de0bec1513c73a1` |
| 基线时间 | 2026-06-11 17:22:22 -0400 |
| 基线 subject | `docs: finish Automation Blueprints terminology rebrand (#44470)` |
| 当前 HEAD | `f4604f89dec8d225d67d7a68065c1b425fd3732a` |
| HEAD 时间 | 2026-08-02 22:14:27 -0500 |
| HEAD subject | `Merge pull request #77275 from NousResearch/bb/tab-reload` |
| 时间跨度 | 约 52 天 |
| 提交总数 | **8 936** |
| 文件变更 | 6 620 个 |
| 代码变更 | +1 055 298 / −359 700 行 |
| 涉及 `tools/` 的 commit | 1 376 |
| 涉及 `agent/` 的 commit | 993 |

> 量级说明：约 52 天内涌入近 9000 个 commit、超过 100 万行新增代码，远超普通迭代节奏。这通常意味着上游在此期间合并了一个或多个长期分支（long-running feature branch），或完成了某次大规模重构。`docs: finish Automation Blueprints terminology rebrand` 这条基线 commit subject 也暗示此前刚刚完成术语统一（"Automation Blueprints" 大概率是新品牌名），本次升级见证了术语落地后的特性爆发期。

---

## 2. Commit 类型分布

| 类型 | 数量 | 占比 |
|---|---|---|
| `fix` | 4 443 | 49.7% |
| `feat` | 988 | 11.0% |
| `Merge PR` | 764 | 8.5% |
| `test` | 610 | 6.8% |
| `chore` | 513 | 5.7% |
| `refactor` | 275 | 3.1% |
| `docs` | 183 | 2.0% |
| `perf` | 142 | 1.6% |
| `fmt` | 118 | 1.3% |
| `security` | 25 | 0.3% |

**观察**：fix 数量是 feat 的 4.5 倍，说明此阶段上游以密集修复为主，新特性交付与修复并行；security 有 25 条，建议单独过一遍（见第 5 节）。

---

## 3. 新增特性（feat）子系统分布

| 子系统 | feat 数 | 备注 |
|---|---|---|
| **desktop** | 279 | 桌面客户端，本轮最大特性波 |
| **gateway** | 53 | HTTP/SSE 网关与 clarify 重写 |
| **cli** | 32 | 命令行 |
| **agent** | 28 | AIAgent 核心抽象 |
| **relay** | 27 | Hermes Relay 远程协同 |
| **skills** | 21 | 技能系统 |
| **kanban** | 20 | Kanban 任务视图 |
| **dashboard** | 20 | 仪表盘 |
| **voice** | 17 | 语音输入 |
| **slack** | 17 | Slack 集成 |
| **moa** | 15 | Mixture-of-Agents |
| **tui / ui-tui** | 23 | 终端 UI |
| **memory** | 12 | 记忆系统 |
| **cron** | 12 | 定时任务 |
| **tts** | 10 | 文本转语音 |
| **tools** | 10 | 工具集 |
| **compression** | 10 | 上下文压缩 |
| **mcp** | 9 | Model Context Protocol |
| **photon** | 8 | iMessage 集成 |
| **models** | 8 | 模型管理 |
| **config** | 8 | 配置 |
| **ci** | 8 | 持续集成 |
| **secrets** | 7 | 密钥处理 |
| **providers** | 7 | 模型 provider |
| **plugins** | 7 | 插件 |
| **delegation** | 7 | 委托 |
| **themes** | 6 | 主题 |

> 上表按 feat 数倒序排列前 27 个子系统。desktop 一项就占全部 feat 的 28%，是本轮迭代的主战场。

---

## 4. 关键变更主题

### 4.1 Clarify / 用户交互（与本项目强相关）

这是本次升级中对 `agent-management` 影响最大的主题。

- **`507d479c8c` fix(clarify): one canonical timeout across CLI, TUI/desktop, and gateway (#69774)**（2026-07-22）
  - 把 CLI / TUI / gateway 三处各自实现的 clarify 超时统一为单一解析器 `tools.clarify_gateway.resolve_clarify_timeout(config)`。
  - 解析顺序：显式 `clarify.timeout`（向后兼容）→ `agent.clarify_timeout`（默认 3600）→ 兜底 3600。
  - **关键**：`<= 0` 与 `None` 都被视为"永久不超时"，仅靠 1s 切片轮询维持 watchdog 心跳。
  - **本项目影响**：`backend/hermes-bridge/hermes_bridge.py:403` 的 `wait_for_response(clarify_id, timeout=None)` 直接命中上游新能力，对 `tools/clarify_gateway.py` 的私有 patch 已可废弃。详见 `docs/patches/hermes-agent/README.md`。
- `10b7ab5cb6` feat(clarify): extend multi-select to gateway text fallback and TUI bridge —— 多选 clarify 扩展到 gateway 文本回退路径。
- `fe95194c59` feat(photon): render multiple-choice clarify as a native iMessage poll —— 多选 clarify 在 iMessage 上渲染为原生 poll。
- `c0dd6e1f3f` fix(desktop): stop a clarify card swallowing keys it doesn't bind —— 桌面端 clarify 卡片不再吞键盘事件。
- `251b668f4d` fix(desktop): let the composer answer past a clarify card —— composer 可越过 clarify 卡片继续回答。
- `aa40f16d3e` fix(gateway): transcribe clarify voice replies —— 转写 clarify 语音回复。
- `aacc15b2c9` fix(clarify): raise default clarify_timeout to 3600s (#32762) —— 默认超时从 60s 提升到 3600s。
- `tools/clarify_gateway.py`：单文件 +202/−21，几乎重写。

### 4.2 Desktop 客户端（279 feat，本轮最大特性波）

近期 merge PR 主线：
- `bb/tab-reload`、`bb/composer-path-copy`、`bb/composer-link-open`、`bb/composer-placeholder` —— composer（输入框）多轮打磨。
- `bb/desktop-lockfile-engines`、`bb/npm-engine-outage` —— 桌面运行时引擎隔离与 npm 引擎故障修复。
- `bb/win-update-lock-handoff`、`ethie/bundled-node-path-windows-layout` —— Windows 升级锁交接与打包 Node 路径修复。
- `bb/sqlite-repair-locked` —— SQLite 锁修复。
- `bb/kanban-model-picker` —— Kanban 视图模型选择器。
- `bb/example-plugin-off-by-default` —— 示例插件默认关闭。

> 与本项目关系：**完全独立**。本项目通过 Bridge 进程调用 hermes-agent，不使用其桌面应用。升级不影响 Bridge 兼容性。

### 4.3 网关与 Bridge（gateway 53 feat）

- HTTP/SSE 网关整体增强。
- `tools/clarify_gateway.py` 引入 `resolve_clarify_timeout` 统一解析器（见 4.1）。
- gateway 端 `notify` / `resolve_gateway_clarify` 等 API 形态有调整。

> **建议**：Bridge 侧调用的 `clarify_gateway.register`、`clarify_gateway.resolve_gateway_clarify`、`clarify_gateway.clear_session`、`clarify_gateway.wait_for_response` 这四个 API 升级后是否仍保持原签名，需在新版本上跑一次完整 clarify 流程验证（详见第 6 节）。

### 4.4 Agent 核心（agent 28 feat）

- AIAgent 抽象更新。
- 委托（delegation）结构化 stall 元数据 + 子 agent 实时状态：`b792bd0529 feat(delegation): structured stall metadata + live per-child status in /agents`。
- 上下文压缩 ceiling 修复：`06c7f9b26f fix(agent): clarify compress_context ceiling is pre-commit only`。
- 批量轨迹持久化与池清理：`a1ff62a139 fix: context-length fallback logging, batch trajectory durability, pool cleanup`。

> **建议**：`agent.clarify_callback` 钩子签名（`hermes_bridge.py:451` 用到）若变化会直接破坏 Bridge，需重点验证。

### 4.5 Relay / Skills / MCP / Plugins

- **Relay（27 feat）**：Hermes Relay 远程协同完善；prompts 信任 `run.py` 线程时间戳（不再自我锚定重推导）。
- **Skills（21 feat）**：技能系统持续打磨。
- **MCP（9 feat）**：Model Context Protocol 支持。
- **Plugins（7 feat）**：示例插件默认关闭。

### 4.6 性能（perf 142）

- `9acc4b47f5` perf(state): external-content FTS + tool-row-free trigram index（schema v23）—— 状态索引大重构。
- `3a69e34702` perf(update): cut redundant network + subprocess work from hermes update —— 升级流程提速。

### 4.7 安全（security 25）

- secrets 处理增强：`fe8c0f7eef fix(secrets): pass OP_LOAD_DESKTOP_APP_SETTINGS through to the op child env`。
- `/private/var` 路径收窄：`7f4d155159 fix(tools): validate timeout, reject whitespace old_string, narrow /private/var block`。
- Windows 探针防死锁：`b9dba7eff5 fix(env-probe): stuck Windows probe can no longer deadlock system-prompt builds (#67999)`。
- Bootstrap 下载超时与 BOM 升级：`73b3a8afe3 fix(bootstrap): download timeouts + BOM upgrade for pre-fix cached scripts (#67193 follow-up)`。
- git 不再阻塞内部调用：`58708c7066 fix(git): never block internal git calls on credential prompts`。

### 4.8 平台与 Provider

- photon（8 feat）：iMessage 集成，多选 clarify 渲染为原生 poll。
- slack（17 feat）、voice（17 feat）、tts（10 feat）。
- providers / models：xAI active_provider 契约锁定、Groq STT 语言提示等。

---

## 5. 兼容性影响评估

| 风险点 | 影响层级 | 评估结论 | 建议动作 |
|---|---|---|---|
| `wait_for_response(timeout=None)` 语义 | Bridge | ✅ 上游 PR #69774 已原生支持 | 私有 patch 废弃 |
| `agent.clarify_callback` 钩子签名 | Bridge | ⚠️ 上游 agent 模块 993 commit、28 feat，签名可能有微调 | 跑一次完整 clarify 流程验证 |
| `clarify_gateway.{register, resolve_gateway_clarify, clear_session, wait_for_response}` API | Bridge | ⚠️ 单文件 +202/−21，几乎重写 | 同上 |
| `tools.file_tools._resolve_path_for_task` / `_resolve_base_dir` | sandbox_patch.py monkey-patch 目标 | ⚠️ tools/ 涉及 1376 个 commit | 跑一次文件读写流程验证 |
| `agent.coding_context._git_root` | sandbox_patch.py monkey-patch 目标 | ⚠️ 同上 | 跑一次 git 操作流程验证 |
| 桌面 / Kanban / Photon / Slack 等子系统 | Bridge | ✅ 完全独立 | 无需动作 |

---

## 6. 升级后建议的回归测试清单

升级 hermes-agent 后，建议按以下清单手动回归（参考 `AGENTS.md`：复杂网页操作不使用 Playwright，交由人工测试）：

1. **Bridge 启动**：拉起 Bridge 进程，确认无 monkey-patch 失败日志。
2. **基础对话**：跑一次不涉及工具调用的智能体对话，验证 `AIAgent.run` 主路径无回归。
3. **文件读写**：在工作流中触发一次文件读写节点，验证 `sandbox_patch.py` 的 `_resolve_path_for_task` / `_resolve_base_dir` patch 仍生效（路径仍被限制在 workingDir）。
4. **git 操作**：触发一次需要 `_git_root` 的操作，验证 patch 仍指向正确的 workingDir。
5. **Clarify 全流程**（关键）：在工作流中触发"智能操作"节点的 clarify（用户提问 → 前端弹窗 → 用户回答 → 继续执行），确认：
   - `clarify_gateway.register` / `wait_for_response(timeout=None)` / `resolve_gateway_clarify` 全链路无异常。
   - Bridge 进程的 agent 线程在用户回答前持续阻塞（无意外超时返回 None）。
   - Java 侧 SSE 连接保持（无提前断开）。
   - 前端断线重连后能恢复 clarify 弹窗状态。
6. **多 clarify 并发**：同一 run 中先后触发两次 clarify，确认 `_clarify_ids` 集合与 `clear_session` 清理正常。
7. **24h 兜底**（可选）：构造 clarify 长时间不回答场景（如离线 1 小时），确认 Java 侧 `SseEmitter(86_400_000L)` 与 `setReadTimeout(86_400_000)` 未提前超时。

---

## 7. 上游基线信息（升级后）

> 本节内容用于 `docs/patches/hermes-agent/README.md` 的"上游基线"小节同步更新。

| 项 | 值 |
|---|---|
| 远程仓库 | https://github.com/NousResearch/hermes-agent |
| 子项目本地路径 | `backend/hermes-agent/` |
| 父项目 `.gitignore` 排除规则 | `hermes-agent/` |
| 当前基线 commit | `f4604f89dec8d225d67d7a68065c1b425fd3732a` |
| 基线 commit subject | `Merge pull request #77275 from NousResearch/bb/tab-reload` |
| 基线时间 | 2026-08-02 22:14:27 -0500 |
| 当前 main 分支跟踪状态 | 正常跟踪 `origin/main`（非 detached HEAD） |

---

## 8. 升级操作回放

本次升级的实际操作记录：

```bash
# 在父项目根目录
cd backend/hermes-agent

# 当前工作区有私有 patch（已 apply），先还原
python ../docs/patches/hermes-agent/apply-patches.py --revert

# 拉取上游
git pull --ff-only origin main

# 验证 patch 是否仍需要（--check 显示找不到原始锚点，说明上游已重写该段）
python ../docs/patches/hermes-agent/apply-patches.py --check

# 决策：上游 PR #69774 已原生覆盖能力 → 不再 apply，标记 patch 为废弃
```

---

## 9. 参考链接

- 上游仓库：https://github.com/NousResearch/hermes-agent
- 关键 PR：[#69774](https://github.com/NousResearch/hermes-agent/pull/69774) fix(clarify): one canonical timeout across CLI, TUI/desktop, and gateway
- 私有 patch 记录：[`docs/patches/hermes-agent/README.md`](../patches/hermes-agent/README.md)
- Bridge 适配层关键文件：
  - [`backend/hermes-bridge/hermes_bridge.py`](../../backend/hermes-bridge/hermes_bridge.py)
  - [`backend/hermes-bridge/sandbox_patch.py`](../../backend/hermes-bridge/sandbox_patch.py)
  - [`backend/src/main/java/com/agent/management/engine/hermes/HermesBridgeClient.java`](../../backend/src/main/java/com/agent/management/engine/hermes/HermesBridgeClient.java)
