OpenClawSkills
GitHub
コア概念 • 5分で読める

Gateway アーキテクチャ

WebSocket Gateway のアーキテクチャ、コンポーネント、クライアントフロー。

Last updated: 2026-01-22

Tutorial.step

Overview

- 長期間稼働する ゲートウェイ がすべてのメッセージングインターフェースを所有(WhatsApp

Baileys, GrammY Telegram, Slack, Discord, Signal, iMessage, WebChat).

- コントロールプレーンクライアント(macOSアプリ、CLI、Web UI、自動化)は

設定バインドホスト上のゲートウェイに WebSocket 経由で接続(デフォルト

''127.0.0.1:18789'')。

- ノード(macOS/iOS/Android/ヘッドレス)も WebSocket 経由で接続しますが、

明示的な大文字/コマンド宣言 ''role: node'' を使用します。

- ホストごとに1つのゲートウェイ。これがWhatsAppセッションが開かれる唯一の場所です。

Tutorial.step

コンポーネントとフロー

#

Tutorial.step

ゲートウェイ(デーモン)

- プロバイダー接続を維持します。

- 型指定されたWS API(リクエスト、レスポンス、サーバー送信イベント)を公開します。

- JSONスキーマに対してインバウンドフレームを検証します。

- ''agent''、''chat''、''presence''、''health''、''heartbeat''、''cron'' などのイベントを発行します。

#

Tutorial.step

クライアント(macアプリ/CLI/Web管理)

- クライアントごとに1つのWS接続。

- リクエストを送信(''health''、''status''、''send''、''agent''、''system-presence'')。

- イベントを購読(''tick''、''agent''、''presence''、''shutdown'')。

#

Tutorial.step

ノード(macOS / iOS / Android / ヘッドレス)

- ''role: node'' を使用して ''同じWSサーバー'' に接続します。

- ''connect'' でデバイスIDを提供。ペアリングは ''デバイスベース''(ロール ''node'')で、

承認はデバイスペアリングストアに存在します。

- ''canvas.*''、''camera.*''、''screen.record''、''location.get'' などのコマンドを公開します。

プロトコル詳細:

- ''ゲートウェイプロトコル''

#

Tutorial.step

Webチャット

- Gateway WS APIを使用したチャット履歴と送信の静的UI。

- リモートセットアップでは、他のクライアントと同じSSH/Tailscaleトンネル経由で

接続します。

Tutorial.step

接続ライフサイクル(単一クライアント)

Terminal
Client                    Gateway
  |                          |
  ||   (or res error + close)
  |   (payload=hello-ok carries snapshot: presence + health)
  |                          |
  |< event:presence -----|   (final: {runId,status,summary})
  |                          |
Tutorial.step

ワイヤープロトコル(概要)

- トランスポート: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'')は安全な再試行のためにべき等キーが必要です。

サーバーは短命の重複排除キャッシュを保持します。

Tutorial.step

ペアリング + ローカル信頼

- すべてのWSクライアント(オペレーター + ノード)は ''connect'' で ''デバイスID'' を含みます。

- 新しいデバイスIDはペアリング承認が必要。ゲートウェイは デバイストークン を発行します。

後続の接続用。

- ローカル 接続(ループバックまたはゲートウェイホスト自身のtailnetアドレス)は

同じホストUXをスムーズに保つために自動承認できます。

- ''非ローカル'' 接続は ''connect.challenge'' ナンスに署名し、

明示的な承認が必要です。

- ゲートウェイ認証(''gateway.auth.*'')は ''すべて'' の接続(ローカルまたは

リモート)に適用されます。詳細:''ゲートウェイプロトコル''、''ペアリング''、''セキュリティ''。

Tutorial.step

プロトコルタイプとコード生成

- TypeBoxスキーマがプロトコルを定義します。

- JSONスキーマはこれらのスキーマから生成されます。

- SwiftモデルはJSONスキーマから生成されます。

Tutorial.step

リモートアクセス

- 推奨:TailscaleまたはVPN。

- 代替:SSHトンネル

''ssh -N -L 18789:127.0.0.1:18789 user@host''

- トンネル経由でも同じハンドシェイク + 認証トークンが適用されます。

- リモートセットアップでWSにTLS + オプションのピン留めを有効にできます。

Tutorial.step

運用スナップショット

- 開始:''openclaw gateway''(フォアグラウンド、stdoutにログ出力)。

- ヘルス:WS経由の ''health''(''hello-ok'' にも含まれます)。

- 監督:自動再起動用のlaunchd/systemd。

Tutorial.step

Invariants

- ホストごとに1つのゲートウェイのみが1つのBaileysセッションを制御します。

- ハンドシェイクは必須。非JSONまたは非接続の最初のフレームは強制終了です。

- イベントは再再生されません。クライアントはギャップを追いつく必要があります。