终端不再只是 Shell:深度解析 Herdr 与 Fresh 的运行时架构

🎥 观看视频(YouTube)

在过去的一年里,在本地工作站上常驻运行自主编程智能体(Autonomous Coding Agents)已经不再是偶发的实验,而是成为了我写代码的日常状态。在一个寻常的工作日下午,我的终端里通常同时挂着好几个智能体:Hermes 在后台重构一个数据库客户端,Claude Code 在一个隔离的 Git Worktree 里跑全量测试,而 OpenCode 则在生成集成测试用例。

但这种工作流很快撞上了一堵古老的墙:传统终端模拟器的固有边界。

像 Windows Terminal、iTerm2 或 Alacritty 这类标准的终端模拟器,从几十年前设计之初就是为了“一个人对着一个 Shell 敲命令”而构建的。一旦你将任务委派给多个自主运行的智能体,这种模型立刻崩溃:你无法一眼看出哪个智能体已经跑完、哪个智能体因为断言失败而崩溃、哪个又因为卡在权限确认或 API 密钥输入框而在原地阻塞等待。当一个智能体想要向你展示它刚刚修改过的 5 个文件时,它唯一能做的是在 stdout 里倾泻一片文件路径,逼着你手动复制粘贴到编辑器里去核对。

针对这一瓶颈,开源与商业生态中涌现出两个完全基于 Rust 构建的新项目,给出了截然不同、却同样激进的工程答案:

  1. Herdr (herdr.dev):专为自主编程智能体设计的终端多路复用器与进程级后台运行时(Agent Habitat)。
  2. Fresh (getfresh.dev):将 VS Code 级别的现代编辑体验与语言服务原生带入终端的零配置文本编辑器与终端 IDE(Modern Terminal IDE)。

两者都把终端当成了应用程序的宿主运行时(Application Runtime),却从相反的极端切入。在实际压测了两者的架构底座、拆解了 13 个工程维度的设计权衡,并亲手通过 Windows 命名管道(Named Pipe IPC)让外部智能体实时遥控 Fresh 编辑器之后,我把这些架构思考整理成了这篇实测笔记。

Herdr 与 Fresh 终端运行时架构对比


1. 同一问题的两个极端答案

当你仔细拆解 Herdr 与 Fresh 的文档结构和底层架构哲学时,两者的反差极其鲜明:

                  ┌──────────────────────────────────────────────┐
                  │            将终端视为应用级运行时             │
                  └──────────────────────┬───────────────────────┘
                                         │
                 ┌───────────────────────┴───────────────────────┐
                 ▼                                               ▼
       [ HERDR: 智能体的栖息地 ]                        [ FRESH: 工程师的工作台 ]
       宿主单元:OS 进程 (Process)                      宿主单元:文档缓冲区 (Buffer)
       主要交互对象:AI 智能体                          主要交互对象:人类工程师
       核心目标:多进程编排与状态可观测性               核心目标:极致流畅的终端原生代码编辑
       "Run them anywhere. Leave them running."       "Zero configuration. No learning curve."

Herdr:智能体的专属栖息地

Herdr 将自身定位为一个专精于多智能体治理的终端复用器。它默认你的工作站上跑着一群各司其职的智能体(a herd of agents)。

  • 心智模型:由一个完全拥有 PTY 生命周期的后台 Server,以及随时可挂载/卸载的 TUI 客户端组成。即使你合上笔记本或关闭终端窗口,后台 Server 和所有子进程依然在原地常驻运行。
  • 原子宿主单元:OS 进程(映射为真实的终端 Pane)。
  • 核心一等公民:智能体(Agent)。Herdr 内置了一套显式的 5 状态生命周期状态机:working(执行中)、blocked(阻塞待确认)、done(已完成)、idle(闲置)和 unknown(未知)。
  • 商业背景:商业初创公司,已获得 600 万美元种子轮融资,正在推进托管云端等待名单。

Fresh:给人类工程师准备的终端工作台

Fresh 则站在了完全相反的立场:人类工程师依然需要一个启动毫秒级、体验像现代 GUI 编辑器一样丝滑,且不需要折腾数天 Neovim 插件脚本的终端环境。

  • 心智模型:基于 crossterm 与 ratatui 构建,将多光标编辑、Ctrl+P 命令面板、鼠标原生拖拽以及可视化配置菜单完整搬进终端。
  • 原子宿主单元:文档缓冲区(Buffer + View),底层由高性能 Piece Tree(片段树)与区间树(Interval Tree)驱动。
  • 运行时扩展:内置基于 QuickJS 与 oxc 的轻量级 TypeScript 运行时,彻底剥离了沉重的 V8 依赖。
  • 开源血统:由 Noam Lewis 创建的纯粹独立开源项目,遵循 GPL-3.0-or-later 协议。

