Agent 路由
通过智能转换,在 AI Agent 之间自动传递输出。
Agent 路由是 MadoHub 的核心功能。当一个 Agent 完成任务后,MadoHub 可以自动提取结果,将其转换为可执行的提示词,并传递给另一个 Agent。
工作原理
- 触发 — 已连接的源图块根据配置的触发类型(空闲检测、完成检测、关键词匹配或持续模式)触发。
- 提取 — MadoHub 读取 Agent 的最后一次响应。对于 Claude Code,使用 JSONL 会话文件进行干净提取。对于其他 Agent,直接读取终端输出。
- 转换 — 提取的输出被转换为目标 Agent 的提示词。可以使用 AI 驱动的改写、模板包装或原始透传。
- 投递 — 转换后的提示词以模拟人类输入的延迟(每行 50–80ms)逐行输入到目标终端,然后使用 Agent 对应的回车序列提交。
JSONL 会话解析
对于 Claude Code,MadoHub 通过读取会话日志文件来提取干净的响应:
- 找到终端对应的 tmux pane,然后广度优先遍历进程树(
ps -eo pid=,ppid=,comm=),找到第一个命令名包含 claude/codex/amp/opencode 的后代进程——该 PID 即为 Agent 进程。 - 读取
~/.claude/sessions/{PID}.json(以 Agent 的 PID 而非 session id 为键),提取其中的sessionId字段。 - 遍历
~/.claude/projects/下的每个子目录,查找名为{sessionId}.jsonl的文件——即为对应的会话记录。 - 解析 JSONL 并提取最后一条助手消息。
这比原始终端抓取能获得更干净的内容,避免了 ANSI 转义码和格式化伪影。
另外,cwd_to_project_dir() 会将图块的工作目录映射为项目目录:先将 / 替换为 -,如果没有精确匹配,则回退到子字符串搜索。
触发类型
| 类型 | 行为 |
|---|---|
| on-idle | 等待完成关键词匹配(IDLE_DELAY_MS),然后等待 8 秒静默。默认且最可靠。 |
| on-complete | 与 on-idle 处理方式完全相同:等待同样的完成关键词匹配,再等待同样的 8 秒静默延迟后才触发。 |
| on-keyword | 输出中匹配自定义正则表达式时触发。 |
| always | 持续流式传输所有新的终端输出。 |
转换类型
| 类型 | 说明 |
|---|---|
| ai-routing | 使用 AI 模型为目标 Agent 生成上下文感知的提示词。需要在设置中配置 API 密钥。支持自定义模板。 |
| prompt-wrap | 将输出包装在用户提供的模板中。变量:{output}、{round}、{maxRounds}、{source}。 |
| full-output | 原样发送终端输出的最后 30 行。 |
| raw | 发送终端输出的最后 10 行。 |
| summary | 发送 AI 生成的输出摘要。 |
路由分发默认使用 madoagent 路径(也可选择 legacy、shadow)。
内容投递
MadoHub 以每行 50–80ms 的延迟逐行将内容输入到目标终端,模拟人类输入。回车键行为因 Agent 而异:
- Claude Code、Codex、Amp、OpenCode:双回车(
\r\r)提交。Codex 为 800ms 预延迟、两次按键间隔 200ms;其余 Agent 为 500ms 预延迟。 - Shell:单个换行符(
\n)提交。
循环保护
路由连接具有内置保护机制,防止无限循环:
| 设置 | 默认值 | 范围 | 说明 |
|---|---|---|---|
| maxRounds | 5 | 1–20 | 自动停用前的最大路由循环次数。 |
| cooldownMs | 3s | 1–30s | 触发之间的最小延迟。 |
| stopKeyword | — | 任意字符串 | 检测到指定关键词时停止路由(例如 "LGTM")。 |
示例工作流
终端 1(Claude Code) 终端 2(Claude Code)
┌──────────────────────┐ → ┌──────────────────────┐
│ "重构 auth 模块" │ │ 接收到: │
│ │ │ "审查 src/auth/ 中 │
│ ✓ 完成 — 3 个文件 │ │ 的重构代码..." │
└──────────────────────┘ └──────────────────────┘Agent 1 重构代码。完成后,MadoHub 读取 JSONL 响应,使用 AI 路由生成包含具体文件和变更的审查提示词,并将其投递给 Agent 2。