Сопряжение, принадлежащее Gateway (опция B)
В сопряжении, принадлежащем Gateway, Gateway является источником истины о том, какие узлы разрешены для присоединения. UI (приложение macOS, будущие клиенты) - это просто фронтенды, которые одобряют или отклоняют ожидающие запросы.
Важно: WS узлы используют сопряжение устройств (роль node) во время connect. node.pair.* - это отдельное хранилище сопряжения и не контролирует WS handshake. Только клиенты, которые явно вызывают node.pair.*, используют этот поток.
Концепции
- Ожидающий запрос: узел попросил присоединиться; требуется одобрение.
- Сопряженный узел: одобренный узел с выданным токеном аутентификации.
- Транспорт: конечная точка Gateway WS пересылает запросы, но не принимает решения о членстве. (Поддержка legacy TCP моста устарела/удалена.)
Как работает сопряжение
- Узел подключается к Gateway WS и запрашивает сопряжение.
- Gateway сохраняет ожидающий запрос и испускает node.pair.requested.
- Вы одобряете или отклоняете запрос (CLI или UI).
- При одобрении Gateway выдает новый токен (токены ротируются при повторном сопряжении).
- Узел переподключается с использованием токена и теперь "сопряжен".
Ожидающие запросы автоматически истекают через 5 минут.
Рабочий процесс CLI (дружественный к headless)
openclaw nodes pending
openclaw nodes approve <requestId>
openclaw nodes reject <requestId>
openclaw nodes status
openclaw nodes rename --node <id|name|ip> --name "Living Room iPad"
nodes status показывает сопряженные/подключенные узлы и их возможности.
Поверхность API (протокол gateway)
События:
- node.pair.requested — испускается при создании нового ожидающего запроса.
- node.pair.resolved — испускается, когда запрос одобрен/отклонен/истек.
Методы:
- node.pair.request — создать или повторно использовать ожидающий запрос.
- node.pair.list — список ожидающих + сопряженных узлов.
- node.pair.approve — одобрить ожидающий запрос (выдает токен).
- node.pair.reject — отклонить ожидающий запрос.
- node.pair.verify — проверить \{ nodeId, token \}.
Примечания:
- node.pair.request идемпотентен для каждого узла: повторные вызовы возвращают тот же ожидающий запрос.
- Одобрение всегда генерирует свежий токен; токен никогда не возвращается из node.pair.request.
- Запросы могут включать silent: true как подсказку для потоков автоодобрения.
Автоодобрение (приложение macOS)
Приложение macOS может опционально попытаться тихое одобрение, когда:
- запрос помечен silent, и
- приложение может проверить SSH соединение к хосту gateway, используя того же пользователя.
Если тихое одобрение не удается, оно откатывается к обычному приглашению "Одобрить/Отклонить".
Хранилище (локальное, приватное)
Состояние сопряжения хранится в каталоге состояния Gateway (по умолчанию ~/.openclaw):
- ~/.openclaw/nodes/paired.json
- ~/.openclaw/nodes/pending.json
Если вы переопределяете OPENCLAW_STATE_DIR, папка nodes/ перемещается вместе с ним.
Примечания по безопасности:
- Токены являются секретами; обращайтесь с paired.json как с конфиденциальным.
- Ротация токена требует повторного одобрения (или удаления записи узла).
Поведение транспорта
- Транспорт без состояния; он не хранит членство.
- Если Gateway офлайн или сопряжение отключено, узлы не могут сопрягаться.
- Если Gateway находится в удаленном режиме, сопряжение все еще происходит против хранилища удаленного Gateway.