← blog 技术原理与实践 · 2026-09-05

Herdr 和 session-share:一个负责“让 agent 工作”,一个负责“让 agent 记住工作”

如何让多个 agent 协作完成任务?Herdr 和 session-share 提供了两种互补的解决方案。

10 min read

现在很多人会同时使用多个 coding agent:让一个 agent 调查问题,让另一个实现代码,再让第三个运行测试或做审查。

但只要 agent 数量一多,问题就来了:

  • 这些 agent 到底跑在哪里?
  • 怎么知道某个 agent 是完成了、卡住了,还是正在等待确认?
  • 一个 agent 的调查结果,怎么交给另一个 agent?
  • 如果当前会话关掉了,下次还能不能接着做?

Herdr 和 session-share 都能用于多 agent 协作,但它们解决的不是同一个问题。

简单地说:

Herdr 负责让多个 agent 同时工作,session-share 负责让不同会话之间共享持久化的协作记录。

Herdr:管理正在运行的 agent

Herdr 可以理解成一个专门为 coding agent 设计的终端运行时。

它把不同 agent 放进独立的 pane 中。每个 pane 都有自己的终端、进程、工作目录和输出缓冲区:

flowchart LR
    C[协调者] --> API[Herdr CLI / API]
    API --> S[Herdr server runtime]
    S --> PA[Pane A / PTY<br/>researcher]
    S --> PB[Pane B / PTY<br/>implementer]
    S --> PC[Pane C / PTY<br/>reviewer]
    PA --> OA[终端输出与状态]
    PB --> OB[终端输出与状态]
    PC --> OC[终端输出与状态]
    OA --> C
    OB --> C
    OC --> C

这些 agent 可以是 Codex、Claude CLI,或者其他 Herdr 能识别的 coding agent。

Herdr 关注的是实时运行状态:

  • agent 是否正在工作
  • 是否已经空闲
  • 是否等待用户批准
  • 是否完成了后台任务
  • 当前终端输出是什么
  • 是否需要继续发送输入

因此,Herdr 不只是“开几个终端窗口”。它还会观察 agent 的终端状态,并通过 CLI 或 API 进行控制。

比如,可以先在一个 pane 中启动 agent,再让它调查问题:

herdr agent prompt researcher \
  "调查这个测试失败的原因,完成后总结复现步骤和根因。" \
  --wait

然后读取它的输出:

herdr agent read researcher \
  --source recent-unwrapped \
  --lines 120

如果另一个 agent 负责实现修复,就可以把调查结论继续传给它:

herdr agent prompt implementer \
  "根据 researcher 的调查结果实现修复:……" \
  --wait

这里的通信路径很直接:

协调者
  → Herdr CLI/API
  → 目标 agent 的 PTY
  → 读取目标 agent 的终端输出

所以,Herdr 更像是一个实时控制平面。它可以管理 agent 进程、发送输入、读取输出、等待状态变化,也可以处理 agent 卡在权限确认或问题选择界面的情况。

session-share:保存 agent 之间的上下文

session-share 关注的不是某个 agent 当前的终端画面,而是不同 agent 会话之间的信息传递。

它更像一个项目级的协作记录层。消息和任务会以持久化记录的形式保存到项目目录下的 .session-share/ 中。它不是实时消息总线,也不保证另一个正在运行的会话已经收到消息;agent 或协调者需要主动写入和读取这些记录。

一个 agent 调查完问题之后,可以留下这样的交接信息:

任务:调查 Windows 下的配置解析失败

结论:
- 问题出现在路径解析阶段
- 反斜杠被当作转义字符处理
- Linux 环境下无法复现
- 相关文件:src/config/path.rs
- 建议增加 Windows 路径测试

也可以通过 CLI 创建任务和发送交接消息。具体参数应以本机 session-share --help 为准,例如:

session-share task "调查配置解析失败" \
  --from coordinator \
  --assign researcher \
  --project "$PWD"

session-share message "已定位到路径解析问题,相关文件是 src/config/path.rs" \
  --from researcher \
  --to implementer \
  --project "$PWD"

之后,另一个 agent,甚至另一个时间点启动的 agent,就可以读取这份记录,结合当前代码和测试结果继续完成实现或验证。

这解决的是另一类问题:

  • 上一个 agent 做到哪里了?
  • 调查结论是什么?
  • 哪些文件已经改过?
  • 测试是否通过?
  • 还有哪些风险没有处理?
  • 这个问题以前是否已经调查过?

即使原来的 Herdr pane 已经关闭,只要项目目录中的 session-share 记录仍然存在,后续会话就可以找到这些交接内容。

它更适合表达“工作语义”,而不是“终端状态”。

两者最核心的差别

可以用两个问题来区分它们:

Herdr 回答:“这个 agent 现在怎么样?我能不能给它发命令?”

