Boo: 基於 libghostty 的現代 GNU Screen 風格多路復用器

Boo 是一款使用 Zig 編寫的終端多路復用器,它利用 libghostty-vt 終端模擬核心來實現 GNU screen 風格的會話模型。透過解析所有會話輸出,Boo 能維持每個會話精確的內部狀態——包括內容、樣式、游標位置和終端模式——使其能夠在重新連接時重新還原終端,並為自動化提供機器可讀的螢幕狀態。

使用 libghostty 的現代終端模擬

Boo 使用 libghostty-vt 取代了 GNU screen 中老舊的終端模擬器。這種架構上的轉變確保了會話的儲存狀態與現代終端實際顯示的內容一致,防止了 SGR 樣式和其他現代終端序列在舊版多路復用器中常見的損壞問題。

關鍵技術優勢包括:

  • 忠實的重繪:該工具使用 Ghostty 的 TerminalFormatter 在重新連接時根據內部狀態重播螢幕內容。
  • 分離式查詢處理:當會話處於分離狀態時,守護程序(daemon)會使用 libghostty 的串流處理器來回答終端查詢(例如 DSR、DA 和 XTWINOPS),防止 TUI 在無人看管時掛起。
  • 一致的狀態:守護程序為每個會話擁有一個持久的 ghostty-vt TerminalStream,確保無論客戶端是否連接,螢幕狀態始終是最新的。

適用於 AI Agent 的自動化原語

Boo 被設計為腳本和 AI agent 的沙盒,讓它們可以在不需要 TTY 的情況下驅動互動式程式。它提供了一套自動化指令,這些指令是針對渲染後的螢幕狀態而非原始位元組日誌進行操作。

核心自動化工作流程

AI agent 和腳本通常遵循以下循環:

  1. 建立boo new <name> -d -- <command> 會建立一個無頭(headless)會話。
  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 mode,並透過一個帶框的 Unix-socket 協定與會話守護程序進行通訊。守護程序管理與 PTY 連接的子程序,並將其輸出餵入 ghostty-vt 終端核心。

常用指令

指令 動作
boo new 啟動一個執行預設 shell 的新會話
boo ui 開啟全螢幕會話管理器側邊欄
boo attach <name> 重新連接到指定的會話
boo ls 列出所有活動中的會話
boo kill <name> 終止特定的會話

按鍵綁定

Boo 遵循 GNU screen 的預設前綴 Ctrl-a

  • Ctrl-a dCtrl-a C-d:從當前會話分離(detach)。
  • Ctrl-a l or Ctrl-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