2. 13 个工程维度的全面解构

为了跳出简单的“功能清单对比”,我将两者的工程实现归一化为 13 个系统级元维度进行横向审视:

# 架构元维度 Herdr Fresh
01 核心定位 智能体运行时 / 终端多路复用器 终端文本编辑器 / 终端 IDE
02 并发架构 Server 独占 PTY;客户端随时脱离;Windows 原生 ConPTY 主线程渲染循环 + Tokio 异步任务 + 独立 QuickJS 插件线程
03 概念原子单元 Pane(操作系统级 PTY 终端进程) Buffer + View(文档数据与视口状态完全解耦)
04 智能体表示方式 一等公民抽象,内置 5 状态检测机与远程热更新清单 普通进程,由 Orchestrator 挂载在独立的 Git Worktree 中
05 自动化 API Socket / 命名管道 CLI(herdr agent prompt, wait-output) fresh --cmd script run(TypeScript)与 daemon open-file
06 持久化与恢复 进程级生存:客户端脱离、机器重启快照恢复、Session 自动重连 内容级生存:Daemon 守护模式(fresh -a)、Hot Exit 热退出恢复
07 远程拓扑模型 多机聚合(本地 UI 统一渲染跨主机 SSH 终端窗格与剪贴板) 文件级通道(基于 SSH/Python 3 的轻量文件编辑与 devcontainer)
08 扩展运行时 跨语言多语言 CLI 插件(声明式 herdr-plugin.toml) 嵌入式 QuickJS(rquickjs 0.11)+ oxc TypeScript 语法解析
09 沙箱与安全隔离 无沙箱,插件以宿主用户权限直接执行二进制 QuickJS 沙箱隔离,受显式 Workspace Trust 信任机制约束
10 配置与交互体验 声明式 TOML 配置,前缀键模式(Ctrl+B),鼠标原生操作 JSON 配置(config.json),无模态快捷键,图形化配置与面板
11 分发与打包机制 官方一键 Shell/PowerShell 安装脚本,Homebrew,Nix 纯静态 musl 单二进制(带内置自更新),winget,cargo,全发行版
12 治理与商业模式 商业创业公司(600 万美元种子轮,云端多机协作) 独立开源作者(Noam Lewis,GPL-3.0-or-later)
13 工程成熟度信号 版本号 ≥0.7,迭代速度极高,Windows 原生 GA 版本号 0.3.x,编辑器核心极其坚固,插件 API 实现度约 61%

概念词汇映射对照表

把两个项目的抽象名词放在一起对照,你会发现它们的拓扑结构有着高度的一致性:

          HERDR 核心抽象                       FRESH 核心抽象
       ┌────────────────────┐               ┌────────────────────┐
       │     Workspace      │ ◄───────────► │ Workspace / Window │
       ├────────────────────┤               ├────────────────────┤
       │     Tab (View)     │ ◄───────────► │    Split / Tab     │
       ├────────────────────┤               ├────────────────────┤
       │    Pane (PTY)      │ ◄───────────► │   Buffer + View    │
       ├────────────────────┤               ├────────────────────┤
       │  Session (Server)  │ ◄───────────► │   Daemon (Server)  │
       ├────────────────────┤               ├────────────────────┤
       │  Agent (一等公民)  │ ◄───────────► │  (无 / 普通终端进程) │
       └────────────────────┘               └────────────────────┘

只要将 Herdr 的 Pane 理解为 Fresh 的分屏 Split,将 Session 理解为 Fresh 的后台 Daemon,两者的底层骨架基本能够 1:1 互译。两者最本质的分水岭在于:Herdr 拥有专属的 Agent 状态机,能实时感知智能体是否被卡住;而 Fresh 的核心关注点始终在文档内容与编辑效率本身。


3. 实战推演:外部智能体如何通过命名管道遥控 Fresh

在 Herdr 负责统筹多进程的同时,Fresh 则为人类工程师提供了一块高质量的代码视口。然而在人机协作中,最容易打断心流的环节就是“审查代码”:

“对讲机 vs 导播室”的设计困境

  1. 传统子 Shell 的“对讲机”局限:
    常规智能体工具(如 run_command、bash 或 PowerShell 子进程)在一个独立的沙箱进程中运行,所有输出都被重定向到 stdout。智能体对人类屏幕上的光标位置、当前打开的文件完全不可知。它唯一能做的是在自己的终端里打印一段摘要,就像拿着对讲机隔空喊话。
  2. Fresh 守护进程的“导播室与投递口”架构:
    当 Fresh 以后台守护模式运行(fresh -a 或后台 Server 会话)时,它就像一个带投递口的现代化导播室。它不仅实时将无损渲染的 2D 终端缓冲区同步刷新到本地磁盘,还对外暴露了一条 Windows 命名管道(\\.\pipe\fresh-<SESSION>.ctrl),接收结构化的 JSON-RPC 指令。

