Boo: libghostty 上に構築されたモダンな GNU Screen スタイルのマルチプレクサ

Boo は、libghostty-vt ターミナルエミュレーションコアを使用して GNU screen スタイルのセッションモデルを実装する、Zig で書かれたターミナルマルチプレクサです。すべてのセッション出力を Ghostty のコアを通じて解析することで、Boo は、コンテンツ、スタイル、カーソル位置、ターミナルモードを含む、すべてのセッションの正確な内部状態を維持します。これにより、再アタッチ時にターミナルを再水和(rehydrate)し、自動化のためのマシンリーダブルな画面状態を提供することが可能になります。

libghostty によるモダンなターミナルエミュレーション

Boo は、GNU screen に見られる老朽化したターミナルエミュレータを libghostty-vt に置き換えます。このアーキテクチャの転換により、セッションの保存された状態が、モダンなターミナルが実際に表示するものと一致することが保証され、古いマルチプレクサが頻繁に落としてしまう SGR スタイルやその他のモダンなターミナルシーケンスの破損を防ぎます。

主な技術的利点は以下の通りです:

  • 忠実な再描画: このツールは、再アタッチ時に内部状態から画面を再生するために Ghostty の TerminalFormatter を使用します。
  • 分離されたクエリ処理: セッションがデタッチされている間、デーモンは libghostty のストリームハンドラーを使用してターミナルクエリ(DSR、DA、および XTWINOPS など)に回答し、TUI が放置されている間にハングするのを防ぎます。
  • 一貫した状態: デーモンは各セッションに対して永続的な ghostty-vt TerminalStream を所有しており、クライアントがアタッチされているかどうかにかかわらず、画面状態が常に最新であることを保証します。

AI エージェントのための自動化プリミティブ

Boo は、スクリプトや AI エージェントが TTY を必要とせずにインタラクティブなプログラムを駆動するためのサンドボックスとして設計されています。生のバイトログではなく、レンダリングされた画面状態に対して操作を行う一連の自動化コマンドを提供します。

コア自動化ワークフロー

AI エージェントやスクリプトは、通常、以下のループに従います:

  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 ターミナルコアに供給します。

一般的なコマンド

コマンド アクション
boo new デフォルトのシェルを実行する新しいセッションを開始します
boo ui フルスクリーン・セッションマネージャー・サイドバーを開きます
boo attach <name> 指定された名前のセッションに再アタッチします
boo ls すべてのアクティブなセッションをリストアップします
boo kill <name> 特定のセッションを終了します

キーバインド

Boo は GNU screen のデフォルトのプレフィックス Ctrl-a に従います:

  • Ctrl-a d または Ctrl-a C-d: 現在のセッションからデタッチします。
  • Ctrl-a l or Ctrl-a C-l: 再描画をトリガーします。
  • Ctrl-a a: リテラルな Ctrl-a 文字を送信します。

現在の制限事項と注意点

若いプロジェクトであるため、Boo はまだ GNU screen の完全なドロップイン・リプレースメントではありません。ユーザーは以下の制約に注意する必要があります:

  • シングルウィンドウ・モデル: 各セッションには正確に 1 つのウィンドウが含まれます。内部的な分割やタブはありません。ユーザーは、タスクごとに 1 つのセッションを実行し、boo ui を介して管理することを推奨します。
  • クライアント・アクセス: 一度に 1 つのクライアントのみがセッションにアタッチできます。共有セッション(screen の -x フラグに類似)はサポートされていません。
  • プレフィックス設定: Ctrl-a プレフィックスは現在ハードコードされており、設定変更はできません。
  • ターミナル環境: すべてのセッションは TERM=xterm-256color で実行されます。

コミュニティの視点

このプロジェクトは、そのミニマルなアプローチと libghostty の使用により称賛されていますが、一部のユーザーは、セッションあたりの複数のウィンドウがないことが、オリジナルの GNU screen と比較して退行であると指摘しています。その他の開発者は、Cmux や zmx のような libghostty に基づく同様のプロジェクトを、 multiplexing ツールとしての Ghostty のターミナルコアの使用が増加している傾向を示していることを指摘しています。

Sources