session-share 回答:“之前的 agent 做了什么?下一个 agent 应该从哪里接着做?”

看几个实际例子。

Agent 正在等待权限确认

Herdr 可以识别这个 agent 处于 blocked 状态,并读取终端上的确认界面。必要时,还可以通过 send-keys 发送按键。

session-share 可以记录“这个任务被权限确认阻塞”,但它本身通常不负责操作那个终端界面。

Agent 已经退出,任务下周继续

Herdr 依赖当前的 session、pane 和进程。进程退出后,它就不再是一个实时控制对象。

session-share 仍然可以保存:

  • 任务目标
  • 已经完成的调查
  • 修改过的文件
  • 测试结果
  • 未解决的问题
  • 下一步建议

下一个 agent 可以先从交接记录了解背景,再结合当前代码和测试结果继续工作。

三个 agent 并行工作

Herdr 负责把三个 agent 真正运行起来:

Herdr
├── researcher:调查问题
├── implementer:编写修复
└── reviewer:检查修改

session-share 则负责记录它们之间的交接:

researcher → 调查结论
implementer → 修改说明和测试结果
reviewer → 审查意见和剩余风险

Herdr 中的通信,通常是“经过协调者”

Herdr 可以让一个协调者读取 agent A 的输出,再把其中的结论发送给 agent B:

Agent A
  → Herdr 读取输出
  → 协调者提炼结论
  → Herdr 向 Agent B 发送任务

这是一种间接通信。

Agent A 和 Agent B 并不是天然拥有一个自由对话的消息通道。它们通常通过以下方式协作:

  • 共享 Git 仓库
  • 共享文件
  • 共享测试结果
  • 由协调 agent 转述信息
  • 通过 Herdr CLI 控制彼此所在的 pane

这种方式的优点是过程清楚、终端证据完整,也容易观察每一步发生了什么。

但它也有一个明显限制:如果只依赖终端输出,协调者需要自己从大量文本中提炼结论。终端输出适合实时观察,却不一定适合长期保存和检索。

这正是 session-share 发挥作用的地方。

session-share 更适合做“交接”和“记忆”

一个比较完整的流程可以是:

flowchart TD
    T[创建任务或记录背景] --> SS[session-share 项目记录<br/>.session-share/]
    SS --> R[researcher 会话读取任务]
    R --> F[调查问题并形成结论]
    F --> M[写入消息或更新任务]
    M --> I[implementer 会话读取交接记录]
    I --> W[结合当前代码实现并运行测试]
    W --> U[写入修改说明、测试结果和剩余风险]
    U --> V[reviewer 会话读取最新记录并审查]

例如:

  1. 在 session-share 中建立一个调查任务。
  2. 用 Herdr 启动 researcher。
  3. researcher 在自己的 pane 中复现问题。
  4. 协调者通过 Herdr 读取 researcher 的结论。
  5. 把结论写入 session-share。
  6. 用 Herdr 启动 implementer。
  7. implementer 读取交接记录,结合当前代码修改实现。
  8. 把修改内容和测试结果再次保存到 session-share。
  9. reviewer 读取这些信息,完成审查。

在这个流程里,Herdr 负责“现场”,session-share 负责“档案”。

什么时候该用 Herdr,什么时候该用 session-share?

如果目标是控制当前正在运行的 agent,优先使用 Herdr:

  • 启动或停止 agent
  • 为 agent 分配独立 pane
  • 向 agent 发送 prompt
  • 读取终端输出
  • 等待 agent 完成
  • 处理权限确认和交互输入
  • 观察 agent 的实时生命周期

如果目标是跨会话共享信息,优先使用 session-share:

  • 创建和派发任务
  • 保存调查结果
  • 记录实现和测试结论
  • 给下一个 agent 写交接说明
  • 回忆上次会话做到哪里
  • 在 Codex、Claude、Pi 等不同 agent 之间传递上下文

它们不是替代关系

把 Herdr 和 session-share 放在一起时,最自然的分工是:

Herdr         = 运行时和控制
session-share = 协作记录和持久记忆

或者换一个更生活化的比喻:

  • Herdr 像一个管理多个工作台的调度中心。你可以看到每个人是否在工作,也可以直接交代事情。
  • session-share 像团队的项目日志。它记录谁调查了什么、得出了什么结论,以及下一步应该做什么。

只有 Herdr 时,多个 agent 可以并行运行,但交接主要依赖实时终端输出和共享文件。

只有 session-share 时,多个会话可以交换任务和结论,但它本身不负责启动 agent,也不负责操作某个具体的终端进程。

两者结合之后,协作链路会完整得多:

Herdr 让 agent 在同一个运行环境里并行工作;session-share 让这些工作的结果能够跨会话沉淀和流转。

这也是两者最重要的区别:Herdr 面向“活着的进程”,session-share 面向“持续的协作上下文”。

Sources

No external sources for this entry.

Related