diff --git a/docs/uk/gateway/protocol.md b/docs/uk/gateway/protocol.md
index b8fc1db2f..7d77ee234 100644
--- a/docs/uk/gateway/protocol.md
+++ b/docs/uk/gateway/protocol.md
@@ -1,34 +1,34 @@
---
read_when:
- - Реалізація або оновлення gateway WS-клієнтів
+ - Реалізація або оновлення клієнтів Gateway WS
- Налагодження невідповідностей протоколу або збоїв підключення
- - Повторна генерація схеми/моделей протоколу
-summary: 'Протокол Gateway WebSocket: рукостискання, фрейми, версіонування'
+ - Повторне генерування схеми/моделей протоколу
+summary: 'Протокол Gateway WebSocket: рукостискання, кадри, версіонування'
title: Протокол Gateway
x-i18n:
- generated_at: "2026-04-07T19:40:42Z"
+ generated_at: "2026-04-10T06:30:21Z"
model: gpt-5.4
provider: openai
- source_hash: 8635e3ac1dd311dbd3a770b088868aa1495a8d53b3ebc1eae0dfda3b2bf4694a
+ source_hash: 83c820c46d4803d571c770468fd6782619eaa1dca253e156e8087dec735c127f
source_path: gateway/protocol.md
workflow: 15
---
# Протокол Gateway (WebSocket)
-Протокол Gateway WS — це **єдина контрольна площина + транспорт вузлів** для
-OpenClaw. Усі клієнти (CLI, веб-інтерфейс, застосунок macOS, вузли iOS/Android, headless
-вузли) підключаються через WebSocket і оголошують свою **роль** + **область**
-під час рукостискання.
+Протокол Gateway WS — це **єдина control plane + node transport** для
+OpenClaw. Усі клієнти (CLI, веб-UI, застосунок macOS, вузли iOS/Android, headless
+вузли) підключаються через WebSocket і оголошують свою **role** + **scope** під
+час рукостискання.
## Транспорт
-- WebSocket, текстові фрейми з JSON-навантаженнями.
-- Першим фреймом **має** бути запит `connect`.
+- WebSocket, текстові кадри з JSON payload.
+- Перший кадр **має** бути запитом `connect`.
## Рукостискання (connect)
-Gateway → Client (передпідключний challenge):
+Gateway → Client (виклик до підключення):
```json
{
@@ -96,8 +96,8 @@ Gateway → Client:
}
```
-Під час передавання довіреного bootstrap `hello-ok.auth` також може містити додаткові
-обмежені записи ролей у `deviceTokens`:
+Під час передавання довіреного bootstrap `hello-ok.auth` також може містити
+додаткові обмежені записи ролей у `deviceTokens`:
```json
{
@@ -116,13 +116,13 @@ Gateway → Client:
}
```
-Для вбудованого bootstrap-процесу node/operator основний токен вузла зберігає
+Для вбудованого потоку bootstrap node/operator основний токен вузла залишається
`scopes: []`, а будь-який переданий токен оператора залишається обмеженим
-списком дозволів bootstrap-оператора (`operator.approvals`, `operator.read`,
-`operator.talk.secrets`, `operator.write`). Перевірки області bootstrap
-залишаються префіксованими роллю: записи оператора задовольняють лише запити
-оператора, а ролям, що не є оператором, як і раніше потрібні області під їхнім
-власним префіксом ролі.
+дозволеним списком bootstrap operator (`operator.approvals`, `operator.read`,
+`operator.talk.secrets`, `operator.write`). Перевірки scope bootstrap
+залишаються з префіксом role: записи operator задовольняють лише запити
+operator, а ролі, що не є operator, усе одно потребують scope під власним
+префіксом role.
### Приклад node
@@ -159,24 +159,24 @@ Gateway → Client:
}
```
-## Форматування фреймів
+## Формат кадрів
-- **Request**: `{type:"req", id, method, params}`
-- **Response**: `{type:"res", id, ok, payload|error}`
-- **Event**: `{type:"event", event, payload, seq?, stateVersion?}`
+- **Запит**: `{type:"req", id, method, params}`
+- **Відповідь**: `{type:"res", id, ok, payload|error}`
+- **Подія**: `{type:"event", event, payload, seq?, stateVersion?}`
-Методи з побічними ефектами потребують **ключів ідемпотентності** (див. schema).
+Методи з побічними ефектами потребують **idempotency keys** (див. схему).
-## Ролі + області
+## Roles + scopes
-### Ролі
+### Roles
-- `operator` = клієнт контрольної площини (CLI/UI/автоматизація).
+- `operator` = клієнт control plane (CLI/UI/automation).
- `node` = хост можливостей (camera/screen/canvas/system.run).
-### Області (operator)
+### Scopes (operator)
-Поширені області:
+Поширені scope:
- `operator.read`
- `operator.write`
@@ -185,410 +185,430 @@ Gateway → Client:
- `operator.pairing`
- `operator.talk.secrets`
-`talk.config` з `includeSecrets: true` потребує `operator.talk.secrets`
+Для `talk.config` з `includeSecrets: true` потрібен `operator.talk.secrets`
(або `operator.admin`).
-RPC-методи Gateway, зареєстровані plugin, можуть запитувати власну область
-оператора, але зарезервовані префікси core admin (`config.*`, `exec.approvals.*`, `wizard.*`,
-`update.*`) завжди зіставляються з `operator.admin`.
+Зареєстровані plugin методи gateway RPC можуть вимагати власний scope operator,
+але зарезервовані префікси core admin (`config.*`, `exec.approvals.*`, `wizard.*`,
+`update.*`) завжди зводяться до `operator.admin`.
-Область методу — це лише перший рівень перевірки. Деякі slash-команди,
-викликані через `chat.send`, додатково застосовують суворіші перевірки на рівні команди.
+Scope методу — лише перший бар’єр. Деякі slash-команди, до яких звертаються через
+`chat.send`, застосовують додаткові суворіші перевірки на рівні команди.
Наприклад, постійні записи `/config set` і `/config unset` потребують `operator.admin`.
-`node.pair.approve` також має додаткову перевірку області під час схвалення понад
-базову область методу:
+`node.pair.approve` також має додаткову перевірку scope під час схвалення понад
+базовий scope методу:
- запити без команди: `operator.pairing`
-- запити з командами вузла без exec: `operator.pairing` + `operator.write`
-- запити, що містять `system.run`, `system.run.prepare` або `system.which`:
+- запити з командами вузла, що не є exec: `operator.pairing` + `operator.write`
+- запити, які містять `system.run`, `system.run.prepare` або `system.which`:
`operator.pairing` + `operator.admin`
### Caps/commands/permissions (node)
-Вузли оголошують заявлені можливості під час підключення:
+Вузли оголошують claims можливостей під час підключення:
- `caps`: високорівневі категорії можливостей.
-- `commands`: список дозволених команд для invoke.
+- `commands`: allowlist команд для invoke.
- `permissions`: детальні перемикачі (наприклад, `screen.record`, `camera.capture`).
-Gateway розглядає це як **заяви** і застосовує серверні allowlist.
+Gateway розглядає їх як **claims** і застосовує серверні allowlist.
-## Присутність
+## Presence
-- `system-presence` повертає записи з ключами за ідентичністю пристрою.
-- Записи присутності містять `deviceId`, `roles` і `scopes`, щоб UI міг показувати один рядок на пристрій
- навіть коли він підключається і як **operator**, і як **node**.
+- `system-presence` повертає записи, ключовані за ідентичністю пристрою.
+- Записи presence містять `deviceId`, `roles` і `scopes`, щоб UI могли
+ показувати один рядок на пристрій, навіть якщо він підключений і як **operator**,
+ і як **node**.
## Поширені сімейства RPC-методів
Ця сторінка не є згенерованим повним дампом, але публічна поверхня WS ширша,
-ніж наведені вище приклади рукостискання/автентифікації. Це основні сімейства методів,
-які сьогодні надає Gateway.
+ніж наведені вище приклади рукостискання/автентифікації. Це основні сімейства
+методів, які Gateway надає сьогодні.
-`hello-ok.features.methods` — це консервативний список виявлення, побудований з
-`src/gateway/server-methods-list.ts` плюс експортів методів завантажених plugin/channel.
-Сприймайте його як виявлення можливостей, а не як згенерований дамп кожного допоміжного виклику,
-реалізованого в `src/gateway/server-methods/*.ts`.
+`hello-ok.features.methods` — це консервативний список виявлення, зібраний із
+`src/gateway/server-methods-list.ts` плюс експорти методів завантажених plugin/channel.
+Сприймайте його як виявлення можливостей, а не як згенерований дамп кожного
+викличного helper, реалізованого в `src/gateway/server-methods/*.ts`.
-### System and identity
+### Система та ідентичність
- `health` повертає кешований або щойно перевірений знімок стану gateway.
- `status` повертає зведення gateway у стилі `/status`; чутливі поля
- включаються лише для operator-клієнтів з admin-областю.
-- `gateway.identity.get` повертає ідентичність пристрою gateway, що використовується relay і
- потоками pairing.
-- `system-presence` повертає поточний знімок присутності для підключених
+ включаються лише для клієнтів operator з admin scope.
+- `gateway.identity.get` повертає ідентичність пристрою gateway, яка
+ використовується в relay і потоках pairing.
+- `system-presence` повертає поточний знімок presence для підключених
пристроїв operator/node.
- `system-event` додає системну подію та може оновлювати/транслювати контекст
- присутності.
+ presence.
- `last-heartbeat` повертає останню збережену подію heartbeat.
-- `set-heartbeats` перемикає обробку heartbeat на gateway.
+- `set-heartbeats` перемикає обробку heartbeat у gateway.
-### Models and usage
+### Моделі та використання
- `models.list` повертає каталог моделей, дозволених під час виконання.
-- `usage.status` повертає зведення вікон використання постачальника/залишку квоти.
-- `usage.cost` повертає агреговані зведення вартості використання за діапазон дат.
+- `usage.status` повертає вікна використання провайдерів/зведення залишкової квоти.
+- `usage.cost` повертає агреговані зведення використання вартості для діапазону дат.
- `doctor.memory.status` повертає готовність vector-memory / embedding для
активного робочого простору агента за замовчуванням.
-- `sessions.usage` повертає зведення використання по сесіях.
-- `sessions.usage.timeseries` повертає часовий ряд використання для однієї сесії.
-- `sessions.usage.logs` повертає записи журналу використання для однієї сесії.
+- `sessions.usage` повертає зведення використання за сеансами.
+- `sessions.usage.timeseries` повертає часовий ряд використання для одного сеансу.
+- `sessions.usage.logs` повертає записи журналу використання для одного сеансу.
-### Channels and login helpers
+### Канали та помічники входу
- `channels.status` повертає зведення стану вбудованих і bundled channel/plugin.
-- `channels.logout` виконує вихід для конкретного channel/account, де channel
+- `channels.logout` виходить із конкретного каналу/облікового запису, якщо канал
підтримує вихід.
-- `web.login.start` запускає потік входу QR/web для поточного QR-сумісного веб-
- провайдера channel.
-- `web.login.wait` очікує завершення цього потоку входу QR/web і запускає
- channel у разі успіху.
-- `push.test` надсилає тестовий APNs push до зареєстрованого вузла iOS.
+- `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 і транслює зміну.
-### Messaging and logs
+### Повідомлення та журнали
-- `send` — це RPC прямої вихідної доставки для channel/account/thread-орієнтованих
- надсилань поза chat runner.
-- `logs.tail` повертає налаштований tail файлового журналу gateway з cursor/limit і
- елементами керування max-byte.
+- `send` — це прямий RPC outbound-delivery для надсилання з націлюванням на
+ channel/account/thread поза chat runner.
+- `logs.tail` повертає tail налаштованого файлового журналу gateway з контролем
+ cursor/limit і max-byte.
-### Talk and TTS
+### Talk і TTS
-- `talk.config` повертає ефективне конфігураційне навантаження Talk; `includeSecrets`
+- `talk.config` повертає ефективний payload конфігурації Talk; `includeSecrets`
потребує `operator.talk.secrets` (або `operator.admin`).
-- `talk.mode` встановлює/транслює поточний стан режиму Talk для клієнтів WebChat/Control UI.
+- `talk.mode` встановлює/транслює поточний стан режиму Talk для клієнтів
+ WebChat/Control UI.
- `talk.speak` синтезує мовлення через активного speech-провайдера Talk.
-- `tts.status` повертає стан увімкнення TTS, активного провайдера, резервних провайдерів
- і стан конфігурації провайдера.
-- `tts.providers` повертає видимий інвентар TTS-провайдерів.
+- `tts.status` повертає стан увімкнення TTS, активного провайдера, резервних
+ провайдерів і стан конфігурації провайдера.
+- `tts.providers` повертає видимий інвентар провайдерів TTS.
- `tts.enable` і `tts.disable` перемикають стан налаштувань TTS.
-- `tts.setProvider` оновлює бажаного TTS-провайдера.
+- `tts.setProvider` оновлює бажаного провайдера TTS.
- `tts.convert` виконує одноразове перетворення text-to-speech.
-### Secrets, config, update, and wizard
+### Секрети, конфігурація, оновлення та wizard
-- `secrets.reload` повторно розв’язує активні SecretRef і замінює стан секретів під час виконання
- лише за повного успіху.
-- `secrets.resolve` розв’язує призначення секретів цільовій команді для конкретного
+- `secrets.reload` повторно розв’язує активні SecretRef і замінює стан секретів
+ під час виконання лише за повного успіху.
+- `secrets.resolve` розв’язує призначення секретів цілі команди для конкретного
набору command/target.
-- `config.get` повертає поточний знімок config і hash.
-- `config.set` записує перевірене навантаження config.
-- `config.patch` об’єднує часткове оновлення config.
-- `config.apply` перевіряє й замінює повне навантаження config.
-- `config.schema` повертає живе навантаження схеми config, що використовується Control UI і
- інструментами CLI: schema, `uiHints`, версію та метадані генерації, включно з
- метаданими схем plugin + channel, коли середовище виконання може їх завантажити. Схема
- містить метадані полів `title` / `description`, похідні від тих самих міток
- і тексту довідки, які використовує UI, включно з вкладеними object, wildcard,
- array-item і гілками композиції `anyOf` / `oneOf` / `allOf`, коли існує
- відповідна документація поля.
-- `config.schema.lookup` повертає навантаження пошуку з обмеженням шляхом для одного шляху config:
- нормалізований шлях, неглибокий вузол schema, зіставлені hint + `hintPath` і
- зведення безпосередніх дочірніх елементів для деталізації в UI/CLI.
- - Вузли схеми пошуку зберігають орієнтовану на користувача документацію та поширені поля валідації:
- `title`, `description`, `type`, `enum`, `const`, `format`, `pattern`,
- числові/рядкові/масивні/об’єктні межі та булеві прапорці, як-от
+- `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`.
+ - Зведення дочірніх елементів містять `key`, нормалізований `path`, `type`, `required`,
+ `hasChildren`, а також підібрані `hint` / `hintPath`.
- `update.run` запускає потік оновлення gateway і планує перезапуск лише тоді,
- коли саме оновлення було успішним.
+ коли саме оновлення виконалося успішно.
- `wizard.start`, `wizard.next`, `wizard.status` і `wizard.cancel` надають
- wizard онбордингу через WS RPC.
+ onboarding wizard через WS RPC.
-### Existing major families
+### Наявні основні сімейства
-#### Agent and workspace helpers
+#### Помічники агента та робочого простору
- `agents.list` повертає налаштовані записи агентів.
- `agents.create`, `agents.update` і `agents.delete` керують записами агентів і
- підключенням робочих просторів.
+ прив’язкою робочого простору.
- `agents.files.list`, `agents.files.get` і `agents.files.set` керують файлами
- bootstrap-робочого простору, доступними для агента.
-- `agent.identity.get` повертає ефективну ідентичність асистента для агента або
- сесії.
-- `agent.wait` очікує завершення запуску та повертає фінальний знімок, коли він
- доступний.
+ робочого простору bootstrap, доступними для агента.
+- `agent.identity.get` повертає ефективну ідентичність асистента для агента або сеансу.
+- `agent.wait` очікує завершення запуску та повертає термінальний знімок, коли
+ він доступний.
-#### Session control
+#### Керування сеансом
-- `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` — це варіант переривання й спрямування для активної сесії.
-- `sessions.abort` перериває активну роботу для сесії.
-- `sessions.patch` оновлює метадані/перевизначення сесії.
-- `sessions.reset`, `sessions.delete` і `sessions.compact` виконують обслуговування сесії.
-- `sessions.get` повертає повний збережений рядок сесії.
+- `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-клієнтів: вбудовані теги директив
- видаляються з видимого тексту, XML-навантаження виклику інструментів у простому тексті (включно з
- `...`, `...`,
+- `chat.history` нормалізується для відображення для UI-клієнтів: вбудовані теги
+ directives видаляються з видимого тексту, XML payload plain-text tool-call
+ (включно з `...`, `...`,
`...`, `...` і
- обрізаними блоками виклику інструментів) та витеклі ASCII/повноширинні токени керування моделі
- видаляються, суто беззвучні рядки асистента, як-от точні `NO_REPLY` /
- `no_reply`, пропускаються, а надто великі рядки можуть замінюватися заповнювачами.
+ обрізаними блоками tool-call) та витоки ASCII/full-width керувальних токенів
+ моделі видаляються, чисті рядки assistant із silent-token, такі як точні
+ `NO_REPLY` / `no_reply`, пропускаються, а надто великі рядки можуть
+ замінюватися placeholder.
-#### Device pairing and device tokens
+#### Pairing пристроїв і токени пристроїв
-- `device.pair.list` повертає очікуючі й схвалені спарені пристрої.
+- `device.pair.list` повертає очікувальні та схвалені paired devices.
- `device.pair.approve`, `device.pair.reject` і `device.pair.remove` керують
- записами спарювання пристроїв.
-- `device.token.rotate` ротатує токен спареного пристрою в межах схвалених ролей
- і областей.
-- `device.token.revoke` відкликає токен пристрою.
+ записами pairing пристроїв.
+- `device.token.rotate` ротує токен paired device в межах схвалених role і
+ scope.
+- `device.token.revoke` відкликає токен paired device.
-#### Node pairing, invoke, and pending work
+#### Pairing вузлів, invoke і відкладена робота
- `node.pair.request`, `node.pair.list`, `node.pair.approve`,
- `node.pair.reject` і `node.pair.verify` охоплюють спарювання вузлів і bootstrap-
- перевірку.
+ `node.pair.reject` і `node.pair.verify` охоплюють pairing вузлів і
+ bootstrap verification.
- `node.list` і `node.describe` повертають стан відомих/підключених вузлів.
-- `node.rename` оновлює мітку спареного вузла.
+- `node.rename` оновлює мітку paired node.
- `node.invoke` пересилає команду підключеному вузлу.
- `node.invoke.result` повертає результат для запиту invoke.
-- `node.event` переносить події, ініційовані вузлом, назад у gateway.
-- `node.canvas.capability.refresh` оновлює scoped-токени можливостей canvas.
-- `node.pending.pull` і `node.pending.ack` — це API черги підключених вузлів.
-- `node.pending.enqueue` і `node.pending.drain` керують довговічною відкладеною роботою
- для офлайн/відключених вузлів.
+- `node.event` переносить події, що походять від вузла, назад у gateway.
+- `node.canvas.capability.refresh` оновлює токени canvas-capability з
+ обмеженим scope.
+- `node.pending.pull` і `node.pending.ack` — це API черги підключеного вузла.
+- `node.pending.enqueue` і `node.pending.drain` керують стійкою відкладеною
+ роботою для офлайн/відключених вузлів.
-#### Approval families
+#### Сімейства approval
- `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
+ `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-
- політикою схвалення через relay-команди вузла.
+- `exec.approvals.node.get` і `exec.approvals.node.set` керують локальною
+ політикою exec approval вузла через relay-команди вузла.
- `plugin.approval.request`, `plugin.approval.list`,
`plugin.approval.waitDecision` і `plugin.approval.resolve` охоплюють
- потоки схвалення, визначені plugin.
+ потоки approval, визначені plugin.
-#### Other major families
+#### Інші основні сімейства
- automation:
- - `wake` планує негайне або на наступний heartbeat введення тексту пробудження
+ - `wake` планує негайне або наступне введення тексту wake на heartbeat
- `cron.list`, `cron.status`, `cron.add`, `cron.update`, `cron.remove`,
`cron.run`, `cron.runs`
-- skills/tools: `skills.*`, `tools.catalog`, `tools.effective`
+- skills/tools: `commands.list`, `skills.*`, `tools.catalog`, `tools.effective`
### Поширені сімейства подій
-- `chat`: оновлення chat у UI, такі як `chat.inject` та інші події chat,
- пов’язані лише з transcript.
-- `session.message` і `session.tool`: оновлення transcript/потоку подій для
- підписаної сесії.
-- `sessions.changed`: змінився індекс сесій або метадані.
-- `presence`: оновлення знімка системної присутності.
+- `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`: життєвий цикл спарювання вузлів.
+- `cron`: подія зміни виконання/завдання cron.
+- `shutdown`: сповіщення про завершення роботи gateway.
+- `node.pair.requested` / `node.pair.resolved`: життєвий цикл pairing вузла.
- `node.invoke.request`: трансляція запиту invoke вузла.
-- `device.pair.requested` / `device.pair.resolved`: життєвий цикл спареного пристрою.
-- `voicewake.changed`: змінилася конфігурація тригерів wake-word.
+- `device.pair.requested` / `device.pair.resolved`: життєвий цикл paired-device.
+- `voicewake.changed`: змінено конфігурацію тригера wake-word.
- `exec.approval.requested` / `exec.approval.resolved`: життєвий цикл
- схвалення exec.
-- `plugin.approval.requested` / `plugin.approval.resolved`: життєвий цикл схвалення
- plugin.
+ exec approval.
+- `plugin.approval.requested` / `plugin.approval.resolved`: життєвий цикл
+ plugin approval.
### Допоміжні методи node
-- Вузли можуть викликати `skills.bins`, щоб отримати поточний список виконуваних файлів skill
- для автоматичних перевірок allow.
+- Nodes можуть викликати `skills.bins`, щоб отримати поточний список виконуваних
+ файлів skill для перевірок auto-allow.
### Допоміжні методи operator
-- Оператори можуть викликати `tools.catalog` (`operator.read`), щоб отримати каталог runtime tools для
- агента. Відповідь містить згруповані tools і метадані походження:
+- 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` або `plugin`
- `pluginId`: власник plugin, коли `source="plugin"`
- - `optional`: чи є інструмент plugin необов’язковим
-- Оператори можуть викликати `tools.effective` (`operator.read`), щоб отримати runtime-effective
- інвентар tools для сесії.
+ - `optional`: чи є plugin tool необов’язковим
+- Operators можуть викликати `tools.effective` (`operator.read`), щоб отримати інвентар інструментів, ефективний під час виконання,
+ для сеансу.
- `sessionKey` є обов’язковим.
- - Gateway виводить довірений контекст runtime із сесії на боці сервера, а не приймає
- auth або контекст доставки, надані викликачем.
- - Відповідь має область сесії та відображає те, що активна розмова може використовувати просто зараз,
- включно з core, plugin і channel tools.
-- Оператори можуть викликати `skills.status` (`operator.read`), щоб отримати видимий
- інвентар Skills для агента.
- - `agentId` необов’язковий; пропустіть його, щоб читати робочий простір агента за замовчуванням.
- - Відповідь містить право на використання, відсутні вимоги, перевірки config і
- очищені параметри встановлення без розкриття сирих значень секретів.
-- Оператори можуть викликати `skills.search` і `skills.detail` (`operator.read`) для
+ - 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.
-- Оператори можуть викликати `skills.install` (`operator.admin`) у двох режимах:
- - Режим ClawHub: `{ source: "clawhub", slug, version?, force? }` установлює
- теку skill у каталог `skills/` робочого простору агента за замовчуванням.
- - Режим інсталятора gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }`
+- Operators можуть викликати `skills.install` (`operator.admin`) у двох режимах:
+ - Режим ClawHub: `{ source: "clawhub", slug, version?, force? }` встановлює
+ папку skill у каталог `skills/` робочого простору агента за замовчуванням.
+ - Режим installer gateway: `{ name, installId, dangerouslyForceUnsafeInstall?, timeoutMs? }`
запускає оголошену дію `metadata.openclaw.install` на хості gateway.
-- Оператори можуть викликати `skills.update` (`operator.admin`) у двох режимах:
- - Режим ClawHub оновлює один відстежуваний slug або всі відстежувані інсталяції ClawHub у
+- Operators можуть викликати `skills.update` (`operator.admin`) у двох режимах:
+ - Режим ClawHub оновлює один відстежуваний slug або всі відстежувані встановлення ClawHub у
робочому просторі агента за замовчуванням.
- - Режим Config патчить значення `skills.entries.`, такі як `enabled`,
+ - Режим Config вносить зміни в значення `skills.entries.`, такі як `enabled`,
`apiKey` і `env`.
-## Схвалення exec
+## Exec approval
-- Коли запит exec потребує схвалення, gateway транслює `exec.approval.requested`.
-- Клієнти operator виконують розв’язання, викликаючи `exec.approval.resolve` (потребує області `operator.approvals`).
-- Для `host=node` `exec.approval.request` має містити `systemRunPlan` (канонічні `argv`/`cwd`/`rawCommand`/метадані сесії). Запити без `systemRunPlan` відхиляються.
-- Після схвалення переслані виклики `node.invoke system.run` повторно використовують цей канонічний
- `systemRunPlan` як авторитетний контекст команди/cwd/сесії.
+- Коли запит exec потребує approval, gateway транслює `exec.approval.requested`.
+- Клієнти operator виконують підтвердження, викликаючи `exec.approval.resolve` (потрібен scope `operator.approvals`).
+- Для `host=node` `exec.approval.request` має містити `systemRunPlan` (канонічні метадані `argv`/`cwd`/`rawCommand`/сеансу). Запити без `systemRunPlan` відхиляються.
+- Після approval переслані виклики `node.invoke system.run` повторно
+ використовують цей канонічний `systemRunPlan` як авторитетний контекст
+ command/cwd/session.
- Якщо викликач змінює `command`, `rawCommand`, `cwd`, `agentId` або
- `sessionKey` між підготовкою та фінальним пересланням схваленого `system.run`, gateway
- відхиляє запуск замість довіри до зміненого навантаження.
+ `sessionKey` між prepare і остаточним пересиланням схваленого `system.run`,
+ gateway відхиляє виконання, замість того щоб довіряти зміненому payload.
## Резервна доставка агента
-- Запити `agent` можуть включати `deliver=true`, щоб запросити вихідну доставку.
-- `bestEffortDeliver=false` зберігає строгий режим: нерозв’язані або лише внутрішні цілі доставки повертають `INVALID_REQUEST`.
-- `bestEffortDeliver=true` дозволяє резервне виконання лише в межах сесії, коли не вдається розв’язати жоден зовнішній маршрут доставки (наприклад, для internal/webchat-сесій або неоднозначних конфігурацій багатьох channel).
+- Запити `agent` можуть містити `deliver=true`, щоб запитати outbound delivery.
+- `bestEffortDeliver=false` зберігає сувору поведінку: нерозв’язані або лише внутрішні цілі delivery повертають `INVALID_REQUEST`.
+- `bestEffortDeliver=true` дозволяє резервний перехід до виконання лише в межах сеансу, коли неможливо розв’язати зовнішній маршрут доставки (наприклад, internal/webchat сеанси або неоднозначні multi-channel config).
## Версіонування
-- `PROTOCOL_VERSION` розташований у `src/gateway/protocol/schema.ts`.
+- `PROTOCOL_VERSION` знаходиться в `src/gateway/protocol/schema.ts`.
- Клієнти надсилають `minProtocol` + `maxProtocol`; сервер відхиляє невідповідності.
-- Schema + models генеруються з визначень TypeBox:
+- Схеми + моделі генеруються з визначень TypeBox:
- `pnpm protocol:gen`
- `pnpm protocol:gen:swift`
- `pnpm protocol:check`
## Автентифікація
-- Автентифікація gateway за спільним секретом використовує `connect.params.auth.token` або
- `connect.params.auth.password` залежно від налаштованого режиму auth.
-- Режими з носієм ідентичності, такі як Tailscale Serve
- (`gateway.auth.allowTailscale: true`) або non-loopback
- `gateway.auth.mode: "trusted-proxy"`, задовольняють перевірку auth під час connect з
- заголовків запиту замість `connect.params.auth.*`.
-- `gateway.auth.mode: "none"` для private-ingress повністю пропускає shared-secret connect auth; не відкривайте цей режим для публічного/недовіреного ingress.
-- Після pairing Gateway видає **токен пристрою**, прив’язаний до ролі + областей
- підключення. Він повертається в `hello-ok.auth.deviceToken` і має
- зберігатися клієнтом для майбутніх підключень.
+- Автентифікація gateway зі спільним секретом використовує `connect.params.auth.token` або
+ `connect.params.auth.password`, залежно від налаштованого режиму auth.
+- Режими з передаванням ідентичності, такі як Tailscale Serve
+ (`gateway.auth.allowTailscale: true`) або не-loopback
+ `gateway.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` після будь-якого
успішного підключення.
-- Повторне підключення з цим **збереженим** токеном пристрою також повинно повторно використовувати
- збережений схвалений набір областей для цього токена. Це зберігає вже наданий
- доступ на читання/перевірку/статус і запобігає непомітному звуженню повторних підключень до
- вужчої неявної admin-only області.
+- Повторне підключення з цим **збереженим** токеном пристрою також має
+ повторно використовувати збережений набір схвалених scope для цього токена.
+ Це зберігає вже наданий доступ на читання/перевірку/status і запобігає
+ тихому звуженню повторних підключень до вужчого неявного scope лише admin.
- Звичайний пріоритет auth під час connect: спочатку явний спільний token/password, потім
- явний `deviceToken`, потім збережений токен для пристрою, потім bootstrap-токен.
+ явний `deviceToken`, потім збережений токен для пристрою, потім bootstrap token.
- Додаткові записи `hello-ok.auth.deviceTokens` — це токени передавання bootstrap.
- Зберігайте їх лише тоді, коли підключення використовувало bootstrap auth через довірений транспорт,
- такий як `wss://` або loopback/local pairing.
-- Якщо клієнт передає **явний** `deviceToken` або явні `scopes`, цей
- запитаний викликачем набір областей залишається авторитетним; кешовані області повторно використовуються
- лише тоді, коли клієнт повторно використовує збережений токен для пристрою.
-- Токени пристроїв можна ротувати/відкликати через `device.token.rotate` і
- `device.token.revoke` (потребує області `operator.pairing`).
-- Видача/ротація токенів залишається обмеженою схваленим набором ролей, записаним у
- записі pairing цього пристрою; ротація токена не може розширити пристрій до
- ролі, яку схвалення pairing ніколи не надавало.
-- Для paired-device сеансів токенів керування пристроями має власну область, якщо
- викликач також не має `operator.admin`: викликачі без admin можуть видаляти/відкликати/ротувати
- лише **власний** запис пристрою.
-- `device.token.rotate` також перевіряє запитаний набір областей оператора відносно
- поточних областей сеансу викликача. Викликачі без admin не можуть ротувати токен до
- ширшого набору областей оператора, ніж той, який вони вже мають.
-- Помилки auth містять `error.details.code` плюс підказки щодо відновлення:
+ Зберігайте їх лише тоді, коли connect використовував bootstrap auth через
+ довірений транспорт, такий як `wss://` або loopback/local pairing.
+- Якщо клієнт надає **явний** `deviceToken` або явні `scopes`, цей набір scope,
+ запитаний викликачем, залишається авторитетним; кешовані scope повторно
+ використовуються лише тоді, коли клієнт повторно використовує збережений токен для пристрою.
+- Токени пристрою можна ротувати/відкликати через `device.token.rotate` і
+ `device.token.revoke` (потрібен scope `operator.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
-- Вузли повинні включати стабільну ідентичність пристрою (`device.id`), похідну від
- відбитка fingerprint keypair.
-- Gateway видає токени для кожного пристрою + ролі.
-- Для нових `device.id` потрібні схвалення pairing, якщо не ввімкнено локальне автосхвалення.
-- Автосхвалення pairing зосереджене на прямих локальних loopback-підключеннях.
-- OpenClaw також має вузький шлях самопідключення backend/container-local для
+- 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 і
- потребують схвалення.
-- Усі WS-клієнти повинні включати ідентичність `device` під час `connect` (operator + node).
- Control UI може пропускати її лише в таких режимах:
- - `gateway.controlUi.allowInsecureAuth=true` для сумісності з небезпечним HTTP лише для localhost.
- - успішна auth Control UI оператора з `gateway.auth.mode: "trusted-proxy"`.
+- Підключення 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`.
+- Усі підключення мають підписувати наданий сервером nonce `connect.challenge`.
### Діагностика міграції автентифікації пристрою
-Для застарілих клієнтів, які все ще використовують поведінку підпису до challenge, `connect` тепер повертає
+Для застарілих клієнтів, які все ще використовують поведінку підписування до challenge, `connect` тепер повертає
коди деталей `DEVICE_AUTH_*` у `error.details.code` зі стабільним `error.details.reason`.
Поширені збої міграції:
-| Message | details.code | details.reason | Meaning |
-| --------------------------- | -------------------------------- | ------------------------ | -------------------------------------------------- |
-| `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` не відповідає відбитку public key. |
-| `device public key invalid` | `DEVICE_AUTH_PUBLIC_KEY_INVALID` | `device-public-key` | Не вдалося виконати формат/канонізацію public key. |
+| Повідомлення | 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`.
-- Підписуйте навантаження v2, яке містить server nonce.
+- Підписуйте payload v2, який містить nonce сервера.
- Надсилайте той самий nonce у `connect.params.device.nonce`.
-- Бажане навантаження підпису — `v3`, яке прив’язує `platform` і `deviceFamily`
+- Бажаний payload підпису — `v3`, який прив’язує `platform` і `deviceFamily`
на додачу до полів device/client/role/scopes/token/nonce.
-- Застарілі підписи `v2` залишаються прийнятними для сумісності, але прив’язка метаданих
- paired-device усе одно керує політикою команд під час повторного підключення.
+- Застарілі підписи `v2` і далі приймаються для сумісності, але pinning
+ метаданих paired-device усе одно керує політикою команд під час повторного підключення.
## TLS + pinning
- Для WS-підключень підтримується TLS.
-- Клієнти можуть за бажанням закріпити відбиток сертифіката gateway (див. config `gateway.tls`
+- Клієнти за бажанням можуть закріплювати відбиток сертифіката gateway (див. конфігурацію `gateway.tls`
плюс `gateway.remote.tlsFingerprint` або CLI `--tls-fingerprint`).
-## Область застосування
+## Scope
-Цей протокол надає **повний API gateway** (status, channels, models, chat,
+Цей протокол відкриває **повний API gateway** (status, channels, models, chat,
agent, sessions, nodes, approvals тощо). Точна поверхня визначається
схемами TypeBox у `src/gateway/protocol/schema.ts`.