Присутствие
«Presence» в OpenClaw — это лёгкое, best‑effort представление:- самого Gateway (шлюза), и
- клиентов, подключённых к Gateway (приложение для macOS, WebChat, CLI и т. д.).
Поля 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(в этом случае дубликаты ожидаемы)
- убедитесь, что клиенты отправляют стабильный