プレゼンス
OpenClaw プレゼンスエントリがどのように生成、マージ、および表示されるか
OpenClaw "プレゼンス"は、以下の軽量でベストエフォートなビューです:
- ゲートウェイ自体、および
- ゲートウェイに接続されたクライアント(Mac アプリ、WebChat、CLI など)
プレゼンスは主に、macOS アプリの Instances タブに入力し、迅速なオペレーター可視性を提供するために使用されます。
プレゼンスフィールド(表示される内容)
プレゼンスエントリは、以下のフィールドを持つ構造化オブジェクトです:
- ''instanceId''(オプションですが強く推奨):安定したクライアント ID(通常は ''connect.client.instanceId'')
- ''host'':人間に優しいホスト名
- ''ip'':ベストエフォートの IP アドレス
- ''version'':クライアントバージョン文字列
- ''deviceFamily'' / ''modelIdentifier'':ハードウェアのヒント
- ''mode'':''ui''、''webchat''、''cli''、''backend''、''probe''、''test''、''node''、...
- ''lastInputSeconds'':"最後のユーザー入力からの秒数"(わかっている場合)
- ''reason'':''self''、''connect''、''node-connected''、''periodic''、...
プロデューサー(プレゼンスのソース)
プレゼンスエントリは複数のソースから生成され、マージされます。
1) ゲートウェイの自己エントリ
ゲートウェイは常に起動時に "self" エントリをシードするため、UI はゲートウェイホストを表示します
クライアントが接続する前でも。
2) WebSocket connect
すべての WS クライアントは ''connect'' リクエストから始まります。ハンドシェイクが成功した後
ゲートウェイはその接続のプレゼンスエントリを挿入します。
ワンショット CLI コマンドが表示されない理由
CLI は通常、短いワンショットコマンドのために接続します。スパムを避けるために
インスタンスリスト、''client.mode === "cli"'' はプレゼンスエントリに''変換されません''。
3) `system-event` ビーコン
クライアントは ''system-event'' メソッドを介してより豊富な定期的ビーコンを送信できます。Mac
アプリはこれを使用して、ホスト名、IP、および ''lastInputSeconds'' を報告します。
4) ノード接続(ロール:ノード)
ノードが ''role: node'' を使用してゲートウェイ WebSocket 経由で接続すると、ゲートウェイは
そのノードのプレゼンスエントリを更新挿入します(他の WS クライアントと同じフロー)。
マージ + 重複排除ルール(`instanceId` が重要な理由)
プレゼンスエントリは単一のインメモリマップに保存されます:
- エントリはプレゼンスキーによってキー付けされます。
- 最良のキーは、再起動後も持続できる安定した ''instanceId''(''connect.client.instanceId'' から)です。
- キーは大文字と小文字を区別しません。
クライアントが安定した ''instanceId'' なしで再接続すると、''重複''行として表示される場合があります。
TTL とバウンドサイズ
プレゼンスは意図的に一時的なものです:
- TTL: 5 分を超えるエントリは削除されます
- 最大エントリ数: 200(最も古いものから)
これにより、リストが新鮮に保たれ、メモリの無制限の成長が回避されます。
リモート/トンネルの注意点(ループバック IP)
クライアントが SSH トンネル/ローカルポート転送経由で接続すると、ゲートウェイは
リモートアドレスを ''127.0.0.1'' として認識する場合があります。良いクライアント報告を上書きしないようにするために
IP、ループバックリモートアドレスは無視されます。
コンシューマー
macOS インスタンスタブ
macOS アプリは ''system-presence'' の出力をレンダリングし、最後の更新時間に基づいて小さなステータス
インジケーター(アクティブ/アイドル/古い)を適用します。
デバッグのヒント
- 生のリストを表示するには、ゲートウェイに対して ''system-presence'' を呼び出します。
- 重複が表示される場合:
- クライアントがハンドシェイクで安定した ''client.instanceId'' を送信することを確認します
- 定期的なビーコンが同じ ''instanceId'' を使用することを確認します
- 接続派生エントリが ''instanceId'' がないかどうかを確認します(重複が予想されます)