コンセプトとアーキテクチャ
Bromure Agentic Coding は、AI コーディングエージェントを Mac 上のハードウェア仮想化された Linux マシンの中で実行し、すべてのセキュリティ制御をエージェントが迂回できない 1 点で実施します。この章では、マニュアルの残りの部分が前提とする用語――セッション、マシン、ルーム、ブランチ、ホストとゲスト、ワイヤ境界――を定義し、各部分がどう組み合わさるかを説明します。クイックスタート以外に 1 章だけ読むなら、この章を読んでください。
セッション、マシン、ルーム、ブランチ
アプリで行うことのほとんどは、4 つのオブジェクトで成り立っています。
セッション
セッション とは、1 台のマシン上の 1 つのフォルダで、1 つのエージェントと交わす 1 つの会話です。新規セッション画面から開始します。セッションにはタイトル(最初のメッセージからエージェントが付け、名前は変更できます)、エージェント(Claude Code、Codex、Grok、Kimi Code、Oh My Pi)、マシン、そしてそのマシン内の作業フォルダがあります。サイドバーに並び、チャットに表示されるのがセッションです。
マシンの中では、セッションは専用のターミナルタブで動くエージェントです。そのタブを見る必要はほとんどありませんが、見ることもできます。ツールバーの Linux ピル(⌥⌘U)またはセッションのメニューの Linux ターミナルで開く で切り替わり、ピル(表示が セッション に変わります)で元に戻ります。
セッションはエージェントのプロセスより長く存続します。エージェントが終了しても、マシンがシャットダウンしても、セッションは会話とともにサイドバーに残り、次のメッセージで同じ会話のままエージェントが再び起動します。セッションのホームを参照してください。
マシン
マシン とは、分離された Linux VM と、その設定および永続的なストレージをまとめたものです。メインウインドウでは マシン と呼びますが、設定エディタ、いくつかのメニュー(新規ワークスペース…、ワークスペース)、コマンドラインでは ワークスペース と呼びます(内部や profile.json などのファイル名では プロファイル)。3 つの言葉はすべて同じものを指します。
マシンは、そこで動くすべてのセッションに適用される認証情報、共有フォルダ、環境、MCP サーバー、ガードレール、モデルの上書き、外観、VM のサイズを定義します――設定エディタで編集するものすべてです。すべてのエージェントはすべてのマシンで使えます。マシンは動いていてもいなくても存在し、1 台のマシンで多数のセッションを同時に動かせます。それぞれが自分のフォルダとターミナルタブを持ちます。
一般的には、プロジェクトごと、または認証情報の境界ごとに 1 台のマシンを使います。同じマシン上のセッションは、そのディスク、認証情報、ネットワーク上の ID を共有します。マシンはサイドバーの 仮想マシン の下に並びます。マシンを参照してください。
マシンの実行期間 とは、マシンの VM が電源の入った状態で続く 1 回の期間です。マシンが起動または再開したときに始まり、シャットダウンまたはサスペンドしたときに終わります。一部の状態はマシンではなく実行期間に属します。あなたが与えた認証情報の承認はメモリ上にあり、実行期間が終わると取り消されます。また、起動ごとの設定共有は起動のたびに作り直されます。
ルーム
ルーム は、同じことに取り組むセッションをまとめたものです。ルームを開くと、そのセッションがライブチャットのグリッドとして並び、入力欄からどれか 1 つ、または全部に一度に送信できます。ルームには専用の スイッチボード を持たせることができます。これはそのルームのセッションだけを見守るセッションです。ルーム内のセッションは別々のマシンで動いていてもかまいません。ルームを参照してください。
ブランチセッション
ブランチセッション は、別のセッションから独自の git ブランチ上で開始するセッションで、同じマシン上の同じリポジトリの別のチェックアウト(git worktree)で動きます。元のセッションのフォルダに触れずに作業し、結果に満足したらレビューして元にマージします。ブランチとレビューを参照してください。
ほかのセッションが開始するセッション
あなたではなく、ほかのものが開始するセッションが 2 種類あります。
- デリゲート。 エージェントは、新しい子セッション(独自のブランチ上、または別のマシン上)に仕事を渡し、結果を待つことができます。子セッションは、それを開始したセッションの下に表示されます。エージェントは既存のセッションに @ニックネーム で依頼を送ることもできます。エージェントの協働を参照してください。
- スイッチボード。 ほかのすべてのセッションを見守る Claude Code のセッションです。進行中のセッションが 2 つ以上になるとサイドバーに現れ、最後に使ったマシンのフォルダ
~/.bromure/switchboardで作業し、厳格なルールのもとで、あなたに代わってセッションを読んだり、答えたり、開始したりできます。ルーム専用のスイッチボードは~/.bromure/rooms/<room>で作業し、そのルームだけを見ます。スイッチボードとメッセージングを参照してください。
自動化の実行とコーディングタスクもセッションとして動き、終わるとアーカイブされます。自動化とコーディングタスクを参照してください。
セッションの状態
サイドバーは、セッションをどのマシンで動いているかではなく、あなたに何を求めているかでグループ分けします。
| 状態 | ドット | 意味 |
|---|---|---|
| 対応が必要 | 赤 | エージェントがあなたを待っています。質問、許可の確認、またはサインイン(「サインインが必要」)です。 |
| 作業中 | オレンジ | エージェントが作業中か、セッションがまだ起動中です。 |
| 準備完了 | 緑 | エージェントがターンを終え、次のメッセージを待っています。 |
| 一時停止中 | — | セッションのマシンがオフかサスペンド中です。次のメッセージでマシンが起動し、会話が再開します。 |
| 完了 | — | エージェントが終了したか、あなたがセッションを終了しました。次のメッセージで同じ会話のままエージェントが再び起動します。 |
これらのグループの外にセッションが置かれる場所がほかに 2 つあります。
- アーカイブ済み は、片付けた会話を入れておく、セッション一覧の下部にある折りたたみ領域です。アーカイブしたセッションも読むことができ、メッセージを 1 つ送れば戻ってきます。完了してから 3 日を超えたセッションは自動でアーカイブされます。ただしルーム内のセッションとスイッチボードは除きます。デリゲート、コーディングタスク、自動化の実行は、終わるとすぐにアーカイブされます。
- マシンやフォルダがもう存在しないセッションは、「マシンが削除されました」または「フォルダが削除されました」として薄く表示されます。削除されたマシンのセッションは、一覧の末尾に 削除 ボタン付きの 1 行にまとめられます。
ホストは各セッションの会話のコピーを(~/Library/Application Support/BromureAC/transcripts/ に)保持し、エージェントの実行中に更新します。そのため、一時停止中・完了・アーカイブ済みのセッションも、マシンを起動せずに読むことができます。
ホストとゲスト
Bromure Agentic Coding のすべては、明確な一線のいずれか一方に存在します:
- ホスト は、あなたの Mac――Apple Silicon 搭載の macOS 14 以降――と、その上で動く Bromure Agentic Coding アプリです。機密性の高いものはすべてホストにあります。本物の認証情報(macOS キーチェーンのマスターキーで暗号化)、サインイン、エージェントに代わってインターネットと通信する MITM プロキシ、Bromure ルート CA の秘密鍵、トレースとセキュリティ タイムライン、そしてアプリのウインドウ、チャット、ターミナルです。あなたが入力するチャットやターミナルは VM の中ではなく、ホスト上で描画されます。
- ゲスト は、エージェントが実際に動く Linux VM です――Claude Code、Codex、Grok、Kimi Code、Oh My Pi、または素のシェルツールと、それらがインストールし触れるすべてのもの:クローンしたリポジトリ、パッケージキャッシュ、Docker コンテナ、virtualenv。ゲストは設計上、信頼できないものとして扱われます。本物の秘密情報は持たず、意図的に無効にしたダミーの認証情報だけを持ち、外向きの Web トラフィックはホストのプロキシを通ります。
両者は 2 つの細い経路で通信します。制御、ターミナル、MCP サーバー、プロキシへの経路には vsock(virtio ソケット。ネットワークを必要としないホスト–ゲスト間の経路)を、通常の IP トラフィックにはプライベートな仮想ネットワークを使います。どちらも以下で説明します。
この分離こそが、セキュリティの主張を具体的なものにしています。プロンプトインジェクションを受けたエージェントや誤動作するエージェントは、ゲストの 中では 何でもできますが、本物の API キーを読むことも、本物の AWS シークレットで署名することも、SSH の秘密鍵を取り出すこともできません――そのどれも、エージェントの側には存在しないからです。
アーキテクチャの概要
図は下から上へ読みます。エージェントはマシンの VM で作業し、その HTTPS は vsock を通ってホストのプロキシへ出ていきます。ダミーの認証情報が本物になるのはそこだけです。アプリは別の vsock ブリッジで VM のターミナルに接続します。オプションの使い捨てブラウザ VM は同じプライベートネットワークを共有するので、エージェントの開発サーバーを読み込めます。
マシンとブラウザ VM のほかに、アプリは独自の管理対象 VM を 3 種類動かせます。いずれも同じプライベートネットワーク上にあります:Kubernetes クラスターのノード と コンテナレジストリ(Kubernetes クラスタとレジストリを参照)、そしてスイッチボードを Signal、WhatsApp、Slack とつなぐ メッセージングコネクタ(スイッチボードとメッセージングを参照)です。これらはサイドバーの 仮想マシン の下に表示されますが、マシンではありません。エージェントは動いていません。
マシンの VM
各マシンの VM は、Apple の Virtualization.framework 上で動く Ubuntu 24.04 のゲストです。Virtualization.framework は Apple Silicon を必要とし、ARM64 のゲストしかサポートしません。VM は 4 基の vCPU と、マシンの リソース ペインで設定したメモリ量で、2 つの仮想ディスクから起動します。
disk.img――システムディスク。マシンの初回起動時に、共有の署名済み Ubuntu ベースイメージ(インストールと初回起動を参照)の APFS コピーオンライトクローンとして作られます。クローンは瞬時に作成され、ゲストが書き込むまで新たなディスク容量を使いません。以降の起動では同じクローンを使い続けるので、apt installしたパッケージ、pull した Docker イメージ、そのほかのシステムレベルの変更は残ります。home.img――/home/ubuntuを収めたプライベートな ext4 ディスクで、2 台目のディスクとして接続されます。サイズは既定で 16 GiB ですが、使った分だけ容量を消費し、ゲストでファイルを削除するとホスト上でも縮みます。ホームは ディスクをリセット でも残ります。そのため、リポジトリ、dotfile、シェル履歴、各セッションのフォルダは、システムディスクをリセットしても失われません。
ゲストは起動ごとの小さな共有もマウントします。その起動の設定(ダミーの認証情報の環境ファイル、プロキシ設定、Bromure CA の証明書、ゲストエージェント、MCP の設定)を載せた読み取り専用の メタ共有 と、ゲストがホストに状況(IP アドレス、ターミナルタブ、エージェントの状態)を報告するための書き込み可能な アウトボックス です。どちらも起動のたびに作り直され、永続的な状態は持ちません。Mac のフォルダも最大 8 つまでゲストに共有でき、ホームフォルダ内に現れます。
設計上、永続的である — Bromure(Web)との対比
Bromure Agentic Coding は姉妹アプリの Web ブラウザ Bromure とコードベースを共有していますが、両者は意図的に寿命について正反対の選択をしています。
| Bromure(Web) | Bromure Agentic Coding | |
|---|---|---|
| ゲストイメージ | Ubuntu + Chromium | Ubuntu 24.04 |
| VM の寿命 | ブラウジングセッションごとに使い捨ての VM を 1 つ。ウインドウを閉じると破棄 | マシンごとに永続的な VM を 1 つ。実行期間をまたいで再利用 |
| 閉じたときのデータ | すべて破棄 | システムディスクとホームは保持 |
| 制御の対象 | VM の状態すべて(捨てられる) | VM の 秘密情報の露出面(ダミーの認証情報、ワイヤ境界) |
コーディングには永続的な状態――クローンしたリポジトリ、パッケージキャッシュ、virtualenv、シェル履歴――が必要なので、セッションのたびに VM を捨てていてはエージェントは役に立ちません。Bromure Agentic Coding は VM の状態を制御する代わりに、VM が持つことを許されるものを制御します。本物の秘密情報は一切持たせず、仲介なしにインターネットへ出る経路も与えません。それでも使い捨てのマシンは選択肢として残っています。ディスクをリセット はベースイメージからシステムディスクをクローンし直し、ホームを巻き戻す… はホームを以前のチェックポイントに戻し、bromure-cli vm run --rm は停止すると削除される使い捨てマシンを作り、侵害時のフローは汚染されたディスクとホームを消去しつつ設定とキーは残します。
ブラウザ VM
Bromure (Web) の一部は、Bromure Agentic Coding の中でも生きています。セッションの横にある組み込みブラウザです。あなた(またはエージェント)がそれを開くと、マシンには Ubuntu と Chromium を動かす 2 つ目の 使い捨て VM が用意されます。一時フォルダにクローンされ、ブラウザを閉じると削除されます。ブラウジングの状態は既定で破棄されますが、マシンで ウェブサイトにサインインしたままにする をオンにすると、Chromium のプロファイルがマシンごとの暗号化ディスクに保持されます。ブラウザ VM はマシンと同じプライベートネットワーク上にあるので、エージェントが起動したばかりの開発サーバーを読み込めます。組み込みブラウザを参照してください。
マシンの状態:オフ、一時停止中、実行中
各マシンは常に、持続する 3 つの状態のいずれかにあります。マシンの起動中は、短い間 起動中… も表示されます。
マシンを確認するには、サイドバー下部の 仮想マシン を展開します。マシンをクリックするとダッシュボードが表示されます。実行中は CPU、メモリ、ディスク、稼働時間がリアルタイムで表示され、オフのときは仕様と設定が 開始 または 再開 ボタンとともに表示されます。オフのマシンでセッションを始めると、マシンは自動で起動します。
| 状態 | VM は… | 保持されるもの | 失われるもの |
|---|---|---|---|
| オフ | まったく動いていない。 | システムディスク(disk.img)、ホーム(home.img)、チェックポイント、設定、SSH キー、ネットワーク上の ID。 | 実行中のプロセス、メモリ、ターミナルタブ、保存済みのメモリスナップショット(正常にシャットダウンすると消去されるので、次回はまっさらな状態から起動)。そのマシン上のセッションは 一時停止中 と表示されます。 |
| 一時停止中 | 凍結されている。メモリはマシンのフォルダの vm.state に、ターミナルタブは tabs.json に保存される。 | オフ で保持されるものすべて に加え、実行中のすべてのプロセスとターミナルタブ――再開すると止まったところからそのまま続きます。再開するまでセッションは 一時停止中 と表示されます。 | なし(スナップショットを破棄する必要がある場合を除く。下記参照)。 |
| 実行中 | 稼働している。 | すべてが稼働中。 | — |
知っておくべきルールがいくつかあります。
- サスペンドはメモリのスナップショットであり、保存ファイルではありません。 復元するには、VM の構成が保存時と同じでなければなりません。スナップショットが依存するもの――たとえばメモリサイズや共有フォルダ――を変更すると、マシンはまっさらな状態から起動し、ファイルには影響しません。何が変わったかはアプリのログに記録されます。
- スナップショットがディスクより長く残ることはありません。 システムディスクをリセットまたは消去すると、保存済みのメモリスナップショットも破棄されます。新しいディスクに古いメモリを組み合わせると、たちまち壊れてしまうからです。
- オフは消去を意味しません。 シャットダウンしたマシンは、システムディスクとホームを無期限に保持します。実際の削除は常に明示的な操作(ディスクをリセット、ホームを巻き戻す…、ワークスペースを削除)によるか、侵害時のフローによって強制されるかのどちらかです。
クローズ動作
マシンのウインドウを閉じたときの動作は、マシンごとに選べます(一般 ペインの ウインドウを閉じるとき):バックグラウンドで実行(ウインドウなしでマシンが動き続ける)、サスペンド、シャットダウン、または 確認する――既定値で、毎回尋ねます。マシンを参照してください。
ワイヤ境界
ワイヤ境界はこの製品の中心となる考え方です。ゲストから外へ出る Web トラフィックは すべて ホスト側の中間者(MITM)プロキシを通り、秘密情報の保護、認証情報の範囲制限、サプライチェーンのスキャン、プロンプトインジェクションの検出、個人データ保護、トレースといったすべての保護が、この 1 点で実施されます。エージェントの側には役に立つものが何もないので、エージェントはこれを迂回できません。
エンドツーエンドのフロー:
- ゲストが持つのはダミーだけ。 マシンが起動すると、ホストは意図的に無効にした代替の認証情報を VM に書き込みます――
ANTHROPIC_API_KEYなどの環境変数や、~/.git-credentials、~/.docker/config.json、~/.kube/configなどのファイルです。ダミーは本物と同じ形(sk-ant-api03-brm-…、ghp_…形式、brm_…)を保つのでクライアント側のチェックを通り、インストールごとに固定されているので、ツールから見て実行期間ごとにキーが変わることはありません。対応する本物の値は、ホスト上のプロキシのメモリに、それぞれが属するホストと結び付けて読み込まれます。 - ゲストの TLS はプロキシで終端する。 ゲストのすべてのシェルは
HTTPS_PROXY=http://127.0.0.1:65534をエクスポートします。これは VM 内のエンドポイントで、vsock(ポート 8443)経由でホストのプロキシへトンネルします。さらに、ホストの仮想ネットワークスイッチがゲストからポート 80 と 443 への外向き接続を同じプロキシへ振り向けるので、プロキシ変数を無視するツールでも必ずここを通ります。プロキシは Bromure ルート CA が署名したホストごとの証明書を提示し、リクエストを検査して、本物のサーバーへ向けて再暗号化します。 - ダミーが本物になるのは外へ出るときだけ。 プロキシは各ダミーを本物の値に差し替えます――API キーやトークンはヘッダーの差し替え、サブスクリプションのサインインの裏にある代用キー、AWS は SigV4 の完全な再署名(ゲストは偽のシークレットで署名し、ホストがその署名を外して本物で署名し直す)、SSH は vsock 経由の ssh-agent による署名です。差し替えは登録されたホストとそのサブドメインにのみ適用され、似た名前のドメインには決して適用されないので、
api.anthropic.com用に登録した認証情報がほかのドメインへ注入されることはありません。
マシンは ガードレール ペインで透過的な振り向けをオフにできます。その場合も、プロキシ変数、認証情報の差し替え、トレース、ガードレールは引き続き適用されます。認証情報とワイヤ境界を参照してください。
Bromure ルート CA
プロキシがゲストの TLS を読めるのは、ゲストがプロキシを信頼しているからです。初回起動時、アプリはインストールごとの認証局――Bromure Agentic Coding ルート CA――を作成し、その 公開 証明書を起動時にメタ共有経由で各 VM の信頼ストアへインストールします。秘密鍵がホストを離れることはありません(~/Library/Application Support/BromureAC/ca/ にあり、あなただけが読めます)。Bromure の VM 以外にこの CA を信頼するものはありません。Mac 自身のトラフィックの傍受には使えず、ca/ フォルダを削除すれば、次回起動時に新しい CA が作られるだけです。
構造上フェイルクローズド
設計はフェイルクローズです。万一ゲストのトラフィックがプロキシを通らずに出ていっても――珍しいポートの生ソケットや、意図的な迂回の試みなど――提示できる認証情報は、どのサーバーも受け付けないダミーだけです。AWS は InvalidSignatureException を返し、API プロバイダーは代用キーを拒否します。境界を迂回しても攻撃者には何の得もありません。境界は秘密情報を チェック する場所ではなく、秘密情報が 存在する 唯一の場所だからです。
侵害検出器
境界はその逆の悪用――持ち出し――も監視します。プロキシは外向きのリクエストをすべて調べ、そのマシンに登録されたダミートークンが含まれていないかを確認します。ダミーの正当な宛先はただ 1 つ、それが作られたホストだけです。したがって、ほかの宛先へ向かうダミーは、エージェントが認証情報を漏らそうとしている証拠です。プロキシはリクエストを止め、マシンを一時停止し、あなたに警告します。マシンをシャットダウンするか、リクエストをブロックするか、セッションの残りの間その宛先を許可するかを選べます。外に出たのはダミーだけなので、本物の認証情報をローテーションする必要はありません。認証情報ごとの承認確認や期限付きの許可を含む認証情報モデルの全体は、認証情報とワイヤ境界にあります。
何が永続し、何が永続しないか
Bromure Agentic Coding は、何が残るかを明確にしています。各マシンのファイルは ~/Library/Application Support/BromureAC/profiles/<uuid>/ にあり、セッションはその隣のサポートフォルダにあります。
永続――シャットダウンやアプリの再起動をまたいで残る:
| 項目 | 場所 | メモ |
|---|---|---|
| システムディスク | disk.img | ベースイメージの APFS コピーオンライトクローン。ディスクをリセット、ワークスペースを削除、または侵害時の消去で削除されます。 |
| ホーム | home.img | 各セッションのフォルダを含む /home/ubuntu を収めます。ディスクをリセット でも残り、ホームを巻き戻す… で巻き戻されます。 |
| チェックポイント | checkpoints/、checkpoints/home/ | ディスクとホームのスナップショット。ホームを巻き戻す… と復元で使われます。 |
| マシンの設定 | profile.json | 秘密でない設定。秘密情報はホスト上で暗号化されて別に保存されます。 |
| SSH キー | ssh/ | マシンのキーペア(ゲストは vsock 経由で署名を依頼できるだけです)。 |
| ネットワーク上の ID | machine-identifier.bin と profile-macs.json 内の MAC アドレス | VM の ID――と通常は IP アドレス――を安定させます。サスペンドしたマシンの復元に必要です。 |
| サスペンドのスナップショット | vm.state + tabs.json | マシンが 一時停止中 の間だけ。 |
| ブラウザのプロファイル(オプション) | browser-profiles/<uuid>/image/ | ウェブサイトにサインインしたままにする のときだけ。マシンごとに暗号化されます。 |
| セッションとルーム | sessions.json、rooms.json、delegations.json(サポートフォルダ) | タイトル、エージェント、フォルダ、状態、ルームの所属、エージェント間で受け渡した作業。 |
| 会話のコピー | transcripts/(サポートフォルダ) | 各セッションの会話のホスト側コピー。マシンがオフのときに読むためのものです。 |
一時的――自動で作り直されるか削除される:
| 項目 | 寿命 |
|---|---|
メタ共有(meta-share/:ダミーの認証情報ファイル、プロキシ設定、CA 証明書、ゲストエージェント) | 起動のたびに作り直されます。 |
アウトボックス(outbox/) | マシンの 1 回の実行期間。 |
| ブラウザ VM のディスク(一時フォルダ内のコピーオンライトクローン) | ブラウザを閉じると削除されます。 |
| 認証情報の承認と拒否 | メモリ上のみ。マシンの実行期間が終わると取り消されます。 |
| ゲストのメモリ、プロセス、ターミナルタブ | マシンをサスペンドしない限り、シャットダウン時に失われます。 |
ここから 2 つのことが言えます。第一に、ウインドウを閉じたりセッションを終了したりしても、それだけで何かが削除されることはありません――破壊的な操作はすべて明示的で、確認を伴います。セッションを削除するとアプリから会話は消えますが、そのフォルダはマシン上に残ります。第二に、まっさらな状態に したい ときには、いくつかの選択肢があります。ホームを巻き戻す…、ディスクをリセット(ホームは残る)、マシンの削除、または bromure-cli vm run --rm による使い捨てマシンです。
メモ: Mac から共有したフォルダは、Bromure のストレージの外にある、ディスク上の普通のフォルダです。Bromure のどの操作もそれを削除することはなく――侵害時の消去でも同じです――消去の確認画面にもそう書かれています。
ホスト・ゲスト間ブリッジ(vsock)
Mac とゲストの間の対話的なやり取りはすべて virtio ソケットを通ります。これは VM のネットワークとは独立して存在する、ホストとゲストを直接結ぶ経路です。設定することはありませんが、存在を知っておくとトレースやトラブルシューティングを読むときに役立ちます。各ブリッジは番号付きの vsock ポートを使います。
マシン VM のブリッジ:
| ポート | ブリッジ | 運ぶもの |
|---|---|---|
| 8443 | MITM プロキシ | ゲストのすべての Web トラフィック――ワイヤ境界そのもの。 |
| 8444 | ssh-agent ブリッジ | ゲストの SSH_AUTH_SOCK からの署名要求。秘密鍵は境界を越えません。 |
| 8445 | AWS 認証情報ヘルパー | credential_process のフィード(本物のアクセスキー ID、偽のシークレット)。 |
| 8446 | Claude のサインイン/ローカル推論 | Claude サブスクリプションの代用キーと、ゲストからオンデバイスモデルへの経路(両者でポートを共有)。 |
| 8447 | Codex のサインイン | ChatGPT サブスクリプションの代用キー。 |
| 5800 | シェルブリッジ | ターミナルへの接続、bromure-cli exec、ファイルペイン、チャットやターミナルからのファイルのアップロード。 |
| 5010 | サインインのコールバック中継 | ループバックのサインインリダイレクト(gh、gcloud などのツール用)をゲストに届けます。 |
| 5840 | バイナリのアテスター | Enforce binaries のもとで、各接続の背後にあるプログラムを名指しする root 所有のアテスター。秘密によって固定されます。サンドボックスポリシーを参照。 |
| 5841 | カーネル・セントリー | ゲストカーネルからのカーネル・セントリーのイベントストリーム。認証され、番号が振られ、欠落がないか見張られます。 |
組み込みの MCP サーバー ――ホストがマシン上のすべてのエージェントに提供するツールで、それぞれゲスト内の小さなシムを介して到達します。
| ポート | サーバー | エージェントに提供するもの |
|---|---|---|
| 5830 | browser | 組み込みブラウザの操作。組み込みブラウザを参照してください。 |
| 5831 | タスクボード | コーディングタスクのツール:計画の設定、サブタスクの作成、作業のレビューへの引き渡し。コーディングタスクを参照してください。 |
| 5832 | 計画ストリーム | コーディングタスクの計画中に使うライブの計画チャネル。 |
| 5833 | bromure-automations | このマシンの自動化の一覧、作成、編集、削除、実行。自動化を参照してください。 |
| 5834 | bromure-infrastructure | このマシンが使える Kubernetes クラスターとレジストリ。Kubernetes クラスタとレジストリを参照してください。 |
| 5835 | bromure-delegation | ほかのセッションへの委任と、@ニックネームでの依頼。エージェントの協働を参照してください。 |
| 5836 | bromure-switchboard | スイッチボードのツール。スイッチボードのセッションだけが使えます。スイッチボードとメッセージングを参照してください。 |
ブラウザ VM のブリッジ: 設定(5000)、ファイル転送(5100)、Chrome DevTools Protocol(5200)、リンク中継(5300)、Web カメラ(5400)、タブストリップ(5810)、ネットワークトレース(5900)。
クリップボード
ターミナルタブには独立したクリップボードサービスはなく、クリップボードはターミナルそのものを通ります。ゲスト内でコピーすると(tmux の選択や、OSC 52 を使うあらゆるプログラム)macOS のクリップボードに入り、ターミナルでは ⌘C で選択範囲をコピー、⌘V でゲストに貼り付けます。ブラウザでは、ゲスト側のクリップボードエージェントが Mac と Chromium の間のコピー&ペーストを担います。
ファイル転送
Mac とマシンの間でファイルをやり取りする方法は 3 つあり、すべてマシンで説明しています。共有フォルダ(Mac 上にあるプロジェクトファイルの通常の経路)、ファイルペイン(ポート 5800 のシェルブリッジ経由でドラッグして出し入れ)、そして添付ファイル――チャットやターミナルにドロップまたは貼り付けた 512 MB までのファイルはマシンにコピーされ、そのパスがエージェントに渡されます。
ネットワーク
NAT モード(デフォルト)
NAT モードのすべてのマシンは、アプリ内の 1 つのソフトウェアネットワークスイッチに接続され、そのスイッチは 1 つの macOS vmnet NAT インターフェースを通じてインターネットに出ます。その結果、次のようになります。
- プライベートサブネットは 1 つ。 新規インストールでは
172.16.0.0/12内のプライベートな /24 をランダムに選んで保持し、Mac がすでに参加している172.xのネットワーク(Docker のものなど)は避けます。環境設定 › リソース のスイッチ(ワークスペースのサブネット ―― プライベートサブネットを使用(リモート間の衝突を回避))にサブネットが表示され、ランダムに選択 で新しいものを選べます。変更は次回マシンを起動したときに反映されます。スイッチがオフの場合、アプリは192.168.64.0/24、または LAN ですでにその範囲が使われていれば別の空いている192.168.x.0/24を使います。 - アプリは独自の DHCP サーバーを そのスイッチ上で動かし、リースは
dhcp-leases.sqliteに保持されます。各マシンは固定の MAC アドレス(profile-macs.json内)を持つので、通常は再起動しても同じ IP アドレスを保ちます。現在のアドレスは、マシンメニューの IP アドレスをコピー とマシンのダッシュボードで確認できます。 - VM 同士は互いに到達できる。 マシン、ブラウザ VM、クラスターのノード、レジストリは設計上同じネットワーク上にあるので、ブラウザはマシンで動いている開発サーバーを読み込め、2 台のマシンは互いのサービスを利用できます。ダッシュボードの待ち受けポート一覧には、到達可能な各サービスが、Mac から接続するときの
<IP>:<ポート>として表示されます。 - 外部からは隔離されている。 VM には Mac からは到達できますが、物理的な LAN からは到達できません。サービスを明示的に公開しない限り(たとえば待ち受けポート一覧から Cloudflare のクイックトンネルを使うなど)、ほかのものが接続することはできません。
- IPv4 のみ。 ゲスト内では IPv6 がオフになっており、
localhostは127.0.0.1に解決されます。
ゲストのネットワーク MTU は既定で 1280 に設定されています――VPN や企業ネットワークの背後でも安全な値です――。defaults write io.bromure.agentic-coding vm.mtu -int <値> で引き上げることができます。
通常の IP トラフィックは、認証情報が移動する経路ではないことを覚えておいてください。Web トラフィックはプロキシへ誘導され、プロキシを迂回したものが運ぶのはダミーの認証情報だけです――上で説明したフェイルクローズの性質です。
ブリッジモード(マシンごと)
マシンを物理的な LAN に参加させることもできます。マシンの リソース ペインで ネットワーク をブリッジに設定してインターフェースを選ぶと、VM はルーターから割り当てられた独自のアドレスでローカルネットワーク上に現れます(ほかのデバイスから直接到達する必要がある場合に便利です)。選んだインターフェースが起動時に使えない場合、マシンは NAT にフォールバックします。設定 › リソースを参照してください。
素早い起動
マシンが素早く起動できる理由は 2 つあります。
- コピーオンライトのディスク。 新しいマシンのシステムディスクは、ベースイメージのコピーではなく瞬時のクローンなので、初回起動で何ギガバイトもの書き込みを待つことはありません。以降のコールドスタートは通常の Linux の起動です。
- サスペンドと再開。 一時停止中 のマシンは起動処理を丸ごと飛ばします。メモリのスナップショットが復元され、ターミナルタブやエージェントも含めて、止まったところから続きます。
マシンはプールされず、事前起動もされません。各マシンはそれぞれが独立した永続的なコンピューターなので、交換可能なものを温めておく必要がないのです。例外は使い捨てのブラウザ VM で、Bromure Web と同じプールの仕組みから提供されます。