ターミナルマルチプレクサ

報告を読むより、その場で見たほうがよい run もあります。attended runtake-over は、どちらも ライブの claude セッション — 自分で読んで steer できるもの — を目の前に置きます。ターミナル マルチプレクサの pane に開くことで、それを実現します。loopkeep が動かせるのは 4 つ、 herdrtmuxzellijcmux です。pane の中でも policy のゲートは変わりません。 マルチプレクサはセッションをどこに出すかを決めるだけで、何をしてよいかには関与しません。

マルチプレクサを選ぶ

run をどこに開くかは 1 つのルールで決まります。開く場所が決まっているなら開く、決まって いないなら聞く。 決められる場所は 3 つあり、最初にマルチプレクサを名指ししたものが勝ちます。

  1. workflow の x-loopkeep の下の mux
  2. この project の .loopkeep/config.yamlmultiplexer.id
  3. config.yamlmultiplexer.id
# .loopkeep/config.yaml(この project)または config.yaml(全体)
multiplexer:
  id: tmux # herdr | tmux | zellij | cmux — 省略で未設定、"none" で無効

名指ししたマルチプレクサは、あらかじめ起動しておく必要はありません。インストールされていれば loopkeep が起動して、そこに pane を開きます。夜中に走る attended run のために tmux を立てたまま にしておく、といったことは要りません。

none は空欄ではなく 1 つの決定です。loopkeep は pane をまったく開きません。take-over は現在の ターミナルを引き継ぎ、attended run は下の「開けるマルチプレクサが無いとき」の経路に乗ります — attended を名指しした workflow なら、黙って headless に落ちるのではなく、あなたに聞きます。

3 つのどれも名指ししていないときは、実際に起動しているものを見ます。見るのはそれだけです — loopkeep がマルチプレクサを起動するのは、どれを使うか名指しされたときだけだからです。1 つだけ 起動していれば場所は決まっているので、そこに開きます。複数起動しているときは、あなた抜きには 決められないので、run を保留して受信箱でどれを使うか聞きます。答えた内容はこの project の 既定として保存されるので、聞かれるのは一度だけです。あとから変えるときは、プロジェクト設定の ターミナルから変更します。

インストールされていないマルチプレクサを名指ししても、黙って別のものに開いたりはしません。その run はターミナルが無い場合と同じ扱いになり、下の on_no_host の経路に乗ります。

pane が開く場所

attended run の pane は決まった場所に開きます。space(マルチプレクサのセッションまたは workspace)、tab(その中の window)、そして run id で名づけられた pane です。だから run run_000123 を名前で見つけられます。その run の take-over は同じ場所に来ます。

space と tab はそれぞれ独立に解決し、最初に一致したものを採ります。

  1. workflow の x-loopkeep の下の mux.space / .tab
  2. この project の .loopkeep/config.yamlmultiplexer.options.space / .tab
  3. config.yaml の同じキー、
  4. 組み込み既定の loopkeepautomation
# config.yaml — すべての attended pane の既定
multiplexer:
  options:
    space: loopkeep
    tab: automation

どちらのレイヤーもアプリから編集できます。全体は設定、project 単位はプロジェクト設定のターミナルです。

pane がどのセッションに開くか

herdr は名前付きのセッションを同時にいくつも動かせて、それぞれが自分の window を持ちます。pane が どのセッションに開くかは、次の順で決まります。

  1. workflow の x-loopkeep の下の mux.session
  2. config.yamlmultiplexer.options.session
  3. 起動しているセッション — 1 つだけならそれ、複数あれば最後に使ったもの、
  4. 1 つも起動していなければ herdr の既定セッション。
# config.yaml — すべての attended pane が開くセッション
multiplexer:
  options:
    session: work

space や tab と違って、組み込みの既定名はありません。何も書かなければ pane は作業中の場所について きます。名指しすると常にそこへ開きます。そのセッションが動いていなければ、黙って別のセッションを 使わずに loopkeep が起動します。他のマルチプレクサには名前付きセッションが無いので、このキーは 無視されます。

アプリからも設定できます — 全体の既定は 設定、project ごとは プロジェクト設定 で、 セッションの一覧から選ぶか、新しい名前を入力します。

開けるマルチプレクサが無いとき

attended run の開ける先が無くなるのは 2 つの場合です。1 つも起動しておらず名指しもされていない (loopkeep が起動すべき相手が無い)ときと、名指しされたマルチプレクサを起こせない(インストール されていない、サーバが起動しない)ときです。どちらもターミナルが無い run として扱います。

そのあとどうなるかは on_no_host が決めます。attended を 名指しした場合の既定は ask なので、loopkeep は run を保留して受信箱で聞きます。今すぐ headless で走らせるか、ターミナルを待つか。待つほうは本当に待ちます — run は並列スロットを占有せずに保留の まま残り、マルチプレクサが起動した時点で自分から attended で始まります。黙って headless に落ちるのは on_no_host: headless を書いたときと、そもそも聞かない auto のときだけです。

モードごとに必要なもの

マルチプレクサによって、loopkeep が頼めることが違います。attended run には、pane を 開き、そこへテキストを注入し、まだ生きているかを報告できるもの — フルセット — が要ります。 take-over は pane を開ければ十分です。そこから先は自分の手で運転するからです。attended run の 要件を満たせないマルチプレクサは、その run にとってターミナルとして数えないので、run は上の 「開けるマルチプレクサが無いとき」の経路に乗ります。要件の少ない take-over は、現在のターミナルに 落ちます。

関連