munder-difflin
读书和学习是在别人思想和知识的帮助下,建立起自己的思想和知识。—— 普希金
Munder Difflin:把终端里的 AI 代理,变成一间会协作的办公室
如果每一个终端会话都不再只是孤零零的一行命令,而是一位坐在工位上的 AI 同事,会怎样?
Munder Difflin 给出的答案,是把这些终端代理放进一间可以看见、可以指挥、可以协作的办公室里。
它是一套本地多代理运行框架,也是一款桌面应用。它将用户已经在使用的终端 AI 编程命令行工具包装为真正运行的代理,为每个代理提供长期记忆、邮箱、协作机制与可视化形象,再由一个名为 Michael 的用户分身统筹整间办公室的任务流转。
项目地址:https://github.com/chaitanyagiri/munder-difflin
Munder Difflin 的目标并不是创造一种脱离真实工作环境的虚拟代理,而是让现有的终端代理命令行工具继续以原本的方式运行,同时获得团队协作能力。Claude Code、Antigravity、OpenAI Codex、xAI Grok、Kimi Code、Qwen、OpenCode、Crush、pi.dev、GitHub Copilot CLI,以及自定义命令,都可以成为这间办公室里的成员。
它们使用用户已有的订阅、已有的额度、已有的本地环境,在自己的机器上持续工作。人不在终端前时,代理仍然可以继续处理任务;人回到桌面前时,则可以看见它们正在做什么、彼此传递了什么、哪些事项需要自己决定。
一间属于代理的办公室
Munder Difflin 把多代理协作做成了可视化的办公现场。
每个终端会话都是一个真实代理进程。它们不是界面层模拟出的聊天窗口,而是由 node-pty 启动的伪终端进程,并通过 xterm.js 呈现终端内容。代理输出什么,用户就能在界面中看到什么;用户也可以随时向任意会话输入内容,继续与某个代理直接沟通。
与此同时,每个代理也会成为办公室地板上的一个像素角色。
它们会出现在 Pixi.js 渲染的二维办公室中,前往不同工位,随着工作状态变化而行动。当代理之间互相发送消息时,信封会从一张桌子飞向另一张桌子。终端中的协作关系,不再隐藏在大量窗口、日志和文件之间,而是被映射为一张可以观看的办公室现场图。
这里的办公室并不是单纯为了装饰。
它将代理的真实终端状态、消息流转与工作位置结合起来,让用户不必只依靠命令行输出理解系统正在发生什么。谁正在工作,谁在等待,谁收到了任务,谁正在处理信息,都会以更直观的方式出现在视野中。
Michael:站在办公室中央的用户分身
在 Munder Difflin 的结构中,Michael 是关键角色。
Michael 被描述为用户的分身,也是整层办公室的 GOD agent。用户不需要逐一为每个代理安排每一件事情,而是可以先与 Michael 对话,再由 Michael 负责理解请求、分配工作、路由消息、处理常规事项,并在真正需要人类判断时发起升级。
整个协作关系可以概括为:
1 | 用户 |
Michael 是办公室的负责人,但用户仍然是 Michael 的负责人。
这一层关系非常重要。Munder Difflin 不是让代理团队脱离人类监督自行扩张,而是让代理承担协调工作,同时为用户保留最终控制权。涉及花费、破坏性操作或工作范围变化的事项,会被升级到审批队列,由用户作出决定。
代理可以自主推进常规事务,用户则在真正需要判断时介入。
每个终端,都是一个真实代理
Munder Difflin 的基础原则很明确:每一个终端都是一个真实代理。
每个代理都以真实进程运行,拥有自己的工作目录、身份与供应商相关生命周期。它可以是 claude、agy、codex、grok、kimi、qwen、opencode、crush、pi、copilot,也可以是用户定义的自定义命令。
这意味着,Munder Difflin 并不要求用户放弃原有的命令行代理习惯。相反,它围绕这些已经存在的工具建立了一层多代理协作环境。
代理仍然在终端里做事,仍然输出真实日志,仍然运行真实命令,仍然遵循各自工具的工作方式。不同的是,它们从单独存在的终端窗口,变成能够记忆、收信、发信、被调度和被观察的团队成员。
对于并行工作场景,系统还提供每个代理独立 Git worktree 的可选隔离方式。多个代理可以在各自工作区中推进工作,减少并行操作时在分支上的相互碰撞。
蜂巢不是聊天群,而是一套本地协作层
Munder Difflin 用 hive 来描述代理之间共享的协作空间。
这个蜂巢建立在本地 Git 仓库中的普通文件之上。每个代理拥有自己的记忆、收件箱与发件箱,代理把消息写入自己的 outbox/,运行框架中的路由器再将消息投递到接收者的 inbox/。
整个过程遵循单提交者设计。代理不会直接操作 Git,由框架统一处理提交,从而避免多个代理同时操作导致的 index.lock 问题。
蜂巢中包括:
- 每个代理独立的记忆
- 基于原子文件的邮箱
- 共享黑板
- 追加式事件日志
- 单提交者 Git 协作机制
这让代理之间的协作不依赖某个模糊的内部状态,而是拥有可以保存、传递和追踪的本地结构。
某个代理完成研究后,可以把结论写入自己的记忆,也可以把任务结果投递给另一个代理。一个代理发现自己无法处理的问题,可以向 Michael 上报。Michael 可以重新分配、协调或升级请求。所有这些动作都会落在一套统一的协作环境中。
让代理记得自己学过什么
多代理系统最容易遇到的问题之一,是上下文容易消失。
一次会话结束后,之前分析过什么、做过什么、踩过什么坑、形成了什么结论,都可能需要重新解释。Munder Difflin 为此提供了以 Markdown 为中心的记忆层,并加入语义召回索引。
代理可以跨会话保存记忆,并以毫秒级速度回忆已经学到的信息。
这套记忆机制不是简单地无限堆积内容。系统还包含记忆压缩能力,用于避免记忆持续膨胀。代理积累的信息会被挖掘到共享的记忆空间中,用户也可以从界面中搜索这些记忆。
项目还提到 Enterprise Knowledge Graph,用于让用户自己的文档与政策可被任意代理查询。
记忆在这里不只是“保存聊天记录”。
它更接近一间办公室里的经验沉淀:某位代理已经研究过的内容,不必永远困在一次终端输出中;团队已经形成的共识,不必每次都从头建立;用户自己的资料与规则,也可以成为代理随时能够调用的知识基础。
即使不启用语义记忆索引,Markdown 记忆仍然可以工作。语义索引则为跨会话的快速召回提供进一步能力。
消息会飞,任务会流动
Munder Difflin 让代理拥有邮箱,也让消息具有可见的流动轨迹。
代理之间不是通过用户不断复制粘贴来协作,而是通过蜂巢中的消息系统传递工作内容。路由器负责把发件箱中的消息送往接收者的收件箱,代理会读取自己的记忆并清空待处理邮件。
当用户从界面上看见信封在工位之间飞行时,背后对应的是实际的消息传递过程。
这使多代理协作拥有一种更接近真实团队的结构:
- 有人负责研究
- 有人负责执行
- 有人负责审查
- 有人负责处理特定工作流
- 有人负责协调、裁决与升级
任务不再只能由一个大模型会话从头做到尾。它们可以被拆分、分发、回收、继续推进,也可以在遇到关键节点时重新回到人类手中。
看得见的控制,比黑箱式自动化更重要
Munder Difflin 不只是一个启动多个代理的工具,它还提供了对代理运行状态的观察和控制能力。
用户可以观看实时终端流,也可以进入某个会话输入内容、浏览文件、查看 Git 历史。系统提供 Command Center,用于集中查看任务、消息、记忆、活动、触发器与工作手册等内容。
其中包括:
- 带依赖关系的看板任务
- 定时任务与心跳机制
- 实时代理队列监控
- 记忆搜索
- 活动日志
- CI 观察器
- 消息对话查看
- 繁忙代理的消息队列
- 内置文件树与编辑器
- Git 历史、差异与分支比较
- 受保护的 Git 切换流程
内置 IDE 使用 Monaco,提供文件树、编辑器标签页与保存能力,同时配合变更、历史和比较相关视图。文件系统与 Git 访问由框架进行中介处理。
这种设计让用户不必在代理系统之外另开一套工具来观察工作结果。终端、文件、任务、消息、记忆与版本历史,可以在同一个桌面应用中被持续查看。
当代理失控时,系统不会只会继续运行
多代理系统如果缺少约束,很容易出现重复循环、错误风暴或预算失控。
Munder Difflin 为此提供了 circuit breaker。它采用逐步升级的控制路径:
1 | 引导 |
当代理进入循环、错误不断扩散或超出预算时,系统可以先尝试引导,再增加约束,最后停止运行。
同时,系统支持每个代理的 token 预算、真实成本统计、持久化账本、OpenTelemetry spans 与工具调用瀑布视图。项目会从会话记录中读取真实 token 与成本信息,并提供与模型相关的成本归因。
这让“代理正在工作”不只是一个模糊状态。
用户能够进一步知道代理用了多少预算、执行了哪些工具、运行情况是否健康、哪里开始变得异常。对于需要同时运行多个代理的人来说,这类可观察性并不是附属功能,而是保持系统可控的重要部分。
人类审批,不是障碍,而是边界
Munder Difflin 提供人类关卡。
涉及花费、范围变化、破坏性操作等情况时,代理不会直接越过用户执行,而是将事项升级到审批队列。用户可以在代理运行中途进行引导,也可以让代理优雅停止。
这使它形成了一种相对清晰的协作分工。
代理负责大量重复、分散、可并行的工作。Michael 负责组织和协调。用户负责那些真正需要价值判断、风险判断与最终决定的节点。
自动化可以把人从重复输入中释放出来,但不应该让人失去对关键动作的控制。Munder Difflin 将这个边界放进了系统机制,而不是只依赖使用者在每次运行前自行记住。
从 Slack 和 Webhook 接收工作
Munder Difflin 还支持 Slack 与 Webhook。
用户可以向频道发送消息,也可以向 Webhook 发起请求。Michael 能够根据这些输入启动一个临时代理,处理工作后在对应线程中回复,并在完成后结束该代理。
这让代理办公室不必只等待桌面应用中的人工输入。
外部消息可以进入 Michael 的队列,代理可以被临时调度处理任务,再把结果带回原始沟通位置。工作入口从终端与桌面延伸到消息渠道,但仍由同一套协调系统接管。
可以分享的招聘角色
项目中还有 Agent Gallery。
它是一套可共享的代理角色模板画廊。用户可以浏览某个角色,下载对应清单,并在应用中导入。角色的目标、模型、参数与 token 预算会被预填充,但导入不会自动启动代理。
人类仍然需要检查内容,并主动点击启动。
这种设计让角色分享拥有清晰边界。模板可以帮助用户更快构建某类代理,但不会绕过审查直接执行命令。角色清单也被限制为结构化信息,不能直接指定可执行文件,也不能携带 Shell 语法。
代理角色可以流动,控制权仍然留在用户手中。
自带密钥,也支持本地模型
Munder Difflin 支持自带密钥,也支持本地 LLM。
不同供应商的密钥可以保存在只写的秘密代理中。对于本地模型环境,项目支持 Ollama、LM Studio 与 vLLM 的基础地址配置。
这意味着,代理办公室可以接入不同模型来源,也可以根据用户自己的环境选择模型与服务方式。
项目同时提供前置条件页面,用于展示相关工具是否已经安装,包括 uv、Git、Node、记忆工具与各类代理命令行工具。页面会说明这些工具的作用,并提供让 Michael 协助安装缺失项的入口。
如果某些支持的代理命令行工具尚未安装,框架可以在终端中运行安装程序,并继续进入新安装的可执行文件。
一个像素风的代理世界
Munder Difflin 的设计语言明确借鉴了 Animal Crossing、Earthbound 与 SNES 菜单界面的气质。
它使用像素对齐、厚重、友好的视觉风格,并以深酒红色与金色作为品牌层的主要配色。办公室中的十五个角色取材自《The Office》中的角色形象,并通过头发、肤色和服装组合加以区分。
这一视觉选择让系统没有走向冷峻的监控面板风格。
它更像一个活着的办公室。代理不是一排无差别的状态卡片,而是有位置、有行动、有消息往来的角色。对一个需要长时间观察和调度的多代理环境来说,这种亲和感会让复杂结构变得更容易接近。
两条数据平面,一套渲染界面
从架构上看,Munder Difflin 让两条数据平面共同服务于一个 Electron 渲染界面。
1 | Electron 渲染界面 |
终端平面由主进程中的 PtyManager 管理,负责启动代理、写入输入、调整终端大小、结束进程并传输输出。
蜂巢与事件平面则负责本地多代理协作。hive.ts 承担磁盘上的多代理层,hooks.ts 提供钩子服务,memory.ts 封装语义记忆工具。路由器负责投递消息、处理代理发件箱,Michael 负责协调与裁决,而空闲状态与收件箱唤醒机制则让代理持续处理收到的信息。
前端通过受类型约束的 window.cth 桥接层访问这些能力。渲染器不直接接触底层特权能力,而是通过预加载层获取终端、文件与 Git 的受控接口。
从开发环境启动办公室
Munder Difflin 支持 macOS、Windows 与 Linux。
运行前需要 Node.js 18 或更高版本、npm,以及用于 node-pty 原生扩展的 C 或 C++ 工具链。在 macOS 上,可以安装 Xcode Command Line Tools:
1 | xcode-select --install |
还需要至少一个已加入 PATH 的受支持代理命令行工具。
从源码启动开发环境:
1 | git clone https://github.com/chaitanyagiri/munder-difflin.git |
安装过程中的 postinstall 会针对 Electron 的 ABI 重建 node-pty。应用首次启动时会进入引导流程,随后进入办公室楼层。用户可以通过 Add agent 启动第一个代理,而 Michael 会自动就座于自己的办公室。
还可以使用以下命令构建、预览或检查类型:
1 | npm run build |
如果 Electron 升级后 node-pty 无法加载,重新执行安装命令即可触发针对当前 Electron ABI 的重建。
版本 0.4.4:让 Windows 上的代理真正开始交流
README 中记录的 0.4.4 版本,特别修复了 Windows 环境中的代理通信问题。
此前,多行协议命令在 cmd.exe 中会被第一个换行截断,代理虽然能够启动,看起来也处于正常状态,但并不知道自己可以与其他代理通信。这个问题使团队表面上存在,实际上却无法协作。
该版本修复了这一问题,也修复了新安装后需要重启才能启动消息路由器的情况,并改善了设置向导与深色模式的可读性。
同时,新版本加入了 Skills、Prerequisites 与拥有独立页面的发布说明。
在多平台代理框架中,代理能否相互发送消息,是从“多个独立终端”走向“一个协作团队”的关键一步。这个修复也让 Windows 环境中的办公室真正能够开始运转。
技能、任务与持续运转的工作流
Munder Difflin 提供技能体系。
系统可以显示不同代理在 Claude Code、OpenCode 与 Codex 中已经具备的能力,也提供可浏览的技能目录,其中包含 227 个以上可搜索、筛选、安装与卸载的技能。
同时,Command Center 支持任务看板与依赖关系,支持计划任务与心跳机制。代理不只适合一次性回答问题,也可以在持续运行的工作流中承担角色。
任务可以等待依赖完成,代理可以在合适的时间执行任务,系统可以通过活动日志和监控视图呈现整个队列的变化。对于需要持续维护、定期检查或多阶段推进的工作来说,这种能力让代理办公室不只是“开几个会话一起做事”,而是一套能够组织工作节奏的环境。
一个仍在成长的原型
Munder Difflin 将自己定位为正在工作的原型。
它已经具备多种代理引擎、自带密钥与本地模型、语音编排、蜂巢协作层、记忆、邮箱、黑板、事件日志、任务看板、计划任务、内置 Monaco IDE、Git 视图、Slack 启动临时工作者、可共享招聘角色、可观察性、熔断器、持久化、会话恢复、多窗口办公室与自动更新等能力。
接下来的方向包括:
- 更多聊天集成
- Telegram 与更丰富的聊天桥接能力
- 更多代理引擎与集成模板
- 更完整地由真实钩子事件驱动角色动作与工具气泡
- 更持久的代理布局与会话命令历史
这些方向都围绕同一个核心继续展开:让代理之间的协作更加自然,让用户对代理团队的观察与控制更加完整。
代码采用 MIT,像素资产有不同边界
Munder Difflin 的源代码采用 MIT License。
不过,项目中打包的像素艺术资源拥有单独限制。地图、图块与基础角色素材来自 LimeZu,并通过相关素材来源引入,遵循非商业使用限制。经过重新配色的角色素材同样继承这一限制。
因此,MIT 许可覆盖源代码,而像素资产的商业使用需要替换素材或获得相应授权。
Munder Difflin 也明确说明,它是一种带有致敬意味的戏仿作品,并不隶属于 NBC、《The Office》或 Dunder Mifflin。
当代理不再只是工具,而开始成为团队
Munder Difflin 最有意思的地方,不只是它能启动多少种终端代理。
真正重要的是,它尝试把多代理协作从一堆分散的终端窗口、脚本和日志中拉出来,放进一套更接近日常办公室运作的结构里。
代理有记忆,有邮箱,有任务,有预算,有工作位置,有协作关系。Michael 负责组织,用户负责关键决策。终端保持真实,工作过程保持可见,自动化拥有边界,任务流转能够被追踪。
它把“同时运行多个 AI 代理”变成一个更具体的画面:一间本地运行的办公室里,多个终端正在工作,信封在桌面之间飞行,任务被分配、处理与升级,而用户始终坐在整个系统真正的决策位置上。
