概要
- 単一の常駐プロセスである ゲートウェイ が、すべてのメッセージングインターフェース(Baileys による WhatsApp、grammY による Telegram、Slack、Discord、Signal、iMessage、WebChat)を管理します。
- コントロールプレーンクライアント(macOS アプリ、CLI、Web UI、自動化ツール)は、設定されたホストとポート(デフォルトは
127.0.0.1:18789)で動作するゲートウェイに WebSocket 経由で接続します。 - ノード (macOS/iOS/Android/ヘッドレス) も同様に WebSocket で接続しますが、接続時に明示的な機能やコマンドと共に
role: nodeを宣言します。 - 1 つのホストにつきゲートウェイは 1 つだけ実行されます。WhatsApp セッションを開始できるのはゲートウェイのみです。
- キャンバスホストは、ゲートウェイと同じポート(デフォルト
18789)を使用して、以下のパスで HTTP 配信されます:/__openclaw__/canvas/(エージェントが編集可能な HTML/CSS/JS)/__openclaw__/a2ui/(A2UI ホスト)
コンポーネントとフロー
ゲートウェイ (デーモン)
- 各プロバイダーとの接続を維持します。
- 型定義された WebSocket API (リクエスト、レスポンス、サーバープッシュイベント) を提供します。
- 受信したフレームを JSON スキーマに照らして検証します。
agent,chat,presence,health,heartbeat,cronなどのイベントを発行します。
クライアント (mac アプリ / CLI / Web 管理画面)
- クライアントごとに 1 つの WebSocket 接続を確立します。
- リクエスト (
health,status,send,agent,system-presence) を送信します。 - イベント (
tick,agent,presence,shutdown) を購読します。
ノード (macOS / iOS / Android / ヘッドレス)
- 同じ WebSocket サーバーに
role: nodeとして接続します。 connect時にデバイスのアイデンティティを提供します。ペアリングは デバイスベース (rolenode) で行われ、その承認情報はデバイスペアリングストアで管理されます。canvas.*,camera.*,screen.record,location.getなどのコマンドを公開します。
WebChat
- ゲートウェイの WebSocket API を使用して会話履歴の表示や送信を行う、静的な UI です。
- リモート環境では、他のクライアントと同様に SSH や Tailscale トンネルを介して接続します。
接続ライフサイクル (単一クライアント)
通信プロトコル (サマリー)
- トランスポート: WebSocket。JSON ペイロードを含むテキストフレームを使用します。
- 最初のフレームは必ず
connectである必要があります。 - ハンドシェイク(接続確立)後:
- リクエスト:
{type:"req", id, method, params}→{type:"res", id, ok, payload|error} - イベント:
{type:"event", event, payload, seq?, stateVersion?}
- リクエスト:
OPENCLAW_GATEWAY_TOKEN(または--token) が設定されている場合、connect.params.auth.tokenが一致しなければソケットは即座に閉じられます。- 副作用を伴うメソッド (
send,agent) では、安全に再試行を行うために冪等(べきとう)キーが必要です。サーバーは短期間の重複排除キャッシュを維持します。 - ノードは、
connect時にrole: "node"に加え、利用可能な機能、コマンド、および権限を含める必要があります。
ペアリングとローカルの信頼
- すべての WebSocket クライアント(オペレーターおよびノード)は、
connect時に デバイスアイデンティティ を含めます。 - 新しいデバイス ID にはペアリングの承認が必要で、ゲートウェイはそれ以降の接続のために デバイストークン を発行します。
- ローカルな接続(ループバックアドレス、またはゲートウェイホスト自身の Tailscale アドレス)は、同一ホスト内での利便性を保つため、自動的に承認される場合があります。
- すべての接続において、
connect.challengeノンスへの署名が必要です。 - 署名ペイロード
v3では、platform(プラットフォーム) とdeviceFamily(デバイスファミリー) も紐付けられます。ゲートウェイは再接続時にペアリング済みのメタデータを固定し、メタデータに変更があった場合にはペアリングの再実行(修復)を求めます。 - ローカル以外からの接続には、引き続き明示的な承認が必要です。
- ゲートウェイ認証 (
gateway.auth.*) は、ローカルかリモートかを問わず、すべての接続に適用されます。
プロトコルの型定義とコード生成
- プロトコルは TypeBox スキーマによって定義されています。
- これらのスキーマから JSON スキーマが生成されます。
- 生成された JSON スキーマから Swift のモデルが作成されます。
リモートアクセス
- 推奨される方法: Tailscale または VPN。
-
代替案: SSH トンネル
- トンネル越しでも、同じハンドシェイクと認証トークンが適用されます。
- リモート設定では、WebSocket に対して TLS 設定やオプションのピン留めを有効にできます。
運用のスナップショット
- 起動:
openclaw gateway(フォアグラウンド実行。ログは標準出力に出力されます)。 - ヘルスチェック: WebSocket 経由の
healthリクエスト (またはhello-okレスポンスに含まれる情報)。 - プロセス監視: 自動再起動のために launchd または systemd を使用します。
不変のルール
- ホストごとに単一のゲートウェイが、単一の Baileys (WhatsApp) セッションを管理します。
- ハンドシェイクは必須です。最初のフレームが有効な JSON でない、あるいは
connectでない場合は強制的に切断されます。 - イベントの再送(リプレイ)は行われません。通信に欠落が生じた場合、クライアント側で情報を再取得する必要があります。