安全能力凭据与开放通道

Fresh 内部集成了一套强大的 TypeScript 脚本引擎(fresh --cmd script run),拥有 366 个可以直接调用编辑器的内部 API。但出于安全防御,执行自定义 TypeScript 脚本必须提供内部环境变量凭据($FRESH_CMD_TOKEN)。任何未授权的外部调用都会被直接拦截:

Error: no capability token: script evaluation is not authorized

这种设计防止了恶意后台脚本或不受信任的第三方进程篡改用户的编辑器上下文。

但 Fresh 留出了一个无需鉴权的标准化入口:fresh --cmd daemon open-file。该命令完全不需要 Capability Token。任何外部脚本、终端工具或 AI 智能体,都可以安全地调用它来指定文件、行号范围,并在人类用户的编辑器视口中直接渲染内联 Markdown 浮层注释。

在我们的工程实测中,代码审查通常呈现出两种截然不同的形态。我们针对这两种场景分别验证了专门的编排模式:

                         代码搜索获得匹配结果
                                  │
                 命中结果是在 1 个文件还是分散在多个文件?
                                /   \
                   多文件命中  /     \ 单文件内多处命中
                              ▼       ▼
                       [ 场景一 ]   [ 场景二 ]
                    daemon open-file .fresh-tour.json
                     多标签并行推送   代码巡游导引

场景一:多文件批量推送(1 个文件 1 处关键位置,共 3–5 个文件)

业务挑战

用户让智能体排查一个跨模块的系统机制(例如 MemPalace v2 混合检索的设计与接入点)。关键代码分布在配置文件、核心实现模块、Wiki 架构文档和 ADR 决策记录等 4 个不同文件中。

如果智能体一个文件接一个文件地串行打开,或者停下来等待用户确认,整个审查过程会被切得稀碎。

技术实现机制

外部智能体直接构造一条批处理命令,通过 daemon open-file 同时向 Fresh 守护进程传入所有目标文件、行号范围以及 Markdown 语义标注。

工程铁律:外部自动化驱动时,绝不要默认添加 --wait 参数。添加 --wait 会导致外部智能体被挂起,直到用户在编辑器里关掉该标签页才会恢复响应。

fresh.exe --cmd daemon open-file default `
  'AGENTS.md:70-92@"**工作区规则**\nMemPalace v2 混合检索强制调用约定。"' `
  'pyproject.toml:35-45@"**依赖锁定**\nmempalace 的 Git 提交版本精确 Pinning。"' `
  'wiki/mempalace-v2-hybrid-retrieval.md:1-30@"**架构原理**\n三层混合检索概念与 RRF 融合公式。"' `
  'docs/decisions/ADR-009-sqlite-hybrid-retrieval-for-mempalace.md:20-50@"**架构决策**\n从 DuckDB 全量迁移至 SQLite 的决策背景。"'

屏幕呈现效果

  1. 左侧终端里的外部智能体输出简明扼要的搜索结论。
  2. 右侧终端里的 Fresh 界面瞬间并行弹出 4 个新标签页。
  3. 每个标签页自动滚动到对应的代码行区间,高亮选中代码块,并在旁边渲染一个带有 Markdown 格式的注释卡片(@"..."),清晰说明该代码段的职责。
  4. 开发者无需任何查找与手动打开操作,直接在原生编辑器内完成高保真审查。

Fresh 外部 Agent 批量多标签页推送与行级高亮标注


场景二:单文件深度游历(同一长文件内部命中多处关键代码)

业务挑战

用户想要深入研究一份长达 300 多行的终端编排设计规范(docs/terminal_orchestration.md),智能体在该文件中检索出了 3 个需要重点精读的技术章节。

此时会出现机械冲突:编辑器的同一个 Buffer 视口在任意时刻只有一个活动的滚动位置。

  • 如果智能体一次性将这 3 个位置作为参数传给 daemon open-file,视口会直接跳到最后一个命中点,用户会完全错过前两处。
  • 如果智能体用 --wait 一处处等待,智能体的交互循环就会完全卡死。

技术实现机制:Guided Code Tour(.fresh-tour.json)

Fresh 原生支持一套 Code Tour(代码巡游) 引擎。针对单文件多处命中的情况,智能体无需强制切屏,而是在工作区根目录写入一份临时的 .fresh-tour.json 巡游清单,通过 daemon open-file 打开第一步,并引导用户使用巡游侧边栏进行自主导航。

智能体动态生成的巡游清单规范如下:

