セッション
セッションとは実行中のワークスペースのことです。Ubuntu VM が起動し、ターミナルタブが稼働し、エージェントが作業している状態を指します。この章では、開始をクリックしてからウィンドウを閉じるまでに起こるすべて — セッションウィンドウのレイアウト、タブと git worktree、組み込みブラウザとファイルペイン、Mac と VM の間でのファイルやクリップボード内容の移動、チェックポイント、そしてセッション終了時の選択肢 — を扱います。
姉妹製品の Bromure ウェブブラウザではウィンドウを閉じるとセッションが破棄されますが、Bromure Agentic Coding のワークスペースは設計上、永続的です。VM のシステムディスクとホームディレクトリはセッションをまたいで保持され、意図的な操作(ベースにリセット…、ホームを消去…、ワークスペースを削除)またはセキュリティワイプのみがデータを破棄します。セッションを閉じることは、VM が次に何をするか — 実行を継続する、サスペンドする、電源を切る — を決めるだけです。
セッションの仕組み
各ワークスペースはちょうど1つの VM に対応します。VM はワークスペースごとのシステムディスク(disk.img)から起動します。これは共有 Ubuntu ベースイメージの APFS コピーオンライトクローンで、初回起動時に即座に作成され、以降の起動ごとに再利用されます。VM 内でインストールしたもの(sudo apt install、言語ツールチェーン、システム構成)はセッション間で保持されます。ホームディレクトリ /home/ubuntu は別に保存され — 最新のワークスペースではプライベートなスパース ext4 ディスクイメージに — システムディスクを完全にリセットしても残ります。ストレージモデルの詳細はコンセプトを参照してください。
VM 内では、すべてのターミナルが単一の tmux セッションに属します。tmux が信頼できる情報源です。各 UI タブは tmux ウィンドウであり、ホストはゲストのタブ一覧をサイドバーにミラーします。この設計により、UI は自由にデタッチと再アタッチができます。セッションはバックグラウンドでヘッドレスに実行し続けたり、独自のウィンドウにポップアウトしたり、別の Mac からミラーしたり(リモートアクセスを参照)しても、エージェントの作業を妨げません。
メモ: ワークスペース VM はプールから事前ウォームされることはありません。各 VM は自身のディスクからコールドブートします(またはサスペンドスナップショットから復元します)。エージェント型ブラウザペインの背後にあるサイドカー VM のみが事前ウォームプールを使用します。
セッションの開始
停止中のワークスペースは複数の場所から開始できます:
- サイドバーでワークスペースを選択し、開始(サスペンド中なら再開)をクリックします — ステージの開始カード上、または VM ダッシュボード上のいずれかで。
- ワークスペースのサイドバー行にある ⋯ をクリックし、開始を選択します。
- オフのワークスペースに属するターミナルグリッドのプレースホルダーセルをクリックします。
起動されるもの
- 初回起動 — アプリは APFS コピーオンライトクローンを使ってベースイメージをワークスペースの
disk.imgにクローンします。クローンは即座に完了し、事前にディスク容量を消費しません。ブロックはゲストが書き込むときにのみ割り当てられます。ホームイメージと起動ごとの共有(メタデータ共有とアウトボックス)が作成され、VM は 4 vCPU(固定)とワークスペースの設定で構成された RAM で起動します。 - 2回目以降の起動 — 既存のシステムディスクとホームが再利用されるため、VM 内でインストールしたものはすべて残っています。
- サスペンド中のワークスペース — コールドブートの代わりに、保存された RAM スナップショット(
vm.state)が復元され、セッションは中断した箇所から正確に再開します。タブバーは保存されたタブスナップショットから復元されます。再開はほぼ瞬時です。
デフォルトでは、VM は Bromure の共有 NAT スイッチに参加します。すべてのワークスペース VM(およびエージェント型ブラウザ VM)は1つのプライベートサブネットを共有し、安定した DHCP アドレスを取得し、互いに到達できます。そのためブラウザペインは、エージェントが起動した開発サーバーを VM の IP で読み込めます。ワークスペースごとのブリッジモードもワークスペース設定で利用できます。メモリとネットワークのオプションについては設定 — 一般を参照してください。
起動画面
VM が起動している間、アニメーション付きの「ダイブ」オーバーレイがターミナル領域を覆います。スキャンする進捗バーの上にワークスペース名が表示され、オプションのステータス行が付きます。これは起動に 0.4 秒以上かかる場合にのみ表示され、ゲストが最初のタブ一覧を報告した瞬間にフェードアウトします。ホームストレージの移行中は、代わりにオーバーレイに確定的な進捗が表示されます(例えば「MOVING HOME — 42% OF 7.9 GB」)。
30 秒以内にターミナルが表示されない場合、オーバーレイは DIVE FAILED パネルに切り替わります — 「«name» never returned a terminal after 30 seconds. The VM may be stuck, or the base image may be damaged.」— 2つのボタンが付きます:
- Keep Waiting — ウォッチドッグを再起動し、起動を継続します。
- Reset Base Image… — 共有イメージ自体が損傷している場合に、ベースイメージの再構築を開始します。
起動が繰り返し失敗する場合はトラブルシューティングを参照してください。
起動時のプロンプト
起動の前には、次のいずれかのプロンプトが表示される場合があります:
| プロンプト | 表示されるタイミング | 選択肢 |
|---|---|---|
| ベースイメージのドリフト | このワークスペースのディスクがクローンされて以降、共有ベースイメージが再構築された | リセットして起動(新しいベースから再クローン。ホームはそのまま)/ そのまま起動 / キャンセル |
| 侵害されたワークスペース | 以前のセッションが認証情報の窃取でフラグ付けされた | 起動前にディスク、ホーム、RAM スナップショット、起動ごとの共有のワイプを確認します。設定、トークン、SSH キーは保持されます。認証情報を参照。 |
| ホームストレージのアップグレード | ワークスペースがまだレガシーの共有フォルダ方式のホームを使用している | 今すぐアップグレード(この起動時に ext4 ホームイメージへ移行)/ 後で(次回起動時に再度確認) |
| モデルのダウンロード中 | 必要なローカルモデルのダウンロードが完了していない | 起動は説明とともに拒否されます。ローカルモデルを参照。 |
| ディスク不足 | ホストボリュームの空き容量が 1 GB 未満 | セッションの途中で行き詰まる代わりに、明確なエラーで起動が拒否されます。 |
セッションウィンドウ
すべてのセッションは、Bromure というタイトルの単一の共有ウィンドウ(デフォルト 1320 × 860 ポイント)内に存在します。これは Mail.app スタイルの分割です。左側にはすべてのワークスペースを一覧表示するサイズ変更可能なサイドバー、右側には選択したワークスペースのターミナルを表示する単一のステージがあります。タイトルバーは透明でツールバーと一体化しており、空いている部分をクリックするとブラウザのようにウィンドウをドラッグできます。
上のスクリーンショットは、オフのワークスペースを選択した状態のウィンドウを示しています。左側の WORKSPACES サイドバー(ピン留めされた Grid ノード、オフ状態を示す2つのワークスペース、AUTOMATIONS セクション、ワークスペースを作成する黒い + ボタン)と、そのワークスペースの VM ダッシュボードを表示するステージ — CPU、メモリ、vCPU、ディスク、稼働時間の統計カード、CONFIGURATION サマリー、そして開始ボタン。
ワークスペースサイドバー
サイドバーは、実行中かどうかにかかわらず、ワークスペースごとに1行を持つソースリストです。各行にはワークスペース名、アクセントカラーのタイル、実行状態バッジが表示されます:
| バッジ | 状態ラベル | 意味 |
|---|---|---|
| 緑のドット | — | 実行中 |
| オレンジ、点滅 | 起動中… | 起動処理中 |
| 黄色のドット | サスペンド中 | RAM スナップショットがディスクに保存済み |
| グレーのドット | オフ | 電源オフ |
赤い感嘆符の三角形は侵害されたワークスペースを示します。実行中のワークスペースは、その下にターミナルタブをネスト表示し(worktree のツリー順)、常時表示の Docker ノードを加え、ホバーコントロール(ポップアウト、閉じる(×)、新規タブ用の +)を表示します。各行の ⋯ メニューは状態に応じたライフサイクルアクションを提供します:開始 / 再開 / シャットダウン / サスペンド / 再起動、worktree をグリッドに追加(実行中のみ)、編集…、複製、ディスクをリセット、ワークスペースを削除。
メモ: シャットダウンと再起動は実行中のプロセスを停止するため確認を求めます。サスペンドは完全に復元可能なため、確認しません。
サイドバーとステージの間の仕切りをドラッグしてサイズを変更します(デフォルト幅 220 ポイント)。約 100 ポイント未満までドラッグするとサイドバーは 44 ポイントのアイコンレールにスナップします。それを超えてドラッグし直すと展開します。⌃⌘S はサイドバーの折りたたみ状態を切り替えます。折りたたまれたレールでは、コンテナタブは非表示になり、ツールチップがワークスペースとタブのコンテキストを示します。
ステージ
ステージには選択したタブのターミナルが表示されます。全面オーバーレイサーフェスで覆うこともできます:
- VM ダッシュボード — サイドバーでワークスペースの名前をクリックします(下記参照)。
- ターミナルグリッド — ピン留めされた Grid ノードをクリックします(ターミナルグリッドを参照)。
- Docker ダッシュボード — 実行中のワークスペースの下にある Docker ノードをクリックして、コンテナとイメージを管理します。
- 自動化エディタ — AUTOMATIONS セクションから(自動化と CLIを参照)。
ステージの右端には、さらに2つの分割があります:エージェント型ブラウザペイン(⌃⌘B)とファイルエクスプローラーペイン(⌃⌘E)。
VM ダッシュボード
ワークスペースのタブではなく名前をクリックすると、任意の実行状態でそのダッシュボードがステージにオーバーレイ表示されます。実行中の VM では、ライブの状態が表示されます:スパークライン付きの CPU、割り当てに対する使用メモリ、負荷平均付きの vCPU、ディスク使用量(ホスト側のクローンサイズよりも正確な、ゲスト自身の df から取得)、稼働時間、そしてゲストの外部到達可能なソケットを <VM-IP>:<port> エンドポイントとしてワンクリックコピー付きで一覧表示する Listening Ports カード。HTTP と思われるサービスにはグローブボタンも付き、Cloudflare クイックトンネルを通じてそのサービス1つだけをインターネットに公開できます(一度きりの同意ダイアログがダウンロードと規約を説明します)。サスペンド中またはオフのワークスペースでは、代わりにダッシュボードにマシンのスペックと構成が表示されます。
アクションバーには、実行中は New Terminal、Suspend、Reboot、Shut Down が、そうでない場合は 開始 / 再開 が表示されます。CONFIGURATION カードには、ツールごとの認証モード、ガードレール、プロンプトインジェクションスキャン、共有フォルダがまとめられます。
メモ: 状態はゲストから約 1.5 秒ごとに更新されます。起動直後のゼロ値は、ゲストエージェントがまだ報告していないことを意味します。
タイトルバーのコントロール
選択したワークスペースが実行中の場合、選択中の VM ごとのコントロールクラスターがツールバーの末尾に配置されます:
| コントロール | 機能 |
|---|---|
| IP ピル | VM の IP アドレスを等幅で表示。クリックでコピーし、Copied と点滅します。ツールチップ:VM IP — click to copy。 |
| ストリーミングドット | セッションメタデータが bromure.io に送信されているときに表示される点滅する赤いドット(登録済みの Mac、非プライベートワークスペース)。エンタープライズを参照。 |
| エンジンバッジ | ローカル推論の状態:エンジンがウォームアップ中はスピナー、準備完了で緑の CPU アイコン、失敗でオレンジ。ローカルモデルを参照。 |
| Fusion ボルト | このワークスペースの Fusion を切り替えます。有効時は黄色(Fusion engaged — click to disengage)。少なくとも2つのプロバイダーに使用可能な認証情報があるまで、ツールチップ Enable at least two models to use Fusion とともに無効化されます。 |
| ファイルを参照 | ワークスペースごとのファイルブラウザウィンドウを開きます(ファイルとクリップボードの移動を参照)。 |
| VM を再起動 | ゲストを再起動します。 |
| トレースを検査(⇧⌘I) | トレースインスペクタを開きます。 |
| ワークスペースを編集 | ワークスペースエディタを開きます。 |
| 独自のウィンドウにポップアウト | ワークスペースを独自のウィンドウに移動します(下記参照)。 |
| エージェント型ブラウザの表示/非表示(⌃⌘B) | ブラウザペインを切り替えます(グローブアイコン)。 |
| リポジトリファイルの表示/非表示(⌃⌘E) | ファイルエクスプローラーペインを切り替えます。 |
ポップアウトと再ドッキング
実行中のワークスペースは、統合ウィンドウから独自の単一 VM ウィンドウにポップアウトできます。サイドバー行またはツールバーのポップアウトアイコンをクリックします。そのタブはそのウィンドウのタイトルバーにあるカプセル型のピルストリップになり、ペインは VM とタブの状態を保持します。変わるのはホスティングウィンドウだけです。ポップアウトされたウィンドウは同じツールバーコントロールに加えて、再ドッキングボタン(この VM をメインウィンドウに戻す)と、マウントされたホストフォルダを一覧表示する共有フォルダのポップオーバー(行をクリックすると Finder で開きます)を持ちます。再ドッキングボタンをクリックすると、ワークスペースが統合ウィンドウに折りたたまれます。
タブの操作
各タブは、ワークスペース VM の単一の tmux セッション内の tmux ウィンドウです。tmux が権威です。ゲストは約 0.7 秒ごとにウィンドウ一覧を公開し、ホストはそれをサイドバー行(およびポップアウトされたウィンドウのピルストリップ)にミラーします。名前変更などのタブの変更は約 40 ミリ秒以内に反映されます。
- 新規タブ — ⌘T を押すか、ワークスペースのサイドバー行の + をクリックします。
- タブを閉じる — ⌘W を押すか、タブ行にホバーして × をクリックします。最後のタブを閉じるとセッションが終了し、ウィンドウを閉じるのと同じクローズアクションパイプラインを通ります。
- タブの切り替え — ⌘1 から ⌘9 を押します。選択したワークスペースの最初の9行の横に小さなコードラベルが表示されます。番号付けはサイドバーの表示ツリー順に従います(コンテナタブを除く)。
タブのラベルはフォアグラウンドのプログラム(claude、codex、シェルなど)を示します。worktree タブは「Website refactoring (claude)」のような、よりわかりやすい表示名を示します。Docker コンテナにシェルをアタッチして開いたタブは、トップレベルではなく Docker ノード内のそのコンテナの下にネストします。
メモ: tmux ウィンドウのインデックスは、タブを閉じた後にギャップが生じることがあります。UI がマッピングを処理し、⌘ 番号のコードは常にサイドバーで見えているものに従います。
エージェントステータスドット
各タブのアイコンには、その中で実行されているエージェントを追跡する色付きのステータスドットが付きます:
| ドット | 意味 |
|---|---|
| オレンジ、点滅 | エージェントが作業中 |
| 緑 | エージェントが完了 |
| 赤 | エージェントがあなたの入力を必要としている |
ステータスは Claude Code についてはウィンドウごとのフックによって、その他のエージェントについてはトラフィックプロキシによって駆動されるため、VM 内での設定なしにドットが機能します。
Git worktree
git worktree とは、1つのリポジトリの2つ目の作業コピーです。別のブランチが独自のディレクトリにチェックアウトされ、リポジトリの履歴を共有しながら、独自のファイルと独自のインデックスを持ちます。Git は一度に多数の worktree をサポートするため、変更を stash したり、再クローンしたり、その場でブランチを切り替えたりすることなく、複数のブランチを並行して作業できます。
Bromure はその上に並行するエージェントの作業ラインを構築します。作業ディレクトリが git リポジトリ内にある任意のターミナルタブは、独自のネストされたエージェントタブを持つ worktree を生成できます。あるエージェントが wt/website-refactoring でサイトをリファクタリングしている間に、別のエージェントが wt/login-fix でバグを追いかける — それぞれが独自のチェックアウト内にあり、互いのコミットされていないファイルにつまずくことはありません。作業ラインの準備ができたら、そのブランチをマージバックする(またはそこからプルリクエストを開く)ことができ、worktree を破棄します。これは、1つのタスクを複数のエージェントに一度に展開し、ターミナルグリッドで見守る自然な方法です。
worktree の作成
サイドバーの任意のタブ行を右クリックしてコンテキストメニューを開きます。常に2つの項目が表示されます:
- 新規 worktree… — 下記のダイアログを開きます。タブの作業ディレクトリが git リポジトリでない場合、項目は表示されますが無効化され、**新規 worktree…(git リポジトリ内ではありません)**とラベル付けされるため、メニューが黙って空になることはありません。worktree タブ自体もチェックアウトなので、これも 新規 worktree… を提供します — これが worktree から worktree を分岐する方法です。
- 新規自動化… — タブのディレクトリで自動化エディタをシードします(自動化を参照)。
新規 worktree ダイアログ — 「Creates a git worktree branched from this tab's current commit and opens a nested agent in it.」— は3つの情報を収集します:
| フィールド | 目的 |
|---|---|
| タスク名 | 短い人間向けラベル、例えば Website refactoring。ブランチ名にスラグ化され、タブに表示されます。 |
| ツールポップアップ | 新しいチェックアウトで起動するエージェント — claude、codex、または grok。ワークスペースで構成されたエージェントがデフォルトになります。 |
| 初期プロンプト(オプション) | エージェント起動時に最初に渡されるメッセージ。worktree が無人で作業を開始できるようにします。空欄のままにすると、エージェントはアイドル状態で開きます。 |
作成(またはキャンセル)をクリックします。Bromure はタブの現在のコミットから分岐した git worktree を wt/<slug> という名前のブランチに追加します。スラグはタスク名を小文字化し、その他の文字の連続を単一のダッシュにまとめ、40 文字で上限を設けたものです。ブランチがすでに存在する名前には -2、-3、… というサフィックスが付きます。次に、新しいチェックアウトにネストされたエージェントタブが開き、「Website refactoring (claude)」のようにタスク名とツールでラベル付けされます。
メモ: タブの作業ディレクトリを特定できない場合、アラート — 「This tab's working directory isn't available yet」— は、ワークスペースがおそらく古い VM 内エージェントを実行していることを説明し、worktree サポートを取り込むように再起動(シャットダウンしてから開始)することを提案します。
worktree タブのネストの仕方
worktree タブは、分岐元のタブの下にネストし、インデントされ、小さなブランチグリフが前に付くため、ネストされたサブエージェントはプレーンなタブではなくブランチとして読めます。worktree 自体も分岐できるため、ネストはツリーになります。worktree から worktree への分岐がサポートされ、インデントは各レベルで内側にステップし、最大6レベルの深さまでいきます。Attach terminal タブと実行中の Merge → … タブも、同じように worktree の下にネストします。これは表示順序のみです。各タブは依然として通常の tmux ウィンドウであり、⌘ 番号のコードは表示ツリー順に従います。
複数の worktree エージェントを並べて見守るには、ワークスペースの ⋯ メニューの worktree をグリッドに追加を使います。これにより、そのワークスペースのすべての worktree タブが一度にターミナルグリッドに追加されます。
worktree のアクション
worktree タブを右クリックすると、それに特有のアクション — マージ…、Attach terminal、そして(区切り線の下に)worktree を破棄 — が表示されます。
マージ… — ブランチのマージバック。 ダイアログは、宛先でチェックアウトされた新しいタブでマージを実行します。worktree のブランチ上のコミットされた作業のみがマージされます。宛先ピッカーは祖先チェーン — 直近の親 worktree、次にその worktree の親、というようにリポジトリのルート(「«branch» (repo root)」)まで — をたどります。直近の親が安全なデフォルトであり、あらかじめ選択されています。それより上位を選ぶと «label» ⚠︎ skips intermediates とフラグ付けされます。なぜなら、それらの中間 worktree はその変更を決して受け取らないからです。宛先を選んでマージをクリックします。
- 競合は自動的に解決されます。 マージが競合した場合、それを自動的に解決するために、コーディングエージェントがそのマージタブでそこから起動します。競合が未解決のまま停止した場合、マージタブは右クリックメニューに Have the agent resolve conflicts を提供し、再試行できます。
- プルリクエストを作成。 ワークスペースに GitHub 認証情報(VM 内で
ghを認証するもの)がある場合、マージダイアログには3つ目のボタン Create Pull Request が追加されます。ローカルでマージする代わりに、ブランチをプッシュし、エージェントに選択した宛先に対するクリーンな GitHub プルリクエストを開かせます。認証情報を参照。 - マージは worktree を破棄しません — 結果に満足したら、自分で片付けます。
Attach terminal はプレーンなターミナルタブを開きます — エージェントはなく、worktree のチェックアウトにすでに cd されたシェルだけ — が worktree の下にネストされるので、その変更を手動で検査またはテストできます。
worktree を破棄はクリーンアップステップであり、破壊的です。チェックアウトを削除し、ブランチを削除します。そのブランチ上でマージされなかったコミットは失われるため、最初に確認します — 「Discard worktree "«name»"?」— そしてチェックアウトとともにタブを閉じます。
メモ: マージまたはプルリクエストを渡るのはコミットされた作業のみです。worktree 内のコミットされていない変更はその worktree に留まり、破棄すると永久に失われます。
スケジュールされた自動化からの worktree
スケジュールされた自動化も worktree を作成します。無人での各実行は、独自の wt/<slug> ブランチに新しい git worktree を作成し、そこでエージェントを起動します。そのため、実行は通常の worktree タブとして着地します — 手動で作成したものとまったく同じように、インデントされ、アタッチ可能で、マージ可能です。自動化を参照。
ターミナル
アクティブなタブは、ネイティブなホスト側のターミナルサーフェス(libghostty、Metal レンダリング)にレンダリングされ、virtio ソケット経由でその tmux ウィンドウにアタッチされます。サーフェスの子プロセスは単なるバイトポンプなので、子プロセスの終了 — VM の再起動、ソケットの切断 — でターミナルの状態が失われることはありません。サーフェスは単に再生成され、バックオフ付きで再アタッチします。ネイティブターミナルが起動できない場合、アプリは黙って VM のグラフィカルフレームバッファにフォールバックします。どちらも同じ tmux セッションのビューです。
外観 — フォントファミリーとサイズ、背景色と前景色、カーソルの形状と点滅 — は、ワークスペースの外観設定から来ており、プロファイルを保存するとライブで適用されます。新しいワークスペースは、ダークスレート背景(#212734)上の JetBrains Mono 12 でシードされ、前景は Terminal.app のテーマから取得されます。固定ピッチのフォントのみがレンダリングされます。解決できないフォントやプロポーショナルフォントは Menlo にフォールバックします。
フォントズームはサーフェスごとに利用できます:⌘+ / ⌘− / ⌘0、トラックパッドのピンチ(±0.25 の各拡大ステップでフォントサイズが1段階変わります)、そして2本指のダブルタップでリセットします。
ウィンドウの不透明度が 1.0 未満のワークスペースは、すりガラスのターミナルになります。ターミナル領域は背景ぼかしとともにデスクトップに対して合成され、タイトルバー、サイドバー、仕切りは不透明のままです。不透明度は 0.3–1.0 にクランプされ、プロファイル保存時にライブで適用されます。
ターミナルグリッド
グリッドは、任意のワークスペースの組み合わせから最大 25 個のライブターミナル(レイアウトは正方形に近づくように広がり、5 × 5 で上限)を並べて表示するステージサーフェスです — worktree エージェントのフリートを見守るのに最適です。各セルは、その tmux ウィンドウ上の独立したライブターミナルサーフェスで、ワークスペースのステージビューとは独立しているため、両方を同時に開くことができます。
- ターミナルを追加 — 任意のタブ行をサイドバー上部のピン留めされた Grid ノードにドラッグするか(ツールチップには「Drag terminals here to watch them side by side」と表示されます)、アクティブなターミナルで ⌘D を押してピン留めしグリッドにジャンプします。ワークスペースの ⋯ メニューの worktree をグリッドに追加は、すべての worktree タブを一度に追加します。
- グリッドを表示 — Grid ノード(または折りたたまれたレールのグリッドボタン)をクリックします。メンバー行をクリックするとそのセルにフォーカスします。
- セルコントロール — 各セルのヘッダーには、ステータスドット、ワークスペース名、タブラベルが表示され、ホバーコントロール Open in workspace と Remove from grid — the terminal keeps running、そしてセル位置を入れ替えるドラッグハンドルが付きます。セルヘッダーを右クリックすると同じアクションが表示されます。
- ズーム — セルをダブルクリック(またはフォーカスされたセルで ⌘↩ を押す)してステージ全体にズームします。繰り返すとズームを解除します。エージェントが Esc を使うため、Esc は意図的にズームを解除しません。
オフまたはサスペンド中のワークスペースに属するセルは、オフまたはサスペンド中ラベルと開始ボタンを持つプレースホルダーカードとして残ります。tmux ウィンドウが消えたセルは削除されます。グリッドのメンバーシップはアプリの再起動をまたいで保持されます(~/Library/Application Support/BromureAC/grid-layout.json 内)。
エージェント型ブラウザペイン
ブラウザペインは、ステージ内の右側の分割で、ライブの Chromium をホストします — 独自の使い捨てサイドカー VM(ワークスペースごとに1つ、初回オープン時に遅延作成)で実行されます。あなたとエージェントの両方がそれを操作します。エージェントは組み込みのブラウザ MCP サーバーを通じて制御し、そのツール呼び出しは選択したワークスペースのブラウザを自動的に起動して表示できます。手動で閉じた後は、ペインが自身で再度開くことはありません。
ヒント: このセクションでは、ブラウザをセッションウィンドウの1つのペインとして扱います。ブラウザの使い方の完全ガイド — 自分で操作する、
browser_*ツールを通じてエージェントに操作させる、サインインを維持する、プライバシーモデル — については、組み込みブラウザを参照してください。
⌃⌘B またはグローブツールバーボタンでペインを切り替えます。初めて開くとき、同意カードが ブラウザをインストールしますか? と ダウンロードしてインストール / 後で で尋ねます — ブラウザイメージはおよそ 500 MB の一度きりのダウンロードです。
そこでできること
ペインは、コンパクトな Safari スタイルのタブバーを上部に配置した、クロームのないブラウザビューです:
- 戻る/進む — 矢印ボタン、または ⌘[ と ⌘]。
- タブピル — タブごとに1つのピル。アクティブなピルは URL フィールド(「Search or enter URL」)を兼ねます。裸のホスト名には
https://が前置されます。URL でないものは Google 検索になります。 - + — 新規タブ(ペインにフォーカスがある間は ⌘T)。
- DevTools — Chromium の DevTools を切り替えます(F12)。
- 共有 — 標準の macOS 共有メニュー。
- サイト情報 — favicon をクリックすると、HTTPS ページの証明書の詳細を含むサイト情報ポップオーバーが表示されます。
ブラウザ VM はワークスペース VM と同じ NAT サブネットを共有するため、ワークスペースの IP でエージェントの開発サーバーを直接読み込めます — ツールバーの IP ピルからコピーしてください。
ペインの左端をドラッグしてサイズを変更します(デフォルト 640 ポイント、380 から 1400 の間。ターミナルは常に少なくとも 240 ポイントを保ちます)。最小値未満までドラッグするとペインが閉じます。
ライフサイクルと永続性
ブラウザはデフォルトで使い捨てです。そのディスクは、ブラウザが解体されると削除される一時的なクローンなので、Cookie とログインはそれとともに消えます。非表示のブラウザは 10 秒後にサスペンドし、折りたたまれてから 5 分後に完全に解体されます。ペインの開閉状態はアプリが実行中はワークスペースごとに記憶されますが、意図的にアプリの再起動をまたいでは記憶されません — 一時的なブラウザはいずれにせよ再起動を生き延びません。
ログインを維持するには、ワークスペースのブラウザ設定で ウェブサイトにサインインしたままにするを有効にします。すると Chromium のプロファイルはワークスペースごとの暗号化されたディスクに保存され、解体を生き延びます。この設定を切り替えると、ワークスペースのブラウザが再起動します(保存時に警告されます)。
メモ: ブラウザビューにキーボードフォーカスがある間、⌘Q と ⌘Tab はゲストによってキャプチャされます。ターミナルまたはサイドバーをクリックして取り戻してください。
ファイルエクスプローラーペイン
ファイルエクスプローラーペイン(ヘッダー FILES)は、アクティブなタブの git リポジトリを IDE スタイルのソースファイルツリーとして表示します。アクティブなタブのディレクトリが git リポジトリに入った瞬間に自動的に開きます — リポジトリへの cd、またはすでにリポジトリ内にあるタブへの切り替え — ので、手動で開くことはめったにありません。⌃⌘E または リポジトリファイルの表示/非表示(⌃⌘E) ツールバーボタンでも切り替えられます。リポジトリに入ることがトリガーなので、リポジトリを一度も訪れないワークスペースは、単にペインを表示しません。
- git ステータスを一目で — ファイルはステータスによって色分けされ、1文字のバッジ(M/A/U/D/R/!)が付きます。変更を含むフォルダにはオレンジのドットが付き、ピルが変更ファイル数を表示します。「変更されたファイルのみ」フィルターと手動更新ボタンがヘッダーにあります。
- 差分とプレビュー — ファイルを選択すると、Diff / File のセグメント化コントロールを持つ詳細分割が開きます:+/− のカウントと行番号ガターを持つ色付きの統合差分、またはレンダリングされたプレビュー(Markdown はレンダリング、ソースファイルはシンタックスハイライト、画像とバイナリはフラグ付け)。削除されたファイルは取り消し線で表示されます — 「File was deleted — switch to Diff to see what was removed.」。追跡されていないファイルと新しく追加されたファイルには差分がなく、プレビューのみです。
- ポップアウトビューア — ポップアウトボタンは、ペインの選択にライブで追従する、フルスクリーン対応の別の File Viewer ウィンドウで詳細を開きます。
- worktree アクション — ヘッダーのすぐ下のバーは、サイドバーメニューを開くことなく、現在のリポジトリの git worktree を管理します:新規 worktree… はリポジトリ内で常に利用可能で、Merge と Delete はアクティブなタブ自体が worktree のときに表示されます。これらは Git worktree で説明されているのと同じ操作を実行します — 新規 worktree… は作成ダイアログを開き、Merge は宛先ピッカーを開き、Delete は確認後に worktree とそのブランチを破棄します。(ローカルセッションのみ。リモートミラーでは、サイドバーのタブメニューから worktree を管理してください。)
すべてのデータは、virtio ソケットのシェルチャネル経由でゲスト内で git(および head)を実行して収集されます — このペインは共有フォルダがなくても、そしてリモートワークスペースでも機能します。ツリーは表示中に 4 秒ごとに自動更新され、変更を含むディレクトリはリポジトリごとに一度だけ自動展開されます。
ペインは IDE スタイルで自身で開閉します:リポジトリに入ると(そこへの cd、またはディレクトリがリポジトリ内にあるタブへの切り替え)開き、リポジトリでないディレクトリへ移動すると閉じます。手動で閉じると、リポジトリを変更するまでそれが優先されます。ペインの左端をドラッグしてサイズを変更します(デフォルト 260 ポイント、200 から 1000 の間。200 未満で閉じます)。
メモ: ファイルツリーは読み取り専用です — ファイルの内容を編集することは決してありません(worktree バーは git 操作を実行し、ファイル編集ではありません)。制限:一覧表示は 20,000 ファイル(それを超えるとツリーは切り詰められます)、プレビューごとに 512 KB、差分ごとに 1 MB。
ファイルとクリップボードの移動
ファイルとクリップボード内容は、ホスト/VM 境界を4つの方法で越えます:ファイルブラウザウィンドウ、共有フォルダ、ターミナルクリップボード、そして画像ペースト。
ファイルブラウザウィンドウ
ファイルを参照ツールバーボタン(フォルダアイコン)をクリックすると、VM への出入りにファイルをやり取りするための Files — «workspace» というタイトルの Finder ライクなウィンドウが開きます。その Locations サイドバーは Home — virtio ソケットのファイルサービス経由でライブに参照されるゲストの実際の /home/ubuntu — に加えて、共有ホストフォルダごとに1つのエントリ(ホスト上で直接参照)を提供します。行にはアイコン、名前、サイズ、変更日が表示され、リストは 1.5 秒ごとに自動更新されます。
- コピーアウト — ウィンドウから Finder にファイルをドラッグします。ゲストファイルはドロップ時に遅延ダウンロードされます。
- コピーイン — パネルの任意の場所にファイルをドロップして、現在のディレクトリにコピーします。転送はチャンク化され(6 MB)、「Copying … in/out」の進捗ピルが表示されます。名前の衝突には Finder スタイルの「 copy」サフィックスが付きます。ドロップされたフォルダは丸ごと届きます。
- ツールバー — 上矢印(Enclosing folder)、等幅のゲストパスのパンくずリスト、New folder、Reveal in Finder(ホストの場所のみ)、そして Refresh。
- コンテキストメニュー — Open、Reveal in Finder(ホスト行)、そして Move to Trash(ホスト)または Delete(ゲスト)。
- ダブルクリック — ホストファイルはデフォルトのアプリで開きます。ゲストファイルは、まずワークスペースごとのキャッシュにダウンロードされ、その後開きます。
メモ: 隠しドットファイルは表示されません。ゲストの場所にはライブの VM が必要で(「The workspace must be running to browse its files.」)、起動したばかりの VM は一時的に「The in-VM agent is updating — try again in a few seconds.」と報告する場合があります。
共有フォルダ
継続的なプロジェクト作業には、通常、共有フォルダの方が一度きりの転送よりも適しています:最大8つのホストフォルダを VM にマウントでき、それぞれがゲストホームに ~/<basename> としてシンボリックリンクされます(src-2 のような自動重複排除付き)。ワークスペースのフォルダ設定で構成します。
クリップボード
クリップボードはターミナルプロトコル自体を通じてブリッジされます — 構成する別個のエージェントはありません:
- ゲスト → Mac — ゲスト内でのコピー(tmux コピーモード、OSC 52)は自動的に macOS ペーストボードに着地します。tmux でマウス選択を離すとコピーされます。
- Mac → ゲスト — ⌘V は、ブラケットペーストを使って macOS クリップボードをターミナルにペーストします。
- 選択 — 通常のマウスドラッグは macOS スタイルでテキストを選択します。⌘C はホスト側の選択をコピーします。選択自体がコピーすることはありません。
画像のペースト
クリップボードに画像がある状態で ⌘V を押すと、ファイル転送になります:画像はゲスト内の /home/ubuntu/.bromure/pastes/clipboard-<timestamp>-<id>.<ext> に書き込まれ、その場所にゲストのファイルパスがテキストとしてペーストされます — そのためエージェントはディスクから画像を読み取れます。アップロード中は、キャレットに一時的なサムネイルチップが進捗行とともに表示され、完了時にしばらく残り(失敗時は赤)、次のキー入力で消えます。
画像として認識されるもの:Finder からコピーされた画像ファイル(コピーされたすべての項目が画像である場合のみ)、およびスクリーンショットやブラウザの「画像をコピー」のような裸のビットマップ — テキストフレーバーも伴うものは通常どおりテキストとしてペーストされるので、通常の ⌘V が乗っ取られることはありません。ペーストは合計 96 MB で上限が設けられ(それより大きいとテキストにフォールバック)、7 日より古いペーストファイルはゲスト内で自動的にクリーンアップされます。ペーストディレクトリはホームイメージ内にあるため、ペーストされたパスは VM の再起動を生き延びます。
ヒント: リンクは逆方向に自動的に機能します:エージェントや CLI ツールがゲスト内で開く URL(OAuth ログイン、
xdg-open)はホストに中継され、デフォルトの Mac ブラウザで開きます。中継されるのはhttp/httpsの URL のみで、レート制限があります。mailto:リンクは意図的にドロップされます。
チェックポイントとロールバック
Bromure は自動的にロールバックポイントを取得するため、うまくいかなかったセッションを、完全なリセットなしに巻き戻せます。
何がいつキャプチャされるか
ワークスペースの成功した各起動時に、アプリはワークスペースの checkpoints/ ディレクトリの下に、両方のストレージ層をコピーオンライトクローンとして黙ってスナップショットします:
- システムディスク(
disk.img)、そして - ext4 ホームイメージ(
home.img、checkpoints/home/の下に保存)、最新のホームモデルのワークスペースについて。
チェックポイントは、動作するターミナルを生成した起動の後にのみ取得されるため、すべてのチェックポイントは起動可能であることが証明されています。保持は階層的なラダーに従います:直近の数回の起動は無条件に保持され、その後1週間は1日1つ、その後1か月は1週間1つ。チェックポイントの作成は無料ですが、ライブディスクがそこから乖離するにつれて、実際のディスク容量を消費します。
ホームの復元
ホームを復元… は、ワークスペースエディタのリソースペインの Your home folder ストレージ行にあります(ワークスペースの実行中は無効化されます — まずセッションウィンドウを閉じてください)。
クリックすると、利用可能なロールバックポイントがポップアップで一覧表示されます — ダイアログが説明するように、「each one is the home as it was when that session started」。1つを選んで確認します:現在のホームが最初にチェックポイントされるため、復元自体を取り消すことができます。ext4 ホームモデルで一度も起動したことのないワークスペースは、代わりに No home checkpoints yet と表示します。
システムディスクのリセット
ベースにリセット… は、同じペインの Workspace system disk 行にあり(サイドバーの ⋯ メニューの ディスクをリセットでも)、システム層に対する最終手段です:disk.img を削除するので、次の起動でベースイメージの新しいコピーを再クローンします。確認 — 「Reset "«name»" system disk to base?」— は何がワイプされるかを明示します:sudo apt install したすべて、/etc、/var、/usr、/opt への変更、そしてシステム全体の構成。ホームフォルダはそのまま残ります:プロジェクト、ドットファイル、SSH キー、シェル履歴はすべて残ります。
リセットは VM の実行中はブロックされ、リセットは保存された RAM スナップショットとタブ状態も破棄します — 新しいディスクと古い RAM の組み合わせは即座に破損してしまうためです。
メモ: チェックポイントはサスペンドとは異なる問いに答えます。サスペンドは現在のセッションの実行状態を保存して再開できるようにします。チェックポイントは既知の正常な時点でのディスク内容を保存して、壊れた環境を巻き戻せるようにします。サスペンドスナップショットは、それが属するディスクがリセットまたは復元されるたびに破棄されます。
ヒント: 何も起動せずにチェックポイントや停止中のワークスペースのホームイメージにフォレンジックアクセスするには、Workspaces ▸ Open ext4 file… で任意の ext4
.imgを読み取り専用の Finder ライクなブラウザで開きます — Mac 上で直接ファイルをプレビューし抽出できます。完全なブラウザ、その場での編集、fsck統合については高度な機能を参照してください。
セッションの終了
セッションを終了すると — ワークスペースのサイドバー行の ×、ポップアウトされたウィンドウの閉じるボタン、または最後のタブでの ⌘W を介して — 一般設定ペインのワークスペースの When closing the window 設定が解決されます:
| アクション | 機能 |
|---|---|
| バックグラウンドで実行 | UI のみをデタッチします。VM はヘッドレスで実行し続け — エージェントは作業を続け — サイドバーからいつでも再アタッチできます。 |
| サスペンド | VM を一時停止し、その RAM をディスクに保存します(ワークスペースのストレージ内の vm.state)。次の起動でほぼ瞬時に復元され、同じターミナルが表示されます。タブバーもスナップショットされる(tabs.json)ので、復元されたセッションはすぐにタブを表示します。 |
| シャットダウン | クリーンな ACPI 電源オフ。実行中のプロセスは停止します。システムディスクとホームは保持されます — 何も破棄されません。完全なシャットダウンは保存されたサスペンド状態をクリアするので、次の起動はコールドブートになります。 |
| 確認(デフォルト) | 毎回プロンプトを表示します:「Close "«name»"?」に Run in the Background、Suspend、Shut Down、Cancel のボタンと、説明「Run in the background keeps the VM running so you can reattach later. Suspend saves its state to disk. Shut down powers it off.」が付きます。 |
知っておく価値のあるいくつかの詳細:
- サスペンド/再開のアイデンティティ — 復元にはまったく同じ VM 構成が必要なため、ワークスペースのマシン識別子、MAC アドレス、共有パスがスナップショットとともに永続化されます。再開時、ホストはゲストに ping を送信してそのクロックを再同期します。
- 復元の失敗 — 保存されたスナップショットがインタラクティブな起動で復元できない場合、アプリは新しい起動にフォールバックします。自動化によって開始された起動は代わりに中止します — サスペンドされたセッションを黙って破棄することは決してありません。
- サスペンド中の共有フォルダの変更 — スナップショットは異なる共有セットに対して再開できないため、共有フォルダを編集すると Discard suspended VM… の確認が強制されます。次の起動はコールドブートになります。ホームと共有フォルダのファイルは影響を受けません。
- ゲストが開始した再起動 — ゲスト内で
rebootを実行してもセッションは終了しません:アプリは再起動の意図を検出し、VM をその場で再起動します。 - データの破棄は常に明示的 — シャットダウンされたワークスペースはそのディスクとホームを保持します。データは ベースにリセット…、ホームを消去…、ワークスペースを削除(すべて確認あり。ワークスペースを参照)、または認証情報窃取の侵害後の強制ワイプによってのみ破棄されます — そしてその場合でもプロファイル設定、トークン、SSH キーは保持され、共有ホストフォルダには決して触れません。
キーボードショートカット
セッションウィンドウのコードはホストが所有します — ターミナルがそれらを見る前にインターセプトされるため、VM 内で何が実行されていても機能します。
ウィンドウとタブ
| ショートカット | アクション |
|---|---|
| ⌘T | 新規タブ |
| ⌘W | タブを閉じる(最後のタブはセッションを終了) |
| ⌘1 – ⌘9 | サイドバーの行順でタブを選択 |
| ⌘D | アクティブなターミナルをグリッドにピン留めして表示 |
| ⌘↩ | フォーカスされたグリッドセルをズーム/ズーム解除 |
| ⌘N | ワークスペースマネージャーを開く |
| ⌃⌘S | サイドバーを切り替え |
| ⌃⌘E | ファイルエクスプローラーペインを切り替え |
| ⌃⌘B | エージェント型ブラウザペインを切り替え |
| ⇧⌘I | トレースインスペクタを開く |
ターミナル
| ショートカット | アクション |
|---|---|
| ⌘C | 選択をコピー |
| ⌘V | ペースト(画像はファイルとしてゲストにアップロード) |
| ⌘+ / ⌘− / ⌘0 | フォントサイズを拡大/縮小/リセット |
| ピンチ/2本指ダブルタップ | フォントをズーム/ズームをリセット |
ブラウザペイン(フォーカス中)
| ショートカット | アクション |
|---|---|
| ⌘T / ⌘W | ブラウザタブを新規作成/閉じる |
| ⌘R | 再読み込み |
| ⌘[ / ⌘] | 戻る/進む |
| ⌘L | アドレスフィールドにフォーカス |
| F12 | DevTools を切り替え |
メモ: 80 ms の自動リピートガードにより、コードを押し続けると1回だけ発火します。意図的な再押下はすべて発火します。