Присутність
“Присутність” OpenClaw — це легке представлення за принципом best-effort для:- самого Gateway, і
- клієнтів, підключених до Gateway (mac app, WebChat, CLI тощо).
Поля присутності (що відображається)
Записи присутності — це структуровані об’єкти з такими полями, як:instanceId(необов’язкове, але наполегливо рекомендоване): стабільна ідентичність клієнта (зазвичайconnect.client.instanceId)host: зрозуміла людині назва хостаip: IP-адреса за принципом best-effortversion: рядок версії клієнтаdeviceFamily/modelIdentifier: підказки щодо апаратного забезпеченняmode:ui,webchat,cli,backend,probe,test,node, …lastInputSeconds: “секунди з моменту останнього введення користувача” (якщо відомо)reason:self,connect,node-connected,periodic, …ts: позначка часу останнього оновлення (мс від початку епохи)
Джерела (звідки береться присутність)
Записи присутності створюються кількома джерелами і об’єднуються.1) Власний запис Gateway
Gateway завжди ініціалізує власний запис “self” під час запуску, щоб UI показували хост gateway ще до підключення будь-яких клієнтів.2) WebSocket connect
Кожен WS-клієнт починає з запитуconnect. Після успішного рукостискання Gateway виконує upsert запису присутності для цього підключення.
Чому одноразові команди CLI не відображаються
CLI часто підключається для коротких одноразових команд. Щоб не засмічувати список Instances,client.mode === "cli" не перетворюється на запис присутності.
3) beacon system-event
Клієнти можуть надсилати багатші періодичні beacon через метод system-event. mac app використовує це, щоб повідомляти назву хоста, IP і lastInputSeconds.
4) Підключення вузлів (role: node)
Коли вузол підключається через WebSocket Gateway зrole: node, Gateway виконує upsert запису присутності для цього вузла (той самий потік, що й для інших WS-клієнтів).
Правила об’єднання та дедуплікації (чому важливий instanceId)
Записи присутності зберігаються в єдиній map у пам’яті:
- Записи мають ключ у вигляді ключа присутності.
- Найкращий ключ — стабільний
instanceId(ізconnect.client.instanceId), який переживає перезапуски. - Ключі нечутливі до регістру.
instanceId, він може з’явитися як
дублікат рядка.
TTL і обмежений розмір
Присутність навмисно є ефемерною:- TTL: записи старші за 5 хвилин видаляються
- Максимум записів: 200 (найстаріші видаляються першими)
Застереження щодо віддалених підключень/тунелів (loopback IP)
Коли клієнт підключається через SSH-тунель / локальне перенаправлення порту, Gateway може бачити віддалену адресу як127.0.0.1. Щоб не перезаписувати коректну IP-адресу, повідомлену клієнтом,
віддалені loopback-адреси ігноруються.
Споживачі
Вкладка Instances у macOS
Застосунок macOS рендерить вивідsystem-presence і застосовує невеликий індикатор стану
(Active/Idle/Stale) на основі віку останнього оновлення.
Поради з налагодження
- Щоб побачити сирий список, викличте
system-presenceдля Gateway. - Якщо ви бачите дублікати:
- переконайтеся, що клієнти надсилають стабільний
client.instanceIdу рукостисканні - переконайтеся, що періодичні beacon використовують той самий
instanceId - перевірте, чи не відсутній
instanceIdу записі, похідному від підключення (у такому разі дублікати очікувані)
- переконайтеся, що клієнти надсилають стабільний