让 50 个终端智能体为你并行打工:解构 diri 的 Rust+GPUI 极速中枢、Holder 进程韧性与原生 MCP 编排体系
随着前沿大语言模型代码生成与逻辑推理能力的跨越式提升,开发者的核心工程瓶颈正在发生历史性的迁移:制约生产力的不再是单个模型能写出多复杂的函数,而是作为人类工程师,你能在同一时间掌控多少个正在运行的智能体。当你在终端里同时开启 5 个、10 个乃至 50 个 Claude Code、Codex 或 Antigravity 实例时,杂乱无章的终端窗口、脆弱的进程生命周期、未隔离的代码工作区读写冲突,会瞬间摧毁人类的认知带宽。
开源项目 diri(前身 Dirijor)正是在这一痛点下应运而生。它完全采用 Rust 编写,基于 Zed 团队的高性能 GPU 加速 UI 框架 GPUI 构建,不仅提供了 120 FPS 丝滑响应的现代化桌面视窗,更通过独创的 Holder 进程隔离架构、基于终端屏幕流的状态感知引擎、深度集成的原生 MCP(Model Context Protocol)协同蜂群,以及零依赖的 SSH 远端穿透能力,为开发者打造了一套稳固、可扩展的“终端智能体并发指挥中心”。
一、从“单兵提示”到“智能体蜂群”:并发编码的系统性断层
在过去的几年中,开发者与 AI 的交互经历了三次范式演进:
- 聊天补全时代(2022~2023):在 IDE 侧边栏聊天框中粘贴代码片断,获取解释与补全;
- 单终端自主交互时代(2024~2025):终端智能体(如 Claude Code、Aider、Codex、Antigravity CLI)开始直接接管终端环境,自主执行 Bash 脚本、编辑文件并运行测试;
- 并发蜂群与管线编排时代(2026~):单一任务被拆解为多个子任务,十数个异构 Agent 在独立隔离分支上并行探索、编码、审查与验证。
然而,一旦开发者尝试在传统终端模拟器(如 Terminal.app、iTerm2 或 VS Code 集成终端)中并行运转 5 个以上的智能体,就会遭遇以下三大系统性断层:
- 认知过载与状态黑盒:你无法一眼看出哪 3 个智能体正在跑编译、哪 2 个智能体因需要
sudo或文件修改确认而阻塞等待、哪 1 个智能体已经悄悄抛错退出。开发者不得不频繁在数十个标签页之间机械轮询,极度内耗。 - 工作区写入踩踏(File Collision):多个智能体在同一个 Git 根目录下同时修改代码,会造成脏工作树冲突、测试产物覆盖与不可逆的分支错乱。
- 脆弱的进程耦合:传统终端模拟器中,子进程与窗口/Daemon 深度绑定。客户端意外闪退、应用升级或 Mac 临时休眠,往往导致跑了数小时的长任务瞬间被
SIGHUP团灭。
diri 的设计哲学正是为了彻底弥合这一断层:将 AI 编码的关注点从底层终端会话维护,抽象提升至任务管线与结果审查的高维视角。
flowchart TD
subgraph ClientLayer ["用户交互层 (Diri Desktop - GPUI)"]
UI["GPUI 120 FPS 响应式桌面端"]
Overview["Safari 风格会话全景网格 (⇧⌘O)"]
NotesUI["Diri Notes 需求任务看板"]
end
subgraph CoreEngine ["核心引擎层 (dirijord-rs)"]
Daemon["本地控制守护进程 (Unix Socket)"]
StateEngine["会话状态机与 Event Cursor"]
Detector["屏幕流正则/启发式状态分类器"]
ActivityLog["审计日志与状态持久化 (JSONL)"]
end
subgraph MCPOrchestration ["蜂群协同层 (dirijor-mcp)"]
MCPBridge["内置 MCP Bridge 服务端"]
TaskQueue["任务分发与去重队列 (request_id)"]
HierarchyACL["层级鉴权边界 (Root / Child ACL)"]
end
subgraph ExecutionLayer ["隔离执行与韧性沙箱"]
Capsule["Recovery Capsule (会话恢复胶囊)"]
Holder["diri-holder 独立进程 (PTY 守护)"]
Worktrees["Git Worktree 隔离目录树"]
RemoteHolder["diri-remote (零依赖 SSH 远端 Holder)"]
end
UI --> Daemon
Overview --> Daemon
NotesUI --> Daemon
Daemon --> StateEngine
StateEngine --> Detector
StateEngine --> ActivityLog
Daemon --> MCPBridge
MCPBridge --> TaskQueue
MCPBridge --> HierarchyACL
Daemon --> Capsule
Capsule --> Holder
Holder --> Worktrees
Holder -.-> RemoteHolder
二、架构基石:基于 GPUI 的原生极速桌面中枢
不同于主流使用 Electron 或 Web 技术栈打包的沉重工具,diri 的前端完全基于 Zed 团队的开源 Rust GUI 框架 GPUI 构建。这为其带来了几项至关重要的竞争优势:
1. 极致轻量与瞬时冷启动
在加载几十个并发终端会话、数十万行滚屏日志的严苛场景下,Electron 架构往往伴随着巨大的内存消耗与垃圾回收卡顿。而 diri 编译为单一纯粹的原生 Mach-O 二进制文件,内存占用极低,冷启动仅需数十毫秒,窗口拖拽与缩放全程跑满 120Hz ProMotion 刷新率。
2. 原生视觉质感与沉浸感设计
diri 充分借鉴了现代 macOS 的工业设计语言:
- 微光磨砂玻璃亚克力质感(Frosted Acrylic Window Backing);
- 动态平滑圆角(Continuous Squircles),使弹出卡片与系统级视窗浑然一体;
- 微秒级悬浮过渡:光标扫过侧边栏或会话列表时采用平滑褪色动画,杜绝界面视觉频闪。
3. 全局会话全景网格(Overview Grid)
在最新发布的版本中,按下快捷键 ⇧⌘O(Shift-Command-O),diri 会以类似 Safari 标签页缩略视图的方式,将所有正在运行的智能体以等比微缩卡片的形式整齐平铺。更惊艳的是,支持直接在触控板上进行双指捏合(Pinch-to-zoom),无缝在“宏观蜂群全景”与“单智能体全屏交互”之间自由穿梭。
三、Holder 进程模型:让 Agent 具备跨重启自愈的“不死之躯”
在长时间运行的 AI 自主编码任务中,最令人沮丧的莫过于:后台模型刚跑了 20 分钟并快要收尾,桌面端应用因为系统更新重启、或者守护进程偶然崩溃,导致整个终端链路直接断开,前功尽弃。
diri 针对这一工程死穴,设计了一套被称为 Holder 的进程解耦与领养架构。
sequenceDiagram
autonumber
actor Dev as 开发者
participant UI as Diri Desktop (GPUI)
participant Daemon as dirijord-rs (Daemon)
participant Capsule as Recovery Capsule (Disk)
participant Holder as diri-holder (Independent Process)
participant Agent as Claude / Codex CLI
Dev->>UI: 触发启动新智能体任务
UI->>Daemon: 创建会话请求 (Unix Socket)
Daemon->>Capsule: 写入会话身份元数据胶囊 (Pre-launch)
Daemon->>Holder: Fork 启动独立的 diri-holder 进程
Holder->>Agent: 分配专属 PTY 并启动 Agent 子进程
Holder-->>Daemon: 确认 PTY 挂载就绪
Note over Daemon: 发生突发状况:Daemon 崩溃或客户端热升级重启!
Daemon-xDaemon: 异常退出 (Agent 依然在 Holder 中正常执行)
Dev->>UI: 重新打开 Diri / Daemon 自动拉起
Daemon->>Capsule: 遍历并读取磁盘上的 Recovery Capsule
Daemon->>Holder: 探测存活的 diri-holder 进程 (Socket Handshake)
Holder-->>Daemon: 握手成功,回放最后生命周期事件流
Daemon->>UI: 无缝重新挂载终端输出,会话即刻复活!
1. PTY 所有权与 Daemon 物理剥离
在 diri 内部,智能体子进程(如 claude、codex、agy)以及对应的 PTY(伪终端)主设备并不属于桌面 GUI,也不属于后台守护进程 dirijord-rs,而是直接由轻量级独立常驻进程 diri-holder 独占拥有。
2. 崩溃恢复胶囊(Recovery Capsule)机制
传统的进程管理依赖中心化的注册表(Registry)。如果在会话创建的瞬间中心数据库写入失败或 Daemon 崩溃,会话就会沦为不可控的孤儿进程。
diri 引入了细粒度的 Per-session Recovery Capsule(会话恢复胶囊):
- 在
diri-holder启动之前,Daemon 会在本地专属存储路径预先落盘一个极简的胶囊文件,记录其会话 UUID、工作目录、Provider 存储路径与启动标识; - 钩子通知与终端状态会实时更新一份最小化的独立状态种子;
- 当新 Daemon 重启拉起时,即便全局数据库在崩溃时损坏,它也能直接扫描磁盘上的胶囊,精准探测存活的 Holder 进程,校验 PID 与 Session ID,完成无缝领养(Adopt);
- 重新连接后,终端缓冲区无需清屏涂抹,立即恢复实时同步,真正实现了 Agent 的“跨进程重启自愈”。
四、非侵入式终端状态检测:精准把脉 Agent 的实时诉求
如何让侧边栏清晰标注“哪些 Agent 正在思考”、“哪些需要你确认授权”、“哪些已经完成”?许多工具试图通过入侵修改 Agent 源码或强依赖外部 Webhook,这极大地限制了通用性。
diri 采用了高度工程化的声明式终端流状态机(Agent Manifests),当前已原生适配 22+ 款主流编码智能体(包括 Claude Code、Codex、Antigravity、Cursor、Gemini、Cline、Devin、Aider 等)。
1. 结构化状态检测流
每个智能体在 manifests/<agent>.json 中定义其专属匹配规则。Diri 运行时将终端屏幕切分为多个观测区域(Region):
bottom_non_empty_lines:底部可见非空行(通常为输入框、Loading 状态条);prompt_box_body:底部方框绘图符(Box-drawing characters)内部区域;whole_recent:最近 60 行终端可见文本;osc_title/osc_progress:终端 OSC 控制序列转义输出。
状态机将这些区域的文本通过精确优先级进行谓词判定:
working(工作中):检测到 Unicode 旋转盲文字符(如\u2800-\u28FF)以及进行中的动名词(*ing),或者连续的任务推进状态;blockedPermission(权限阻塞):检测到类似"requesting permission for:"、"do you want to proceed?"等交互式确认提示。此时 Diri 不仅将侧边栏高亮为琥珀色警告,还会自动抓取其提示框内的选项文本,将其直接作为可点击卡片呈现在主界面通知中;blockedQuestion(疑问阻塞):智能体停下向人类工程师请教架构决策;idle(就绪/闲置):智能体完成了本轮所有任务,等待新输入。
2. Antigravity 状态检测实录
以 Google Antigravity CLI 为例,diri 的声明式规则片段如下所示:
{
"id": "antigravity",
"statusModel": "full",
"agent": {
"displayName": "Antigravity",
"binary": "agy",
"resume": { "style": "flag", "token": "--continue" },
"statusAuthority": "screen"
},
"rules": [
{
"id": "blocked-permission-request",
"state": "blockedPermission",
"priority": 300,
"region": "whole_recent",
"when": {
"all": [
{ "contains": "requesting permission for:" },
{ "any": [
{ "contains": "do you want to proceed?" },
{ "all": [
{ "contains": "tab amend" },
{ "contains": "edit command" }
]
}
]
}
]
},
"capture": {
"region": "bottom_non_empty_lines",
"regionLines": 12,
"maxChars": 400
}
},
{
"id": "working-spinner-verb",
"state": "working",
"priority": 100,
"region": "whole_recent",
"when": {
"lineRegex": "^\\s*[\\u2800-\\u28FF]+\\s+[A-Za-z]+\\w*ing\\b"
}
}
]
}
通过这套机制,开发者无需给几十个 Agent 注入繁琐的代码补丁,diri 仅凭纯粹的终端屏幕语义流,就能以极高精度捕获任何一个 Agent 的阻塞状态。
五、内置原生 MCP 编排服务:让 Agent 能够“孕育”并调度 Agent
如果说单智能体的并发只是提高了人效,那么智能体之间的相互派工与自主协作,则是质的跃迁。diri 内置了名为 dirijor-mcp 的高性能 Model Context Protocol 服务端。
这意味着,无需依赖第三方中转,任何接入 Diri 的智能体都可以通过标准的 MCP 工具集,将自己晋升为 “主管智能体”(Lead/Root Agent),在后台自主孵化子智能体完成特定模块,并在完成后归集代码。
flowchart TD
subgraph RootAgent ["根智能体 (Root Agent)"]
LeadPrompt["需求分析: 重构用户认证模块"]
MCPCall1["MCP: create_worktree(feat/auth-jwt)"]
MCPCall2["MCP: spawn_agent(agent='codex', role='jwt')"]
MCPCall3["MCP: submit_task(task='实现 JWT 校验逻辑')"]
MCPCall4["MCP: wait_for_task(task_id)"]
end
subgraph ChildAgent ["子智能体 (Worker Agent)"]
ReceiveTask["通过 MCP 接收结构化 Task"]
Acknowledge["调用 report_task(status='acknowledged')"]
ExecuteCode["在独立 Worktree 内编写代码并运行单元测试"]
ReportDone["调用 report_task(status='completed', evidence='All tests passed')"]
end
LeadPrompt --> MCPCall1
MCPCall1 --> MCPCall2
MCPCall2 --> MCPCall3
MCPCall3 --> ReceiveTask
ReceiveTask --> Acknowledge
Acknowledge --> ExecuteCode
ExecuteCode --> ReportDone
ReportDone --> MCPCall4
MCPCall4 --> Integrate["调用 integrate() 合并代码并提交 PR"]
1. 核心 MCP 工具矩阵
dirijor-mcp 暴露了极其丰富且语义严谨的工具原语:
- 任务生命周期与可靠递送:
submit_task:向指定会话指派一个携带持久化task_id的任务,支持幂等request_id去重;wait_for_task/wait_any:阻塞等待单个或一组任务的显式完成/失败状态;report_task:被指派的子 Agent 显式上报acknowledged、blocked、completed或failed,并附带执行物证(Evidence);
- 智能体生命周期:
spawn_agent/spawn_agents:动态拉起一个或多个全新的智能体终端会话;fork_agent:基于当前上下文分叉出会话;manage_agent/release_agent:归档或安全释放子会话;
- 代码集成与工作区管理:
create_worktree/list_worktrees/remove_worktree:动态划分与销毁 Git Worktree;get_diff/integrate:提取子 Agent 修改的 diff 片段并执行集成;
- 计划与笔记协作(Notes System):
create_note/read_note/start_from_note:让智能体直接阅读用户在 Diri Notes 中起草的 PRD,并在执行过程中反向回写待办项勾选状态。
2. 严密的层级访问控制(Hierarchy ACL)
智能体自主生成智能体,极易引发失控死循环或权限蔓延。dirijor-mcp 构建了严格的鉴权沙箱:
- Root Agent 鉴权:只有被标记为 Root 的顶级 Agent,才具备在其项目内部创建新会话、划拨 Worktree 的完整权限;
- Delegated Agent(子代理)隔离:子代理只能向其父代理(Parent)汇报进度,或者与其直系子代(Direct Children)通信,严禁越权向旁路兄弟会话发送指令;
- 终止保护:子代理绝不能调用
release_agent释放父会话或非自己创建的会话,且非持久化未托管的外部 MCP 调用直接 Fail-closed 拒绝服务。
六、Git Worktree 自动化:彻底根绝多智能体写冲突
当 5 个智能体在同一个项目里各自写代码时,最致命的灾难莫过于 Git 冲突。diri 将 Git Worktree(工作区多分支挂载) 变成了第一公民。
flowchart LR
Repo[("中央 Git 仓库 (.git)")]
subgraph WorktreeA ["Worktree 1 (feat/auth)"]
AgentA["Claude Code (负责鉴权)"]
FilesA["独立文件空间 /tmp/.../wt-auth"]
end
subgraph WorktreeB ["Worktree 2 (feat/payment)"]
AgentB["Codex (负责支付接入)"]
FilesB["独立文件空间 /tmp/.../wt-payment"]
end
subgraph WorktreeC ["Worktree 3 (fix/perf)"]
AgentC["Antigravity (负责性能基准测试)"]
FilesC["独立文件空间 /tmp/.../wt-perf"]
end
Repo === WorktreeA
Repo === WorktreeB
Repo === WorktreeC
- 秒级分配独立目录:当为新任务派生 Agent 时,
diri自动通过git worktree add检出一个全新分支到独立的磁盘目录; - 互不干扰的编译与测试:每个 Agent 拥有各自独立的构建缓存、依赖锁与未提交文件,彻底告别编译产物覆盖与文件读写竞争;
- 直观的代码审查视窗:在
diri的 UI 侧边栏中,点击任意一个正在工作的 Agent,不仅能看到它的终端字符流,还能直接在其右侧呼出 “Review” 面板,实时查阅该 Worktree 相较于主分支的增量 diff,一键完成 Staging、Commit、Cherry-pick 或推送到远端发起 PR。
七、零依赖远端直连:diri-remote 如何告别 tmux 与云中继
许多团队的深度任务(如大模型微调、大规模内核编译、复杂仿真环境)必须跑在远程开发机(如 Linux GPU 服务器、AWS EC2 或公司内部的 Forge 机器)上。以往的做法通常是:
- 本地打开终端,SSH 登录到远端;
- 手动启动一个
tmux或screen会话防掉线; - 在 tmux 内部跑 Agent;
- 遇到断网或重连,再次手动
tmux attach。
这种方式的痛点在于:界面的快捷键与 tmux 抢键、状态无法被本地感知、排版乱码,更无法与本地的工作区协同。
diri 在其架构中彻底废黜了 tmux 依赖,重构为 Bootstrapped Remote PTY Holder(diri-remote):
本地 Diri Desktop
└── 本地 Rust Engine (dirijord-rs)
└── ssh -T 二进制信道 (无交互式 PTY)
└── 自动注入极简短生命周期 Bridge
└── 启动远端独立编译的 diri-remote (Holder)
└── 远端 Agent (Claude / Codex / Shell)
1. 纯二进制隧道与无状态依赖
- 远程服务器上无需预装 tmux、screen、zellij、Node.js、Python、socat 甚至 curl/wget;
- 远程执行不需要任何
sudo提权,也不写入全局系统级守护进程配置; - Diri 通过标准的
ssh -T打开一个纯净的二进制流,将轻量级静态编译的diri-remote二进制引导到远端用户目录; diri-remote直接接管远端 Linux 的 PTY,即使网络波动导致 SSH 断开,远端的 Agent 依然在静默运行;本地网络恢复后,Diri 重新握手即可无缝重连回放。
八、全天候调度与防休眠唤醒:全自主执行的最后一公里
在日常开发中,许多批处理任务(如每日凌晨拉取最新 Issue 并分类、周末定期跑端到端回归测试)需要定时触发。diri 引入了与 macOS 电源管理深度绑定的调度器(Scheduler):
- 会话持久化排程:直接通过自然语言或配置告诉 Agent:“每个工作日上午 9 点,检索仓库的新 Issue 并生成总结 Note”;
- 智能防睡与 RTC 硬件唤醒:在设定的执行时刻到来时,
diri可以借助 macOS 的电源断言(Power Assertions)在休眠状态下定时唤醒 Mac,让 Agent 在后台静默运行;任务完成后,自动释放电源锁,使电脑继续安眠; - 错过执行(Missed Run)平滑回补:若因合盖断电导致预定任务错过,当下一次开机登录时,
diri会精准识别并单次安全回补执行,绝不会触发无限循环雪崩。
九、快速上手实战:开启你的智能体指挥中心
1. 安装与初始化
diri 目前对 macOS 提供了开箱即用的 Universal 签名构建(支持 Apple Silicon 与 Intel):
# 通过 Homebrew Cask 一键安装
brew install --cask cristicretu/diri/diri
注:Linux 用户(Ubuntu 22.04 / 24.04)可通过官方仓库提供的 Debian / AppImage 安装包体验 Beta 版本。
2. 快捷键与核心操作指令
安装完成后启动 Diri,核心键位极大贴合了终端与 macOS 的原生直觉:
| 快捷键 | 功能描述 |
|---|---|
⌘N |
在当前项目新建一个终端 Agent 会话 |
⇧⌘N |
新建会话并自动分配独立的 Git Worktree 隔离工作区 |
⇧⌘O |
开启全景缩略网格(Overview Pinch Grid),双指可直接捏合缩放 |
⌘K |
呼出全局命令面板(Command Palette),快速搜索会话、执行动作 |
⌥1 ~ ⌥9 |
快速按序切换对应的并发智能体终端卡片 |
⌘D |
打开当前会话的 Git 变更审查面板(Review Diffs) |
十、总结:迎接“一人调度一支 AI 舰队”的新时代
从单文本补全,到终端多步交互,再到 diri 所展现的多智能体并发蜂群,AI 辅助软件开发的范式正在以不可逆的速度重构。
diri 的工程价值在于,它没有停留在“做个酷炫的终端皮肤”这一表面层次,而是深入到底层操作系统原语,以坚若磐石的工程思维解决了一系列核心难题:
- 用 GPUI 与纯 Rust 换取无与伦比的 120 FPS 响应与轻量足迹;
- 用 Holder 进程解耦与 Recovery Capsule 解决了长期困扰开发者的断线与崩溃死穴;
- 用 屏幕语义解析与声明式规则 优雅兼容了 22+ 款主流闭源与开源 Agent;
- 用 内置 MCP 与 Git Worktree 将多 Agent 协作从单点写冲突,转变为有条不紊的并行管线;
- 用
diri-remote实现了跨本地与远端物理算力的无感调度。
对于追求极限生产力、渴望在日常工作中掌控数十个 Agent 并发打工的极客工程师而言,diri 不仅是一个趁手的开发者工具,更是一扇窥见未来软件工程运作形态的重要窗口。
原文链接与参考资料
- diri 官方代码仓库:GitHub - cristicretu/diri
- diri 官方网站与文档:https://diri.sh
- diri 文档中心与 MCP 指南:diri.sh/docs/mcp
- GPUI 高性能 UI 引擎:GitHub - zed-industries/zed
- 项目作者:Cristi Cretu (@cristicretu)
-
- 一、从“单兵提示”到“智能体蜂群”:并发编码的系统性断层
- 二、架构基石:基于 GPUI 的原生极速桌面中枢
- 三、Holder 进程模型:让 Agent 具备跨重启自愈的“不死之躯”
- 四、非侵入式终端状态检测:精准把脉 Agent 的实时诉求
- 五、内置原生 MCP 编排服务:让 Agent 能够“孕育”并调度 Agent
- 六、Git Worktree 自动化:彻底根绝多智能体写冲突
- 七、零依赖远端直连:
diri-remote如何告别 tmux 与云中继 - 八、全天候调度与防休眠唤醒:全自主执行的最后一公里
- 九、快速上手实战:开启你的智能体指挥中心
- 十、总结:迎接“一人调度一支 AI 舰队”的新时代
- 原文链接与参考资料