Web interfaces

コントロール UI

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

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

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

クイックオープン(ローカル)

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

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

認証は、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 回限りのペアリング承認が必要です。

  • 保留中のリクエストを一覧表示

    bash
    openclaw devices list
  • リクエスト ID で承認

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

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

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

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

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

  • モバイルペアリングを開く

    デバイスを選択し、デバイスカードの モバイルデバイスをペアリングをクリックします。

  • スマートフォンを接続する

    OpenClaw モバイルアプリで 設定Gateway を開き、QR コードをスキャンします。代わりにセットアップコードをコピーして貼り付けることもできます。

  • 接続を確認する

    公式の iOS/Android アプリは自動的に接続します。承認待ちにリクエストが表示された場合は、承認する前にロールとスコープを確認してください。

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

    個人 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 エディターを開き、テーマを選択または作成して 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 サーバーを一覧表示し、その場での追加、無効化、削除をサポートします。検出タブはストアです。OpenClaw に含まれる注目の Plugin、公式の外部 Plugin、人気サービス向けのワンクリック MCP コネクターが表示されます。検索ボックスに入力すると、ClawHub がインラインで検索され、ダウンロード数とソース検証バッジを含む ClawHub からセクションが追加されます。ディープリンクでは /settings/plugins?tab=discover を使用してストアを直接開けます。

    Skillsタブには、選択したエージェントをスコープとして、スキル状態レポート、有効化と無効化の切り替え、API キー入力、インラインの ClawHub スキル検索があります。ワークショップタブには、スキル提案向けのスキルワークショップボードと 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を使用してください。

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

    サイドバーでは、スクロール可能なセッション一覧の上にナビゲーションが固定表示されます。マルチエージェント構成では、各エージェントが折りたたみ可能な最上位セクションとして表示されます。エージェントを展開すると、開いているチャットから移動せずにそのセッションを参照でき、折りたたまれたエージェントには未読インジケーターが表示されます。エージェント内では、一覧は 固定済み、接続されたチャンネル(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 アプリではさらに、ウィンドウコントロールの横にネイティブのサイドバー切り替えとトラックパッドのスワイプジェスチャーが追加されます。サイドバーを展開している間は右端に戻る/進むボタンが表示され、折りたたんでいる間はネイティブ検索(コマンドパレット)ボタンと新規セッションボタンが表示されます。

    現在できること

    チャットと音声会話
    • Gateway WS(chat.historychat.sendchat.abortchat.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/ツールイベント配信から得られるリアルタイムのツールアクティビティを、まず秘匿化してブラウザ内に保存する要約を表示する「アクティビティ」タブ。
    チャンネル、セッション、メモリ
    • チャンネル:組み込みおよび同梱/外部Pluginチャンネルの状態、QRログイン、チャンネルごとの設定(channels.statusweb.login.*config.patch)。
    • チャンネルプローブの更新では、時間のかかるプロバイダーチェックが完了するまで以前のスナップショットを表示し続け、プローブまたは監査がUIの時間上限を超えた場合は部分的なスナップショットであることを示します。
    • セッション(エージェントとツール配下の設定ページ、/settings/sessions):デフォルトで設定済みエージェントのセッションを一覧表示し、頻繁に使うセッションのピン留め、名前変更、非アクティブなセッションのアーカイブまたは復元、古くなった未設定エージェントのセッションキーからのフォールバック、セッションごとのモデル/思考/高速/詳細/トレース/推論のオーバーライド適用を行えます(sessions.listsessions.patch)。ピン留めされたセッションは、最近使用したピン留めされていないセッションより上に並びます。アーカイブされたセッションは、セッションページのアーカイブ済みビューに表示され、トランスクリプトが保持されます。最後に既読にしてからアクティビティがあったセッションの行には未読を示す点が表示され、未読にする/既読にする操作(sessions.patch { unread })と、トランスクリプトを分岐して新しいセッションを作成するフォーク操作(sessions.create { parentSessionKey, fork: true })があります。テーブル上部の概要タイルには、読み込まれた一覧の概要(セッション数、実行中のラン、未読セッション、合計トークン)が表示されます。各行には種類を示すグリフと実行中のランを示す点があり、ステータスは単色の点とラベルで表示されます。また、セッションからトークン数とコンテキストサイズが報告される場合、トークン列にはコンテキストウィンドウ使用量メーターが表示されます。行の管理操作は、サイドバーのセッションメニューと同じ内容の行ごとのメニュー(ケバブボタンまたは右クリック)に配置され、行のドロワーには、その他のセッション詳細とともにエージェントランタイムと実行時間が表示されます。
    • セッションのグループ化:「グループ化」コントロールにより、セッションテーブルをカスタムグループ、チャンネル、種類、エージェント、または日付ごとのセクションに整理できます。カスタムグループは、sessions.patchcategory)を介してセッションごとに保持されるため、メッセージチャンネル(Discord、Telegram、WhatsAppなど)から開始されたセッションも分類できます。行をセクションにドラッグするか、行ごとのグループセレクターを使用してグループを割り当て、「新しいグループ」操作でグループを作成します。
    • メモリ(エージェントページのタブ。選択したエージェントが対象):Dreamingの状態、有効化/無効化トグル、Dream Diaryリーダー(doctor.memory.statusdoctor.memory.dreamDiaryconfig.patch)。
    • メモリのインポート(エージェントとツール配下の設定ページ、/settings/memory-import):ローカルのCodex統合メモリまたはClaude Code自動メモリをプレビューし、選択したエージェントのワークスペースにコピーします(migrations.memory.planmigrations.memory.apply)。
    Cron、タスク、Plugin、Skills、デバイス、実行承認
    • オートメーション(Cronジョブ):オートメーション/実行履歴のタブ切り替えの上に統計カード(オートメーション数、失敗数、スケジューラーの状態、次回起動)を表示します。オートメーションタブでは、フィルター可能なテーブル(すべて/アクティブ/一時停止、検索、スケジュールと最終実行のフィルター、行ごとの操作メニュー)にジョブが一覧表示され、その下にスターター候補が表示されます。実行履歴タブには、すべてのオートメーションの最近の実行が表示されます(cron.*)。
    • タスク:リンクされたセッションとキャンセル操作を含む、実行中および最近のバックグラウンドタスクのライブ台帳(tasks.*)。
    • Plugin:インストール済み一覧と厳選されたストアの閲覧、ClawHubの検索、Pluginコードのインストールと削除、インストール済みPluginの有効化または無効化を行えます(plugins.*)。MCPサーバーの行では、設定メソッドを介してmcp.serversを編集します。
    • Skills:状態、有効化/無効化、インストール、APIキーの更新(skills.*)。
    • デバイス:単一の一覧に、ペアリング済みデバイスレコード、Nodeカタログ、ライブプレゼンスを統合します(device.pair.listnode.listsystem-presence)。Gatewayホストは先頭に固定されます。ペアリング済みクライアントには、接続状態、ロール、トークン、機能、コマンドが表示されます。重複するペアリングは展開可能なグループにまとめられ、古いN件をクリーンアップでは、管理者が確認したオフラインの重複のうち、自動承認されたもの(サイレントなローカル、信頼済みCIDR、またはSSH検証済み)、あるいは承認元情報の記録開始より前のものを一括削除します。エントリは削除でき(node.pair.removedevice.pair.remove)、デバイスのペアリングとNodeの再承認はインラインで処理されます(device.pair.*node.pair.approve/reject)。モバイルセットアップコードも同じカードから作成できます。
    • 実行承認:exec host=gateway/nodeに対するGatewayまたはNodeの許可リストと確認ポリシーを編集します(exec.approvals.*)。
    設定
    • ~/.openclaw/openclaw.jsonを表示/編集します(config.getconfig.set)。
    • エージェント:エージェントごとのタブ(概要、ファイル、ツール、Skills、チャンネル、オートメーション、メモリ)を備えた設定ページ(設定 → エージェント/settings/agents)。概要タブでは、エージェントのアイデンティティ(表示名、絵文字、アバター画像)を編集します。アバター画像は、agents.updateの前にブラウザー内で縮小され、サイズ制限が適用されます。保存すると、設定されたアイデンティティフィールドが保存され、ワークスペースのIDENTITY.mdにも反映されます。設定値は、同じファイルフィールドに対する手動編集より優先されます。
    • プロフィール:デフォルトエージェントのアイデンティティと全期間の使用統計(累計トークン、ピーク日、最長セッション、アクティビティの連続記録、1年間のトークンヒートマップ、上位ツール、チャンネルのハイライト)を表示する設定ページ(usage.costsessions.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.schemaconfig.schema.lookupから生成されます。これには、フィールドのtitle/description、対応するUIヒント、直下の子要素の概要、ネストされたオブジェクト/ワイルドカード/配列/合成Node上のドキュメントメタデータ、さらに利用可能な場合はPluginおよびチャンネルのスキーマが含まれます。Raw JSONエディターは、スナップショットを安全にRaw形式で往復変換できる場合にのみ使用できます。それ以外の場合、Control UIはフォームモードを強制します。
    • Raw JSONエディターの「保存済みにリセット」では、平坦化されたスナップショットを再レンダリングする代わりに、Raw形式で記述された形状(書式、コメント、$includeのレイアウト)を保持します。そのため、スナップショットを安全に往復変換できる場合、リセット後も外部編集が維持されます。
    • 構造化されたSecretRefオブジェクト値は、オブジェクトから文字列への意図しない破損を防ぐため、フォームのテキスト入力では読み取り専用として表示されます。
    使用量
    • セッションから算出されるトークンおよび推定コストの分析は、プロバイダー請求とは分離されたままです。
    • プロバイダーカードはusage.statusを呼び出し、設定済みのプロバイダーPluginから報告されたライブのプラン名、割り当て期間、残高、支出、予算を表示します。
    • プロバイダー使用量の取得に失敗しても、セッション/コストダッシュボードはブロックされません。利用できないプロバイダーカードには、それぞれ独自のエラー状態が表示されます。
    デバッグ、ログ、更新
    • デバッグ:状態/正常性/モデルのスナップショット、イベントログ、手動RPC呼び出し(statushealthmodels.list)。
    • イベントログには、Control UIの更新/RPCタイミング、時間のかかるチャット/設定レンダリングのタイミング、およびブラウザーが該当するPerformanceObserverエントリタイプを公開している場合の、長いアニメーションフレームや長時間タスクに関するブラウザー応答性エントリが含まれます。
    • ログ:Gatewayファイルログをライブで追尾し、フィルター/エクスポートできます(logs.tail)。
    • 更新:パッケージ/git更新と再起動(update.run)を実行して再起動レポートを表示し、その後、再接続後にupdate.statusをポーリングして、実行中のGatewayバージョンを確認します。
    オートメーションパネルの注記
    • 行を選択すると全画面の詳細ビューが開き、ヘッダーにはアクティブ/一時停止スイッチと「今すぐ実行」が表示されます(期限到来時に実行、複製、削除はメニュー内)。設定タブでは、オートメーション(プロンプト、詳細、頻度、高度なオーバーライド)をインラインで編集し、実行履歴タブにはそのオートメーションの実行が表示されます。
    • テーブル下のスターターオートメーションを使用すると、編集可能なプロンプトとスケジュールが作成フォームに事前入力されます。
    • 分離タスクでは、配信のデフォルトは概要の通知です。内部専用の実行では「なし」に切り替えます。
    • 通知が選択されている場合、チャンネル/送信先フィールドが表示されます。
    • Webhookモードでは、有効なHTTP(S) Webhook URLをdelivery.toに設定して、delivery.mode = "webhook"を使用します。
    • メインセッションのタスクでは、Webhookおよび配信なしモードを使用できます。
    • 高度な編集コントロールには、実行後の削除、エージェントオーバーライドのクリア、Cronの正確/時間分散オプション、エージェントのモデル/思考オーバーライド、ベストエフォート配信トグルが含まれます。
    • フォーム検証では、フィールド単位のエラーがインラインで表示されます。無効な値がある場合、修正されるまで保存ボタンは無効になります。
    • 専用のBearerトークンを送信するには、cron.webhookTokenを設定します。省略した場合、Webhookは認証ヘッダーなしで送信されます。
    • cron.webhookは非推奨の旧式フォールバックです。引き続きnotify: trueを使用している保存済みジョブを、ジョブごとの明示的なWebhook配信または完了時配信へ移行するには、openclaw doctor --fixを実行します。

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

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

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

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

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

    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 --verboseopenclaw mcp doctor --probe、または openclaw mcp reload を実行します。

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

    アクティビティタブ

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

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

    オペレーターターミナル

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

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

    セッションサイドバーで検出された Codex および Claude Code セッションは、同じターミナルパネル内で各ネイティブ CLI を開けます。Settings › ChatOpen Codex/Claude sessions inTerminal に設定すると、通常の行クリックで 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 が制御するブラウザー(エージェントがブラウザーツールを通じて操作するものと同じ)を通常の任意のウェブブラウザー内に表示する、ドッキング可能なブラウザーパネルが付属しています。ネイティブ WebView は不要です。接続先の Gateway が operator.admin 接続に browser.request を通知すると表示され、セッションワークスペースレールの地球儀ボタンで表示を切り替えられます。パネルには、タブ、編集可能な URL バー、戻る/進む/再読み込み、使用中のブラウザーで開く機能を備えたライブページスナップショットが表示されます。右側または下部にドッキングでき、クリック、ホイールスクロール、基本的な文字入力をリモートページに転送します。

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

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

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

    チャットの動作

    送信と履歴のセマンティクス
    • 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 に記載されています。
    • 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.listtask イベントによるライブ更新)が一覧表示されます。実行中の作業には、経過時間のライブタイマー、ツール使用回数、現在使用中のツール、停止コントロールが表示されます。折りたたみ可能な完了済みセクションには実行時間が追加され、「トランスクリプトを表示」リンクを押すとタスクの子セッションがペイン内に開きます。分割ペインのヘッダーにあるアクティビティ切り替え、または単一ペインのチャットにあるフローティングアクティビティボタンで開けます。タスクのスナップショットは先行して読み込まれるため、レールを先に開かなくても、どちらにも実行中件数のバッジが表示されます。「タスク」ページは、引き続きエージェント横断の完全な台帳です。
    • ワークスペースレール、バックグラウンドタスクレール、詳細パネルは、ウィンドウではなく各ペイン自体の幅に適応します。狭いペインまたはコンパクトなウィンドウでは、両方のレールが下部ストリップとして表示されます(ペインが広くなるまでサイドドックのコントロールは非表示になり、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 が最新の使用量を再度報告するまで非表示になります。
    トークモード(ブラウザーのリアルタイム)

    トークモードでは、登録済みのリアルタイム音声プロバイダーを使用します。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 リレーのブラウザーアダプターを検証します。このコマンドはプロバイダーのステータスのみを出力し、シークレットをログに記録しません。

    停止と中止
    • chat.abort を呼び出す Stop をクリックします。
    • 実行中は、通常のフォローアップがキューに入ります。キュー内のメッセージで Steer をクリックすると、そのフォローアップが実行中のターンに挿入されます。
    • /stop(または stopstop actionstop runstop openclawplease stop のような単独の中止フレーズ)を入力すると、帯域外で中止します。
    • chat.abort{ sessionKey }runId なし)をサポートし、そのセッションのすべてのアクティブな実行を中止します。
    中止時の部分出力の保持
    • 実行が中止されても、アシスタントの部分的なテキストが UI に表示されることがあります。
    • バッファーされた出力が存在する場合、Gateway は中止されたアシスタントの部分的なテキストをトランスクリプト履歴に永続化します。
    • 永続化されたエントリには中止メタデータが含まれるため、トランスクリプトの利用側は、中止された部分出力と正常完了時の出力を区別できます。

    接続の切断と再接続

    セッションの確立後に 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 は、endpointkeys.p256dhkeys.auth を登録します。
    • push.web.unsubscribe は、登録済みのエンドポイントを削除します。
    • push.web.test は、呼び出し元のサブスクリプションにテスト通知を送信します。

    ホストされた埋め込み

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

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

    strict

    ホストされた埋め込み内でのスクリプト実行を無効にします。

    scripts (default)

    オリジンの分離を維持しながら、インタラクティブな埋め込みを許可します。通常、自己完結型のブラウザーゲーム/ウィジェットにはこれで十分です。

    trusted

    意図的により強い権限を必要とする同一サイトのドキュメント向けに、allow-scripts に加えて allow-same-origin を追加します。

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

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

    チャットメッセージの幅

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

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

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

    Tailnet アクセス(推奨)

    統合 Tailscale Serve(推奨)

    Gateway をループバック上に維持し、Tailscale Serve で HTTPS プロキシします。

    bash
    openclaw gateway --tailscale serve

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

    デフォルトでは、gateway.auth.allowTailscaletrue の場合、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 が表示されることがあります。

    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 として送信されます)。

    セキュアでない 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 をローカルに開きます。

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

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

    • 安全でない HTTP コンテキストで、localhost の Control UI セッションがデバイス ID なしで続行できるようにします。
    • ペアリングチェックは回避されません。
    • リモート(localhost 以外)のデバイス ID 要件は緩和されません。
    緊急時のみ
    json5
    {  gateway: {    controlUi: { dangerouslyDisableDeviceAuth: true },    bind: "tailnet",    auth: { mode: "token", token: "replace-me" },  },}
    信頼済みプロキシに関する注意
    • 信頼済みプロキシ認証に成功すると、デバイス ID なしで operator の Control UI セッションが許可される場合があります。
    • これは node ロールの Control UI セッションには適用されません
    • 同一ホストの loopback リバースプロキシも信頼済みプロキシ認証の要件を満たしません。信頼済みプロキシ認証を参照してください。

    HTTPS のセットアップについては、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 を別の場所で実行する場合に便利です。

  • UI 開発サーバーを起動する

    bash
    pnpm ui:dev
  • 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>
  • 注意事項
    • 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 ヘッダーによるオリジンフォールバックモードを有効にしますが、危険なセキュリティモードです。
    json5
    {  gateway: {    controlUi: {      allowedOrigins: ["http://localhost:5173"],    },  },}

    リモートアクセスのセットアップ詳細: リモートアクセス

    関連項目

    Was this useful?
    On this page

    On this page