---
read_when:
    - ブラウザから Gateway を操作したい場合
    - SSH トンネルを使わずに Tailnet へアクセスしたい場合
sidebarTitle: Control UI
summary: Gateway向けのブラウザベースのコントロールUI（チャット、アクティビティ、ノード、設定）
title: コントロール UI
x-i18n:
    generated_at: "2026-07-14T14:08:10Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 25
    provider: openai
    source_hash: 4974d8b0e6f2db068632b2aa31c3712d6a86d52516653f2c311c6cdf856e8989
    source_path: web/control-ui.md
    workflow: 16
---

Control UI は、Gateway によって提供される小規模な **Vite + Lit** シングルページアプリです。

- デフォルト: `http://<host>:18789/`
- オプションのプレフィックス: `gateway.controlUi.basePath` を設定（例: `/openclaw`）

同じポート上の **Gateway WebSocket と直接通信**します。

## クイックオープン（ローカル）

Gateway が同じコンピューターで実行されている場合は、[http://127.0.0.1:18789/](http://127.0.0.1:18789/)（または [http://localhost:18789/](http://localhost:18789/)）を開きます。

ページを読み込めない場合は、まず Gateway を起動します: `openclaw gateway`。

<Note>
ネイティブ Windows の LAN バインドでは、Gateway ホスト上で `127.0.0.1` が動作していても、Windows Firewall または組織管理の Group Policy によって、通知された LAN URL がブロックされる場合があります。Windows ホストで `openclaw gateway status --deep` を実行してください。ブロックされている可能性が高いポート、プロファイルの不一致、ポリシーによって無視される可能性があるローカルファイアウォールルールが報告されます。
</Note>

認証は、WebSocket ハンドシェイク中に次の方法で提供されます。

- `connect.params.auth.token`
- `connect.params.auth.password`
- `gateway.auth.allowTailscale: true` の場合は Tailscale Serve ID ヘッダー
- `gateway.auth.mode: "trusted-proxy"` の場合は信頼済みプロキシ ID ヘッダー

ダッシュボードの設定パネルは、現在のブラウザータブセッションと選択した Gateway URL に対するトークンを保持します。パスワードは永続化されません。通常、オンボーディングでは最初の接続時に共有シークレット認証用の Gateway トークンが生成されますが、`gateway.auth.mode` が `"password"` の場合はパスワード認証も使用できます。

## デバイスのペアリング（初回接続）

新しいブラウザーまたはデバイスから接続する場合、通常は `disconnected (1008): pairing required` として表示される **1 回限りのペアリング承認**が必要です。

<Steps>
  <Step title="保留中のリクエストを一覧表示">
    ```bash
    openclaw devices list
    ```
  </Step>
  <Step title="リクエスト ID で承認">
    ```bash
    openclaw devices approve <requestId>
    ```
  </Step>
</Steps>

ブラウザーが認証情報（ロール、スコープ、公開鍵）を変更してペアリングを再試行すると、以前の保留中リクエストは置き換えられ、新しい `requestId` が作成されます。承認する前に `openclaw devices list` を再実行してください。

すでにペアリング済みのブラウザーを読み取りアクセスから書き込みまたは管理者アクセスへ切り替える場合、暗黙の再接続ではなく、承認のアップグレードとして扱われます。OpenClaw は以前の承認を有効なまま維持し、より広範な権限での再接続をブロックして、新しいスコープセットを明示的に承認するよう求めます。

承認後はデバイスが記憶され、`openclaw devices revoke --device <id> --role <role>` で取り消さない限り、再承認は必要ありません。トークンのローテーション、取り消し、および Paperclip / `openclaw_gateway` の初回実行承認フローについては、[デバイス CLI](/ja-JP/cli/devices) を参照してください。

<Note>
- local loopback から直接接続するブラウザー（`127.0.0.1` / `localhost`）は自動承認されます。
- `gateway.auth.allowTailscale: true` で、Tailscale ID が検証され、ブラウザーがデバイス ID を提示する場合、Tailscale Serve は Control UI オペレーターセッションのペアリング往復処理を省略できます。デバイス ID のないブラウザーと Node ロールの接続には、引き続き通常のデバイスチェックが適用されます。
- Tailnet への直接バインド、LAN からのブラウザー接続、およびデバイス ID のないブラウザープロファイルでは、引き続き明示的な承認が必要です。
- 各ブラウザープロファイルは一意のデバイス ID を生成するため、ブラウザーを切り替えたりブラウザーデータを消去したりすると、再ペアリングが必要です。

</Note>

## モバイルデバイスをペアリングする

すでにペアリング済みの管理者は、ターミナルを開かずに iOS/Android 接続用の QR コードを作成できます。

<Steps>
  <Step title="モバイルペアリングを開く">
    **デバイス**を選択し、**デバイス**カードの **モバイルデバイスをペアリング**をクリックします。
  </Step>
  <Step title="スマートフォンを接続する">
    OpenClaw モバイルアプリで **設定** → **Gateway** を開き、QR コードをスキャンします。代わりにセットアップコードをコピーして貼り付けることもできます。
  </Step>
  <Step title="接続を確認する">
    公式の iOS/Android アプリは自動的に接続します。**承認待ち**にリクエストが表示された場合は、承認する前にロールとスコープを確認してください。
  </Step>
</Steps>

セットアップコードの作成には `operator.admin` が必要です。これを持たないセッションではボタンが無効になります。セットアップコードには有効期間の短いブートストラップ認証情報が含まれるため、有効な間は QR コードとコピーしたコードをパスワードと同様に扱ってください。リモートペアリングでは、Gateway が `wss://` に解決される必要があります（たとえば Tailscale Serve/Funnel 経由）。通常の `ws://` は loopback とプライベート LAN アドレスに限定されます。セキュリティとフォールバックの詳細については、[ペアリング](/ja-JP/channels/pairing#pair-from-the-control-ui-recommended) を参照してください。

## 個人 ID（ブラウザー内のみ）

Control UI は、共有セッションで送信者を識別できるよう、送信メッセージに付加されるブラウザーごとの個人 ID（表示名とアバター）をサポートします。これは現在のブラウザープロファイルをスコープとしてブラウザーストレージに保存され、他のデバイスには同期されません。また、送信したメッセージに通常付与されるトランスクリプトの作成者メタデータを除き、サーバー側には永続化されません。サイトデータを消去するかブラウザーを切り替えると、空の状態にリセットされます。

アシスタントのアバター上書きも同じブラウザー内のみの方式に従います。アップロードした上書きは、Gateway が解決した ID にローカルで重ねられ、`config.patch` を介して往復することはありません。共有の `ui.assistant.avatar` 設定フィールドは、このフィールドへ直接書き込む非 UI クライアント向けに引き続き利用できます。

## ランタイム設定エンドポイント

Control UI は、Gateway の Control UI ベースパスを基準に解決される `/control-ui-config.json` からランタイム設定を取得します（たとえば、ベースパス `/__openclaw__/` では `/__openclaw__/control-ui-config.json`）。このエンドポイントは、その他の HTTP サーフェスと同じ Gateway 認証によって保護されます。未認証のブラウザーは取得できず、取得に成功するには、有効な Gateway トークンまたはパスワード、Tailscale Serve ID、あるいは信頼済みプロキシ ID が必要です。

## Gateway ホストの状態

シンプルビューで **設定**を開くと、Gateway のマシン、LAN アドレス、オペレーティングシステム、ランタイム、稼働時間、CPU 負荷、メモリ、状態ボリュームのディスク容量が表示される **Gateway ホスト**カードを確認できます。このカードは表示中、`system.info` Gateway RPC を介して 10 秒ごとに更新されます。この RPC には `operator.read` スコープが必要です。古い Gateway や、そのスコープを持たない接続では、このカードは表示されません。

## 言語サポート

Control UI は初回読み込み時に、ブラウザーのロケールに基づいて自身をローカライズします。後で上書きするには、**Settings -> General -> Language** を開きます（選択項目は Appearance の下ではなく、General クイック設定カードにあります）。

- サポート対象ロケール: `en`, `ar`, `de`, `es`, `fa`, `fr`, `hi`, `id`, `it`, `ja-JP`, `ko`, `nl`, `pl`, `pt-BR`, `ru`, `th`, `tr`, `uk`, `vi`, `zh-CN`, `zh-TW`
- 英語以外の翻訳はブラウザーで遅延読み込みされます。
- 選択したロケールはブラウザーストレージに保存され、以後のアクセスで再利用されます。
- 翻訳キーがない場合は英語にフォールバックします。

ドキュメントの翻訳も同じ英語以外のロケールセットに対して生成されますが、ドキュメントサイトに組み込まれた Mintlify の言語選択には、Mintlify が受け付けるロケールコードのみが表示されます。タイ語（`th`）とペルシャ語（`fa`）のドキュメントも公開リポジトリには生成されますが、Mintlify がこれらのコードをサポートするまでは選択項目に表示されない場合があります。

## 外観テーマ

外観パネルには組み込みの Claw、Knot、Dash テーマ（デフォルトは Claw）と、ブラウザー内のみの tweakcn インポートスロットが 1 つあります。テーマをインポートするには、[tweakcn エディター](https://tweakcn.com/editor/theme)を開き、テーマを選択または作成して **Share** をクリックし、コピーしたリンクを外観に貼り付けます。インポーターは、`https://tweakcn.com/r/themes/<id>` レジストリ URL、`https://tweakcn.com/editor/theme?theme=amethyst-haze` のようなエディター URL、相対 `/themes/<id>` パス、生のテーマ ID、および `amethyst-haze` のようなデフォルトテーマ名にも対応しています。

インポートしたテーマは現在のブラウザープロファイルにのみ保存されます。Gateway 設定には書き込まれず、デバイス間でも同期されません。インポートしたテーマを置き換えると、1 つのローカルスロットが更新されます。インポートしたテーマが有効な状態で消去すると、Claw に戻ります。

外観にはブラウザー内のみのテキストサイズ設定もあり、Control UI の他の設定とともに保存されます。これはチャットテキスト、コンポーザーテキスト、ツールカード、チャットサイドバーに適用されます。また、モバイル Safari がフォーカス時に自動ズームしないよう、テキスト入力を 16px 以上に保ちます。

## Plugin を管理する

サイドバーで **Plugin** を開くか、設定済みの Control UI ベースパスを基準とする `/settings/plugins` を使用すると、Control UI を離れずに Plugin を参照および管理できます。たとえば、ベースパスが `/openclaw` の場合は `/openclaw/settings/plugins` を使用します。このページは、すべてのオプション Plugin が無効でも常に利用できます。

Plugin は、4 つのタブを備えたハブです。**インストール済み**と **検出**では `/settings/plugins` の Plugin コードを管理し、**Skills**では `/skills` のエージェントごとのスキルマネージャーを提供し、**ワークショップ**では `/skills/workshop` のスキルワークショップ提案レビューを提供します。各タブはそれぞれ固有の URL を保持し、サイドバーにはこれらすべてに対する単一の Plugin 項目が表示されます。

**インストール済み**タブには、概要の件数とともに、カテゴリ別にグループ化されたローカルの完全なインベントリが表示されます。各行を開くと詳細ビューが表示されます。オーバーフロー（`…`）メニューでは Plugin を有効または無効にでき、外部からインストールした Plugin には **削除**も表示されます。また、設定済みの [MCP サーバー](/ja-JP/cli/mcp)を一覧表示し、その場での追加、無効化、削除をサポートします。**検出**タブはストアです。OpenClaw に含まれる注目の Plugin、公式の外部 Plugin、人気サービス向けのワンクリック MCP コネクターが表示されます。検索ボックスに入力すると、[ClawHub](https://clawhub.ai/plugins) がインラインで検索され、ダウンロード数とソース検証バッジを含む **ClawHub から**セクションが追加されます。ディープリンクでは `/settings/plugins?tab=discover` を使用してストアを直接開けます。

**Skills**タブには、選択したエージェントをスコープとして、スキル状態レポート、有効化と無効化の切り替え、API キー入力、インラインの ClawHub スキル検索があります。**ワークショップ**タブには、[スキル提案](/ja-JP/tools/skill-workshop)向けのスキルワークショップボードと Today レビューフローがあります。**スキルのアイデアを探す**では、新しいものから古いものの順に、一定範囲の内容のあるセッションをレビューし、結果を保留中の提案として残します。パネルには累積カバレッジが表示されます。**以前の作業をスキャン**では永続化されたカーソルから処理を継続し、古い履歴をすべて処理すると **新しい作業をスキャン**に変わります。自律的な自己学習が無効でも手動の履歴レビューは機能し、選択したエージェントに設定されたモデルを使用します。

同梱 Plugin はすでに Gateway 上に存在し、**インストール**ではなく **有効化**または **無効化**が表示されます。たとえば、Workboard は OpenClaw に含まれていますがデフォルトでは無効なため、アクションは **有効化**です。バンドルされた Plugin は削除できず、無効化のみ可能です。

カタログの読み取りと ClawHub の検索には `operator.read` が必要です。Plugin のインストール、有効化、無効化、削除、および MCP サーバーの変更には `operator.admin` が必要です。読み取り専用オペレーターの場合、これらの操作は無効のままです。

ClawHub のインストールは Gateway を介して実行され、Gateway が仲介する他のインストールと同じ信頼性、整合性、Plugin インストールポリシーのチェックが適用されます。Plugin コードのインストールまたは削除には Gateway の再起動が必要です。インストール済み Plugin の有効化または無効化は、その Plugin と現在の Gateway ランタイムが対応していれば再起動なしで適用できます。対応していない場合、UI は再起動が必要であることを報告します。OAuth を使用する MCP コネクターでは、追加後に CLI から 1 回限りの `openclaw mcp login <name>` を実行する必要があります。

このページは意図的に、インベントリ、検出、インストール、有効化、削除に重点を置いています。任意の npm、git、ローカルパスのソース、更新、高度な Plugin 設定には、[`openclaw plugins`](/ja-JP/cli/plugins)を使用してください。

## サイドバーナビゲーション

サイドバーでは、スクロール可能なセッション一覧の上にナビゲーションが固定表示されます。マルチエージェント構成では、各エージェントが折りたたみ可能な最上位セクションとして表示されます。エージェントを展開すると、開いているチャットから移動せずにそのセッションを参照でき、折りたたまれたエージェントには未読インジケーターが表示されます。エージェント内では、一覧は **固定済み**、接続されたチャンネル（Telegram、Slack、WhatsApp、...）ごとの組み込みセクション、管理対象のワークツリーまたは実行 Node に関連付けられたセッション用の組み込み **作業** セクション（行には `repo ⎇ branch` の行と Node ホストが表示されます）、カスタムグループ（セッション `category`）、およびその他のセッション用の **チャット** に分かれます。チャンネルセクションと作業セクションでは行が自動的に分類されますが、セッションをカスタムグループに割り当てた場合は、常にその割り当てが優先されます。セッションを開くと、行の順序を変更せずに選択ハイライトが移動します。最後に既読にしてから新しいアクティビティがあったセッションには未読ドットが表示され、開くと既読になります。各セッション行にはコンテキストメニュー（ケバブボタンまたは右クリック）があり、固定/固定解除、未読/既読にする、名前を変更、フォーク、グループへ移動（新しいグループおよびグループから削除を含む）、アーカイブ、削除を実行できます。タッチレイアウトでは、直接操作できる固定ボタンとメニューコントロールが常に表示されます。Cmd/Ctrl クリックで行の複数選択を切り替え、Shift クリックで表示順に沿って選択範囲を拡張できます。選択された行のメニューを開くと、一括操作（N 件を未読/既読にする、N 件をグループへ移動、N 件をアーカイブ、N 件を削除）が表示され、選択中のすべてのセッションに適用されます。一括削除では確認は一度だけ行われます。セッションをカスタムグループまたは **チャット** にドラッグすると移動できます。カスタムグループのヘッダーは、折りたたみ、展開、またはドラッグによる並べ替えが可能です。グループ名とその順序は gateway（`sessions.groups.*`）に保存されるため、ブラウザーをまたいで引き継がれます。一方、折りたたみ状態はブラウザープロファイルに保存されます。グループヘッダーにもメニュー（ケバブボタンまたは右クリック）があり、グループ名を変更、新しいグループ、グループを削除を実行できます。グループ名の変更またはグループの削除は、アーカイブ済みのものを含むすべてのメンバーセッションにサーバー側で反映されます。グループを削除してもセッションは維持され、チャットへ戻されます。セッション一覧ヘッダーにある唯一の **+** を選択すると、新しいセッションページが開きます（以下を参照）。並べ替えコントロールにはグループ化の切り替えもあり、グループ化（デフォルト）またはなしを選択して、1 つのフラットな一覧にできます（固定済みは引き続き分離されます）。選択内容は現在のブラウザープロファイルに保存されます。**使用状況**、**自動化**、**Plugin** はデフォルトで固定されています。**その他** 行を選択すると、Plugin が提供するタブを含む、その他すべての移動先を含むメニューが開きます。そのメニューで **固定項目を編集** を選択するか、ナビゲーション領域を右クリックすると、移動先の固定または固定解除、およびデフォルトへの復元ができます。固定項目のセットは現在のブラウザープロファイルに保存され、再読み込み後も維持されます。

## 新しいセッションページ

サイドバーのセッション一覧ヘッダーにある **+** を選択すると、`/new` に全画面の下書きが開きます。最初のメッセージを送信するまで何も作成されません。メッセージボックスの上にあるターゲット行では、セッションの作業場所を選択します。エージェント（マルチエージェント構成の場合）、実行処理の実行先（**Gateway · ローカル**、または `system.run` を公開するペアリング済み Node。`operator.admin` が必要）、フォルダー（デフォルトはエージェントのワークスペース。その他の絶対 Gateway パスには `operator.admin` とワークツリーが必要）、およびオプションの **ワークツリー** 切り替えを指定できます。ワークツリー切り替えには、ベースブランチ選択（`worktrees.branches` に基づくため、フェッチは発生しません）と、オプションのワークツリー名（ブランチは `openclaw/<name>` になります）があります。フォルダーチップの参照ボタンを選択すると、管理者専用の `fs.listDir` メソッドを使用するインラインディレクトリ選択画面が開きます。最上位には Gateway と既知のすべての Node が表示されます。オフラインの Node とディレクトリ参照をサポートしない Node も表示されたままですが、無効化されます。Gateway を選択すると、現在のフォルダーまたは Gateway のホームから開始します。対応する Node を選択すると、その Node のホストファイルシステムを参照し、実行処理をその Node に関連付け、選択した Node の絶対パスを直接使用します（管理対象ワークツリーは引き続き Gateway でのみ使用できます）。送信すると、最初のメッセージを指定して `sessions.create` が呼び出されるため、同じラウンドトリップで実行が開始され、UI は新しいセッションのチャットへ移動します。Gateway がセッションを作成したものの、その最初の送信を拒否した場合、チャットでは再読み込み後もプロンプトとエラーが保持されます。**再試行** を選択すると、別のセッションを作成せず、すでに作成済みのセッションを通じて送信されます。

**Settings** 内では、専用サイドバーの先頭に、設定セクションをすばやく見つけるための **Search settings** フィールドがあります。

サイドバー上部の **Search** フィールドを使用すると、コマンドパレット（⌘K）が開きます。サイドバーのヘッダーにある OpenClaw ブランドをクリックすると、すっきりした新規セッション開始画面が開きます。失敗または期限超過した Cron ジョブ、期限切れ間近または期限切れのモデル認証など、対処が必要なものがある場合は、サイドバーのフッター上部にコンパクトな注意チップが表示され、クリックすると該当ページに移動します。フッターには、アクティブなエージェントがチップとして表示されます。チップにはアバター（アイデンティティ画像または絵文字）、名前、接続状態を示すドット、リアルタイムのサブタイトルが含まれ、新規セッション用の **+** もあります。チップをクリックすると、エージェントメニューが開きます。このメニューには、エージェント切り替え（マルチエージェント構成）、"このエージェントで何ができますか？"、**エージェント設定**、**設定**、モバイルペアリング、**ドキュメント**、ビルドチップ、カラーモード切り替えがあります。エージェントが 10 個を超えるリストにはフィルターフィールドが表示され、ピン留めされたエージェントが先頭に並びます。エージェントのピン留めや解除はエージェント設定ページで行い、ピン留めしたセットはブラウザプロファイルに保存されます。エージェントを選択すると、チャットに加えて、使用状況、自動化、タスク、ワークボード、セッションのスコープがそのエージェントに限定されます。スコープ付きの各ページには **エージェント** コントロールがあり、スコープを解除するための **すべてのエージェント** が用意されています。これにより、具体的なチャットエージェントを変更せずに共有ページのスコープが広がりますが、セッションへの直接リンクでは引き続き対象セッションが開きます。エージェント設定ページは独自の `?agent=` 選択を保持し、共有ページのスコープには従いません。Gateway がソースチェックアウトから `main` 以外のブランチで実行されている場合、非リリース版の Gateway であることが一目で分かるよう、フッターにはそのブランチ名も赤色で表示されます（リリース版のインストールでは表示されません）。Shift-Command-Comma を押すと、ブラウザの Command-Comma ショートカットを上書きせずに **設定** が開きます。サイドバーのヘッダーには折りたたみ切り替え（⌘B）もあります。折りたたむとサイドバーが完全に非表示になり、ワークスペースが全幅表示になります。フローティング展開コントロール（または ⌘B）で元に戻せます。macOS アプリでは、代わりにこの切り替えがタイトルバーにネイティブに配置されます。デスクトップではサイドバーが唯一のナビゲーション領域であり、トップバーはありません。狭いビューポートでは、サイドバーの代わりにスライドオーバードロワーが表示され、その手前のコンパクトなヘッダー行に、ドロワー切り替え、ブランド、コマンドパレット検索が配置されます。macOS アプリでは、このヘッダー行にタイトルバーの余白が統合され、ウィンドウコントロールの横に 1 本のコンパクトな帯として表示されます。ナビゲーションには通常のブラウザ履歴が使用されるため、ブラウザの戻る／進むボタンで履歴をたどれます。macOS アプリではさらに、ウィンドウコントロールの横にネイティブのサイドバー切り替えとトラックパッドのスワイプジェスチャーが追加されます。サイドバーを展開している間は右端に戻る／進むボタンが表示され、折りたたんでいる間はネイティブ検索（コマンドパレット）ボタンと新規セッションボタンが表示されます。

## 現在できること

<AccordionGroup>
  <Accordion title="チャットと音声会話">
    - Gateway WS（`chat.history`、`chat.send`、`chat.abort`、`chat.inject`）を介してモデルとチャットできます。
    - チャット履歴の更新では、メッセージごとのテキスト上限が設定された、範囲の限られた最近のウィンドウを要求します。そのため、大規模なセッションでも、チャットが使用可能になる前にブラウザがトランスクリプト全体のペイロードをレンダリングする必要はありません。
    - 公開 GitHub Issue またはプルリクエストのリンクにマウスポインターを合わせるかキーボードフォーカスを当てると、状態、タイトル、作成者、最近のアクティビティ、コメント、変更統計が表示されます。接続された Gateway は、UI がリモート Gateway を使用している場合も含め、リンク先を変更せずに公開メタデータを取得してキャッシュします。Gateway は、リポジトリが公開されていることを確認したうえで、利用可能な場合は `GH_TOKEN` または `GITHUB_TOKEN` を使用します。それ以外の場合は、キャッシュ期間を長くして GitHub の匿名 API を使用します。
    - ブラウザのリアルタイムセッションを通じて音声会話できます。OpenAI は直接 WebRTC を使用し、Google Live は WebSocket 経由で制限付きの使い捨てブラウザトークンを使用し、バックエンド専用のリアルタイム音声 Plugin は Gateway リレートランスポートを使用します。クライアント所有のプロバイダーセッションは `talk.client.create` で開始され、Gateway リレーセッションは `talk.session.create` で開始されます。リレーではプロバイダーの認証情報を Gateway 上に保持したまま、ブラウザが `talk.session.appendAudio` を通じてマイクの PCM をストリーミングします。また、`openclaw_agent_consult` プロバイダーツール呼び出しを `talk.client.toolCall` 経由で転送し、Gateway ポリシーと設定済みのより大きな OpenClaw モデルで処理します。さらに、実行中の音声指示を `talk.client.steer` または `talk.session.steer` 経由でルーティングします。
    - チャット内で、ツール呼び出しとリアルタイムのツール出力カード（エージェントイベント）をストリーミング表示します。ツールアクティビティは、種類に応じた行として表示されます。シェルコマンドでは、構文が強調表示されたコマンドとターミナル形式の出力が表示されます。対応する編集および書き込み呼び出しでは、範囲を限定したインライン差分、利用可能な場合は行番号、`+added -removed` 統計が表示されます。連続した呼び出しは、「13 件のコマンドを実行、6 個のファイルを読み取り、9 個のファイルを編集」のような要約に折りたたまれます。実行中は、最新の実行中呼び出しの名前がグループヘッダーになります。行を展開すると、残りの引数と未加工の出力を確認できます。
    - 複雑なツール呼び出し（長いシェルコマンド、引数の多い Plugin ツール）向けの AI による目的タイトルを任意で有効化できます。`gateway.controlUi.toolTitles: true` で有効にします（デフォルトはオフ）。タイトルは、標準のユーティリティモデルルーティングを通じて、バッチ処理される `chat.toolTitles` メソッドから生成されます。明示的な `utilityModel`（他のユーティリティタスクと同様にオペレーターが選択するプロバイダー）がある場合はそれを使用し、それ以外の場合はセッションプロバイダーが宣言した小規模モデルのデフォルトを使用します。結果はエージェントごとに Gateway 側でキャッシュされます。このオプトインが無効な場合、または使用可能な低コストモデルがない場合、行には決定的なラベルがそのまま使用され、モデル呼び出しは行われません。
    - モデルが提案した一時的なフォローアップタスクを開始または破棄できます。提案を承認すると、提案されたプロンプトを使用する新しい管理対象ワークツリーセッションが開きます。
    - 既存の `session.tool`／ツールイベント配信から得られるリアルタイムのツールアクティビティを、まず秘匿化してブラウザ内に保存する要約を表示する「アクティビティ」タブ。

  </Accordion>
  <Accordion title="チャンネル、セッション、メモリ">
    - チャンネル：組み込みおよび同梱／外部Pluginチャンネルの状態、QRログイン、チャンネルごとの設定（`channels.status`、`web.login.*`、`config.patch`）。
    - チャンネルプローブの更新では、時間のかかるプロバイダーチェックが完了するまで以前のスナップショットを表示し続け、プローブまたは監査がUIの時間上限を超えた場合は部分的なスナップショットであることを示します。
    - セッション（**エージェントとツール**配下の設定ページ、`/settings/sessions`）：デフォルトで設定済みエージェントのセッションを一覧表示し、頻繁に使うセッションのピン留め、名前変更、非アクティブなセッションのアーカイブまたは復元、古くなった未設定エージェントのセッションキーからのフォールバック、セッションごとのモデル／思考／高速／詳細／トレース／推論のオーバーライド適用を行えます（`sessions.list`、`sessions.patch`）。ピン留めされたセッションは、最近使用したピン留めされていないセッションより上に並びます。アーカイブされたセッションは、セッションページのアーカイブ済みビューに表示され、トランスクリプトが保持されます。最後に既読にしてからアクティビティがあったセッションの行には未読を示す点が表示され、未読にする／既読にする操作（`sessions.patch { unread }`）と、トランスクリプトを分岐して新しいセッションを作成するフォーク操作（`sessions.create { parentSessionKey, fork: true }`）があります。テーブル上部の概要タイルには、読み込まれた一覧の概要（セッション数、実行中のラン、未読セッション、合計トークン）が表示されます。各行には種類を示すグリフと実行中のランを示す点があり、ステータスは単色の点とラベルで表示されます。また、セッションからトークン数とコンテキストサイズが報告される場合、トークン列にはコンテキストウィンドウ使用量メーターが表示されます。行の管理操作は、サイドバーのセッションメニューと同じ内容の行ごとのメニュー（ケバブボタンまたは右クリック）に配置され、行のドロワーには、その他のセッション詳細とともにエージェントランタイムと実行時間が表示されます。
    - セッションのグループ化：「グループ化」コントロールにより、セッションテーブルをカスタムグループ、チャンネル、種類、エージェント、または日付ごとのセクションに整理できます。カスタムグループは、`sessions.patch`（`category`）を介してセッションごとに保持されるため、メッセージチャンネル（Discord、Telegram、WhatsAppなど）から開始されたセッションも分類できます。行をセクションにドラッグするか、行ごとのグループセレクターを使用してグループを割り当て、「新しいグループ」操作でグループを作成します。
    - メモリ（エージェントページのタブ。選択したエージェントが対象）：Dreamingの状態、有効化／無効化トグル、Dream Diaryリーダー（`doctor.memory.status`、`doctor.memory.dreamDiary`、`config.patch`）。
    - メモリのインポート（**エージェントとツール**配下の設定ページ、`/settings/memory-import`）：ローカルのCodex統合メモリまたはClaude Code自動メモリをプレビューし、選択したエージェントのワークスペースにコピーします（`migrations.memory.plan`、`migrations.memory.apply`）。

  </Accordion>
  <Accordion title="Cron、タスク、Plugin、Skills、デバイス、実行承認">
    - オートメーション（Cronジョブ）：オートメーション／実行履歴のタブ切り替えの上に統計カード（オートメーション数、失敗数、スケジューラーの状態、次回起動）を表示します。オートメーションタブでは、フィルター可能なテーブル（すべて／アクティブ／一時停止、検索、スケジュールと最終実行のフィルター、行ごとの操作メニュー）にジョブが一覧表示され、その下にスターター候補が表示されます。実行履歴タブには、すべてのオートメーションの最近の実行が表示されます（`cron.*`）。
    - タスク：リンクされたセッションとキャンセル操作を含む、実行中および最近のバックグラウンドタスクのライブ台帳（`tasks.*`）。
    - Plugin：インストール済み一覧と厳選されたストアの閲覧、ClawHubの検索、Pluginコードのインストールと削除、インストール済みPluginの有効化または無効化を行えます（`plugins.*`）。MCPサーバーの行では、設定メソッドを介して`mcp.servers`を編集します。
    - Skills：状態、有効化／無効化、インストール、APIキーの更新（`skills.*`）。
    - デバイス：単一の一覧に、ペアリング済みデバイスレコード、Nodeカタログ、ライブプレゼンスを統合します（`device.pair.list`、`node.list`、`system-presence`）。Gatewayホストは先頭に固定されます。ペアリング済みクライアントには、接続状態、ロール、トークン、機能、コマンドが表示されます。重複するペアリングは展開可能なグループにまとめられ、**古いN件をクリーンアップ**では、管理者が確認したオフラインの重複のうち、自動承認されたもの（サイレントなローカル、信頼済みCIDR、またはSSH検証済み）、あるいは承認元情報の記録開始より前のものを一括削除します。エントリは削除でき（`node.pair.remove`、`device.pair.remove`）、デバイスのペアリングとNodeの再承認はインラインで処理されます（`device.pair.*`、`node.pair.approve`/`reject`）。モバイルセットアップコードも同じカードから作成できます。
    - 実行承認：`exec host=gateway/node`に対するGatewayまたはNodeの許可リストと確認ポリシーを編集します（`exec.approvals.*`）。

  </Accordion>
  <Accordion title="設定">
    - `~/.openclaw/openclaw.json`を表示／編集します（`config.get`、`config.set`）。
    - エージェント：エージェントごとのタブ（概要、ファイル、ツール、Skills、チャンネル、オートメーション、メモリ）を備えた設定ページ（**設定 → エージェント**、`/settings/agents`）。概要タブでは、エージェントのアイデンティティ（表示名、絵文字、アバター画像）を編集します。アバター画像は、`agents.update`の前にブラウザー内で縮小され、サイズ制限が適用されます。保存すると、設定されたアイデンティティフィールドが保存され、ワークスペースの`IDENTITY.md`にも反映されます。設定値は、同じファイルフィールドに対する手動編集より優先されます。
    - プロフィール：デフォルトエージェントのアイデンティティと全期間の使用統計（累計トークン、ピーク日、最長セッション、アクティビティの連続記録、1年間のトークンヒートマップ、上位ツール、チャンネルのハイライト）を表示する設定ページ（`usage.cost`、`sessions.usage`）。
    - MCPには専用の設定ページがあり、読み取り専用のサーバー行（トランスポート、有効状態、OAuth／フィルター／並列処理の概要）、一般的な運用コマンド、対象範囲が限定された`mcp`設定エディターが表示されます。サーバーの追加、有効化／無効化、削除はPluginページで行います。
    - モデルプロバイダー：設定済みのすべてのモデルプロバイダーを、ブランドアイコン、認証状態（`models.authStatus`）、モデルの利用可否（`models.list`）、プロバイダーから報告される場合のライブプラン／割り当て／請求データ（`usage.status`）、過去30日間のローカルセッション支出（`sessions.usage`）とともに一覧表示する設定ページ。「更新」操作により、資格情報の状態とプロバイダー使用量を再取得します。
    - 接続：ダッシュボード自体のGateway接続（WebSocket URL、Gatewayトークン、パスワード、デフォルトのセッションキー）と、最新のハンドシェイクスナップショット（状態、稼働時間、ティック間隔、最終チャンネル更新）を管理する、**接続**配下の設定ページ。オフラインログインゲートは切断時のケースを処理し、このページでは接続中に接続設定を編集します。
    - 検証を行って適用および再起動し（`config.apply`）、その後、最後にアクティブだったセッションを起動します。
    - 書き込みには、同時編集による上書きを防ぐベースハッシュガードが含まれます。
    - 書き込み（`config.set`/`config.apply`/`config.patch`）では、送信された設定ペイロード内の参照について、アクティブなSecretRefの解決を事前確認します。送信されたアクティブな参照が未解決の場合、書き込み前に拒否されます。
    - フォームの保存では、保存済み設定から復元できない古い秘匿化プレースホルダーを破棄しつつ、保存済みシークレットに引き続き対応する秘匿化値は保持します。
    - スキーマとフォームのレンダリングは`config.schema`／`config.schema.lookup`から生成されます。これには、フィールドの`title`/`description`、対応するUIヒント、直下の子要素の概要、ネストされたオブジェクト／ワイルドカード／配列／合成Node上のドキュメントメタデータ、さらに利用可能な場合はPluginおよびチャンネルのスキーマが含まれます。Raw JSONエディターは、スナップショットを安全にRaw形式で往復変換できる場合にのみ使用できます。それ以外の場合、Control UIはフォームモードを強制します。
    - Raw JSONエディターの「保存済みにリセット」では、平坦化されたスナップショットを再レンダリングする代わりに、Raw形式で記述された形状（書式、コメント、`$include`のレイアウト）を保持します。そのため、スナップショットを安全に往復変換できる場合、リセット後も外部編集が維持されます。
    - 構造化されたSecretRefオブジェクト値は、オブジェクトから文字列への意図しない破損を防ぐため、フォームのテキスト入力では読み取り専用として表示されます。

  </Accordion>
  <Accordion title="使用量">
    - セッションから算出されるトークンおよび推定コストの分析は、プロバイダー請求とは分離されたままです。
    - プロバイダーカードは`usage.status`を呼び出し、設定済みのプロバイダーPluginから報告されたライブのプラン名、割り当て期間、残高、支出、予算を表示します。
    - プロバイダー使用量の取得に失敗しても、セッション／コストダッシュボードはブロックされません。利用できないプロバイダーカードには、それぞれ独自のエラー状態が表示されます。

  </Accordion>
  <Accordion title="デバッグ、ログ、更新">
    - デバッグ：状態／正常性／モデルのスナップショット、イベントログ、手動RPC呼び出し（`status`、`health`、`models.list`）。
    - イベントログには、Control UIの更新／RPCタイミング、時間のかかるチャット／設定レンダリングのタイミング、およびブラウザーが該当するPerformanceObserverエントリタイプを公開している場合の、長いアニメーションフレームや長時間タスクに関するブラウザー応答性エントリが含まれます。
    - ログ：Gatewayファイルログをライブで追尾し、フィルター／エクスポートできます（`logs.tail`）。
    - 更新：パッケージ／git更新と再起動（`update.run`）を実行して再起動レポートを表示し、その後、再接続後に`update.status`をポーリングして、実行中のGatewayバージョンを確認します。

  </Accordion>
  <Accordion title="オートメーションパネルの注記">
    - 行を選択すると全画面の詳細ビューが開き、ヘッダーにはアクティブ／一時停止スイッチと「今すぐ実行」が表示されます（期限到来時に実行、複製、削除はメニュー内）。設定タブでは、オートメーション（プロンプト、詳細、頻度、高度なオーバーライド）をインラインで編集し、実行履歴タブにはそのオートメーションの実行が表示されます。
    - テーブル下のスターターオートメーションを使用すると、編集可能なプロンプトとスケジュールが作成フォームに事前入力されます。
    - 分離タスクでは、配信のデフォルトは概要の通知です。内部専用の実行では「なし」に切り替えます。
    - 通知が選択されている場合、チャンネル／送信先フィールドが表示されます。
    - Webhookモードでは、有効なHTTP(S) Webhook URLを`delivery.to`に設定して、`delivery.mode = "webhook"`を使用します。
    - メインセッションのタスクでは、Webhookおよび配信なしモードを使用できます。
    - 高度な編集コントロールには、実行後の削除、エージェントオーバーライドのクリア、Cronの正確／時間分散オプション、エージェントのモデル／思考オーバーライド、ベストエフォート配信トグルが含まれます。
    - フォーム検証では、フィールド単位のエラーがインラインで表示されます。無効な値がある場合、修正されるまで保存ボタンは無効になります。
    - 専用のBearerトークンを送信するには、`cron.webhookToken`を設定します。省略した場合、Webhookは認証ヘッダーなしで送信されます。
    - `cron.webhook`は非推奨の旧式フォールバックです。引き続き`notify: true`を使用している保存済みジョブを、ジョブごとの明示的なWebhook配信または完了時配信へ移行するには、`openclaw doctor --fix`を実行します。

  </Accordion>
</AccordionGroup>

## アシスタントメモリのインポート

ローカルのCodexまたはClaude CodeメモリをOpenClawエージェントに取り込むには、**設定** → **メモリのインポート**を開きます。Gatewayは自身のホスト上でサポートされているローカルメモリを検出するため、リモートのControl UIではブラウザーのコンピューターではなくGatewayのコンピューターからインポートします。

1. インポート先のエージェントを選択します。
2. 検出されたソースコレクションとMarkdownファイル名を確認します。ファイルの内容は
   プランのレスポンスでは送信されず、ページにも表示されません。
3. インポートするコレクションを選択して確認します。適用時には書き込み前にプランが再構築されるため、
   古くなった選択は安全に失敗します。
4. ファイルがすでに存在する場合は、**既存のインポートを置換**を有効にしてプレビューを
   更新し、置換を確認します。

Codexは統合済みの`MEMORY.md`と`memory_summary.md`のみをインポートします。Claude
Codeはプロジェクトの自動メモリディレクトリと設定済みの
`autoMemoryDirectory`からMarkdownをインポートします。このページを通じてセッション、設定、指示、または
資格情報をインポートすることはありません。ファイルは選択したワークスペースの
`memory/imports/`配下にコピーされ、アクティブなメモリPluginがインデックスを作成できます。ソースが
変更されることはありません。

計画と適用には `operator.admin` が必要です。適用するたびに、状態が存在する場合は検証済みの
OpenClaw バックアップを作成し、機密情報を除去した移行レポートを書き込み、既存の宛先ファイルを置き換える前に
項目単位のバックアップを保持します。パスと
呼び出し動作については、[メモリの概要](/ja-JP/concepts/memory#import-from-coding-assistants)を参照してください。

## MCP ページ

専用の MCP ページは、`mcp.servers` 配下にある OpenClaw 管理の MCP サーバー向けオペレータービューです。このページ自体が MCP トランスポートを起動することはありません。保存済みの設定を確認および編集するために使用し、稼働中のサーバーを検証する必要がある場合は `openclaw mcp doctor --probe` を使用してください。

一般的なワークフロー：

1. サイドバーから **MCP** を開きます。
2. 概要カードで、サーバーの合計数、有効数、OAuth 対応数、フィルタリング済み数を確認します。
3. 各サーバー行で、トランスポート、有効化状態、認証、フィルター、タイムアウト、コマンドのヒントを確認します。
4. **Plugins** ページでサーバーを管理（追加、有効化／無効化、削除）します。このページは `mcp.servers` を対話的に書き込む唯一の場所であり、ここにある行一覧からリンクされています。
5. サーバー定義、ヘッダー、TLS/mTLS パス、OAuth メタデータ、ツールフィルター、Codex 投影メタデータについて、対象範囲の `mcp` 設定セクションを編集します。
6. 設定を書き込むには **Save** を使用し、稼働中の Gateway に変更後の設定を適用させる場合は **Save & Publish** を使用します。
7. 静的診断、稼働中の検証、またはキャッシュ済みランタイムの破棄を行うには、ターミナルから `openclaw mcp status --verbose`、`openclaw mcp doctor --probe`、または `openclaw mcp reload` を実行します。

このページでは、認証情報を含む URL 形式の値をレンダリング前に秘匿化し、コマンドスニペット内のサーバー名を引用符で囲みます。そのため、名前に空白やシェルのメタ文字が含まれていても、コピーしたコマンドは引き続き動作します。CLI と設定の完全なリファレンス：[MCP](/ja-JP/cli/mcp)。

## アクティビティタブ

アクティビティタブは、Logs と Debug の横にある **Settings › System** 内にあります。これはツールのライブアクティビティを監視する一時的なブラウザーローカルのオブザーバーであり、Chat のツールカードにも使用されている Gateway の `session.tool`／ツールイベントストリームから生成されます。Gateway の別のイベントファミリー、エンドポイント、永続的なアクティビティストア、メトリクスフィード、または外部オブザーバーストリームを追加するものではありません。

アクティビティエントリには、サニタイズされた概要と、秘匿化および切り詰められた出力プレビューのみが保持されます。ツール引数の値はアクティビティ状態に保存されません。UI には引数が非表示であることが示され、引数フィールド数のみが記録されます。メモリ内の一覧は現在のブラウザタブに追従し、Control UI 内を移動しても維持されますが、ページの再読み込み、セッションの切り替え、または **Clear** でリセットされます。

## オペレーターターミナル

ドッキング可能なオペレーターターミナルは、デフォルトでは無効です。有効にするには、`gateway.terminal.enabled: true` を設定して Gateway を再起動します。ターミナルには `operator.admin` 接続が必要で、アクティブなエージェントワークスペース内でホスト PTY を開きます。新しいタブは、現在選択されているチャットエージェントに従います。

<Warning>
ターミナルは制約のないホストシェルであり、Gateway プロセスの環境を継承します。信頼できるオペレーター環境でのみ有効にしてください。OpenClaw は `sandbox.mode: "all"` を持つエージェントのターミナルセッションを拒否します。アクティブなエージェントをそのモードに変更すると、既存および処理中のターミナルセッションが閉じられます。
</Warning>

ドックの表示を切り替えるには **Ctrl + backtick** を使用します。レイアウトは下部および右側へのドッキングに対応し、ブラウザーのビューポートに合わせてサイズが変わり、複数のシェルタブを保持します。`gateway.terminal.enabled` と任意の `gateway.terminal.shell` オーバーライドについては、[Gateway の設定](/ja-JP/gateway/configuration-reference#gateway)を参照してください。

セッションサイドバーで検出された Codex および Claude Code セッションは、同じターミナルパネル内で各ネイティブ CLI を開けます。**Settings › Chat** で **Open Codex/Claude sessions in** を **Terminal** に設定すると、通常の行クリックで `codex resume` または `claude --resume` が開きます。デフォルトは引き続き読み取り専用の OpenClaw ビューアーです。行の右クリックメニューまたはケバブメニューでは常に両方の選択肢が提示され、対象となるセッションではビューアーのヘッダーに **Open in terminal** が表示されます。

対象可否はセッションおよびホストごとに決まります。Gateway ローカルのセッションでは、プロバイダー所有の再開コマンドが Gateway ホスト上で開始されます。ペアリングされた Node のセッションでは、所有元 Node 上で許可リストに登録されたプロバイダーコマンドを開始し、その PTY の出力、入力、サイズ変更イベントのみを中継します。これは汎用的な Node シェルを公開するものではなく、ブラウザーから提供されたコマンドも受け付けません。双方向ストリーミングのない組み込みワーカーブリッジを含め、一致するターミナル再開コマンドを通知しない Node では、ビューアーは引き続き利用でき、ターミナルを開けないことが表示されます。

セッションは切断後も存続します。ページの再読み込み、ラップトップのスリープ、または一時的なネットワーク障害が発生しても、セッションは終了せず Gateway 上でデタッチされ、再接続時には同じブラウザタブが再アタッチされ、直近の出力が再生されます。デタッチされたセッションは `gateway.terminal.detachedSessionTimeoutSeconds` 後に終了されます（デフォルトは 300 秒。`0` を使用すると切断時に終了する動作に戻ります）。`terminal.list` はアタッチ可能なセッションを表示し、`terminal.attach` はセッションを引き継ぎ（tmux 形式のテイクオーバー）、`terminal.text` はアタッチせずにセッションの直近の出力をプレーンテキストとして読み取ります。これはエージェント／ツール向けの機能です。

ターミナルは、`/?view=terminal` にあるターミナル専用の全画面ドキュメントとしても利用できます。iOS および Android アプリは、保存済みの Gateway 認証情報を再利用して、このページをターミナル画面に埋め込みます。利用可否は同じ `gateway.terminal.enabled` および `operator.admin` ゲートに従い、接続先の Gateway がターミナルを提供していない場合はページに通知が表示されます。

## ブラウザーパネル

Control UI には、Gateway が制御するブラウザー（エージェントが[ブラウザーツール](/ja-JP/tools/browser-control)を通じて操作するものと同じ）を通常の任意のウェブブラウザー内に表示する、ドッキング可能なブラウザーパネルが付属しています。ネイティブ WebView は不要です。接続先の Gateway が `operator.admin` 接続に `browser.request` を通知すると表示され、セッションワークスペースレールの地球儀ボタンで表示を切り替えられます。パネルには、タブ、編集可能な URL バー、戻る／進む／再読み込み、使用中のブラウザーで開く機能を備えたライブページスナップショットが表示されます。右側または下部にドッキングでき、クリック、ホイールスクロール、基本的な文字入力をリモートページに転送します。

2 つのキャプチャーモードで、ページのコンテキストをエージェント向けにまとめられます。

- **Annotate (pencil)**：ページ上にフリーハンドでマークアップを描画します。**Send to chat** を実行すると、ストロークがスクリーンショットに合成され、画像がアクティブなチャット作成欄に添付されます。また、ページの URL、タイトル、マークされた各領域を説明するプロンプトが事前入力されるため、エージェントは囲まれた場所を正確に把握できます。
- **Inspect (pointer)**：カーソルの下にある要素（セレクター、アクセシブル名、ロール、サイズ）を確認するには、要素にマウスカーソルを合わせます。クリックすると、その要素の詳細とハイライトされたスクリーンショットが、同じ作成欄のフローを通じて送信されます。Inspect、ホイールスクロール、戻る／進むには `browser.evaluateEnabled` が必要です（デフォルトで有効）。

macOS アプリでは、ダッシュボードでクリックしたリンク向けにネイティブのリンクブラウザーサイドバーが維持されます。ブラウザーパネルもそこで動作し、その他すべてのプラットフォームでページに注釈を付けるための手段となります。

## チャットの動作

<AccordionGroup>
  <Accordion title="送信と履歴のセマンティクス">
    - `chat.send` は**ノンブロッキング**です。`{ runId, status: "started" }` ですぐに確認応答し、レスポンスは `chat` イベントを介してストリーミングされます。信頼された Control UI クライアントは、ローカル診断用のオプションの ACK タイミングメタデータも受信できます。
    - チャットへのアップロードでは、画像と動画以外のファイルを受け付けます。画像はネイティブの画像パスを維持し、その他のファイルは管理対象メディアとして保存され、履歴には添付ファイルのリンクとして表示されます。
    - 同じ `idempotencyKey` で再送信すると、実行中は `{ status: "in_flight" }`、完了後は `{ status: "ok" }` が返されます。
    - `chat.history` のレスポンスは、UI の安全性を確保するためサイズが制限されています。トランスクリプトのエントリが大きすぎる場合、Gateway は長いテキストフィールドを切り詰め、容量の大きいメタデータブロックを省略し、サイズ超過のメッセージをプレースホルダー（`[chat.history omitted: message too large]`）に置き換えることがあります。
    - `chat.history` で表示対象のアシスタントメッセージが切り詰められた場合、サイドリーダーは、`sessionKey`、必要に応じてアクティブな `agentId`、およびトランスクリプトの `messageId` を使用し、`chat.message.get` を介して表示用に正規化された完全なトランスクリプトエントリをオンデマンドで取得できます。それでも Gateway がそれ以上の内容を返せない場合、リーダーは切り詰められたプレビューを黙って繰り返すのではなく、明示的に利用不可の状態を表示します。
    - アシスタントが生成した画像は管理対象メディア参照として永続化され、認証済みの Gateway メディア URL を介して返されるため、再読み込み時に未加工の base64 画像ペイロードがチャット履歴のレスポンス内に残っている必要はありません。
    - `chat.history` のレンダリング時、Control UI は表示されるアシスタントテキストから、表示専用のインラインディレクティブタグ（たとえば `[[reply_to_*]]` や `[[audio_as_voice]]`）、プレーンテキストのツール呼び出し XML ペイロード（`<tool_call>...</tool_call>`、`<function_call>...</function_call>`、`<tool_calls>...</tool_calls>`、`<function_calls>...</function_calls>`、および切り詰められたツール呼び出しブロックを含む）、漏出した ASCII／全角のモデル制御トークンを除去します。表示されるテキスト全体が、正確なサイレントトークン `NO_REPLY` / `no_reply` または Heartbeat 確認応答トークン `HEARTBEAT_OK` のみであるアシスタントエントリは省略されます。
    - 送信中および最終的な履歴更新中に `chat.history` が一時的に古いスナップショットを返した場合でも、チャットビューはローカルの楽観的なユーザー／アシスタントメッセージを表示したままにします。Gateway の履歴が追いつくと、正規のトランスクリプトがそれらのローカルメッセージを置き換えます。
    - ライブの `chat` イベントは配信状態を表し、`chat.history` は永続的なセッショントランスクリプトから再構築されます。ツール完了イベントの後、Control UI は履歴を再読み込みし、小さな楽観的末尾のみをマージします。トランスクリプトの境界については [WebChat](/ja-JP/web/webchat) に記載されています。
    - `chat.inject` はアシスタントのメモをセッショントランスクリプトに追加し、UI のみを更新するための `chat` イベントをブロードキャストします（エージェント実行もチャネル配信も行いません）。
    - サイドバーには、読み込まれたすべてのアクティブなセッションが、エージェントセクションと、ピン留め／チャネル／作業／カスタム／チャットの各バケットに分けて表示されます。単一の「新規セッション」アクションを使用すると、下書きダイアログが開きます。表示されている行を開いても、ハイライトのみが移動します。カスタムグループは折りたたみとドラッグによる並べ替えが可能で、セッションをグループまたはチャットにドロップできます。グループ名と順序は Gateway を介して同期されますが、折りたたみ状態はブラウザー内に保持されます。新しいダッシュボードセッションには、最初のコマンド以外のメッセージから、簡潔な生成タイトルが非同期で付けられます。明示的な名前が置き換えられることはありません。この個別のモデル呼び出しを低コストのモデルにルーティングするには、`agents.defaults.utilityModel`（または `agents.list[].utilityModel`）を設定します。別のエージェントセクションを展開すると、開いているチャットから移動せずに、そのエージェントのセッションを参照できます。
    - セッション検索はコマンドパレット（⌘K、またはサイドバー上部の「検索」フィールド）にあります。クエリを入力すると、エージェントをまたいで一致するページを上限数までたどり、内部の子／Cron 行を除外し、表示可能な一致項目をナビゲーションコマンドと並べて一覧表示します。「セッション」ページには、フィルター付きの網羅的な検索可能リストが引き続き表示されます。
    - サイドバーの各行には、直接ピン留めする操作と、未読状態、名前変更、フォーク、グループ化、アーカイブ、削除のための完全なコンテキストメニューがあります。複数選択した行（Cmd/Ctrl クリック、範囲選択は Shift クリック）には、未読状態、グループ化、アーカイブ、削除を含む一括メニューが表示されます。選択したすべてのセッションがアーカイブ可能でない限り、一括アーカイブ／削除は無効のままです。実行中の処理とエージェントのメインセッションはアーカイブできません。現在選択中のセッションをアーカイブまたは削除すると、チャットはそのエージェントのメインセッションに戻ります。
    - macOS アプリでは、OpenClaw のマークはサイドバーの行を占有せず、ウィンドウコントロールの隣にある、通常は空のネイティブタイトルバーストリップを使用します。
    - デスクトップ幅では、チャットコントロールはコンパクトな 1 行に維持され、トランスクリプトを下方向にスクロールすると折りたたまれます。上方向にスクロールする、先頭に戻る、または末尾に到達すると、コントロールが復元されます。
    - 連続する重複したテキストのみのメッセージは、件数バッジ付きの 1 つの吹き出しとしてレンダリングされます。画像、添付ファイル、ツール出力、または Canvas プレビューを含むメッセージは折りたたまれません。
    - セッションのチェックアウトが GitHub リポジトリのデフォルト以外のブランチにある場合、チャットビューはコンポーザーの上にプルリクエストのチップを固定表示します。各チップには PR 番号、リポジトリ、ブランチ、差分数、CI ピル、下書き／マージ済み／クローズ済みの状態が表示され、それぞれ PR へのリンクになっています。この行には最大 2 個のチップが表示され、ライブ（オープン／下書き）PR が優先されます。「さらに表示」ボタンを押すと、折りたたまれたマージ済み／クローズ済みの履歴が表示されます。CI ピルを開くと、小さな CI 監視ポップオーバーに成功／失敗／実行中／スキップ済みのチェック数と、PR のチェックページへのリンクが表示されます。検出は `controlUi.sessionPullRequests` を介してサーバー側で実行され、設定されている場合は Gateway の `GH_TOKEN`/`GITHUB_TOKEN` を再利用します。GitHub API のレート制限に達した場合、チップは最後に確認された状態を維持し、状態が古い可能性があるという警告を表示します。チップを閉じると、現在のブラウザープロファイルではそのセッションに対して非表示になります。PR がまだ存在しない場合、この行にはブランチ自体、つまりリポジトリ、ブランチ名、およびデフォルトブランチとのマージベースに対する差分（コミット済みと未コミットの作業）の +/− サイズが表示されます。プッシュ済みブランチに比較可能なコミットができると、この行には GitHub の新規プルリクエストページを開く「PR を作成」ボタンが追加されます。それ以前でも、変更されたファイル（コミット済み、未コミット、未追跡）があるセッションには、ボタンなしでこの行が表示されます。オープンまたは下書きの PR が存在する間、この行は非表示になります。ブランチ行はローカルの git のみから生成されるため、GitHub がレート制限中でも利用でき、「PR が見つからない」という結果は制限がリセットされるまで信頼できないため、同じ状態が古い可能性を示す警告が付けられます。
    - セッション差分パネルには、セッションのチェックアウトで実際に変更された内容が表示されます。ブランチボタン（ワークスペースレールのヘッダー、分割ペインのヘッダー、または単一ペインのチャットにあるフローティングボタン）を押すと、チェックアウトのデフォルトブランチとのマージベースに対するブランチ、未コミット、未追跡の作業について、ファイルごとの差分を示す詳細パネルが開きます。これにはステータスドット、名前変更の矢印、ファイルごとの +/− 数、折りたたみ可能なファイル、ハンク間の「未変更の N 行」マーカーが含まれます。差分は `sessions.diff` Gateway メソッド（`operator.read` スコープ）を介してサーバー側で計算されます。バイナリファイルとサイズ超過ファイルは統計のみのエントリに縮退し、接続先の Gateway が `sessions.diff` を公開している場合にのみボタンが表示されます。
    - 各チャットペインのセッションワークスペースレールには、セッションファイル、プロジェクトファイル、成果物が一覧表示されます。デフォルトではペインの右端にドッキングされます。ヘッダーをドラッグする（またはドックボタンを使用する）と下部に移動でき、この選択は現在のブラウザープロファイルに保存されます。折りたたまれたレールは領域をまったく占有しません。⇧⌘B、分割ペインのヘッダーにあるファイル切り替え、または単一ペインのチャットにあるフローティングファイルボタンで再度開けます（後者 2 つには、どちらも変更ファイル数のバッジが表示されます）。独立したファイル、ツール、Canvas の詳細パネルには影響しません。
    - チャット内のファイル参照、展開された読み取り／編集／書き込みツールカード内のファイルパス、またはワークスペースレール内のファイル行をクリックすると、ファイル詳細パネルが開きます。これは CodeMirror ベースのコードビューで、構文ハイライト、行番号、指定行への移動、ファイル内検索、コピー操作、外部エディターで開くメニューを備えています。Gateway が `operator.admin` 接続に対して `sessions.files.set` を公開している場合、パネルには変更状態の追跡と Cmd/Ctrl-S による保存を備えた編集モードが追加されます。保存されていない下書きは、明示的に保存または破棄されるまで、現在のブラウザータブ内でファイル、パネル、セッション間を移動しても保持されます。保存は、`sessions.files.get` が返すコンテンツハッシュに対する比較交換方式です。ファイルが読み込まれた後にディスク上で変更された場合（たとえばエージェントが作業を続けた場合）、パネルには競合通知と、「再読み込み」（最新の内容を採用）および「上書き」（ローカルの編集を維持）の操作が表示されます。書き込みには読み取りと同じファイルシステム安全性を確保するワークスペースガード（パス包含、シンボリックリンク／ハードリンクの拒否、256 KB の UTF-8 上限）が適用され、既存のファイルのみを上書きします。エディターがファイルを作成または削除することはありません。
    - 各チャットペインのバックグラウンドタスクレールには、現在のエージェントのバックグラウンドタスクとサブエージェント（エージェント単位の `tasks.list`、`task` イベントによるライブ更新）が一覧表示されます。実行中の作業には、経過時間のライブタイマー、ツール使用回数、現在使用中のツール、停止コントロールが表示されます。折りたたみ可能な完了済みセクションには実行時間が追加され、「トランスクリプトを表示」リンクを押すとタスクの子セッションがペイン内に開きます。分割ペインのヘッダーにあるアクティビティ切り替え、または単一ペインのチャットにあるフローティングアクティビティボタンで開けます。タスクのスナップショットは先行して読み込まれるため、レールを先に開かなくても、どちらにも実行中件数のバッジが表示されます。「タスク」ページは、引き続きエージェント横断の完全な台帳です。
    - ワークスペースレール、バックグラウンドタスクレール、詳細パネルは、ウィンドウではなく各ペイン自体の幅に適応します。狭いペインまたはコンパクトなウィンドウでは、両方のレールが下部ストリップとして表示されます（ペインが広くなるまでサイドドックのコントロールは非表示になり、1 列しか収まらない場合はワークスペースレールがサイドスロットを優先的に使用します）。詳細パネルはスレッドと同じ行を共有せず、その下に積み重なり、水平方向のサイズ変更ハンドルが表示されます。スマートフォンサイズのビューポートでは、引き続き詳細パネルが全画面で開きます。
    - チャットヘッダーのモデルおよび思考ピッカーは、`sessions.patch` を介してアクティブなセッションへ即座にパッチを適用します。これらは 1 回の送信だけに使用されるオプションではなく、永続的なセッションオーバーライドです。
    - **分割ビュー：**右上のフローティング切り替え行（セッション差分、バックグラウンドタスク、セッションファイルの切り替えの隣）から開き、収まる数だけアクティブなペインを右または下に分割します。各ペインには独自のセッション、トランスクリプト、コンポーザー、ツールストリームがあります。
    - サイドバーからチャットへセッションをドラッグすると、ペイン内で開きます。アニメーション付きのドロッププレビューがゾーン間を滑らかに移動し、結果を示すラベルが表示されます。新しいペインが占める正確な半分には「分割」、ペイン全体には「ここで開く」と表示されます。単一ペインモードからのドロップも機能します。
    - アクティブな分割ペインによって、サイドバーの選択状態と URL が決まります。各ペインには、セッションタイトルに加えてワークスペースレール、分割、閉じるのコントロールを含む独自のヘッダー行があります。区切り線で列と縦に積み重ねたペインのサイズを変更でき、ブラウザーは再読み込み後もレイアウトをローカルに保持します。
    - 狭い画面では、分割ビューはレイアウトを維持しますが、閉じるコントロールを含むヘッダーとともに、アクティブなペインのみをレンダリングします。
    - 同じセッションに対するモデルピッカーの変更がまだ保存中にメッセージを送信した場合、コンポーザーは `chat.send` を呼び出す前にそのセッションパッチを待機するため、選択したモデルで送信されます。
    - `/new` と入力すると、New Chat と同様に新しいダッシュボードセッションを作成して切り替えます。ただし、`session.dmScope: "main"` が設定されており、現在の親がエージェントのメインセッションである場合は、そのメインセッションをその場でリセットします。`/reset` と入力すると、現在のセッションに対する Gateway の明示的なその場でのリセットが維持されます。
    - チャットのモデルピッカーは、Gateway に設定されたモデルビューを要求します。`agents.defaults.models` が存在する場合は、その許可リストがピッカーを制御します。これには、プロバイダー単位のカタログを動的に保つ `provider/*` エントリも含まれます。それ以外の場合、ピッカーには明示的な `models.providers.*.models` エントリと、使用可能な認証を持つプロバイダーが表示されます。完全なカタログは、`view: "all"` を指定したデバッグ用 `models.list` RPC から引き続き利用できます。
    - 最新の Gateway セッション使用量レポートに現在のコンテキストトークン数が含まれている場合、チャット作成ツールバーに使用率を示す小さなコンテキスト使用量リングが表示されます。リングを開くと、現在のコンテキストウィンドウ、直近の実行のトークン数と推定総コスト、プロバイダーとモデルの識別情報、および報告されている場合は最新のプロバイダー応答における入力、出力、キャッシュのコスト内訳を確認できます。コンテキストへの負荷が高くなるとリングは警告スタイルに切り替わり、推奨される Compaction レベルでは、通常のセッション Compaction パスを実行するコンパクトなボタンが表示されます。古くなったトークンのスナップショットは、Gateway が最新の使用量を再度報告するまで非表示になります。

  </Accordion>
  <Accordion title="トークモード（ブラウザーのリアルタイム）">
    トークモードでは、登録済みのリアルタイム音声プロバイダーを使用します。OpenAI は `talk.realtime.provider: "openai"` と `openai` API キープロファイル、`talk.realtime.providers.openai.apiKey`、または `OPENAI_API_KEY` を使用して設定します。OpenAI Realtime は公開 Platform API を使用し、Platform API キーが必要です。Codex OAuth ログインではこの機能を利用できません。Google は `talk.realtime.provider: "google"` と `talk.realtime.providers.google.apiKey` を使用して設定します。ブラウザーが標準のプロバイダー API キーを受け取ることはありません。OpenAI は WebRTC 用の一時的な Realtime クライアントシークレットを受け取り、Google Live はブラウザーの WebSocket セッション用に制約された一度限りの Live API 認証トークンを受け取ります。このトークンには、Gateway によって指示とツール宣言が固定されています。バックエンドのリアルタイムブリッジのみを公開するプロバイダーは、Gateway リレートランスポートを介して動作するため、認証情報とベンダーソケットはサーバー側に留まり、ブラウザーの音声は認証済みの Gateway RPC を通じて転送されます。Realtime セッションプロンプトは Gateway によって組み立てられます。`talk.client.create` は呼び出し元が指定した指示の上書きを受け付けません。

    永続的なプロバイダー、モデル、音声、トランスポート、推論エフォート、正確な VAD しきい値、無音時間、およびプレフィックスパディングのデフォルト値は **Settings → Communications → Talk** にあります。これらを変更するには `operator.admin` アクセス権が必要です。Gateway リレーを設定するとバックエンドのリレーパスが強制されます。WebRTC を設定するとセッションの所有権はクライアントに維持され、プロバイダーがブラウザーセッションを作成できない場合は、暗黙にリレーへフォールバックせず失敗します。

    トークコントロールは、コンポーザーツールバーにあるマイクボタンです。そのキャレットには **System default** と、USB、Bluetooth、仮想入力を含む、ブラウザーが公開するすべてのマイクが一覧表示されます。選択したデバイス ID はブラウザー内にのみ保持され、Gateway に送信されることはありません。そのデバイスが利用できなくなった場合、トークは別のマイクから暗黙に録音するのではなく、別の入力を選択するよう求めます。トークの実行中は、マイクボタンがライブ入力レベルメーターを表示するピル型コントロールに変わります。クリックすると音声入力が停止し、マウスポインターを合わせると停止グリフが表示されます。リアルタイムツール呼び出しが `talk.client.toolCall` を通じて設定済みのより大きなモデルに問い合わせている間、スクリーンリーダーは `Connecting voice input...`、`Listening...`、または `Asking OpenClaw...` を読み上げます。実行中のエージェント応答を停止する操作は、ピルの横にある独立した四角形の **Stop** コントロールのままです。

    メンテナー向けライブスモークテスト: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` は、OpenAI バックエンド WebSocket ブリッジ、OpenAI ブラウザー WebRTC SDP 交換、Google Live の制約付きトークンによるブラウザー WebSocket セットアップ、および偽のマイクメディアを使用した Gateway リレーのブラウザーアダプターを検証します。このコマンドはプロバイダーのステータスのみを出力し、シークレットをログに記録しません。

  </Accordion>
  <Accordion title="停止と中止">
    - `chat.abort` を呼び出す **Stop** をクリックします。
    - 実行中は、通常のフォローアップがキューに入ります。キュー内のメッセージで **Steer** をクリックすると、そのフォローアップが実行中のターンに挿入されます。
    - `/stop`（または `stop`、`stop action`、`stop run`、`stop openclaw`、`please stop` のような単独の中止フレーズ）を入力すると、帯域外で中止します。
    - `chat.abort` は `{ sessionKey }`（`runId` なし）をサポートし、そのセッションのすべてのアクティブな実行を中止します。

  </Accordion>
  <Accordion title="中止時の部分出力の保持">
    - 実行が中止されても、アシスタントの部分的なテキストが UI に表示されることがあります。
    - バッファーされた出力が存在する場合、Gateway は中止されたアシスタントの部分的なテキストをトランスクリプト履歴に永続化します。
    - 永続化されたエントリには中止メタデータが含まれるため、トランスクリプトの利用側は、中止された部分出力と正常完了時の出力を区別できます。

  </Accordion>
</AccordionGroup>

## 接続の切断と再接続

セッションの確立後に Gateway 接続が切断されても、ログアウトされません。クライアントがバックオフ（800 ms から最大 15 s）を使用して自動的に再試行している間、ダッシュボードは表示されたままで、上部バーの下に琥珀色の「Gateway connection lost — Reconnecting…」というフローティングピルが表示されます。接続が回復するまで、ライブ更新とリアルタイム／セッション操作は一時停止します。ピル内の **Retry now** をクリックすると、直ちに再試行されます。チャットは引き続き編集できます。通常のテキストおよび添付ファイルの送信は、現在のタブにある Gateway／セッションスコープのブラウザーストレージに保持され、再接続待ちとして表示され、Gateway が復旧すると自動的に送信されます。オフライン中は、ライブコントロールとスラッシュコマンドを使用できません。

このブラウザーにすでに認証情報（設定済みのトークン／パスワードまたは承認済みのデバイストークン）が保存されている場合、初回表示時と再読み込み時には、ログインゲートを一瞬表示する代わりに、接続が確立されるまで小さなアニメーション付き OpenClaw マークが表示されます。ログインゲートは、認証情報がまだ保存されていない場合、または Gateway が認証情報を明示的に拒否した場合（不正なトークン／パスワード、取り消されたペアリング）にのみ表示されます。これらは待機ではなく入力が必要な状態です。

## PWA のインストールと Web Push

Control UI には `manifest.webmanifest` とサービスワーカーが付属しているため、最新のブラウザーではスタンドアロン PWA としてインストールできます。Web Push を使用すると、タブやブラウザーウィンドウが開いていない場合でも、Gateway が通知によってインストール済みの PWA を起動できます。

OpenClaw の更新直後にページに **Protocol mismatch** と表示された場合は、まず `openclaw dashboard` でダッシュボードを開き直し、ハードリフレッシュしてください。それでも失敗する場合は、ダッシュボードのオリジンのサイトデータを消去するか、プライベートブラウザーウィンドウでテストしてください。古いタブまたはブラウザーのサービスワーカーキャッシュにより、更新前の Control UI バンドルが新しい Gateway に対して動作し続けることがあります。

| サーフェス                                               | 機能                                                               |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest`                      | PWA マニフェスト。アクセス可能になると、ブラウザーに「Install app」が表示されます。   |
| `ui/public/sw.js`                                     | `push` イベントと通知のクリックを処理するサービスワーカー。 |
| `push/vapid-keys.json`（OpenClaw の状態ディレクトリ内） | Web Push ペイロードの署名に使用される、自動生成された VAPID キーペア。       |
| `push/web-push-subscriptions.json`                    | 永続化されたブラウザーのサブスクリプションエンドポイント。                          |

キーを固定する場合（マルチホストデプロイ、シークレットのローテーション、テストなど）は、Gateway プロセスの環境変数を使用して VAPID キーペアを上書きします。

- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT`（デフォルトは `https://openclaw.ai`）

Control UI は、次のスコープ制限付き Gateway メソッドを使用して、ブラウザーのサブスクリプションを登録およびテストします。

- `push.web.vapidPublicKey` は、アクティブな VAPID 公開鍵を取得します。
- `push.web.subscribe` は、`endpoint` と `keys.p256dh`／`keys.auth` を登録します。
- `push.web.unsubscribe` は、登録済みのエンドポイントを削除します。
- `push.web.test` は、呼び出し元のサブスクリプションにテスト通知を送信します。

<Note>
Web Push は、iOS APNS リレーパス（リレー経由のプッシュについては [設定](/ja-JP/gateway/configuration) を参照）およびネイティブモバイルのペアリングを対象とする `push.test` メソッドとは独立しています。
</Note>

## ホストされた埋め込み

アシスタントメッセージでは、`[embed ...]` ショートコードを使用して、ホストされた Web コンテンツをインライン表示できます。iframe のサンドボックスポリシーは `gateway.controlUi.embedSandbox` で制御されます。

同梱の Canvas Plugin は、ツール呼び出しから自己完結型の SVG または HTML を直接レンダリングする [`show_widget`](/ja-JP/tools/show-widget) も提供します。ブラウザーは `inline-widgets` Gateway 機能を通知し、生成された Canvas ドキュメントはチャット履歴の再読み込み後も利用できます。チャネルから開始された実行では、このツールを利用できません。

<Tabs>
  <Tab title="strict">
    ホストされた埋め込み内でのスクリプト実行を無効にします。
  </Tab>
  <Tab title="scripts (default)">
    オリジンの分離を維持しながら、インタラクティブな埋め込みを許可します。通常、自己完結型のブラウザーゲーム／ウィジェットにはこれで十分です。
  </Tab>
  <Tab title="trusted">
    意図的により強い権限を必要とする同一サイトのドキュメント向けに、`allow-scripts` に加えて `allow-same-origin` を追加します。
  </Tab>
</Tabs>

```json5
{
  gateway: {
    controlUi: {
      embedSandbox: "scripts",
    },
  },
}
```

<Warning>
埋め込みドキュメントが同一オリジンの動作を本当に必要とする場合にのみ、`trusted` を使用してください。エージェントが生成するほとんどのゲームやインタラクティブなキャンバスでは、`scripts` の方が安全です。
</Warning>

絶対 URL の外部 `http(s)` 埋め込みは、デフォルトで引き続きブロックされます。`[embed url="https://..."]` にサードパーティページの読み込みを許可するには、`gateway.controlUi.allowExternalEmbedUrls: true` を設定します。

## チャットメッセージの幅

チャットのトランスクリプトには、コンポーザーと位置を揃えた、中央配置の読みやすいフレームが使用されます。そのフレーム内では、アシスタントおよびツールの出力は左揃えのまま、ユーザーの吹き出しは右揃えになります。ワイドモニター環境では、`gateway.controlUi.chatMessageMaxWidth` を設定することで、同梱の CSS にパッチを適用せずにトランスクリプトの幅を上書きできます。

```json5
{
  gateway: {
    controlUi: {
      chatMessageMaxWidth: "min(1280px, 82%)",
    },
  },
}
```

値はブラウザーに渡される前に検証されます。サポートされる形式には、`960px` や `82%` のような単純な長さとパーセンテージ、および制約付きの `min(...)`、`max(...)`、`clamp(...)`、`calc(...)`、`fit-content(...)` の幅式が含まれます。

## Tailnet アクセス（推奨）

<Tabs>
  <Tab title="統合 Tailscale Serve（推奨）">
    Gateway をループバック上に維持し、Tailscale Serve で HTTPS プロキシします。

    ```bash
    openclaw gateway --tailscale serve
    ```

    `https://<magicdns>/`（または設定済みの `gateway.controlUi.basePath`）を開きます。

    デフォルトでは、`gateway.auth.allowTailscale` が `true` の場合、Control UI／WebSocket の Serve リクエストは Tailscale ID ヘッダー（`tailscale-user-login`）を使用して認証できます。OpenClaw は、`x-forwarded-for` アドレスを `tailscale whois` で解決してヘッダーと照合することで ID を検証し、リクエストが Tailscale の `x-forwarded-*` ヘッダーとともにループバックへ到達した場合にのみ受け入れます。ブラウザーのデバイス ID を持つ Control UI オペレーターセッションでは、この検証済み Serve パスによりデバイスペアリングの往復も省略されます。デバイス ID のないブラウザーと Node ロール接続では、引き続き通常のデバイスチェックが行われます。Serve トラフィックにも明示的な共有シークレット認証情報を要求する場合は、`gateway.auth.allowTailscale: false` を設定し、`gateway.auth.mode: "token"` または `"password"` を使用します。

    この非同期 Serve ID パスでは、同じクライアント IP と認証スコープからの認証失敗が、レート制限への書き込み前に直列化されます。そのため、同じブラウザーから不正な再試行が同時に行われると、2 つの単純な不一致が並行して競合するのではなく、2 番目のリクエストに `retry later` が表示されることがあります。

    <Warning>
    トークンなしの Serve 認証では、Gateway ホストが信頼されていることを前提とします。そのホストで信頼できないローカルコードが実行される可能性がある場合は、トークン／パスワード認証を必須にしてください。
    </Warning>

  </Tab>
  <Tab title="tailnet にバインド + トークン">
    ```bash
    openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
    ```

    `http://<tailscale-ip>:18789/`（または設定済みの `gateway.controlUi.basePath`）を開きます。

    一致する共有シークレットを UI 設定に貼り付けます（`connect.params.auth.token` または `connect.params.auth.password` として送信されます）。

  </Tab>
</Tabs>

## セキュアでない HTTP

プレーン HTTP（`http://<lan-ip>` または `http://<tailscale-ip>`）経由でダッシュボードを開くと、ブラウザーは **セキュアでないコンテキスト** で動作し、WebCrypto をブロックします。デフォルトでは、OpenClaw はデバイス ID のない Control UI 接続を **ブロック** します。

文書化されている例外:

- `gateway.controlUi.allowInsecureAuth=true` を使用した localhost 限定のセキュアでない HTTP 互換性
- `gateway.auth.mode: "trusted-proxy"` を介した Control UI オペレーター認証の成功
- 緊急用の `gateway.controlUi.dangerouslyDisableDeviceAuth=true`

**推奨される修正:** HTTPS（Tailscale Serve）を使用するか、`https://<magicdns>/`（Serve）または `http://127.0.0.1:18789/`（Gateway ホスト上）で UI をローカルに開きます。

<AccordionGroup>
  <Accordion title="安全でない認証の切り替え動作">
    ```json5
    {
      gateway: {
        controlUi: { allowInsecureAuth: true },
        bind: "tailnet",
        auth: { mode: "token", token: "replace-me" },
      },
    }
    ```

    `allowInsecureAuth` はローカル互換性のためだけの切り替えです。

    - 安全でない HTTP コンテキストで、localhost の Control UI セッションがデバイス ID なしで続行できるようにします。
    - ペアリングチェックは回避されません。
    - リモート（localhost 以外）のデバイス ID 要件は緩和されません。

  </Accordion>
  <Accordion title="緊急時のみ">
    ```json5
    {
      gateway: {
        controlUi: { dangerouslyDisableDeviceAuth: true },
        bind: "tailnet",
        auth: { mode: "token", token: "replace-me" },
      },
    }
    ```

    <Warning>
    `dangerouslyDisableDeviceAuth` は Control UI のデバイス ID チェックを無効にするため、セキュリティが大幅に低下します。緊急使用後は速やかに元に戻してください。
    </Warning>

  </Accordion>
  <Accordion title="信頼済みプロキシに関する注意">
    - 信頼済みプロキシ認証に成功すると、デバイス ID なしで **operator** の Control UI セッションが許可される場合があります。
    - これは node ロールの Control UI セッションには適用され**ません**。
    - 同一ホストの loopback リバースプロキシも信頼済みプロキシ認証の要件を満たしません。[信頼済みプロキシ認証](/ja-JP/gateway/trusted-proxy-auth)を参照してください。

  </Accordion>
</AccordionGroup>

HTTPS のセットアップについては、[Tailscale](/ja-JP/gateway/tailscale)を参照してください。

## コンテンツセキュリティポリシー

Control UI には厳格な `img-src` ポリシーが組み込まれており、許可されるのは**同一オリジン**のアセット、`data:` URL、ローカルで生成された `blob:` URL のみです。リモートの `http(s)` およびプロトコル相対の画像 URL はブラウザーによって拒否され、ネットワークフェッチも発生しません。

実際の動作は次のとおりです。

- 相対パス（例: `/avatars/<id>`）で配信されるアバターと画像は引き続き表示されます。これには、UI が取得してローカルの `blob:` URL に変換する認証済みアバタールートも含まれます。
- インラインの `data:image/...` URL は引き続き表示されます。
- Control UI によって作成されたローカルの `blob:` URL は引き続き表示されます。
- GitHub リンクプレビューのアバターは、Gateway が GitHub の固定アバターホストから取得し、制限された `data:` URL として返します。operator のブラウザーがリモートのアバターホストに接続することはありません。
- チャンネルメタデータが出力したリモートアバター URL は Control UI のアバターヘルパーで除去され、組み込みのロゴ／バッジに置き換えられます。そのため、侵害された、または悪意のあるチャンネルが operator のブラウザーに任意のリモート画像を強制的に取得させることはできません。

これは常に有効で、設定による変更はできません。

## アバタールートの認証

Gateway 認証が設定されている場合、Control UI のアバターエンドポイントには、API の他の部分と同じ Gateway トークンが必要です。

- `GET /avatar/<agentId>` は、認証済みの呼び出し元にのみアバター画像を返します。`GET /avatar/<agentId>?meta=1` も同じ規則に従ってアバターのメタデータを返します。
- どちらのルートに対する未認証リクエストも拒否されるため（同階層のアシスタントメディアルートと同様）、他の部分が保護されているホストでアバタールートからエージェントの ID が漏洩することはありません。
- Control UI はアバターの取得時に Gateway トークンを bearer ヘッダーとして転送し、認証済みの blob URL を使用するため、ダッシュボードでも画像が引き続き表示されます。

Gateway 認証を無効にすると（共有ホストでは非推奨）、Gateway の他の部分と同様に、アバタールートも未認証になります。

## アシスタントメディアルートの認証

Gateway 認証が設定されている場合、アシスタントのローカルメディアプレビューは 2 段階のルートを使用します。

- `GET /__openclaw__/assistant-media?meta=1&source=<path>` には通常の Control UI operator 認証が必要です。ブラウザーは利用可能かどうかを確認するときに、Gateway トークンを bearer ヘッダーとして送信します。
- 成功したメタデータレスポンスには、その正確なソースパスにスコープされた有効期間の短い `mediaTicket` が含まれます。
- ブラウザーで表示される画像、音声、動画、ドキュメントの URL では、アクティブな Gateway トークンやパスワードの代わりに `mediaTicket=<ticket>` を使用します。このチケットは短時間で期限切れになり、別のソースを認可することはできません。

これにより、再利用可能な Gateway 認証情報を表示可能なメディア URL に含めることなく、ブラウザー標準のメディア要素との互換性を維持できます。

## 承認リンク

operator への承認通知では、予約済みの `${controlUiBasePath}/approve/{approvalId}` 名前空間で配信されるスタンドアロンの承認ドキュメントへディープリンクできます（例: `/approve/<approvalId>`。ベースパスが設定されている場合は `/openclaw/approve/<approvalId>`）。この URL は承認の有効期間中は変わらず、自分のデバイス間で安全に転送できます。この URL は承認を識別するだけで、認可することはありません。

- 1 セグメントの `/approve/<approvalId>` 名前空間は、**すべての** HTTP メソッドについて、Plugin の HTTP ルートより前に Gateway によって予約されます。そのため、Plugin のルートが承認ドキュメントを隠したり傍受したりすることはありません。
- 承認ドキュメントを開くには、Control UI の他の部分と同じ Gateway 認証（トークン／パスワード、Tailscale Serve の ID、または信頼済みプロキシの ID）が必要です。認証情報が承認 URL に含まれることはありません。
- Control UI の配信が無効な場合、この名前空間へのリクエストは Plugin ハンドラーにフォールスルーせず、`404` を返します。
- 承認ドキュメントでのサインインは、そのページでのみ一時的に有効です。同じブラウザーで完全版 Control UI が保存した Gateway の選択内容や設定は上書きされません。

Gateway は `dist/control-ui` から静的ファイルを配信します。

```bash
pnpm ui:build
```

オプションの絶対ベース（固定アセット URL）:

```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
```

ローカル開発（別の開発サーバー）:

```bash
pnpm ui:dev
```

次に、UI の接続先を Gateway の WS URL（例: `ws://127.0.0.1:18789`）に設定します。

## Control UI の空白ページ

ブラウザーに空白のダッシュボードが表示され、DevTools に有用なエラーがない場合、拡張機能または早期に実行されるコンテンツスクリプトによって、JavaScript モジュールアプリの評価が妨げられた可能性があります。静的ページにはプレーン HTML の復旧パネルが含まれており、起動後に `<openclaw-app>` が登録されていない場合に表示されます。

ブラウザー環境を変更した後、パネルの **Try again** アクションを使用するか、次の項目を確認した後に手動で再読み込みしてください。

- すべてのページに挿入される拡張機能、特に `<all_urls>` コンテンツスクリプトを含む拡張機能を無効にします。
- プライベートウィンドウ、クリーンなブラウザープロファイル、または別のブラウザーを試します。
- Gateway を実行したままにし、ブラウザーを変更した後も同じダッシュボード URL を確認します。

## デバッグ／テスト: 開発サーバー + リモート Gateway

Control UI は静的ファイルです。WebSocket の接続先は設定可能であり、HTTP オリジンとは異なる接続先にできます。Vite 開発サーバーをローカルで実行し、Gateway を別の場所で実行する場合に便利です。

<Steps>
  <Step title="UI 開発サーバーを起動する">
    ```bash
    pnpm ui:dev
    ```
  </Step>
  <Step title="gatewayUrl を指定して開く">
    ```text
    http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
    ```

    オプションのワンタイム認証（必要な場合）:

    ```text
    http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
    ```

  </Step>
</Steps>

<AccordionGroup>
  <Accordion title="注意事項">
    - `gatewayUrl` は読み込み後に localStorage に保存され、URL から削除されます。
    - `gatewayUrl` を介して完全な `ws://` または `wss://` エンドポイントを渡す場合は、ブラウザーがクエリ文字列を正しく解析できるよう、値を URL エンコードしてください。
    - `token` は可能な限り URL フラグメント（`#token=...`）を介して渡してください。フラグメントはサーバーに送信されないため、リクエストログや Referer からの漏洩を防げます。従来の `?token=` クエリパラメーターも互換性のために一度だけインポートされますが、これはフォールバックとしてのみ使用され、ブートストラップ直後に削除されます。
    - `password` はメモリ内にのみ保持されます。
    - `gatewayUrl` が設定されている場合、UI は設定または環境の認証情報にフォールバックしません。`token`（または `password`）を明示的に指定してください。明示的な認証情報がない場合はエラーになります。
    - Gateway が TLS の背後にある場合（Tailscale Serve、HTTPS プロキシなど）は、`wss://` を使用してください。
    - `gatewayUrl` はクリックジャッキングを防ぐため、トップレベルウィンドウ（埋め込みではない）でのみ受け入れられます。
    - 公開された非 loopback の Control UI デプロイでは、`gateway.controlUi.allowedOrigins`（完全なオリジン）を明示的に設定する必要があります。loopback、RFC1918／リンクローカル、`.local`、`.ts.net`、または Tailscale CGNAT ホストからのプライベートな同一オリジン LAN／Tailnet 読み込みは、Host ヘッダーのフォールバックを有効にしなくても許可されます。
    - Gateway の起動時に、有効なランタイムのバインドとポートから `http://localhost:<port>` や `http://127.0.0.1:<port>` などのローカルオリジンが初期登録される場合がありますが、リモートブラウザーのオリジンは引き続き明示的な登録が必要です。
    - 厳密に管理されたローカルテスト以外では `gateway.controlUi.allowedOrigins: ["*"]` を使用しないでください。これは「使用中の任意のホストに一致する」ではなく、あらゆるブラウザーオリジンを許可することを意味します。
    - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` は Host ヘッダーによるオリジンフォールバックモードを有効にしますが、危険なセキュリティモードです。

  </Accordion>
</AccordionGroup>

```json5
{
  gateway: {
    controlUi: {
      allowedOrigins: ["http://localhost:5173"],
    },
  },
}
```

リモートアクセスのセットアップ詳細: [リモートアクセス](/ja-JP/gateway/remote)。

## 関連項目

- [ダッシュボード](/ja-JP/web/dashboard) — Gateway ダッシュボード
- [ヘルスチェック](/ja-JP/gateway/health) — Gateway の正常性監視
- [TUI](/ja-JP/web/tui) — ターミナルユーザーインターフェース
- [WebChat](/ja-JP/web/webchat) — ブラウザーベースのチャットインターフェース
