ネットワーキングとディスカバリー
ゲートウェイ所有ペアリング
ゲートウェイ所有ペアリングでは、ゲートウェイがどのノードが参加を許可されるかの信頼できる情報源となります。UI(macOSアプリ、将来のクライアント)は、保留中のリクエストを承認または拒否する単なるフロントエンドです。重要: WSノードは connect 時にデバイスペアリング(ロール node)を使用します。node.pair.* は別個のペアリングストアであり、WSハンドシェイクを制御しません。このフローを使用するのは、明示的に node.pair.* を呼び出すクライアントのみです。
概念
- 保留中のリクエスト: 参加を要求したノード。承認が必要です。
- ペアリング済みノード: 承認され、認証トークンが発行されたノード。
- トランスポート: ゲートウェイWSエンドポイントはリクエストを転送しますが、メンバーシップを決定しません。(従来のTCPブリッジサポートは非推奨/削除されています。)
ペアリングの仕組み
- ノードがゲートウェイWSに接続し、ペアリングをリクエストします。
- ゲートウェイは保留中のリクエストを保存し、
node.pair.requestedを発行します。 - ユーザーがリクエストを承認または拒否します(CLIまたはUI経由)。
- 承認時に、ゲートウェイは新しいトークンを発行します(トークンは再ペアリング時にローテーションされます)。
- ノードはトークンを使用して再接続し、これで「ペアリング済み」となります。
保留中のリクエストは5分後に自動的に期限切れになります。
CLIワークフロー(ヘッドレス対応)
openclaw nodes pending
openclaw nodes approve <requestId>
openclaw nodes reject <requestId>
openclaw nodes status
openclaw nodes rename --node <id|name|ip> --name "Living Room iPad"
nodes status は、ペアリング済み/接続済みのノードとその機能を表示します。
APIサーフェス(ゲートウェイプロトコル)
イベント:
node.pair.requested— 新しい保留リクエストが作成されたときに発行されます。node.pair.resolved— リクエストが承認/拒否/期限切れになったときに発行されます。
メソッド:
node.pair.request— 保留リクエストを作成または再利用します。node.pair.list— 保留中およびペアリング済みのノードを一覧表示します。node.pair.approve— 保留中のリクエストを承認します(トークンを発行)。node.pair.reject— 保留中のリクエストを拒否します。node.pair.verify—{ nodeId, token }を検証します。
注意点:
node.pair.requestはノードごとに冪等です:繰り返し呼び出しても同じ保留リクエストが返されます。- 承認は常に新しいトークンを生成します;
node.pair.requestからトークンが返されることはありません。 - リクエストには、自動承認フローのヒントとして
silent: trueを含めることができます。
自動承認(macOSアプリ)
macOSアプリは、以下の条件を満たす場合、オプションでサイレント承認を試みることができます:
- リクエストが
silentとマークされている、かつ - アプリが同じユーザーを使用してゲートウェイホストへのSSH接続を検証できる場合。
サイレント承認が失敗した場合、通常の「承認/拒否」プロンプトにフォールバックします。
ストレージ(ローカル、プライベート)
ペアリング状態は、ゲートウェイの状態ディレクトリ(デフォルト ~/.openclaw)の下に保存されます:
~/.openclaw/nodes/paired.json~/.openclaw/nodes/pending.json
OPENCLAW_STATE_DIR を上書きした場合、nodes/ フォルダもそれに伴って移動します。セキュリティ上の注意:
- トークンは秘密情報です;
paired.jsonは機密として扱ってください。 - トークンをローテーションするには、再承認(またはノードエントリの削除)が必要です。
トランスポートの動作
- トランスポートはステートレスです;メンバーシップを保存しません。
- ゲートウェイがオフラインの場合、またはペアリングが無効になっている場合、ノードはペアリングできません。
- ゲートウェイがリモートモードの場合でも、ペアリングはリモートゲートウェイのストアに対して行われます。