Gateway
Протокол Gateway
Протокол Gateway WS — это единая плоскость управления + транспорт узлов для OpenClaw. Все клиенты (CLI, веб-UI, приложение macOS, узлы iOS/Android, безголовые узлы) подключаются через WebSocket и объявляют свою роль + область действия во время рукопожатия.
Транспорт
- WebSocket, текстовые фреймы с JSON-полезной нагрузкой.
- Первый фрейм должен быть запросом
connect. - Фреймы до подключения ограничены 64 КиБ. После успешного рукопожатия клиентам
следует соблюдать ограничения
hello-ok.policy.maxPayloadиhello-ok.policy.maxBufferedBytes. Когда диагностика включена, слишком большие входящие фреймы и медленные исходящие буферы порождают событияpayload.largeдо того, как gateway закроет или отбросит затронутый фрейм. Эти события сохраняют размеры, лимиты, поверхности и безопасные коды причин. Они не сохраняют тело сообщения, содержимое вложений, необработанное тело фрейма, токены, cookie или секретные значения.
Рукопожатие (connect)
Gateway → Клиент (предварительный вызов до подключения):
{ "type": "event", "event": "connect.challenge", "payload": { "nonce": "…", "ts": 1737264000000 }}Клиент → Gateway:
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "cli", "version": "1.2.3", "platform": "macos", "mode": "operator" }, "role": "operator", "scopes": ["operator.read", "operator.write"], "caps": [], "commands": [], "permissions": {}, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-cli/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Gateway → Клиент:
{ "type": "res", "id": "…", "ok": true, "payload": { "type": "hello-ok", "protocol": 4, "server": { "version": "…", "connId": "…" }, "features": { "methods": ["…"], "events": ["…"] }, "snapshot": { "…": "…" }, "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }, "policy": { "maxPayload": 26214400, "maxBufferedBytes": 52428800, "tickIntervalMs": 15000 } }}Пока Gateway еще завершает запуск вспомогательных компонентов, запрос connect
может вернуть повторяемую ошибку UNAVAILABLE с details.reason, равным
"startup-sidecars", и retryAfterMs. Клиентам следует повторить такой ответ
в пределах общего бюджета подключения, а не показывать его как окончательный
сбой рукопожатия.
server, features, snapshot и policy обязательны по схеме
(packages/gateway-protocol/src/schema/frames.ts). auth также обязателен и сообщает
согласованные роль/области действия. pluginSurfaceUrls необязателен и сопоставляет
имена поверхностей Plugin, например canvas, с URL размещенных поверхностей в рамках области действия.
URL поверхностей Plugin с областью действия могут истекать. Узлы могут вызвать
node.pluginSurface.refresh с { "surface": "canvas" }, чтобы получить свежую
запись в pluginSurfaceUrls. Экспериментальный рефакторинг Plugin Canvas не
поддерживает устаревший путь совместимости canvasHostUrl, canvasCapability или
node.canvas.capability.refresh; текущие нативные клиенты и gateways должны
использовать поверхности Plugin.
Когда токен устройства не выдан, hello-ok.auth сообщает согласованные
разрешения без полей токена:
{ "auth": { "role": "operator", "scopes": ["operator.read", "operator.write"] }}Доверенные backend-клиенты в том же процессе (client.id: "gateway-client",
client.mode: "backend") могут не указывать device при прямых loopback-подключениях,
когда они аутентифицируются с помощью общего токена/пароля gateway. Этот путь
зарезервирован для внутренних RPC плоскости управления и не дает устаревшим
базовым привязкам CLI/устройства блокировать локальную backend-работу, например
обновления сеансов субагентов. Удаленные клиенты, клиенты из браузерного origin,
клиенты узлов и явные клиенты с токеном устройства/идентичностью устройства
по-прежнему используют обычные проверки сопряжения и повышения области действия.
Когда токен устройства выдан, hello-ok также включает:
{ "auth": { "deviceToken": "…", "role": "operator", "scopes": ["operator.read", "operator.write"] }}Встроенная инициализация через QR/код настройки — это новый путь передачи на мобильное устройство. Успешное базовое подключение по коду настройки возвращает основной токен узла и один ограниченный токен оператора:
{ "auth": { "deviceToken": "…", "role": "node", "scopes": [], "deviceTokens": [ { "deviceToken": "…", "role": "operator", "scopes": ["operator.approvals", "operator.read", "operator.talk.secrets", "operator.write"] } ] }}Передача оператору намеренно ограничена, чтобы QR-онбординг мог запустить
мобильный операторский цикл без выдачи operator.admin или operator.pairing.
Она включает operator.talk.secrets, чтобы нативный клиент мог прочитать
конфигурацию Talk, которая нужна ему после инициализации. Более широкие области
администрирования и сопряжения требуют отдельного одобренного операторского
сопряжения или потока токенов. Клиентам следует сохранять
hello-ok.auth.deviceTokens только
когда подключение использовало bootstrap-аутентификацию по доверенному транспорту,
например wss://, или через loopback/локальное сопряжение.
Пример узла
{ "type": "req", "id": "…", "method": "connect", "params": { "minProtocol": 3, "maxProtocol": 4, "client": { "id": "ios-node", "version": "1.2.3", "platform": "ios", "mode": "node" }, "role": "node", "scopes": [], "caps": ["camera", "canvas", "screen", "location", "voice"], "commands": ["camera.snap", "canvas.navigate", "screen.record", "location.get"], "permissions": { "camera.capture": true, "screen.record": false }, "auth": { "token": "…" }, "locale": "en-US", "userAgent": "openclaw-ios/1.2.3", "device": { "id": "device_fingerprint", "publicKey": "…", "signature": "…", "signedAt": 1737264000000, "nonce": "…" } }}Обрамление
- Запрос:
{type:"req", id, method, params} - Ответ:
{type:"res", id, ok, payload|error} - Событие:
{type:"event", event, payload, seq?, stateVersion?}
Методы с побочными эффектами требуют ключи идемпотентности (см. схему).
Роли + области действия
Полную модель областей действия оператора, проверки во время одобрения и семантику общего секрета см. в разделе Области действия оператора.
Роли
operator= клиент плоскости управления (CLI/UI/автоматизация).node= хост возможностей (camera/screen/canvas/system.run).
Области действия (оператор)
Распространенные области действия:
operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config с includeSecrets: true требует operator.talk.secrets
(или operator.admin).
RPC-методы gateway, зарегистрированные Plugin, могут запрашивать собственную
область действия оператора, но зарезервированные префиксы администрирования ядра
(config.*, exec.approvals.*, wizard.*, update.*) всегда разрешаются в
operator.admin.
Область действия метода — только первый барьер. Некоторые slash-команды,
доступные через chat.send, применяют поверх него более строгие проверки
на уровне команды. Например, постоянные записи /config set и /config unset
требуют operator.admin.
node.pair.approve также имеет дополнительную проверку области действия во время
одобрения поверх базовой области действия метода:
- запросы без команд:
operator.pairing - запросы с node-командами не exec-типа:
operator.pairing+operator.write - запросы, включающие
system.run,system.run.prepareилиsystem.which:operator.pairing+operator.admin
Возможности/команды/разрешения (узел)
Узлы объявляют заявки на возможности во время подключения:
caps: высокоуровневые категории возможностей, такие какcamera,canvas,screen,location,voiceиtalk.commands: allowlist команд для вызова.permissions: детальные переключатели (например,screen.record,camera.capture).
Gateway рассматривает их как заявки и применяет серверные allowlist.
Присутствие
system-presenceвозвращает записи, ключами которых являются идентичности устройств.- Записи присутствия включают
deviceId,rolesиscopes, чтобы UI могли показывать одну строку на устройство даже когда оно подключается и как operator, и как node. node.listвключает необязательные поляlastSeenAtMsиlastSeenReason. Подключенные узлы сообщают текущее время подключения какlastSeenAtMsс причинойconnect; сопряженные узлы также могут сообщать устойчивое фоновое присутствие, когда доверенное событие узла обновляет их метаданные сопряжения.
Фоновое событие активности узла
Узлы могут вызвать node.event с event: "node.presence.alive", чтобы записать, что сопряженный узел был
активен во время фонового пробуждения, не помечая его как подключенный.
{ "event": "node.presence.alive", "payloadJSON": "{\"trigger\":\"silent_push\",\"sentAtMs\":1737264000000,\"displayName\":\"Peter's iPhone\",\"version\":\"2026.4.28\",\"platform\":\"iOS 18.4.0\",\"deviceFamily\":\"iPhone\",\"modelIdentifier\":\"iPhone17,1\",\"pushTransport\":\"relay\"}"}trigger — закрытое перечисление: background, silent_push, bg_app_refresh,
significant_location, manual или connect. Неизвестные строки trigger нормализуются gateway до
background перед сохранением. Событие устойчиво только для аутентифицированных сеансов устройств
узлов; сеансы без устройства или без сопряжения возвращают handled: false.
Успешные gateways возвращают структурированный результат:
{ "ok": true, "event": "node.presence.alive", "handled": true, "reason": "persisted"}Более старые gateways все еще могут возвращать { "ok": true } для node.event; клиентам следует считать это
подтвержденным RPC, а не устойчивым сохранением присутствия.
Определение областей действия широковещательных событий
Широковещательные события WebSocket, отправляемые сервером, ограничиваются областями действия, чтобы сеансы с областью сопряжения или только для узла не получали пассивно содержимое сеанса.
- Фреймы чата, агента и результатов инструментов (включая потоковые события
agentи результаты вызовов инструментов) требуют как минимумoperator.read. Сеансы безoperator.readполностью пропускают эти фреймы. - Широковещательные
plugin.*, определенные Plugin, ограничиваютсяoperator.writeилиoperator.adminв зависимости от того, как Plugin их зарегистрировал. - События статуса и транспорта (
heartbeat,presence,tick, жизненный цикл connect/disconnect и т. д.) остаются без ограничений, чтобы состояние транспорта было наблюдаемым для каждого аутентифицированного сеанса. - Неизвестные семейства широковещательных событий по умолчанию ограничиваются областями действия (fail-closed), если зарегистрированный обработчик явно не ослабляет эти ограничения.
Каждое клиентское подключение хранит собственный порядковый номер для клиента, поэтому широковещательные события сохраняют монотонный порядок на этом сокете, даже когда разные клиенты видят разные отфильтрованные по областям действия подмножества потока событий.
Общие семейства RPC-методов
Публичная поверхность WS шире, чем приведенные выше примеры рукопожатия/аутентификации. Это
не сгенерированный дамп — hello-ok.features.methods является консервативным
списком обнаружения, построенным из src/gateway/server-methods-list.ts плюс загруженных
экспортов методов Plugin/каналов. Рассматривайте его как обнаружение возможностей, а не как полное
перечисление src/gateway/server-methods/*.ts.
System and identity
healthвозвращает кэшированный или заново проверенный снимок состояния Gateway.diagnostics.stabilityвозвращает недавний ограниченный регистратор диагностической стабильности. Он хранит операционные метаданные, такие как имена событий, счетчики, размеры в байтах, показания памяти, состояние очереди/сеанса, имена каналов/Plugin и идентификаторы сеансов. Он не хранит текст чатов, тела Webhook, выводы инструментов, сырые тела запросов или ответов, токены, cookie или секретные значения. Требуется область чтения оператора.statusвозвращает сводку Gateway в стиле/status; чувствительные поля включаются только для операторских клиентов с областью администратора.gateway.identity.getвозвращает идентификатор устройства Gateway, используемый потоками ретрансляции и сопряжения.system-presenceвозвращает текущий снимок присутствия для подключенных операторских/узловых устройств.system-eventдобавляет системное событие и может обновлять/транслировать контекст присутствия.last-heartbeatвозвращает последнее сохраненное событие Heartbeat.set-heartbeatsвключает или отключает обработку Heartbeat на Gateway.
Models and usage
models.listвозвращает каталог моделей, разрешенных средой выполнения. Передайте{ "view": "configured" }для настроенных моделей размером под средство выбора (agents.defaults.modelsсначала, затемmodels.providers.*.models) или{ "view": "all" }для полного каталога.usage.statusвозвращает сводки окон использования провайдеров и оставшейся квоты.usage.costвозвращает агрегированные сводки расходов за диапазон дат. ПередайтеagentIdдля одного агента илиagentScope: "all", чтобы агрегировать настроенных агентов.doctor.memory.statusвозвращает готовность векторной памяти / кэшированных эмбеддингов для активной рабочей области агента по умолчанию. Передавайте{ "probe": true }или{ "deep": true }только когда вызывающей стороне явно нужен живой ping провайдера эмбеддингов. Клиенты, учитывающие Dreaming, также могут передать{ "agentId": "agent-id" }, чтобы ограничить статистику хранилища Dreaming выбранной рабочей областью агента; еслиagentIdопущен, сохраняется fallback на агента по умолчанию и агрегируются настроенные рабочие области Dreaming.doctor.memory.dreamDiary,doctor.memory.backfillDreamDiary,doctor.memory.resetDreamDiary,doctor.memory.resetGroundedShortTerm,doctor.memory.repairDreamingArtifactsиdoctor.memory.dedupeDreamDiaryпринимают необязательные параметры{ "agentId": "agent-id" }для представлений/действий Dreaming выбранного агента. КогдаagentIdопущен, они работают с настроенной рабочей областью агента по умолчанию.doctor.memory.remHarnessвозвращает ограниченный, доступный только для чтения предварительный просмотр REM harness для удаленных клиентов плоскости управления. Он может включать пути рабочих областей, фрагменты памяти, отрендеренный заземленный Markdown и кандидатов для глубокого продвижения, поэтому вызывающим сторонам нуженoperator.read.sessions.usageвозвращает сводки использования по сеансам. ПередайтеagentIdдля одного агента илиagentScope: "all", чтобы вывести настроенных агентов вместе.sessions.usage.timeseriesвозвращает временной ряд использования для одного сеанса.sessions.usage.logsвозвращает записи журнала использования для одного сеанса.
Channels and login helpers
channels.statusвозвращает сводки состояния встроенных + поставляемых каналов/Plugin.channels.logoutвыполняет выход из конкретного канала/учетной записи, если канал поддерживает выход.web.login.startзапускает поток входа через QR/веб для текущего провайдера веб-канала с поддержкой QR.web.login.waitожидает завершения этого потока входа через QR/веб и при успехе запускает канал.push.testотправляет тестовый push APNs на зарегистрированный узел iOS.voicewake.getвозвращает сохраненные триггеры фразы пробуждения.voicewake.setобновляет триггеры фразы пробуждения и транслирует изменение.
Messaging and logs
send— это прямой RPC исходящей доставки для отправок, нацеленных на канал/учетную запись/поток, вне раннера чата.logs.tailвозвращает настроенный хвост файлового журнала Gateway с управлением курсором/лимитом и максимальным числом байтов.
Talk and TTS
talk.catalogвозвращает доступный только для чтения каталог провайдеров Talk для речи, потоковой транскрипции и голоса в реальном времени. Он включает идентификаторы провайдеров, метки, состояние настройки, раскрытые идентификаторы моделей/голосов, канонические режимы, транспорты, стратегии brain и флаги аудио/возможностей реального времени, не возвращая секреты провайдеров и не изменяя глобальную конфигурацию.talk.configвозвращает эффективную полезную нагрузку конфигурации Talk;includeSecretsтребуетoperator.talk.secrets(илиoperator.admin).talk.session.createсоздает принадлежащий Gateway сеанс Talk дляrealtime/gateway-relay,transcription/gateway-relayилиstt-tts/managed-room. Дляstt-tts/managed-roomвызывающие стороны сoperator.write, передающиеsessionKey, также должны передатьspawnedByдля видимости ключа сеанса в заданной области; созданиеsessionKeyбез области иbrain: "direct-tools"требуютoperator.admin.talk.session.joinпроверяет токен сеанса управляемой комнаты, при необходимости испускает событияsession.readyилиsession.replacedи возвращает метаданные комнаты/сеанса плюс недавние события Talk без токена в открытом виде или сохраненного хэша токена.talk.session.appendAudioдобавляет входное аудио PCM в base64 к принадлежащим Gateway сеансам ретрансляции реального времени и транскрипции.talk.session.startTurn,talk.session.endTurnиtalk.session.cancelTurnуправляют жизненным циклом хода в управляемой комнате с отклонением устаревшего хода до очистки состояния.talk.session.cancelOutputостанавливает аудиовывод ассистента, главным образом для прерывания по VAD в сеансах ретрансляции Gateway.talk.session.submitToolResultзавершает вызов инструмента провайдера, испущенный принадлежащим Gateway сеансом ретрансляции реального времени. Передайтеoptions: { willContinue: true }для промежуточного вывода инструмента, когда затем будет финальный результат, илиoptions: { suppressResponse: true }, когда результат инструмента должен удовлетворить вызов провайдера без запуска еще одного ответа ассистента в реальном времени.talk.session.steerотправляет голосовое управление активным запуском в принадлежащий Gateway сеанс Talk с агентной поддержкой. Он принимает{ sessionId, text, mode? }, гдеmode—status,steer,cancelилиfollowup; опущенный режим классифицируется по произнесенному тексту.talk.session.closeзакрывает принадлежащий Gateway сеанс ретрансляции, транскрипции или управляемой комнаты и испускает терминальные события Talk.talk.modeзадает/транслирует текущее состояние режима Talk для клиентов WebChat/Control UI.talk.client.createсоздает принадлежащий клиенту сеанс провайдера реального времени с использованиемwebrtcилиprovider-websocket, при этом Gateway владеет конфигурацией, учетными данными, инструкциями и политикой инструментов.talk.client.toolCallпозволяет принадлежащим клиенту транспортам реального времени пересылать вызовы инструментов провайдера в политику Gateway. Первый поддерживаемый инструмент —openclaw_agent_consult; клиенты получают идентификатор запуска и ожидают обычных событий жизненного цикла чата перед отправкой результата инструмента, специфичного для провайдера.talk.client.steerотправляет голосовое управление активным запуском для принадлежащих клиенту транспортов реального времени. Gateway разрешает активный встроенный запуск изsessionKeyи возвращает структурированный результат принятия/отклонения вместо молчаливого отбрасывания управления.talk.event— единый канал событий Talk для адаптеров реального времени, транскрипции, STT/TTS, управляемых комнат, телефонии и встреч.talk.speakсинтезирует речь через активного речевого провайдера Talk.tts.statusвозвращает состояние включения TTS, активного провайдера, fallback-провайдеров и состояние конфигурации провайдеров.tts.providersвозвращает видимый инвентарь провайдеров TTS.tts.enableиtts.disableпереключают состояние настроек TTS.tts.setProviderобновляет предпочтительного провайдера TTS.tts.convertвыполняет одноразовое преобразование текста в речь.
Secrets, config, update, and wizard
secrets.reloadзаново разрешает активные SecretRefs и заменяет состояние секретов среды выполнения только при полном успехе.secrets.resolveразрешает назначения секретов, нацеленные на команду, для конкретного набора команд/целей.config.getвозвращает текущий снимок конфигурации и хэш.config.setзаписывает проверенную полезную нагрузку конфигурации.config.patchобъединяет частичное обновление конфигурации. Разрушительная замена массива требует указать затронутый путь вreplacePaths; вложенные массивы под элементами массива используют пути[], такие какagents.list[].skills.config.applyпроверяет и заменяет полную полезную нагрузку конфигурации.config.schemaвозвращает живую полезную нагрузку схемы конфигурации, используемую Control UI и инструментами CLI: схему,uiHints, версию и метаданные генерации, включая метаданные схем Plugin + каналов, когда среда выполнения может их загрузить. Схема включает метаданные полейtitle/description, выведенные из тех же меток и справочного текста, которые использует UI, включая ветки компоновки вложенных объектов, wildcard, элементов массива иanyOf/oneOf/allOf, когда существует соответствующая документация поля.config.schema.lookupвозвращает полезную нагрузку поиска в области пути для одного пути конфигурации: нормализованный путь, поверхностный узел схемы, совпавшую подсказку +hintPath, необязательныйreloadKindи непосредственные сводки дочерних элементов для детализации UI/CLI.reloadKind— одно изrestart,hotилиnoneи отражает планировщик перезагрузки конфигурации Gateway для запрошенного пути. Узлы схемы поиска сохраняют пользовательскую документацию и общие поля проверки (title,description,type,enum,const,format,pattern, ограничения чисел/строк/массивов/объектов и флаги вродеadditionalProperties,deprecated,readOnly,writeOnly). Сводки дочерних элементов раскрываютkey, нормализованныйpath,type,required,hasChildren, необязательныйreloadKind, а также совпавшиеhint/hintPath.update.runзапускает поток обновления Gateway и планирует перезапуск только когда само обновление успешно; вызывающие стороны с сеансом могут включитьcontinuationMessage, чтобы при запуске возобновить один последующий ход агента через очередь продолжения после перезапуска. Обновления через менеджер пакетов и контролируемые обновления git-checkout из плоскости управления используют отделенную передачу управляемому сервису вместо замены дерева пакетов или изменения вывода checkout/build внутри живого Gateway. Запущенная передача возвращаетok: trueсresult.reason: "managed-service-handoff-started"иhandoff.status: "started"; недоступные или завершившиеся ошибкой передачи возвращаютok: falseсmanaged-service-handoff-unavailableилиmanaged-service-handoff-failed, плюсhandoff.command, когда требуется ручное обновление через shell. Недоступная передача означает, что OpenClaw не хватает безопасной границы супервизора или устойчивого идентификатора сервиса, напримерOPENCLAW_SYSTEMD_UNITдля systemd. Во время запущенной передачи sentinel перезапуска может кратко сообщатьstats.reason: "restart-health-pending"; продолжение откладывается, пока CLI не проверит перезапущенный Gateway и не запишет финальный sentinelok.update.statusобновляет и возвращает последний sentinel перезапуска обновления, включая версию, запущенную после перезапуска, если она доступна.wizard.start,wizard.next,wizard.statusиwizard.cancelпредоставляют мастер онбординга через WS RPC.
Вспомогательные методы агента и рабочей области
agents.listвозвращает настроенные записи агентов, включая действующую модель и метаданные среды выполнения.agents.create,agents.updateиagents.deleteуправляют записями агентов и привязкой рабочей области.agents.files.list,agents.files.getиagents.files.setуправляют начальными файлами рабочей области, доступными агенту.tasks.list,tasks.getиtasks.cancelпредоставляют реестр задач Gateway клиентам SDK и операторам.artifacts.list,artifacts.getиartifacts.downloadпредоставляют сводки артефактов, полученных из транскрипта, и загрузки для явной областиsessionKey,runIdилиtaskId. Запросы запусков и задач определяют владеющую сессию на стороне сервера и возвращают только медиа из транскрипта с совпадающим происхождением; небезопасные или локальные URL-источники возвращают неподдерживаемые загрузки вместо получения на стороне сервера.environments.listиenvironments.statusпредоставляют клиентам SDK доступное только для чтения обнаружение локальных для Gateway и узловых окружений.agent.identity.getвозвращает действующую идентичность ассистента для агента или сессии.agent.waitожидает завершения запуска и возвращает конечный снимок, когда он доступен.
Управление сессиями
sessions.listвозвращает текущий индекс сессий, включая построчные метаданныеagentRuntime, когда настроен backend среды выполнения агента.sessions.subscribeиsessions.unsubscribeпереключают подписки на события изменения сессий для текущего WS-клиента.sessions.messages.subscribeиsessions.messages.unsubscribeпереключают подписки на события транскрипта/сообщений для одной сессии.sessions.previewвозвращает ограниченные предварительные просмотры транскрипта для конкретных ключей сессий.sessions.describeвозвращает одну строку сессии Gateway для точного ключа сессии.sessions.resolveразрешает или канонизирует целевую сессию.sessions.createсоздает новую запись сессии.sessions.sendотправляет сообщение в существующую сессию.sessions.steer— вариант прерывания и перенаправления для активной сессии.sessions.abortпрерывает активную работу для сессии. Вызывающий может передатьkeyплюс необязательныйrunIdили передать толькоrunIdдля активных запусков, которые Gateway может сопоставить с сессией.sessions.patchобновляет метаданные/переопределения сессии и сообщает разрешенную каноническую модель плюс действующийagentRuntime.sessions.reset,sessions.deleteиsessions.compactвыполняют обслуживание сессии.sessions.getвозвращает полную сохраненную строку сессии.- Выполнение чата по-прежнему использует
chat.history,chat.send,chat.abortиchat.inject.chat.historyнормализуется для отображения в UI-клиентах: встроенные теги директив удаляются из видимого текста, XML-полезные нагрузки вызовов инструментов в обычном тексте (включая<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>и усеченные блоки вызовов инструментов), а также утекшие ASCII/полноширинные управляющие токены модели удаляются, строки ассистента, состоящие только из тихих токенов, такие как точныеNO_REPLY/no_reply, опускаются, а слишком большие строки могут заменяться заполнителями. chat.message.get— аддитивный ограниченный считыватель полного сообщения для одной видимой записи транскрипта. Клиенты передаютsessionKey, необязательныйagentId, когда выбор сессии ограничен агентом, плюсmessageIdтранскрипта, ранее предоставленный черезchat.history, а Gateway возвращает ту же нормализованную для отображения проекцию без облегченного ограничения усечения истории, если сохраненная запись все еще доступна и не является слишком большой.chat.sendпринимает для одного ходаfastMode: "auto", чтобы использовать быстрый режим для вызовов модели, начатых до автоматического порога, а затем запускать последующие повторные попытки, fallback, результаты инструментов или вызовы продолжения без быстрого режима. По умолчанию порог равен 60 секундам и может настраиваться для каждой модели черезagents.defaults.models["<provider>/<model>"].params.fastAutoOnSeconds. Вызывающийchat.sendможет передать для одного ходаfastAutoOnSeconds, чтобы переопределить порог для этого запроса.
Сопряжение устройств и токены устройств
device.pair.listвозвращает ожидающие и одобренные сопряженные устройства.device.pair.approve,device.pair.rejectиdevice.pair.removeуправляют записями сопряжения устройств.device.token.rotateротирует токен сопряженного устройства в пределах его одобренной роли и границ области вызывающего.device.token.revokeотзывает токен сопряженного устройства в пределах его одобренной роли и границ области вызывающего.
Сопряжение Node, вызов и ожидающая работа
node.pair.request,node.pair.list,node.pair.approve,node.pair.reject,node.pair.removeиnode.pair.verifyохватывают сопряжение Node и проверку начальной настройки.node.listиnode.describeвозвращают состояние известных/подключенных Node.node.renameобновляет метку сопряженного Node.node.invokeпересылает команду подключенному Node.node.invoke.resultвозвращает результат для запроса вызова.node.eventпередает события, исходящие от Node, обратно в Gateway.node.pending.pullиnode.pending.ack— API очереди подключенного Node.node.pending.enqueueиnode.pending.drainуправляют долговечной ожидающей работой для автономных/отключенных Node.
Семейства утверждений
exec.approval.request,exec.approval.get,exec.approval.listиexec.approval.resolveохватывают одноразовые запросы утверждения exec, а также поиск/повтор ожидающих утверждений.exec.approval.waitDecisionожидает одно ожидающее утверждение exec и возвращает итоговое решение (илиnullпри истечении времени ожидания).exec.approvals.getиexec.approvals.setуправляют снимками политики утверждений exec Gateway.exec.approvals.node.getиexec.approvals.node.setуправляют локальной для Node политикой утверждений exec через команды ретрансляции Node.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionиplugin.approval.resolveохватывают потоки утверждения, определяемые Plugin.
Автоматизация, Skills и инструменты
- Автоматизация:
wakeпланирует немедленную или следующую по Heartbeat вставку текста пробуждения;cron.get,cron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runsуправляют запланированной работой. cron.runостается RPC в стиле постановки в очередь для ручных запусков. Клиенты, которым нужна семантика завершения, должны читать возвращенныйrunIdи опрашиватьcron.runs.cron.runsпринимает необязательный непустой фильтрrunId, чтобы клиенты могли отслеживать один поставленный в очередь ручной запуск без гонки с другими записями истории для той же задачи.- Skills и инструменты:
commands.list,skills.*,tools.catalog,tools.effective,tools.invoke.
Общие семейства событий
chat: обновления UI-чата, такие какchat.inject, и другие события чата только для транскрипта. В протоколе v4 delta-полезные нагрузки несутdeltaText;messageостается накопленным снимком ассистента. Замены не по префиксу устанавливаютreplace=trueи используютdeltaTextкак текст замены.session.message,session.operationиsession.tool: обновления транскрипта, выполняющейся операции сессии и потока событий для подписанной сессии.sessions.changed: изменился индекс сессий или метаданные.presence: обновления снимка присутствия системы.tick: периодическое событие keepalive / liveness.health: обновление снимка состояния Gateway.heartbeat: обновление потока событий Heartbeat.cron: событие изменения запуска/задания Cron.shutdown: уведомление о завершении работы Gateway.node.pair.requested/node.pair.resolved: жизненный цикл сопряжения Node.node.invoke.request: широковещательный запрос вызова Node.device.pair.requested/device.pair.resolved: жизненный цикл сопряженного устройства.voicewake.changed: изменилась конфигурация триггера по слову пробуждения.exec.approval.requested/exec.approval.resolved: жизненный цикл утверждения exec.plugin.approval.requested/plugin.approval.resolved: жизненный цикл утверждения Plugin.
Вспомогательные методы Node
- Node могут вызывать
skills.bins, чтобы получить текущий список исполняемых файлов Skills для проверок автоматического разрешения.
RPC реестра задач
Клиенты операторов могут просматривать и отменять записи фоновых задач Gateway через RPC реестра задач. Эти методы возвращают очищенные сводки задач, а не сырое состояние среды выполнения.
tasks.listтребуетoperator.read.- Параметры: необязательный
status("queued","running","completed","failed","cancelled"или"timed_out") или массив этих статусов, необязательныйagentId, необязательныйsessionKey, необязательныйlimitот1до500и необязательная строкаcursor. - Результат:
{ "tasks": TaskSummary[], "nextCursor"?: string }.
- Параметры: необязательный
tasks.getтребуетoperator.read.- Параметры:
{ "taskId": string }. - Результат:
{ "task": TaskSummary }. - Отсутствующие идентификаторы задач возвращают форму ошибки Gateway not-found.
- Параметры:
tasks.cancelтребуетoperator.write.- Параметры:
{ "taskId": string, "reason"?: string }. - Результат:
{ "found": boolean, "cancelled": boolean, "reason"?: string, "task"?: TaskSummary }. foundсообщает, была ли в реестре совпадающая задача.cancelledсообщает, приняла ли среда выполнения отмену или записала ее.
- Параметры:
TaskSummary включает id, status и необязательные метаданные, такие как kind,
runtime, title, agentId, sessionKey, childSessionKey, ownerKey,
runId, taskId, flowId, parentTaskId, sourceId, метки времени, прогресс,
конечную сводку и очищенный текст ошибки. agentId идентифицирует агента,
выполняющего задачу; sessionKey и ownerKey сохраняют контекст запрашивающего
и управления.
Вспомогательные методы оператора
- Операторы могут вызывать
commands.list(operator.read), чтобы получить инвентарь команд времени выполнения для агента.agentIdнеобязателен; опустите его, чтобы читать рабочее пространство агента по умолчанию.scopeуправляет тем, на какую поверхность нацелено основноеname:textвозвращает основной текстовый токен команды без начального/nativeи путь по умолчаниюbothвозвращают нативные имена с учетом провайдера, когда они доступны
textAliasesсодержит точные slash-псевдонимы, такие как/modelи/m.nativeNameсодержит нативное имя команды с учетом провайдера, когда оно существует.providerнеобязателен и влияет только на нативное именование и доступность нативных команд Plugin.includeArgs=falseисключает сериализованные метаданные аргументов из ответа.
- Операторы могут вызывать
tools.catalog(operator.read), чтобы получить каталог инструментов времени выполнения для агента. Ответ включает сгруппированные инструменты и метаданные происхождения:source:coreилиpluginpluginId: владелец Plugin, когдаsource="plugin"optional: является ли инструмент Plugin необязательным
- Операторы могут вызывать
tools.effective(operator.read), чтобы получить фактически действующий во время выполнения инвентарь инструментов для сессии.sessionKeyобязателен.- Gateway выводит доверенный контекст времени выполнения из сессии на стороне сервера, вместо того чтобы принимать предоставленный вызывающим кодом контекст аутентификации или доставки.
- Ответ представляет собой серверную проекцию активного инвентаря в области сессии, включая core, Plugin, канал и уже обнаруженные инструменты MCP-сервера.
tools.effectiveдоступен только для чтения для MCP: он может пропустить прогретый каталог MCP сессии через итоговую политику инструментов, но не создает среды выполнения MCP, не подключает транспорты и не выполняетtools/list. Если подходящего прогретого каталога нет, ответ может включать уведомление, напримерmcp-not-yet-connected,mcp-not-yet-listedилиmcp-stale-catalog.- Записи эффективных инструментов используют
source="core",source="plugin",source="channel"илиsource="mcp".
- Операторы могут вызывать
tools.invoke(operator.write), чтобы вызвать один доступный инструмент через тот же путь политики Gateway, что и/tools/invoke.nameобязателен.args,sessionKey,agentId,confirmиidempotencyKeyнеобязательны.- Если присутствуют и
sessionKey, иagentId, разрешенный агент сессии должен совпадать сagentId. - Core-обертки только для владельца, такие как
cron,gatewayиnodes, требуют идентичность владельца/администратора (operator.admin), хотя сам методtools.invokeимеетoperator.write. - Ответ представляет собой конверт для SDK с
ok,toolName, необязательнымoutputи типизированными полямиerror. Отказы из-за подтверждения или политики возвращаютok:falseв полезной нагрузке, а не обходят конвейер политики инструментов Gateway.
- Операторы могут вызывать
skills.status(operator.read), чтобы получить видимый инвентарь навыков для агента.agentIdнеобязателен; опустите его, чтобы читать рабочее пространство агента по умолчанию.- Ответ включает пригодность, отсутствующие требования, проверки конфигурации и очищенные параметры установки без раскрытия необработанных секретных значений.
- Операторы могут вызывать
skills.searchиskills.detail(operator.read) для метаданных обнаружения ClawHub. - Операторы могут вызывать
skills.upload.begin,skills.upload.chunkиskills.upload.commit(operator.admin), чтобы подготовить приватный архив навыка перед установкой. Это отдельный административный путь загрузки для доверенных клиентов, а не обычный поток установки навыка ClawHub, и он по умолчанию отключен, если не включенskills.install.allowUploadedArchives.skills.upload.begin({ kind: "skill-archive", slug, sizeBytes, sha256?, force?, idempotencyKey? })создает загрузку, привязанную к этому slug и значению force.skills.upload.chunk({ uploadId, offset, dataBase64 })добавляет байты по точному декодированному смещению.skills.upload.commit({ uploadId, sha256? })проверяет итоговый размер и SHA-256. Commit только завершает загрузку; он не устанавливает навык.- Загруженные архивы навыков являются zip-архивами, содержащими корневой
SKILL.md. Внутреннее имя каталога архива никогда не выбирает целевое место установки.
- Операторы могут вызывать
skills.install(operator.admin) в трех режимах:- Режим ClawHub:
{ source: "clawhub", slug, version?, force? }устанавливает папку навыка в каталогskills/рабочего пространства агента по умолчанию. - Режим загрузки:
{ source: "upload", uploadId, slug, force?, sha256?, timeoutMs? }устанавливает завершенную загрузку в каталогskills/<slug>рабочего пространства агента по умолчанию. Slug и значение force должны совпадать с исходным запросомskills.upload.begin. Этот режим отклоняется, если не включенskills.install.allowUploadedArchives. Настройка не влияет на установки ClawHub. - Режим установщика Gateway:
{ name, installId, timeoutMs? }выполняет объявленное действиеmetadata.openclaw.installна хосте Gateway. Старые клиенты все еще могут отправлятьdangerouslyForceUnsafeInstall; это поле устарело, принимается только для совместимости протокола и игнорируется. Используйтеsecurity.installPolicyдля решений по установке, которыми владеет оператор.
- Режим ClawHub:
- Операторы могут вызывать
skills.update(operator.admin) в двух режимах:- Режим ClawHub обновляет один отслеживаемый slug или все отслеживаемые установки ClawHub в рабочем пространстве агента по умолчанию.
- Режим конфигурации исправляет значения
skills.entries.<skillKey>, такие какenabled,apiKeyиenv.
Представления models.list
models.list принимает необязательный параметр view:
- Опущен или
"default": текущее поведение времени выполнения. Если настроеноagents.defaults.models, ответом будет разрешенный каталог, включая динамически обнаруженные модели для записейprovider/*. Иначе ответом будет полный каталог Gateway. "configured": поведение размера picker. Если настроеноagents.defaults.models, оно по-прежнему имеет приоритет, включая обнаружение в области провайдера для записейprovider/*. Без списка разрешений ответ использует явные записиmodels.providers.*.models, откатываясь к полному каталогу только тогда, когда настроенных строк моделей нет."all": полный каталог Gateway, с обходомagents.defaults.models. Используйте это для диагностики и UI обнаружения, а не для обычных picker моделей.
Подтверждения Exec
- Когда exec-запрос требует подтверждения, Gateway рассылает
exec.approval.requested. - Клиенты оператора разрешают его вызовом
exec.approval.resolve(требуется областьoperator.approvals). - Для
host=nodeexec.approval.requestдолжен включатьsystemRunPlan(каноническиеargv/cwd/rawCommand/метаданные сессии). Запросы безsystemRunPlanотклоняются. - После подтверждения перенаправленные вызовы
node.invoke system.runповторно используют этот каноническийsystemRunPlanкак авторитетный контекст команды/cwd/сессии. - Если вызывающий код изменяет
command,rawCommand,cwd,agentIdилиsessionKeyмежду подготовкой и итоговым подтвержденным перенаправлениемsystem.run, Gateway отклоняет запуск вместо доверия измененной полезной нагрузке.
Резервный вариант доставки агента
- Запросы
agentмогут включатьdeliver=true, чтобы запросить исходящую доставку. bestEffortDeliver=falseсохраняет строгое поведение: неразрешенные или только внутренние цели доставки возвращаютINVALID_REQUEST.bestEffortDeliver=trueразрешает откат к выполнению только в сессии, когда не удается разрешить внешний доставляемый маршрут (например, внутренние/webchat-сессии или неоднозначные многоканальные конфигурации).- Итоговые результаты
agentмогут включатьresult.deliveryStatus, когда доставка была запрошена, используя те же статусыsent,suppressed,partial_failedиfailed, которые задокументированы дляopenclaw agent --json --deliver.
Версионирование
PROTOCOL_VERSIONнаходится вpackages/gateway-protocol/src/version.ts.- Клиенты отправляют
minProtocol+maxProtocol; сервер отклоняет диапазоны, которые не включают его текущий протокол. Текущие клиенты и серверы требуют протокол v4. - Схемы + модели генерируются из определений TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Константы клиента
Эталонный клиент в src/gateway/client.ts использует эти значения по умолчанию. Значения стабильны в рамках протокола v4 и являются ожидаемой базовой линией для сторонних клиентов.
| Константа | Значение по умолчанию | Источник |
|---|---|---|
PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
MIN_CLIENT_PROTOCOL_VERSION |
4 |
packages/gateway-protocol/src/version.ts |
| Тайм-аут запроса (на RPC) | 30_000 мс |
src/gateway/client.ts (requestTimeoutMs) |
| Тайм-аут Preauth / connect-challenge | 15_000 мс |
src/gateway/handshake-timeouts.ts (config/env могут увеличить парный бюджет сервера/клиента) |
| Начальная задержка повторного подключения | 1_000 мс |
src/gateway/client.ts (backoffMs) |
| Максимальная задержка повторного подключения | 30_000 мс |
src/gateway/client.ts (scheduleReconnect) |
| Ограничение быстрого повтора после закрытия device-token | 250 мс |
src/gateway/client.ts |
Льготный период принудительной остановки перед terminate() |
250 мс |
FORCE_STOP_TERMINATE_GRACE_MS |
Тайм-аут по умолчанию stopAndWait() |
1_000 мс |
STOP_AND_WAIT_TIMEOUT_MS |
Интервал tick по умолчанию (до hello-ok) |
30_000 мс |
src/gateway/client.ts |
| Закрытие по тайм-ауту tick | код 4000, когда молчание превышает tickIntervalMs * 2 |
src/gateway/client.ts |
MAX_PAYLOAD_BYTES |
25 * 1024 * 1024 (25 МБ) |
src/gateway/server-constants.ts |
Сервер объявляет эффективные policy.tickIntervalMs, policy.maxPayload и policy.maxBufferedBytes в hello-ok; клиенты должны соблюдать эти значения, а не значения по умолчанию до handshake.
Аутентификация
- Аутентификация Gateway по общему секрету использует
connect.params.auth.tokenилиconnect.params.auth.password, в зависимости от настроенного режима аутентификации. - Режимы с передачей идентичности, такие как Tailscale Serve
(
gateway.auth.allowTailscale: true) или не-loopbackgateway.auth.mode: "trusted-proxy", проходят проверку аутентификации connect по заголовкам запроса вместоconnect.params.auth.*. gateway.auth.mode: "none"для приватного входящего трафика полностью пропускает аутентификацию connect по общему секрету; не открывайте этот режим на публичном или недоверенном входящем трафике.- После сопряжения Gateway выдает токен устройства, ограниченный ролью соединения
и областями доступа. Он возвращается в
hello-ok.auth.deviceToken, и клиенту следует сохранять его для будущих подключений. - Клиентам следует сохранять основной
hello-ok.auth.deviceTokenпосле любого успешного подключения. - Повторное подключение с этим сохраненным токеном устройства также должно повторно использовать сохраненный утвержденный набор областей доступа для этого токена. Это сохраняет уже выданный доступ на чтение, пробу и статус и не дает повторным подключениям незаметно сжиматься до более узкой неявной области только для администратора.
- Сборка аутентификации connect на стороне клиента (
selectConnectAuthвsrc/gateway/client.ts):auth.passwordортогонален и всегда передается, когда задан.auth.tokenзаполняется в порядке приоритета: сначала явный общий токен, затем явныйdeviceToken, затем сохраненный токен отдельного устройства (по ключуdeviceId+role).auth.bootstrapTokenотправляется только когда ни один из вариантов выше не далauth.token. Общий токен или любой найденный токен устройства подавляет его.- Автопродвижение сохраненного токена устройства при однократной повторной
попытке
AUTH_TOKEN_MISMATCHразрешено только для доверенных конечных точек: loopback илиwss://с закрепленнымtlsFingerprint. Публичныйwss://без закрепления не подходит.
- Встроенная начальная загрузка по коду настройки возвращает основной
hello-ok.auth.deviceTokenNode плюс ограниченный токен оператора вhello-ok.auth.deviceTokensдля доверенной передачи на мобильное устройство. Токен оператора включаетoperator.talk.secretsдля чтения нативной конфигурации Talk и исключаетoperator.adminиoperator.pairing. - Пока небазовая начальная загрузка по коду настройки ожидает утверждения, сведения
PAIRING_REQUIREDвключаютrecommendedNextStep: "wait_then_retry",retryable: trueиpauseReconnect: false. Клиентам следует продолжать переподключаться с тем же токеном начальной загрузки, пока запрос не будет утвержден или токен не станет недействительным. - Сохраняйте
hello-ok.auth.deviceTokensтолько когда подключение использовало аутентификацию начальной загрузки на доверенном транспорте, таком какwss://, или при локальном сопряжении через loopback/local. - Если клиент передает явный
deviceTokenили явныеscopes, запрошенный вызывающей стороной набор областей доступа остается авторитетным; кэшированные области доступа повторно используются только когда клиент повторно использует сохраненный токен отдельного устройства. - Токены устройств можно ротировать и отзывать через
device.token.rotateиdevice.token.revoke(требуется область доступаoperator.pairing). Ротация или отзыв токена Node либо другой неоператорской роли также требуетoperator.admin. device.token.rotateвозвращает метаданные ротации. Он отражает замещающий bearer-токен только для вызовов с того же устройства, которые уже аутентифицированы этим токеном устройства, чтобы клиенты только с токеном могли сохранить замену до переподключения. Ротации по общему или административному токену не отражают bearer-токен.- Выдача, ротация и отзыв токенов остаются ограничены утвержденным набором ролей, записанным в записи сопряжения этого устройства; изменение токенов не может расширить роль устройства или выбрать целевую роль устройства, которую утверждение сопряжения никогда не предоставляло.
- Для сеансов токенов сопряженных устройств управление устройствами ограничено
самим устройством, если у вызывающей стороны нет
operator.admin: вызывающие стороны без прав администратора могут управлять только токеном оператора для записи своего устройства. Управление токенами Node и других неоператорских ролей доступно только администратору, даже для собственного устройства вызывающей стороны. device.token.rotateиdevice.token.revokeтакже проверяют целевой набор областей доступа токена оператора относительно текущих областей доступа сеанса вызывающей стороны. Вызывающие стороны без прав администратора не могут ротировать или отзывать токен оператора с более широкими правами, чем уже имеют сами.- Ошибки аутентификации включают
error.details.codeи подсказки для восстановления:error.details.canRetryWithDeviceToken(boolean)error.details.recommendedNextStep(retry_with_device_token,update_auth_configuration,update_auth_credentials,wait_then_retry,review_auth_configuration)
- Поведение клиента для
AUTH_TOKEN_MISMATCH:- Доверенные клиенты могут выполнить одну ограниченную повторную попытку с кэшированным токеном отдельного устройства.
- Если эта повторная попытка завершается ошибкой, клиентам следует остановить автоматические циклы переподключения и показать оператору руководство к действию.
AUTH_SCOPE_MISMATCHозначает, что токен устройства был распознан, но не покрывает запрошенную роль или области доступа. Клиентам не следует представлять это как неверный токен; предложите оператору повторно выполнить сопряжение или утвердить более узкий либо более широкий контракт областей доступа.
Идентичность устройства + сопряжение
- Node должны включать стабильную идентичность устройства (
device.id), полученную из отпечатка пары ключей. - Gateway выдают токены для каждой пары устройство + роль.
- Для новых идентификаторов устройств требуются утверждения сопряжения, если не включено локальное автоутверждение.
- Автоутверждение сопряжения сосредоточено на прямых подключениях через local loopback.
- OpenClaw также имеет узкий путь самоподключения, локальный для backend/контейнера, для доверенных вспомогательных потоков с общим секретом.
- Подключения в tailnet или LAN с того же хоста все равно считаются удаленными для сопряжения и требуют утверждения.
- Клиенты WS обычно включают идентичность
deviceво времяconnect(оператор + Node). Единственные исключения оператора без устройства — явные доверенные пути:gateway.controlUi.allowInsecureAuth=trueдля совместимости небезопасного HTTP только на localhost.- успешная аутентификация оператора Control UI через
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(аварийный режим, серьезное снижение безопасности).- прямые loopback backend-RPC
gateway-clientна зарезервированном внутреннем вспомогательном пути.
- Пропуск идентичности устройства имеет последствия для областей доступа. Когда
подключение оператора без устройства разрешено через явный доверенный путь,
OpenClaw все равно очищает самостоятельно объявленные области доступа до пустого
набора, если у этого пути нет именованного исключения для сохранения областей
доступа. Методы, ограниченные областями доступа, затем завершаются ошибкой
missing scope. gateway.controlUi.dangerouslyDisableDeviceAuth=true— это аварийный путь Control UI с сохранением областей доступа. Он не выдает области доступа произвольным пользовательским backend- или CLI-подобным WebSocket-клиентам.- Зарезервированный прямой loopback вспомогательный backend-путь
gateway-clientсохраняет области доступа только для внутренних локальных RPC плоскости управления; пользовательские идентификаторы backend не получают это исключение. - Все соединения должны подписывать предоставленный сервером nonce
connect.challenge.
Диагностика миграции аутентификации устройства
Для устаревших клиентов, которые все еще используют поведение подписи до challenge, connect теперь возвращает
коды сведений DEVICE_AUTH_* в error.details.code со стабильным error.details.reason.
Типичные ошибки миграции:
| Сообщение | details.code | details.reason | Значение |
|---|---|---|---|
device nonce required |
DEVICE_AUTH_NONCE_REQUIRED |
device-nonce-missing |
Клиент пропустил device.nonce (или отправил пустое значение). |
device nonce mismatch |
DEVICE_AUTH_NONCE_MISMATCH |
device-nonce-mismatch |
Клиент подписал с устаревшим или неверным nonce. |
device signature invalid |
DEVICE_AUTH_SIGNATURE_INVALID |
device-signature |
Полезная нагрузка подписи не соответствует полезной нагрузке v2. |
device signature expired |
DEVICE_AUTH_SIGNATURE_EXPIRED |
device-signature-stale |
Подписанная временная метка вне допустимого отклонения. |
device identity mismatch |
DEVICE_AUTH_DEVICE_ID_MISMATCH |
device-id-mismatch |
device.id не соответствует отпечатку публичного ключа. |
device public key invalid |
DEVICE_AUTH_PUBLIC_KEY_INVALID |
device-public-key |
Формат или каноникализация публичного ключа не прошли проверку. |
Цель миграции:
- Всегда ждать
connect.challenge. - Подписывать полезную нагрузку v2, которая включает nonce сервера.
- Отправлять тот же nonce в
connect.params.device.nonce. - Предпочтительная полезная нагрузка подписи —
v3, которая связываетplatformиdeviceFamilyв дополнение к полям device/client/role/scopes/token/nonce. - Устаревшие подписи
v2по-прежнему принимаются для совместимости, но закрепление метаданных сопряженного устройства все равно управляет политикой команд при переподключении.
TLS + закрепление
- TLS поддерживается для соединений WS.
- Клиенты могут при необходимости закрепить отпечаток сертификата Gateway (см.
конфигурацию
gateway.tlsплюсgateway.remote.tlsFingerprintили CLI--tls-fingerprint).
Область доступа
Этот протокол открывает полный API Gateway (статус, каналы, модели, чат,
агент, сеансы, узлы, утверждения и т. д.). Точная поверхность определяется
схемами TypeBox в packages/gateway-protocol/src/schema.ts.