記事

リモートPTY端末のWebSocketストリーミングとリアルタイム共同観察の設計

クラウド上で Claude Code を動かすにはコンテナが必要です。ブラウザから見守るには、サンドボックスからの外向き接続、ブラウザソケット側で計測するバックプレッシャー、明示的な切断フレームが必要です。

エージェントをクラウドマシンに移すのは簡単な半分であり、誰もが語る部分です。製品の実用性を左右するもう半分は、そのマシンとブラウザ間の接続制御です。

A browser, a control plane and a sandbox. Output flows right to left; the congestion that starts at the browser has to be felt at the sandbox.browsercontrolsandboxoutputoutputslowholdreceive window closesstop writing
出力は右から左へ流れます。輻輳はブラウザ側で発生し、対応できる唯一の主体は遠隔地にいます。

画面が実行環境ではなくなる

エージェントをローカルから移す理由はPCの性能ではなく、実行を特定デバイスから解放するためです。

これにより、すべてのキーストロークと出力バイトがネットワークを経由することになります。

サンドボックスが外向きに接続する

エージェントを実行するマシンには公開ポートがありません。制御プレーンに対して1本の外向き接続を張り、全ブラウザを多重化します。

したがって、到達性ではなく、接続維持時の輻輳制御こそが重要になります。

第1のサイレント障害:誤ったソケットの監視

大量のログを出すビルドでは、ブラウザの描画能力を超える速度で出力が生成されます。

サンドボックス自身のソケットを監視しても、制御プレーンとの高速回線では詰まりません。詰まっているのはブラウザ側のソケットです。

遅い受信側で検知し、TCPのバックプレッシャーをサンドボックスまで伝播させて書き込みを一時停止します。

共有リンクでの読み込み停止は他者にも影響するため、ミリ秒単位で素早く制御します。

第2のサイレント障害:常に返答してしまう Ping

WebSocket の ping は OS のネットワークスタックが自動返答するため、タブを閉じても反応し続けます。

制御プレーンがブラウザの切断を明示的にサンドボックスへ送信し、不要な出力を止めます。

なぜこれが本質なのか

CLI をコンテナに入れるだけなら誰でもできます。接続状態を正直に管理することこそが実用性の分かれ目です。

ファイルの衝突を防ぐ予約ボードは専用記事で、秘密情報の分離は第3の記事で解説しています。

率直な答え

ノートPCを閉じても Claude Code は動き続けますか?

はい。エージェントプロセスと作業ディレクトリはクラウド上にあるため、PCを閉じても閲覧が終わるだけで処理は継続します。

クラウドエージェントのために自宅ネットワークのポート開放は必要ですか?

不要です。サンドボックスが制御プレーンへ外向き接続を張るセルフホストランナー方式のため、NAT 配下でも動作します。

観察しているブラウザが落ちた場合、タスクはどうなりますか?

タスクは継続します。制御プレーンがサンドボックスへ明示的に切断を通知するため、空の接続への無駄な配信は防止されます。