Omnigent 是 Python(FastAPI) 的分层控制面:Server → Host → Runner → Harness。它驱动底层编码 Agent 的方式不是单一的——有自己跑 agent loop 的 headless/SDK、有 native app-server(结构化协议)、有 ACP,还有最有特色的 native TUI:把厂商真实 CLI 跑在一个 tmux pane 里,靠 send-keys 注入输入、靠 forwarder 镜像 transcript。它确实内置了"伪终端",但用的是 tmux,不是 Paseo 那种 node-pty(因为它是 Python 不是 Node)。
claude/cursor/hermes/kiro 等真实 TUI 跑在里面,再用 PTY↔WebSocket 桥把画面投给你。不是全走 ACP——ACP 只是四种模式之一(Goose 用)。Codex/OpenCode 走 app-server 结构化协议,还有一类是 Omnigent 自己直接调模型 API 的 headless loop。
会话控制面(Server+SQL)是真相之源;执行下沉到 Host→Runner;每个会话一个 harness 子进程。
omnigent/server、omnigent/host、omnigent/runner/app.py、runtime/harnesses/process_manager.py("one subprocess per AP conversation ... per-conversation Unix socket")。omnigent/llms/*)codex_native_app_server.py)opencode_native_app_server.py)tmux send-keys(或 antigravity/pi 用 connect-RPC)*_native_forwarder.py 镜像 transcripttest_goose_acp_e2e)goose session)也有 ACP;Codex 走 app-server。所以它不是"统一用 ACP",而是按 Agent 逐个挑最合适的接入方式——代价是每个厂商一大坨专属适配代码(*_native_forwarder.py 动辄几万行)。ws_bridge.py(fork tmux attach,渲染屏幕→二进制 WS 帧,resize 走 ioctl(TIOCSWINSZ))与 control_bridge.py(tmux -C 控制模式,%output 行协议,浏览器 xterm.js 拥有网格,输入用 send-keys -H 十六进制逐字节注入)。
tmux attach 实时接管,还能同机直连或跨机走 WS 桥。Omnigent 用它把"人类才会用的交互式 TUI"变成可托管、可镜像、可共享的会话。| Paseo | Omnigent | |
|---|---|---|
| 语言 | TypeScript / Node | Python |
| 伪终端实现 | node-pty + @xterm/headless | tmux(每终端独立 server/socket) |
| 前端终端 | xterm(RN/web) | xterm.js(web) |
| 远程投屏 | 紧凑二进制 WS 帧 | PTY↔WS 桥 或 tmux -C 控制模式 |
| 给 agent 喂输入 | 写 PTY / SDK | tmux send-keys(或 connect-RPC) |
| 读 agent 输出 | PTY 流 / SDK 事件 | per-厂商 forwarder 解析 TUI → transcript |
| 是否只有终端一条路 | 否(也有 SDK/ACP) | 否(headless SDK / app-server / TUI / ACP 四条) |
node-pty,Omnigent 是 Python 里直接托管 tmux。而"控制 agent"这件事,Omnigent 比 Paseo 铺得更宽:同一个平台里,一个 agent 可能走 headless、app-server、tmux TUI 或 ACP 中的任意一种。| 维度 | Multica | Paseo | Omnigent |
|---|---|---|---|
| 语言 | Go | TypeScript | Python |
| 主接入方式 | 每 task 起 CLI 子进程 (stream-json / app-server / ACP) | 保活 provider 会话 (SDK / ACP)+ node-pty | 四模式:headless / app-server / tmux TUI / ACP |
| 内置伪终端 | 无(解析结构化事件流) | node-pty 常驻 | tmux(每终端独立 server) |
| 跑厂商真实 TUI 并镜像 | 否 | 可投终端,但不"伪装"结构化 transcript | 是:send-keys 注入 + forwarder 镜像 |
| 进程模型 | 每聊天轮次重启 + --resume | 长期保活会话 | 每会话一个常驻 harness 子进程(懒启/空闲回收) |
| 维护代价 | Go adapter,中等 | adapter 较干净 | 最重:每厂商专属 native 适配(forwarder 数万行) |