数据截至 (上游 commit 3667151744e3)
进程模型:一个常驻服务端 + 一群瘦客户端
30 秒导读: herdr 把自己拆成两个进程角色——一个常驻后台服务端(拥有所有终端、所有状态、所有渲染),和一群随开随关的瘦客户端(只负责把终端切到 raw 模式、把服务端画好的帧写到 stdout、把 stdin 原样送回去)。你在命令行敲的那个
herdr,永远是客户端;服务端是它在发现"没人在跑"时自己偷偷拉起来的。
本章只讲骨架:谁是进程、谁拥有状态、一次启动都发生了什么。终端内核见 终端内核,帧怎么画、怎么压缩见 渲染管线,JSON API 的方法表见 控制面。
1. 这是什么(零基础也能懂)
一句话: herdr 是给 AI 编码 agent 用的终端工作区管理器,而它的运行时形态是「一个后台守护进程 + 若干可随时来去的终端前端」。
为什么要这么拆? 因为 agent 干活的时间尺度和人看屏幕的时间尺度不一样。你想合上笔记本、断掉 SSH、换一个终端窗口,而 claude、codex 这些进程得继续跑。如果 herdr 是个单体 TUI 程序,你关掉终端 = 杀掉它 = 杀掉所有 agent。
最贴切的类比:tmux。 你敲 tmux 时,真正长命的是 tmux server;你敲的那个是 tmux client。herdr 是同一套心智模型,只是它把「服务端」做得更重(服务端自己跑完整的 UI 逻辑并渲染成帧),把「客户端」做得更瘦。
用起来什么样:
$ herdr # 第一次:发现没有服务端 → 后台拉一个 → 自己变成客户端接上去
# (界面出现,你在里面开 pane、跑 agent)
ctrl+b q # detach:客户端退出,服务端和所有 agent 继续跑
$ herdr # 第二次:发现服务端在 → 直接接上去,现场原封不动
$ herdr server stop # 真正把服务端停掉(pane 里的进程也一起走)
一句话直觉: 把服务端当成"那台一直开着的机器",客户端当成"你临时插上去的显示器 + 键盘"。显示器拔掉,机器不停。