{
  "title": "Terminal Orchestration Architecture Tour",
  "description": "Guided walkthrough of docs/terminal_orchestration.md",
  "schema_version": "1.0",
  "steps": [
    {
      "step_id": 1,
      "title": "IPC Architecture & Named Pipes",
      "file_path": "docs/terminal_orchestration.md",
      "lines": [7, 26],
      "explanation": "## IPC 架构设计\n定义了 Daemon 生命周期、Windows 命名管道 (\\\\.\\pipe\\fresh-*.ctrl) 以及零延迟磁盘渲染缓冲区机制。",
      "overlay_config": {
        "type": "block",
        "focus_mode": true
      }
    },
    {
      "step_id": 2,
      "title": "Decision Matrix: Direct vs. Fresh",
      "file_path": "docs/terminal_orchestration.md",
      "lines": [28, 54],
      "explanation": "## 决策矩阵\n何时使用直连子进程 `run_command`,何时使用 `fresh` 终端多路复用器。",
      "overlay_config": {
        "type": "block",
        "focus_mode": true
      }
    },
    {
      "step_id": 3,
      "title": "Capability Security Boundary",
      "file_path": "docs/terminal_orchestration.md",
      "lines": [56, 85],
      "explanation": "## 安全能力边界\n解释为何脚本求值强制需要 `$FRESH_CMD_TOKEN`,而 `daemon open-file` 则完全开放给外部 Agent 进行无感知协同。",
      "overlay_config": {
        "type": "block",
        "focus_mode": true
      }
    }
  ]
}

写入清单后,智能体仅触发第一步的视口对焦:

fresh.exe --cmd daemon open-file default 'docs/terminal_orchestration.md:7-26@"**Step 1 of 3: IPC Architecture**\n按 Ctrl+P 输入 \"Tour: Open Workspace Tour...\" 可展开全交互导引轨道。"'

屏幕呈现效果

  1. Fresh 立即将光标定位至第一步代码段,并激活聚焦遮罩(Focus Mode)。
  2. 用户按下 Ctrl+P 打开命令面板,选择 Tour: Open Workspace Tour... 后,Fresh 侧边栏展开一张可点击交互的巡游书签轨。
  3. 工程师可以通过键盘方向键随时前进或回退,在保持上下文连贯的同时,逐个消化复杂设计的每一处细节。

Fresh 单文件交互式代码巡游与 Utility Dock 导览轨道


4. 落地建议:什么时候该选谁?

在深度使用并实测了两种架构之后,工程选型的界限其实非常清晰:

                                  你的核心诉求
                                       │
        ┌──────────────────────────────┴──────────────────────────────┐
        ▼                                                             ▼
[ 多智能体编排与状态守护 ]                                     [ 极致的终端交互编辑体验 ]
- 同时并发运行 5–20 个自主编程智能体                          - 需要 LSP 补全、代码定义跳转、多光标编辑
- 需要一眼洞察“哪个智能体被卡住了”                            - 快速比对 Git Diff、深入 AST 语法树结构
- 需要在机器重启或网络中断后保留运行态                        - 需要外部智能体将代码片段直接投射到屏幕上
- 需要跨多台远程主机/手机端统一聚合接管                       - 追求纯单二进制、零配置、无心智负担开箱即用
        │                                                             │
        ▼                                                             ▼
    选用 HERDR                                                    选用 FRESH

最佳协同组合:分层堆叠架构

我们完全不需要在这两个工具之间做非此即彼的单选题。它们恰好处于现代化开发者工作流的不同层级:

  • 外层底座用 Herdr:让 Herdr 充当你的本地工作站全局进程调度器。它负责管理智能体集群、维护独立的 Git 工作树空间,并在侧边栏统一汇总各个智能体的健康状态。
  • 内层工作台用 Fresh:在需要人类介入代码审查、编辑重构或接收智能体导引代码巡游时,在 Herdr 的一个 Split 分屏中拉起 Fresh。

这种组合方式既保全了多智能体并发执行的宏观可观测性,又保留了终端内极速丝滑的微观代码操作能力。


5. 总结与思考

将终端从一个纯粹的字符 I/O 窗口演进为一个结构化的应用级运行时,正在从底层重塑人机协同软件工程的交互形态。

当智能体只能隔着 stdout 与我们交流时,每一次代码审查都是一次充满心智摩擦的跨应用复制粘贴。而一旦终端本身具备了守护进程与 IPC 控制总线,智能体便真正具备了“指着屏幕上的代码与你讨论”的能力:批量推送视口、高亮关键行号、组织交互式代码巡游。

无论是聚焦于进程生命周期管理的 Herdr,还是深耕文本编辑与界面交互的 Fresh,它们共同验证了一个不可逆转的技术趋势:终端不再只是运行 Shell 的地方,它正在成为下一代 AI 增强型开发工具的核心基础设施。