Presence
OpenClaw-„Presence“ ist eine leichtgewichtige Best-Effort-Ansicht von:- dem Gateway selbst und
- Clients, die mit dem Gateway verbunden sind (mac app, WebChat, CLI usw.)
Presence-Felder (was angezeigt wird)
Presence-Einträge sind strukturierte Objekte mit Feldern wie:instanceId(optional, aber dringend empfohlen): stabile Client-Identität (normalerweiseconnect.client.instanceId)host: benutzerfreundlicher Hostnameip: Best-Effort-IP-Adresseversion: Versionszeichenfolge des ClientsdeviceFamily/modelIdentifier: Hardware-Hinweisemode:ui,webchat,cli,backend,probe,test,node, …lastInputSeconds: „Sekunden seit der letzten Benutzereingabe“ (falls bekannt)reason:self,connect,node-connected,periodic, …ts: Zeitstempel der letzten Aktualisierung (ms seit der Unix-Epoche)
Producer (woher Presence kommt)
Presence-Einträge werden von mehreren Quellen erzeugt und zusammengeführt.1) Gateway-Selbsteintrag
Das Gateway erzeugt beim Start immer einen „self“-Eintrag, damit UIs den Gateway-Host anzeigen, noch bevor sich Clients verbinden.2) WebSocket-Verbindung
Jeder WS-Client beginnt mit einerconnect-Anfrage. Nach erfolgreichem Handshake
führt das Gateway ein Upsert eines Presence-Eintrags für diese Verbindung aus.
Warum einmalige CLI-Befehle nicht angezeigt werden
Die CLI verbindet sich oft für kurze, einmalige Befehle. Um die Instances-Liste nicht zuzuspammen, wirdclient.mode === "cli" nicht in einen Presence-Eintrag umgewandelt.
3) system-event-Beacons
Clients können über die Methode system-event umfangreichere periodische Beacons senden. Die mac
app verwendet dies, um Hostname, IP und lastInputSeconds zu melden.
4) Node-Verbindungen (role: node)
Wenn sich ein Node über das Gateway-WebSocket mitrole: node verbindet, führt das Gateway
ein Upsert eines Presence-Eintrags für diesen Node aus (derselbe Ablauf wie bei anderen WS-Clients).
Regeln für Zusammenführung + Deduplizierung (warum instanceId wichtig ist)
Presence-Einträge werden in einer einzelnen In-Memory-Map gespeichert:
- Einträge sind durch einen Presence-Schlüssel verschlüsselt.
- Der beste Schlüssel ist eine stabile
instanceId(ausconnect.client.instanceId), die Neustarts überlebt. - Schlüssel sind nicht case-sensitiv.
instanceId erneut verbindet, kann er als
doppelte Zeile erscheinen.
TTL und begrenzte Größe
Presence ist absichtlich flüchtig:- TTL: Einträge, die älter als 5 Minuten sind, werden bereinigt
- Maximale Einträge: 200 (älteste werden zuerst entfernt)
Hinweis zu Remote/Tunnel (Loopback-IP-Adressen)
Wenn sich ein Client über einen SSH-Tunnel / lokale Portweiterleitung verbindet, kann das Gateway die entfernte Adresse als127.0.0.1 sehen. Um eine gute vom Client gemeldete
IP nicht zu überschreiben, werden entfernte Loopback-Adressen ignoriert.
Consumer
Tab „Instances“ unter macOS
Die macOS-App rendert die Ausgabe vonsystem-presence und verwendet einen kleinen Status-
indikator (Aktiv/Inaktiv/Veraltet) basierend auf dem Alter der letzten Aktualisierung.
Tipps zur Fehlerbehebung
- Um die Rohliste zu sehen, rufen Sie
system-presencegegen das Gateway auf. - Wenn Sie Duplikate sehen:
- bestätigen Sie, dass Clients im Handshake eine stabile
client.instanceIdsenden - bestätigen Sie, dass periodische Beacons dieselbe
instanceIdverwenden - prüfen Sie, ob dem aus der Verbindung abgeleiteten Eintrag
instanceIdfehlt (Duplikate sind zu erwarten)
- bestätigen Sie, dass Clients im Handshake eine stabile