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