Протокол Gateway (WebSocket)
Протокол Gateway WS — це єдина control plane + node transport для OpenClaw. Усі клієнти (CLI, веб-UI, застосунок macOS, вузли iOS/Android, headless вузли) підключаються через WebSocket і оголошують свою role + scope під час рукостискання.Транспорт
- WebSocket, текстові кадри з JSON payload.
- Перший кадр має бути запитом
connect.
Рукостискання (connect)
Gateway → Client (виклик до підключення):hello-ok також містить:
hello-ok.auth також може містити
додаткові обмежені записи ролей у deviceTokens:
scopes: [], а будь-який переданий токен оператора залишається обмеженим
дозволеним списком bootstrap operator (operator.approvals, operator.read,
operator.talk.secrets, operator.write). Перевірки scope bootstrap
залишаються з префіксом role: записи operator задовольняють лише запити
operator, а ролі, що не є operator, усе одно потребують scope під власним
префіксом role.
Приклад node
Формат кадрів
- Запит:
{type:"req", id, method, params} - Відповідь:
{type:"res", id, ok, payload|error} - Подія:
{type:"event", event, payload, seq?, stateVersion?}
Roles + scopes
Roles
operator= клієнт control plane (CLI/UI/automation).node= хост можливостей (camera/screen/canvas/system.run).
Scopes (operator)
Поширені scope:operator.readoperator.writeoperator.adminoperator.approvalsoperator.pairingoperator.talk.secrets
talk.config з includeSecrets: true потрібен operator.talk.secrets
(або operator.admin).
Зареєстровані plugin методи gateway RPC можуть вимагати власний scope operator,
але зарезервовані префікси core admin (config.*, exec.approvals.*, wizard.*,
update.*) завжди зводяться до operator.admin.
Scope методу — лише перший бар’єр. Деякі slash-команди, до яких звертаються через
chat.send, застосовують додаткові суворіші перевірки на рівні команди.
Наприклад, постійні записи /config set і /config unset потребують operator.admin.
node.pair.approve також має додаткову перевірку scope під час схвалення понад
базовий scope методу:
- запити без команди:
operator.pairing - запити з командами вузла, що не є exec:
operator.pairing+operator.write - запити, які містять
system.run,system.run.prepareабоsystem.which:operator.pairing+operator.admin
Caps/commands/permissions (node)
Вузли оголошують claims можливостей під час підключення:caps: високорівневі категорії можливостей.commands: allowlist команд для invoke.permissions: детальні перемикачі (наприклад,screen.record,camera.capture).
Presence
system-presenceповертає записи, ключовані за ідентичністю пристрою.- Записи presence містять
deviceId,rolesіscopes, щоб UI могли показувати один рядок на пристрій, навіть якщо він підключений і як operator, і як node.
Поширені сімейства RPC-методів
Ця сторінка не є згенерованим повним дампом, але публічна поверхня WS ширша, ніж наведені вище приклади рукостискання/автентифікації. Це основні сімейства методів, які Gateway надає сьогодні.hello-ok.features.methods — це консервативний список виявлення, зібраний із
src/gateway/server-methods-list.ts плюс експорти методів завантажених plugin/channel.
Сприймайте його як виявлення можливостей, а не як згенерований дамп кожного
викличного helper, реалізованого в src/gateway/server-methods/*.ts.
Система та ідентичність
healthповертає кешований або щойно перевірений знімок стану gateway.statusповертає зведення gateway у стилі/status; чутливі поля включаються лише для клієнтів operator з admin scope.gateway.identity.getповертає ідентичність пристрою gateway, яка використовується в relay і потоках pairing.system-presenceповертає поточний знімок presence для підключених пристроїв operator/node.system-eventдодає системну подію та може оновлювати/транслювати контекст presence.last-heartbeatповертає останню збережену подію heartbeat.set-heartbeatsперемикає обробку heartbeat у gateway.
Моделі та використання
models.listповертає каталог моделей, дозволених під час виконання.usage.statusповертає вікна використання провайдерів/зведення залишкової квоти.usage.costповертає агреговані зведення використання вартості для діапазону дат.doctor.memory.statusповертає готовність vector-memory / embedding для активного робочого простору агента за замовчуванням.sessions.usageповертає зведення використання за сеансами.sessions.usage.timeseriesповертає часовий ряд використання для одного сеансу.sessions.usage.logsповертає записи журналу використання для одного сеансу.
Канали та помічники входу
channels.statusповертає зведення стану вбудованих і bundled channel/plugin.channels.logoutвиходить із конкретного каналу/облікового запису, якщо канал підтримує вихід.web.login.startзапускає QR/web потік входу для поточного провайдера web-каналу з підтримкою QR.web.login.waitочікує завершення цього QR/web потоку входу та запускає канал у разі успіху.push.testнадсилає тестовий push APNs до зареєстрованого вузла iOS.voicewake.getповертає збережені тригери wake-word.voicewake.setоновлює тригери wake-word і транслює зміну.
Повідомлення та журнали
send— це прямий RPC outbound-delivery для надсилання з націлюванням на channel/account/thread поза chat runner.logs.tailповертає tail налаштованого файлового журналу gateway з контролем cursor/limit і max-byte.
Talk і TTS
talk.configповертає ефективний payload конфігурації Talk;includeSecretsпотребуєoperator.talk.secrets(абоoperator.admin).talk.modeвстановлює/транслює поточний стан режиму Talk для клієнтів WebChat/Control UI.talk.speakсинтезує мовлення через активного speech-провайдера Talk.tts.statusповертає стан увімкнення TTS, активного провайдера, резервних провайдерів і стан конфігурації провайдера.tts.providersповертає видимий інвентар провайдерів TTS.tts.enableіtts.disableперемикають стан налаштувань TTS.tts.setProviderоновлює бажаного провайдера TTS.tts.convertвиконує одноразове перетворення text-to-speech.
Секрети, конфігурація, оновлення та wizard
secrets.reloadповторно розв’язує активні SecretRef і замінює стан секретів під час виконання лише за повного успіху.secrets.resolveрозв’язує призначення секретів цілі команди для конкретного набору command/target.config.getповертає поточний знімок конфігурації та хеш.config.setзаписує валідований payload конфігурації.config.patchоб’єднує часткове оновлення конфігурації.config.applyвалідує і замінює повний payload конфігурації.config.schemaповертає payload живої схеми конфігурації, який використовують Control UI та інструменти CLI: schema,uiHints, версію та метадані генерування, включно з метаданими схеми plugin + channel, коли runtime може їх завантажити. Схема містить метадані полівtitle/description, похідні від тих самих міток і довідкового тексту, які використовує UI, включно з вкладеним object, wildcard, array-item і гілками композиціїanyOf/oneOf/allOf, коли існує відповідна документація поля.config.schema.lookupповертає payload lookup з обмеженням шляхом для одного шляху конфігурації: нормалізований шлях, вузол поверхневої схеми, підібрану підказку +hintPathі зведення безпосередніх дочірніх елементів для поглибленого перегляду в UI/CLI.- Вузли схеми lookup зберігають документацію, орієнтовану на користувача, і
поширені поля валідації:
title,description,type,enum,const,format,pattern, числові/рядкові/масивні/об’єктні межі та булеві прапорці, як-отadditionalProperties,deprecated,readOnly,writeOnly. - Зведення дочірніх елементів містять
key, нормалізованийpath,type,required,hasChildren, а також підібраніhint/hintPath.
- Вузли схеми lookup зберігають документацію, орієнтовану на користувача, і
поширені поля валідації:
update.runзапускає потік оновлення gateway і планує перезапуск лише тоді, коли саме оновлення виконалося успішно.wizard.start,wizard.next,wizard.statusіwizard.cancelнадають onboarding wizard через WS RPC.
Наявні основні сімейства
Помічники агента та робочого простору
agents.listповертає налаштовані записи агентів.agents.create,agents.updateіagents.deleteкерують записами агентів і прив’язкою робочого простору.agents.files.list,agents.files.getіagents.files.setкерують файлами робочого простору bootstrap, доступними для агента.agent.identity.getповертає ефективну ідентичність асистента для агента або сеансу.agent.waitочікує завершення запуску та повертає термінальний знімок, коли він доступний.
Керування сеансом
sessions.listповертає поточний індекс сеансів.sessions.subscribeіsessions.unsubscribeвмикають або вимикають підписки на події зміни сеансів для поточного WS-клієнта.sessions.messages.subscribeіsessions.messages.unsubscribeвмикають або вимикають підписки на події transcript/message для одного сеансу.sessions.previewповертає обмежені попередні перегляди transcript для конкретних ключів сеансу.sessions.resolveрозв’язує або канонікалізує ціль сеансу.sessions.createстворює новий запис сеансу.sessions.sendнадсилає повідомлення в наявний сеанс.sessions.steer— це варіант interrupt-and-steer для активного сеансу.sessions.abortперериває активну роботу для сеансу.sessions.patchоновлює метадані/перевизначення сеансу.sessions.reset,sessions.deleteіsessions.compactвиконують обслуговування сеансу.sessions.getповертає повний збережений рядок сеансу.- виконання chat, як і раніше, використовує
chat.history,chat.send,chat.abortіchat.inject. chat.historyнормалізується для відображення для UI-клієнтів: вбудовані теги directives видаляються з видимого тексту, XML payload plain-text tool-call (включно з<tool_call>...</tool_call>,<function_call>...</function_call>,<tool_calls>...</tool_calls>,<function_calls>...</function_calls>і обрізаними блоками tool-call) та витоки ASCII/full-width керувальних токенів моделі видаляються, чисті рядки assistant із silent-token, такі як точніNO_REPLY/no_reply, пропускаються, а надто великі рядки можуть замінюватися placeholder.
Pairing пристроїв і токени пристроїв
device.pair.listповертає очікувальні та схвалені paired devices.device.pair.approve,device.pair.rejectіdevice.pair.removeкерують записами pairing пристроїв.device.token.rotateротує токен paired device в межах схвалених role і scope.device.token.revokeвідкликає токен paired device.
Pairing вузлів, invoke і відкладена робота
node.pair.request,node.pair.list,node.pair.approve,node.pair.rejectіnode.pair.verifyохоплюють pairing вузлів і bootstrap verification.node.listіnode.describeповертають стан відомих/підключених вузлів.node.renameоновлює мітку paired node.node.invokeпересилає команду підключеному вузлу.node.invoke.resultповертає результат для запиту invoke.node.eventпереносить події, що походять від вузла, назад у gateway.node.canvas.capability.refreshоновлює токени canvas-capability з обмеженим scope.node.pending.pullіnode.pending.ack— це API черги підключеного вузла.node.pending.enqueueіnode.pending.drainкерують стійкою відкладеною роботою для офлайн/відключених вузлів.
Сімейства approval
exec.approval.request,exec.approval.get,exec.approval.listіexec.approval.resolveохоплюють одноразові запити exec approval плюс lookup/replay відкладених approval.exec.approval.waitDecisionочікує на один відкладений exec approval і повертає остаточне рішення (абоnullу разі тайм-ауту).exec.approvals.getіexec.approvals.setкерують знімками політики exec approval gateway.exec.approvals.node.getіexec.approvals.node.setкерують локальною політикою exec approval вузла через relay-команди вузла.plugin.approval.request,plugin.approval.list,plugin.approval.waitDecisionіplugin.approval.resolveохоплюють потоки approval, визначені plugin.
Інші основні сімейства
- automation:
wakeпланує негайне або наступне введення тексту wake на heartbeatcron.list,cron.status,cron.add,cron.update,cron.remove,cron.run,cron.runs
- skills/tools:
commands.list,skills.*,tools.catalog,tools.effective
Поширені сімейства подій
chat: оновлення UI chat, такі якchat.injectта інші події chat, що стосуються лише transcript.session.messageіsession.tool: оновлення transcript/event-stream для сеансу, на який оформлено підписку.sessions.changed: індекс сеансів або метадані змінилися.presence: оновлення знімка system presence.tick: періодична подія keepalive / liveness.health: оновлення знімка стану gateway.heartbeat: оновлення потоку подій heartbeat.cron: подія зміни виконання/завдання cron.shutdown: сповіщення про завершення роботи gateway.node.pair.requested/node.pair.resolved: життєвий цикл pairing вузла.node.invoke.request: трансляція запиту invoke вузла.device.pair.requested/device.pair.resolved: життєвий цикл paired-device.voicewake.changed: змінено конфігурацію тригера wake-word.exec.approval.requested/exec.approval.resolved: життєвий цикл exec approval.plugin.approval.requested/plugin.approval.resolved: життєвий цикл plugin approval.
Допоміжні методи node
- Nodes можуть викликати
skills.bins, щоб отримати поточний список виконуваних файлів skill для перевірок auto-allow.
Допоміжні методи operator
- Operators можуть викликати
commands.list(operator.read), щоб отримати інвентар команд під час виконання для агента.agentIdє необов’язковим; опустіть його, щоб читати робочий простір агента за замовчуванням.scopeвизначає, яку поверхню націлює основнаname:textповертає основний текстовий токен команди без початкового/nativeі шлях за замовчуваннямbothповертають native names, залежні від провайдера, коли вони доступні
textAliasesмістить точні slash-аліаси, такі як/modelі/m.nativeNameмістить native command name, залежне від провайдера, коли воно є.providerє необов’язковим і впливає лише на native naming плюс доступність native plugin command.includeArgs=falseприбирає із відповіді серіалізовані метадані аргументів.
- Operators можуть викликати
tools.catalog(operator.read), щоб отримати каталог інструментів під час виконання для агента. Відповідь містить згруповані інструменти та метадані походження:source:coreабоpluginpluginId: власник plugin, колиsource="plugin"optional: чи є plugin tool необов’язковим
- Operators можуть викликати
tools.effective(operator.read), щоб отримати інвентар інструментів, ефективний під час виконання, для сеансу.sessionKeyє обов’язковим.- Gateway виводить довірений runtime context із сеансу на стороні сервера, замість приймати auth або delivery context, наданий викликачем.
- Відповідь має scope сеансу й відображає, що активна розмова може використовувати просто зараз, включно з core, plugin і channel tools.
- Operators можуть викликати
skills.status(operator.read), щоб отримати видимий інвентар skills для агента.agentIdє необов’язковим; опустіть його, щоб читати робочий простір агента за замовчуванням.- Відповідь містить eligibility, відсутні вимоги, перевірки config і очищені параметри встановлення без розкриття необроблених значень secret.
- Operators можуть викликати
skills.searchіskills.detail(operator.read) для метаданих виявлення ClawHub. - Operators можуть викликати
skills.install(operator.admin) у двох режимах:- Режим ClawHub:
{ source: "clawhub", slug, version?, force? }встановлює папку skill у каталогskills/робочого простору агента за замовчуванням. - Режим installer gateway:
{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }запускає оголошену діюmetadata.openclaw.installна хості gateway.
- Режим ClawHub:
- Operators можуть викликати
skills.update(operator.admin) у двох режимах:- Режим ClawHub оновлює один відстежуваний slug або всі відстежувані встановлення ClawHub у робочому просторі агента за замовчуванням.
- Режим Config вносить зміни в значення
skills.entries.<skillKey>, такі якenabled,apiKeyіenv.
Exec approval
- Коли запит exec потребує approval, gateway транслює
exec.approval.requested. - Клієнти operator виконують підтвердження, викликаючи
exec.approval.resolve(потрібен scopeoperator.approvals). - Для
host=nodeexec.approval.requestмає міститиsystemRunPlan(канонічні метаданіargv/cwd/rawCommand/сеансу). Запити безsystemRunPlanвідхиляються. - Після approval переслані виклики
node.invoke system.runповторно використовують цей канонічнийsystemRunPlanяк авторитетний контекст command/cwd/session. - Якщо викликач змінює
command,rawCommand,cwd,agentIdабоsessionKeyміж prepare і остаточним пересиланням схваленогоsystem.run, gateway відхиляє виконання, замість того щоб довіряти зміненому payload.
Резервна доставка агента
- Запити
agentможуть міститиdeliver=true, щоб запитати outbound delivery. bestEffortDeliver=falseзберігає сувору поведінку: нерозв’язані або лише внутрішні цілі delivery повертаютьINVALID_REQUEST.bestEffortDeliver=trueдозволяє резервний перехід до виконання лише в межах сеансу, коли неможливо розв’язати зовнішній маршрут доставки (наприклад, internal/webchat сеанси або неоднозначні multi-channel config).
Версіонування
PROTOCOL_VERSIONзнаходиться вsrc/gateway/protocol/schema.ts.- Клієнти надсилають
minProtocol+maxProtocol; сервер відхиляє невідповідності. - Схеми + моделі генеруються з визначень TypeBox:
pnpm protocol:genpnpm protocol:gen:swiftpnpm protocol:check
Автентифікація
- Автентифікація gateway зі спільним секретом використовує
connect.params.auth.tokenабоconnect.params.auth.password, залежно від налаштованого режиму auth. - Режими з передаванням ідентичності, такі як Tailscale Serve
(
gateway.auth.allowTailscale: true) або не-loopbackgateway.auth.mode: "trusted-proxy", задовольняють перевірку auth під час connect за заголовками запиту, а не черезconnect.params.auth.*. - Private-ingress
gateway.auth.mode: "none"повністю пропускає автентифікацію connect зі спільним секретом; не відкривайте цей режим для публічного/недовіреного ingress. - Після pairing Gateway видає токен пристрою з обмеженням на role + scopes
підключення. Він повертається в
hello-ok.auth.deviceTokenі має бути збережений клієнтом для майбутніх підключень. - Клієнти повинні зберігати основний
hello-ok.auth.deviceTokenпісля будь-якого успішного підключення. - Повторне підключення з цим збереженим токеном пристрою також має повторно використовувати збережений набір схвалених scope для цього токена. Це зберігає вже наданий доступ на читання/перевірку/status і запобігає тихому звуженню повторних підключень до вужчого неявного scope лише admin.
- Звичайний пріоритет auth під час connect: спочатку явний спільний token/password, потім
явний
deviceToken, потім збережений токен для пристрою, потім bootstrap token. - Додаткові записи
hello-ok.auth.deviceTokens— це токени передавання bootstrap. Зберігайте їх лише тоді, коли connect використовував bootstrap auth через довірений транспорт, такий якwss://або loopback/local pairing. - Якщо клієнт надає явний
deviceTokenабо явніscopes, цей набір scope, запитаний викликачем, залишається авторитетним; кешовані scope повторно використовуються лише тоді, коли клієнт повторно використовує збережений токен для пристрою. - Токени пристрою можна ротувати/відкликати через
device.token.rotateіdevice.token.revoke(потрібен scopeoperator.pairing). - Видача/ротація токенів залишається обмеженою схваленим набором role, зафіксованим у записі pairing цього пристрою; ротація токена не може розширити пристрій до role, яку pairing approval ніколи не надавав.
- Для сесій токенів paired-device керування пристроєм має власне scope, якщо
викликач також не має
operator.admin: викликачі без admin можуть видаляти/відкликати/ротувати лише власний запис пристрою. device.token.rotateтакож перевіряє запитаний набір scope operator щодо поточних scope сесії викликача. Викликачі без admin не можуть ротувати токен до ширшого набору scope operator, ніж уже мають.- Збої auth містять
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:- Довірені клієнти можуть виконати одну обмежену повторну спробу з кешованим токеном для пристрою.
- Якщо ця повторна спроба не вдається, клієнти повинні зупинити автоматичні цикли перепідключення та показати вказівки для дій оператора.
Ідентичність пристрою + pairing
- Nodes повинні включати стабільну ідентичність пристрою (
device.id), похідну від відбитка keypair. - Gateways видають токени для кожного пристрою + role.
- Для нових device ID потрібні pairing approval, якщо не ввімкнено локальне auto-approval.
- Pairing auto-approval зосереджене на прямих локальних підключеннях local loopback.
- OpenClaw також має вузький backend/container-local шлях self-connect для довірених helper-потоків зі спільним секретом.
- Підключення tailnet або LAN з того самого хоста все одно вважаються віддаленими для pairing і потребують approval.
- Усі WS-клієнти мають включати ідентичність
deviceпід часconnect(operator + node). Control UI може опускати її лише в таких режимах:gateway.controlUi.allowInsecureAuth=trueдля сумісності з небезпечним HTTP лише на localhost.- успішна автентифікація operator Control UI з
gateway.auth.mode: "trusted-proxy". gateway.controlUi.dangerouslyDisableDeviceAuth=true(аварійний режим, серйозне зниження безпеки).
- Усі підключення мають підписувати наданий сервером 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 | Payload підпису не відповідає payload 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. - Підписуйте payload v2, який містить nonce сервера.
- Надсилайте той самий nonce у
connect.params.device.nonce. - Бажаний payload підпису —
v3, який прив’язуєplatformіdeviceFamilyна додачу до полів device/client/role/scopes/token/nonce. - Застарілі підписи
v2і далі приймаються для сумісності, але pinning метаданих paired-device усе одно керує політикою команд під час повторного підключення.
TLS + pinning
- Для WS-підключень підтримується TLS.
- Клієнти за бажанням можуть закріплювати відбиток сертифіката gateway (див. конфігурацію
gateway.tlsплюсgateway.remote.tlsFingerprintабо CLI--tls-fingerprint).
Scope
Цей протокол відкриває повний API gateway (status, channels, models, chat, agent, sessions, nodes, approvals тощо). Точна поверхня визначається схемами TypeBox уsrc/gateway/protocol/schema.ts.