botmux 是一个薄编排层:把飞书事件翻译成 CLI 进程的输入/输出,不重造 Agent 能力。官方定位(README.md):一条飞书消息启动一个会话,每个会话一个独立 CLI 进程,输出实时流式回传为飞书卡片。
进程模型:三层
飞书长连接事件 (WSClient)
│
▼
daemon(一个 bot 一个进程,pm2 托管,常驻)
│ 每个会话 fork 一个
▼
worker(一会话一进程)── HTTP+WS 提供 Web 终端
│ 适配器 + 后端(PTY/tmux/zellij/...)拉起
▼
CLI 进程(Claude Code / Codex / ... 完整运行时)
- 一个 bot 一个 daemon:多机器人 = 多 daemon,进程完全隔离(
ecosystem.config.cjs+src/cli.ts的 pm2 编排;startDaemon(botIndex)按BOTMUX_BOT_INDEX认领 bots.json 中的一个 bot,见 src/daemon.ts:19954)。 - 一个会话一个 worker:daemon 通过
child_process.fork()拉起worker.js(src/core/worker-pool.ts:6257),worker 管一个 CLI PTY 会话 + Web 终端;tmux 后端下 CLI 可脱离 worker 常驻(见 tmux)。
入口文件
| 文件 | 角色 |
|---|---|
src/cli.ts | botmux bin(package.json bin)。setup/start/stop/restart/logs/status/list/delete/autostart/device/whiteboard 等命令;start 经 pm2 拉起 fleet(每 bot 一个 daemon + dashboard) |
src/index-daemon.ts | daemon 进程入口(package.json main)。加载 ~/.botmux/.env、scrub 会话级环境变量(daemon 永远不是会话)、读全局 locale,然后 startDaemon(botIndex) |
src/index-core-only.ts | core-only(apiOnly)入口:单进程、无飞书凭证、无 bots.json,只在 127.0.0.1 提供 HTTP 控制 API(BOTMUX_API_PORT),供沙盒内任务运行器经 POST /api/trigger 驱动(见 api-core-only) |
src/worker.ts | 会话 worker 进程:管理单个 CLI PTY 会话 + xterm.js Web 终端(详见 daemon-worker) |
src/worker-ipc-preload.ts | worker fork 后、正式 IPC 处理器注册前暂存 daemon 消息并为首轮输入回 ACK,ready 后按序重放 |
src/ 子目录职责地图
| 目录 | 职责(一句话) |
|---|---|
core/ | daemon 侧核心域:worker-pool(fork/IPC/卡片刷新)、command-handler(斜杠命令)、scheduler(croner 定时)、session-store 相关、ask 协议、plugins(MCP gateway)等 160+ 个文件(递归统计,含子目录) |
im/lark/ | 飞书侧:event-dispatcher(WSClient + 路由准入)、client(API 封装)、card-builder/card-handler(卡片)、message-parser 等 |
adapters/cli/ | CLI 适配器,每种 CLI 一个文件(claude-code/codex/cursor/gemini/opencode/kimi/grok/riff 等 20+),registry.ts 工厂分发(见 adapters) |
adapters/backend/ | 会话后端:pty/tmux/tmux-pipe/zellij/herdr/riff 等,worker 与 CLI 经后端解耦 |
services/ | 持久化/策略服务 160+(递归统计,含子目录):session-store、message-queue、schedule-store、usage-ledger、hook-runner、各 CLI transcript 解析、vc-meeting 系列等 |
workflows/ | Workflow DAG 编排引擎:v3/(DAG、distillation、goal-mode)、events/(事件溯源)、hostExecutors/(feishu-send 等宿主执行器)(见 workflow-engine) |
dashboard/ | Dashboard 管控面服务端:聚合器、认证、联邦、飞书登录、Web 终端代理(见 dashboard) |
setup/ | botmux setup:飞书应用创建、权限自动化(open-platform-automation)、CLI 选择、tmux/字体依赖保障 |
skills/ | 随包内置的 CLI 侧 Skill 定义(botmux-send/schedule/history/bots/quoted 等)与注入器(见 skills) |
platform/ | 设备凭证/绑定/隧道(device-enroll、device-isolation、tunnel-client) |
vc-agent/ | 飞书会议智能体:会议状态机、轮询/推送事件源、实时语音(见 vc-agent) |
cli/ | CLI 子命令辅助模块:pm2 事务、会话 picker(TUI)、send-dispatch、saved-workflow 等 |
desktop/ | Electron 桌面端(main/preload/renderer,独立打包管线) |
utils/ | 通用设施:logger、idle-detector、terminal-renderer(xterm 截屏)、file-lock、atomic-write 等 |
features/ | 场景特性,目前含 codex-notifier(Codex 桌面通知接管) |
顶层还有:daemon.ts(编排组装,2.1 万行)、bot-registry.ts(多 bot 配置与状态)、config.ts/global-config.ts、codex-app-runner.ts/mira-runner.ts/mir-local-runtime.ts(特定 CLI 的子 runner)、dashboard.ts(dashboard HTTP 静态/代理服务)。
数据流
- 飞书推送
im.message.receive_v1→im/lark/event-dispatcher.ts解析归属(@mention / 话题 / 群权限) core/command-handler.ts拦截/xxx斜杠命令;非命令消息进入会话路由(handleNewTopic / handleThreadReply)- 新话题 → worker-pool fork 一个 worker;已有会话 → 复用,消息经 IPC 写进 CLI stdin
- worker 持续读 PTY 输出 → terminal-renderer 转 Markdown → 流式卡片回传(见 card-streaming)
- CLI 通过注入的 Skill(
botmux send等)主动向话题发消息
技术栈
- 语言/运行时:TypeScript(ESM),Node >= 22,pnpm;vitest 单测/e2e
- 飞书:
@larksuiteoapi/node-sdk(WSClient 长连接 + REST),proxy-agent代理支持 - 进程/终端:
node-pty(PTY)、pm2(daemon 托管)、tmux/zellij(外部后端,setup 自动安装) - Web 终端:
ws+@xterm/headless(服务端渲染/截屏) - 定时:
croner(cron 解析) - Dashboard:React 19 前端(scripts/build-dashboard.mjs 打包进 dist)
- 其他:
zod(校验)、markdown-it、@napi-rs/canvas(截图)、@modelcontextprotocol/sdk(MCP gateway)、qrcode-terminal(setup 扫码)
更多背景:overview、architecture。