Присутствие¶
«Presence» в OpenClaw — это лёгкое, best‑effort представление:
- самого Gateway (шлюза), и
- клиентов, подключённых к Gateway (приложение для macOS, WebChat, CLI и т. д.).
Presence используется в первую очередь для отрисовки вкладки Instances в приложении для macOS и для быстрого обзора состояния оператором.
Поля presence (что отображается)¶
Записи presence представляют собой структурированные объекты с такими полями, как:
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: метка времени последнего обновления (мс с начала эпохи)
Производители (откуда берётся presence)¶
Записи presence создаются несколькими источниками и объединяются.
1. Собственная запись Gateway¶
Gateway всегда инициализирует «self»‑запись при запуске, чтобы интерфейсы показывали хост шлюза даже до подключения каких‑либо клиентов.
2. Подключение WebSocket¶
Каждый WS‑клиент начинает с запроса connect. При успешном рукопожатии
Gateway выполняет upsert записи presence для этого соединения.
Почему разовые команды CLI не отображаются¶
CLI часто подключается для коротких разовых команд. Чтобы не засорять список
Instances, client.mode === "cli" не преобразуется в запись presence.
3. Маяки system-event¶
Клиенты могут отправлять более насыщенные периодические маяки через метод system-event. Приложение
для macOS использует это для передачи имени хоста, IP и lastInputSeconds.
4. Подключение узла (роль: node)¶
Когда узел подключается через WebSocket Gateway с role: node, Gateway
выполняет upsert записи presence для этого узла (тот же процесс, что и для других WS‑клиентов).
Правила объединения и дедупликации (почему важен instanceId)¶
Записи presence хранятся в единой карте в памяти:
- Записи индексируются по ключу presence.
- Лучший ключ — это стабильный
instanceId(изconnect.client.instanceId), сохраняющийся между перезапусками. - Ключи нечувствительны к регистру.
Если клиент переподключается без стабильного instanceId, он может отображаться как
дублирующаяся строка.
TTL и ограниченный размер¶
Presence намеренно является эфемерным:
- 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при рукопожатии - убедитесь, что периодические маяки используют тот же
instanceId - проверьте, не отсутствует ли у записи, полученной из соединения,
instanceId(в этом случае дубликаты ожидаемы)