Boo: 基于 libghostty 构建的现代 GNU Screen 风格复用器

Boo 是一个用 Zig 编写的终端复用器,它使用 libghostty-vt 终端仿真核心实现了 GNU screen 风格的会话模型。通过将所有会话输出解析通过 Ghostty 的核心,Boo 能够维护每个会话精确的内部状态——包括内容、样式、光标位置和终端模式——从而允许它在重新连接时重新恢复终端状态,并为自动化提供机器可读的屏幕状态。

使用 libghostty 进行现代终端仿真

Boo 用 libghostty-vt 取代了 GNU screen 中陈旧的终端仿真器。这种架构转变确保了会话的保存状态与现代终端实际显示的内容一致,防止了 SGR 样式和其他现代终端序列在旧版复用器中经常出现的损坏问题。

关键技术优势包括:

  • 忠实的重绘:该工具使用 Ghostty 的 TerminalFormatter 在重新连接时根据内部状态重放屏幕。
  • 脱离连接时的查询处理:当会话处于分离状态时,守护进程会使用 libghostty 的流处理器来回答终端查询(例如 DSR、DA 和 XTWINOPS),防止 TUI 在无人看管时挂起。
  • 一致的状态:守护进程为每个会话拥有一个持久的 ghostty-vt TerminalStream,确保无论客户端是否连接,屏幕状态始终是最新的。

面向 AI Agent 的自动化原语

Boo 被设计为一个沙盒,供脚本和 AI agent 驱动交互式程序,而无需 TTY。它提供了一套自动化命令,这些命令操作的是渲染后的屏幕状态,而不是原始字节日志。

核心自动化工作流

AI agent 和脚本通常遵循以下循环:

  1. 创建boo new <name> -d -- <command> 创建一个无头会话。
  2. 输入boo send <name> --text 'command' --enter 发送字面量文本并提交。
  3. 同步boo wait <name> --idle 阻塞直到输出静默 2 秒,或者 boo wait <name> --text <text> 阻塞直到特定文本出现。
  4. 观察boo peek <name> --scrollback 读取渲染后的屏幕。使用 --json 提供机器可读的元数据,包括大小、光标位置和标题。
  5. 清理boo kill <name> 结束会话。

架构与用法

Boo 采用客户端-守护进程架构。客户端将本地 TTY 置于 raw 模式并通通过一个分帧的 Unix-socket 协议与会话守护进程通信。守护进程管理 PTY 连接的子进程,并将其输出喂给 ghostty-vt 终端核心。

常用命令

Command Action
boo new 启动一个运行默认 shell 的新会话
boo ui 打开全屏会话管理器侧边栏
boo attach <name> 重新连接到命名会话
boo ls 列出所有活动会话
boo kill <name> 终止特定会话

按键绑定

Boo 遵循 GNU screen 的默认前缀 Ctrl-a

  • Ctrl-a dCtrl-a C-d:从当前会话分离。
  • Ctrl-a lCtrl-a C-l:触发重绘。
  • Ctrl-a a:发送一个字面量 Ctrl-a 字符。

当前局限性与注意事项

作为一个年轻的项目,Boo 尚未成为 GNU screen 的完全替代品。用户应注意以下限制:

  • 单窗口模型:每个会话仅包含一个窗口;没有内部拆分或标签页。建议用户为每个任务运行一个会话,并通过 boo ui 进行管理。
  • 客户端访问:一次只能有一个客户端连接到会话;不支持共享会话(类似于 screen 的 -x 标志)。
  • 前缀配置Ctrl-a 前缀目前是硬编码的,无法配置。
  • 终端环境:所有会话均以 TERM=xterm-256color 运行。

社区观点

虽然该项目因其极简主义方法和对 libghostty 的使用而受到称赞,但一些用户指出,每个会话缺少多个窗口是一个相对于原始 GNU screen 的退化。其他开发者提到了基于 libghostty 的类似项目,例如 Cmux 和 zmx,这表明使用 Ghostty 的终端核心进行复用工具开发的趋势正在增长。

Sources