diff --git a/docs/uk/channels/bluebubbles.md b/docs/uk/channels/bluebubbles.md
index cc47b06e8..436f4172e 100644
--- a/docs/uk/channels/bluebubbles.md
+++ b/docs/uk/channels/bluebubbles.md
@@ -1,46 +1,46 @@
---
read_when:
- Налаштування каналу BlueBubbles
- - Усунення несправностей сполучення Webhook
+ - Усунення несправностей під час сполучення Webhook
- Налаштування iMessage на macOS
sidebarTitle: BlueBubbles
-summary: iMessage через macOS-сервер BlueBubbles (надсилання/отримання через REST, набір тексту, реакції, сполучення, розширені дії).
+summary: iMessage через сервер BlueBubbles для macOS (надсилання/отримання через REST, введення тексту, реакції, сполучення, розширені дії).
title: BlueBubbles
x-i18n:
- generated_at: "2026-05-01T05:05:03Z"
+ generated_at: "2026-05-03T22:33:25Z"
model: gpt-5.5
provider: openai
- source_hash: 499cc2a46db6e0eddfb897e96ec4b3e4a39ba9f2f6da8e7485c1c46562de4145
+ source_hash: 78a054da0c7c32b161997acd05914896259dd1a050e736a4c9e438a452ab6a51
source_path: channels/bluebubbles.md
workflow: 16
---
-Статус: bundled plugin, який взаємодіє з macOS-сервером BlueBubbles через HTTP. **Рекомендовано для інтеграції з iMessage** завдяки багатшому API та простішому налаштуванню порівняно із застарілим каналом imsg.
+Status: bundled plugin, який взаємодіє із сервером BlueBubbles macOS через HTTP. **Рекомендовано для інтеграції з iMessage** завдяки багатшому API та простішому налаштуванню порівняно із застарілим каналом imsg.
-Поточні випуски OpenClaw постачають BlueBubbles у комплекті, тому звичайні пакетовані збірки не потребують окремого кроку `openclaw plugins install`.
+Поточні випуски OpenClaw постачають BlueBubbles у складі пакета, тому звичайні пакетовані збірки не потребують окремого кроку `openclaw plugins install`.
## Огляд
- Працює на macOS через допоміжний застосунок BlueBubbles ([bluebubbles.app](https://bluebubbles.app)).
-- Рекомендовано/перевірено: macOS Sequoia (15). macOS Tahoe (26) працює; редагування наразі зламане на Tahoe, а оновлення іконок груп можуть повідомляти про успіх, але не синхронізуватися.
-- OpenClaw взаємодіє з ним через REST API (`GET /api/v1/ping`, `POST /message/text`, `POST /chat/:id/*`).
-- Вхідні повідомлення надходять через webhooks; вихідні відповіді, індикатори набору, сповіщення про прочитання та tapbacks виконуються REST-викликами.
-- Вкладення та стікери приймаються як вхідні медіа (і, коли можливо, передаються agent).
-- Автоматичні TTS-відповіді, що синтезують MP3 або CAF-аудіо, доставляються як бульбашки голосових нотаток iMessage замість звичайних файлових вкладень.
-- Сполучення/allowlist працює так само, як і в інших каналах (`/channels/pairing` тощо), з `channels.bluebubbles.allowFrom` + кодами сполучення.
-- Реакції передаються як системні події, так само як у Slack/Telegram, щоб agents могли "згадати" їх перед відповіддю.
-- Розширені можливості: редагування, скасування надсилання, гілки відповідей, ефекти повідомлень, керування групами.
+- Рекомендовано/протестовано: macOS Sequoia (15). macOS Tahoe (26) працює; редагування наразі зламане на Tahoe, а оновлення значків груп можуть повідомляти про успіх, але не синхронізуватися.
+- OpenClaw взаємодіє з ним через його REST API (`GET /api/v1/ping`, `POST /message/text`, `POST /chat/:id/*`).
+- Вхідні повідомлення надходять через webhooks; вихідні відповіді, індикатори набору, сповіщення про прочитання та tapbacks виконуються як REST-виклики.
+- Вкладення та стікери приймаються як вхідні медіа (і за можливості передаються агенту).
+- Автоматичні TTS-відповіді, що синтезують MP3 або CAF-аудіо, доставляються як голосові нотатки iMessage, а не як звичайні файлові вкладення.
+- Звʼязування/allowlist працює так само, як і для інших каналів (`/channels/pairing` тощо), з `channels.bluebubbles.allowFrom` + кодами звʼязування.
+- Реакції подаються як системні події так само, як у Slack/Telegram, щоб агенти могли "згадувати" їх перед відповіддю.
+- Розширені функції: редагування, скасування надсилання, гілки відповідей, ефекти повідомлень, керування групами.
## Швидкий старт
- Установіть сервер BlueBubbles на ваш Mac (дотримуйтесь інструкцій на [bluebubbles.app/install](https://bluebubbles.app/install)).
+ Установіть сервер BlueBubbles на ваш Mac (дотримуйтеся інструкцій на [bluebubbles.app/install](https://bluebubbles.app/install)).
- У конфігурації BlueBubbles увімкніть web API та встановіть пароль.
+ У конфігурації BlueBubbles увімкніть web API і встановіть пароль.
Запустіть `openclaw onboard` і виберіть BlueBubbles або налаштуйте вручну:
@@ -63,7 +63,7 @@ x-i18n:
Спрямуйте webhooks BlueBubbles на ваш gateway (приклад: `https://your-gateway-host:3000/bluebubbles-webhook?password=`).
- Запустіть gateway; він зареєструє обробник webhook і почне сполучення.
+ Запустіть gateway; він зареєструє обробник webhook і почне звʼязування.
@@ -71,14 +71,14 @@ x-i18n:
**Безпека**
- Завжди встановлюйте пароль webhook.
-- Автентифікація webhook завжди обов’язкова. OpenClaw відхиляє webhook-запити BlueBubbles, якщо вони не містять пароль/guid, що відповідає `channels.bluebubbles.password` (наприклад, `?password=` або `x-password`), незалежно від топології loopback/proxy.
-- Автентифікація паролем перевіряється перед читанням/розбором повних тіл webhook.
+- Автентифікація webhook завжди обовʼязкова. OpenClaw відхиляє webhook-запити BlueBubbles, якщо вони не містять password/guid, що збігається з `channels.bluebubbles.password` (наприклад, `?password=` або `x-password`), незалежно від топології loopback/proxy.
+- Автентифікація паролем перевіряється до читання/розбору повних тіл webhook.
## Підтримання Messages.app активним (VM / headless-налаштування)
-У деяких VM macOS / постійно ввімкнених налаштуваннях Messages.app може переходити в стан "idle" (вхідні події зупиняються, доки застосунок не відкриють або не виведуть на передній план). Простий обхідний шлях — **підштовхувати Messages кожні 5 хвилин** за допомогою AppleScript + LaunchAgent.
+Деякі macOS VM / постійно ввімкнені налаштування можуть призводити до того, що Messages.app переходить у стан "idle" (вхідні події зупиняються, доки застосунок не буде відкрито/виведено на передній план). Простий обхідний шлях — **торкатися Messages кожні 5 хвилин** за допомогою AppleScript + LaunchAgent.
@@ -132,7 +132,7 @@ x-i18n:
```
- Це запускається **кожні 300 секунд** і **під час входу в систему**. Перший запуск може спричинити запити macOS **Automation** (`osascript` → Messages). Схваліть їх у тому самому сеансі користувача, у якому працює LaunchAgent.
+ Це запускається **кожні 300 секунд** і **під час входу в систему**. Перший запуск може спричинити запити macOS **Automation** (`osascript` → Messages). Підтвердьте їх у тій самій користувацькій сесії, у якій працює LaunchAgent.
@@ -143,9 +143,9 @@ x-i18n:
-## Онбординг
+## Onboarding
-BlueBubbles доступний в інтерактивному онбордингу:
+BlueBubbles доступний в інтерактивному onboarding:
```
openclaw onboard
@@ -157,16 +157,16 @@ openclaw onboard
Адреса сервера BlueBubbles (наприклад, `http://192.168.1.100:1234`).
- Пароль API з налаштувань BlueBubbles Server.
+ API-пароль із налаштувань BlueBubbles Server.
- Шлях кінцевої точки webhook.
+ Шлях endpoint webhook.
`pairing`, `allowlist`, `open` або `disabled`.
- Номери телефонів, електронні адреси або цілі чату.
+ Телефонні номери, електронні адреси або цілі чатів.
Ви також можете додати BlueBubbles через CLI:
@@ -175,33 +175,33 @@ openclaw onboard
openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --password
```
-## Контроль доступу (DM + групи)
+## Контроль доступу (DMs + групи)
- За замовчуванням: `channels.bluebubbles.dmPolicy = "pairing"`.
- - Невідомі відправники отримують код сполучення; повідомлення ігноруються, доки їх не буде схвалено (коди спливають через 1 годину).
+ - Невідомі відправники отримують код звʼязування; повідомлення ігноруються, доки їх не схвалять (коди спливають через 1 годину).
- Схвалити через:
- `openclaw pairing list bluebubbles`
- `openclaw pairing approve bluebubbles `
- - Сполучення є типовим обміном токенами. Докладніше: [Сполучення](/uk/channels/pairing)
+ - Звʼязування є типовим обміном токенами. Докладніше: [Звʼязування](/uk/channels/pairing)
- `channels.bluebubbles.groupPolicy = open | allowlist | disabled` (за замовчуванням: `allowlist`).
- - `channels.bluebubbles.groupAllowFrom` контролює, хто може запускати agent у групах, коли встановлено `allowlist`.
+ - `channels.bluebubbles.groupAllowFrom` керує тим, хто може запускати дії в групах, коли встановлено `allowlist`.
-### Збагачення імен контактів (macOS, необов’язково)
+### Збагачення імен контактів (macOS, необовʼязково)
-Групові webhooks BlueBubbles часто містять лише сирі адреси учасників. Якщо ви хочете, щоб контекст `GroupMembers` натомість показував локальні імена контактів, ви можете ввімкнути збагачення локальними Contacts на macOS:
+Групові webhooks BlueBubbles часто містять лише сирі адреси учасників. Якщо ви хочете, щоб контекст `GroupMembers` натомість показував локальні імена контактів, ви можете ввімкнути локальне збагачення Contacts на macOS:
- `channels.bluebubbles.enrichGroupParticipantsFromContacts = true` вмикає пошук. За замовчуванням: `false`.
-- Пошуки запускаються лише після того, як доступ до групи, авторизація команди та mention gating пропустили повідомлення.
+- Пошуки виконуються лише після того, як доступ до групи, авторизація команд і фільтрація згадок пропустили повідомлення.
- Збагачуються лише учасники з телефонними номерами без імен.
-- Сирі номери телефонів залишаються fallback-значенням, коли локальний збіг не знайдено.
+- Сирі телефонні номери залишаються fallback, коли локальний збіг не знайдено.
```json5
{
@@ -213,13 +213,13 @@ openclaw channels add bluebubbles --http-url http://192.168.1.100:1234 --passwor
}
```
-### Mention gating (групи)
+### Фільтрація згадок (групи)
-BlueBubbles підтримує mention gating для групових чатів, що відповідає поведінці iMessage/WhatsApp:
+BlueBubbles підтримує фільтрацію згадок для групових чатів, відповідно до поведінки iMessage/WhatsApp:
- Використовує `agents.list[].groupChat.mentionPatterns` (або `messages.groupChat.mentionPatterns`) для виявлення згадок.
-- Коли `requireMention` увімкнено для групи, agent відповідає лише тоді, коли його згадали.
-- Команди керування від авторизованих відправників обходять mention gating.
+- Коли для групи ввімкнено `requireMention`, агент відповідає лише тоді, коли його згадали.
+- Контрольні команди від авторизованих відправників обходять фільтрацію згадок.
Конфігурація для окремої групи:
@@ -238,15 +238,15 @@ BlueBubbles підтримує mention gating для групових чатів
}
```
-### Command gating
+### Фільтрація команд
-- Команди керування (наприклад, `/config`, `/model`) потребують авторизації.
-- Використовує `allowFrom` і `groupAllowFrom` для визначення авторизації команд.
-- Авторизовані відправники можуть запускати команди керування навіть без згадування в групах.
+- Контрольні команди (наприклад, `/config`, `/model`) потребують авторизації.
+- Використовує `allowFrom` і `groupAllowFrom`, щоб визначити авторизацію команд.
+- Авторизовані відправники можуть запускати контрольні команди навіть без згадки в групах.
### Системний prompt для окремої групи
-Кожен запис у `channels.bluebubbles.groups.*` приймає необов’язковий рядок `systemPrompt`. Значення додається до системного prompt agent на кожному ході, який обробляє повідомлення в цій групі, тож ви можете задати persona або поведінкові правила для окремої групи без редагування prompt agent:
+Кожен запис у `channels.bluebubbles.groups.*` приймає необовʼязковий рядок `systemPrompt`. Значення вставляється в системний prompt агента на кожному ході, який обробляє повідомлення в цій групі, щоб ви могли встановлювати persona або правила поведінки для окремої групи без редагування prompt агента:
```json5
{
@@ -262,11 +262,11 @@ BlueBubbles підтримує mention gating для групових чатів
}
```
-Ключ відповідає тому, що BlueBubbles повідомляє як `chatGuid` / `chatIdentifier` / числовий `chatId` для групи, а wildcard-запис `"*"` задає значення за замовчуванням для кожної групи без точного збігу (той самий шаблон, що використовується `requireMention` і політиками інструментів для окремих груп). Точні збіги завжди мають пріоритет над wildcard. DM ігнорують це поле; натомість використовуйте налаштування prompt на рівні agent або облікового запису.
+Ключ відповідає тому, що BlueBubbles повідомляє як `chatGuid` / `chatIdentifier` / числовий `chatId` для групи, а wildcard-запис `"*"` задає стандартне значення для кожної групи без точного збігу (той самий патерн, що використовується `requireMention` і політиками інструментів для окремих груп). Точні збіги завжди мають перевагу над wildcard. DMs ігнорують це поле; натомість використовуйте налаштування prompt на рівні агента або облікового запису.
#### Робочий приклад: гілковані відповіді та tapback-реакції (Private API)
-Коли увімкнено BlueBubbles Private API, вхідні повідомлення надходять із короткими ідентифікаторами повідомлень (наприклад, `[[reply_to:5]]`), а agent може викликати `action=reply`, щоб відповісти в гілці конкретного повідомлення, або `action=react`, щоб залишити tapback. `systemPrompt` для окремої групи — надійний спосіб змусити agent вибирати правильний інструмент:
+Коли BlueBubbles Private API увімкнено, вхідні повідомлення надходять із короткими ідентифікаторами повідомлень (наприклад, `[[reply_to:5]]`), а агент може викликати `action=reply`, щоб відповісти в гілці конкретного повідомлення, або `action=react`, щоб додати tapback. `systemPrompt` для окремої групи — надійний спосіб змусити агента вибирати правильний інструмент:
```json5
{
@@ -274,15 +274,7 @@ BlueBubbles підтримує mention gating для групових чатів
bluebubbles: {
groups: {
"iMessage;+;chat-family": {
- systemPrompt: [
- "When replying in this group, always call action=reply with the",
- "[[reply_to:N]] messageId from context so your response threads",
- "under the triggering message. Never send a new unlinked message.",
- "",
- "For short acknowledgements ('ok', 'got it', 'on it'), use",
- "action=react with an appropriate tapback emoji (❤️, 👍, 😂, ‼️, ❓)",
- "instead of sending a text reply.",
- ].join(" "),
+ systemPrompt: "When replying in this group, always call action=reply with the [[reply_to:N]] messageId from context so your response threads under the triggering message. Never send a new unlinked message. For short acknowledgements ('ok', 'got it', 'on it'), use action=react with an appropriate tapback emoji (❤️, 👍, 😂, ‼️, ❓) instead of sending a text reply.",
},
},
},
@@ -290,20 +282,20 @@ BlueBubbles підтримує mention gating для групових чатів
}
```
-Tapback-реакції та гілковані відповіді обидві потребують BlueBubbles Private API; див. [Розширені дії](#advanced-actions) і [Ідентифікатори повідомлень](#message-ids-short-vs-full), щоб дізнатися про базову механіку.
+Tapback-реакції та гілковані відповіді обидві потребують BlueBubbles Private API; див. [Розширені дії](#advanced-actions) і [Ідентифікатори повідомлень](#message-ids-short-vs-full) щодо базових механік.
-## Прив’язки розмов ACP
+## Привʼязки розмов ACP
-Чати BlueBubbles можна перетворити на довговічні робочі простори ACP без зміни транспортного шару.
+Чати BlueBubbles можна перетворити на сталі робочі простори ACP без зміни транспортного шару.
Швидкий потік оператора:
- Запустіть `/acp spawn codex --bind here` усередині DM або дозволеного групового чату.
-- Майбутні повідомлення в тій самій розмові BlueBubbles маршрутизуються до створеного сеансу ACP.
-- `/new` і `/reset` скидають той самий прив’язаний сеанс ACP на місці.
-- `/acp close` закриває сеанс ACP і видаляє прив’язку.
+- Майбутні повідомлення в тій самій розмові BlueBubbles спрямовуються до створеної сесії ACP.
+- `/new` і `/reset` скидають ту саму привʼязану сесію ACP на місці.
+- `/acp close` закриває сесію ACP і видаляє привʼязку.
-Налаштовані постійні прив’язки також підтримуються через записи верхнього рівня `bindings[]` з `type: "acp"` і `match.channel: "bluebubbles"`.
+Налаштовані сталі привʼязки також підтримуються через записи верхнього рівня `bindings[]` з `type: "acp"` і `match.channel: "bluebubbles"`.
`match.peer.id` може використовувати будь-яку підтримувану форму цілі BlueBubbles:
@@ -312,7 +304,7 @@ Tapback-реакції та гілковані відповіді обидві
- `chat_guid:`
- `chat_identifier:`
-Для стабільних групових прив’язок віддавайте перевагу `chat_id:*` або `chat_identifier:*`.
+Для стабільних групових привʼязок віддавайте перевагу `chat_id:*` або `chat_identifier:*`.
Приклад:
@@ -344,13 +336,13 @@ Tapback-реакції та гілковані відповіді обидві
}
```
-Див. [ACP Agents](/uk/tools/acp-agents) щодо спільної поведінки прив’язок ACP.
+Див. [Агенти ACP](/uk/tools/acp-agents) щодо спільної поведінки привʼязок ACP.
## Набір тексту + сповіщення про прочитання
- **Індикатори набору**: надсилаються автоматично перед і під час генерації відповіді.
-- **Підтвердження прочитання**: керуються `channels.bluebubbles.sendReadReceipts` (типово: `true`).
-- **Індикатори набору**: OpenClaw надсилає події початку набору; BlueBubbles автоматично очищає стан набору під час надсилання або після тайм-ауту (ручна зупинка через DELETE ненадійна).
+- **Сповіщення про прочитання**: керуються `channels.bluebubbles.sendReadReceipts` (за замовчуванням: `true`).
+- **Індикатори набору**: OpenClaw надсилає події початку набору; BlueBubbles автоматично очищає набір під час надсилання або після тайм-ауту (ручна зупинка через DELETE ненадійна).
```json5
{
@@ -390,7 +382,7 @@ BlueBubbles підтримує розширені дії з повідомлен
- - **react**: додати/видалити tapback-реакції (`messageId`, `emoji`, `remove`). Нативний набір tapback в iMessage: `love`, `like`, `dislike`, `laugh`, `emphasize` і `question`. Коли агент вибирає emoji поза цим набором (наприклад `👀`), інструмент реакцій повертається до `love`, щоб tapback усе одно відобразився, а не зірвав увесь запит. Налаштовані ack-реакції й далі проходять сувору валідацію та дають помилку для невідомих значень.
+ - **react**: додати або прибрати реакції tapback (`messageId`, `emoji`, `remove`). Власний набір tapback в iMessage: `love`, `like`, `dislike`, `laugh`, `emphasize` і `question`. Коли агент вибирає емодзі поза цим набором (наприклад, `👀`), інструмент реакцій повертається до `love`, щоб tapback усе одно відобразився, а не зірвав увесь запит. Налаштовані ack-реакції й надалі перевіряються суворо та дають помилку для невідомих значень.
- **edit**: редагувати надіслане повідомлення (`messageId`, `text`).
- **unsend**: скасувати надсилання повідомлення (`messageId`).
- **reply**: відповісти на конкретне повідомлення (`messageId`, `text`, `to`).
@@ -401,53 +393,53 @@ BlueBubbles підтримує розширені дії з повідомлен
- **removeParticipant**: видалити когось із групи (`chatGuid`, `address`).
- **leaveGroup**: вийти з групового чату (`chatGuid`).
- **upload-file**: надіслати медіа/файли (`to`, `buffer`, `filename`, `asVoice`).
- - Голосові нотатки: установіть `asVoice: true` з аудіо **MP3** або **CAF**, щоб надіслати як голосове повідомлення iMessage. BlueBubbles перетворює MP3 → CAF під час надсилання голосових нотаток.
- - Застарілий псевдонім: `sendAttachment` і далі працює, але `upload-file` є канонічною назвою дії.
+ - Голосові нотатки: установіть `asVoice: true` з аудіо **MP3** або **CAF**, щоб надіслати голосове повідомлення iMessage. BlueBubbles перетворює MP3 → CAF під час надсилання голосових нотаток.
+ - Застарілий псевдонім: `sendAttachment` досі працює, але `upload-file` є канонічною назвою дії.
-### ID повідомлень (короткі й повні)
+### ID повідомлень (короткі та повні)
OpenClaw може показувати _короткі_ ID повідомлень (наприклад, `1`, `2`), щоб заощаджувати токени.
- `MessageSid` / `ReplyToId` можуть бути короткими ID.
- `MessageSidFull` / `ReplyToIdFull` містять повні ID провайдера.
-- Короткі ID зберігаються в пам’яті; вони можуть застаріти після перезапуску або витіснення з кешу.
-- Дії приймають короткий або повний `messageId`, але короткі ID спричинять помилку, якщо вони більше недоступні.
+- Короткі ID зберігаються в пам’яті; вони можуть ставати недійсними після перезапуску або витіснення з кешу.
+- Дії приймають короткий або повний `messageId`, але короткі ID дадуть помилку, якщо більше недоступні.
Використовуйте повні ID для довготривалих автоматизацій і зберігання:
- Шаблони: `{{MessageSidFull}}`, `{{ReplyToIdFull}}`
- Контекст: `MessageSidFull` / `ReplyToIdFull` у вхідних payload
-Див. [Конфігурація](/uk/gateway/configuration) щодо змінних шаблонів.
+Див. [Конфігурацію](/uk/gateway/configuration) для змінних шаблонів.
-## Об’єднання split-send DM (команда + URL в одному складанні)
+## Об’єднання розділених DM-надсилань (команда + URL в одному повідомленні)
-Коли користувач вводить команду й URL разом в iMessage — наприклад `Dump https://example.com/article` — Apple розділяє надсилання на **дві окремі доставки Webhook**:
+Коли користувач вводить команду й URL разом в iMessage — наприклад, `Dump https://example.com/article` — Apple розділяє надсилання на **дві окремі доставки webhook**:
1. Текстове повідомлення (`"Dump"`).
-2. Бульбашка URL-прев’ю (`"https://..."`) із зображеннями OG-прев’ю як вкладеннями.
+2. Бульбашка попереднього перегляду URL (`"https://..."`) з OG-preview зображеннями як вкладеннями.
-У більшості налаштувань два Webhook надходять в OpenClaw з інтервалом приблизно 0,8-2,0 с. Без об’єднання агент отримує лише команду на ході 1, відповідає (часто «надішліть мені URL») і бачить URL лише на ході 2 — коли контекст команди вже втрачено.
+Два webhook надходять до OpenClaw з інтервалом приблизно 0.8-2.0 с у більшості конфігурацій. Без об’єднання агент отримує лише команду на кроці 1, відповідає (часто "надішліть мені URL") і бачить URL лише на кроці 2 — коли контекст команди вже втрачено.
-`channels.bluebubbles.coalesceSameSenderDms` вмикає для DM об’єднання послідовних Webhook від того самого відправника в один хід агента. Групові чати й далі прив’язуються до окремих повідомлень, щоб зберегти структуру ходів кількох користувачів.
+`channels.bluebubbles.coalesceSameSenderDms` вмикає для DM об’єднання послідовних webhook від того самого відправника в один крок агента. Групові чати й надалі прив’язуються до окремих повідомлень, щоб зберегти структуру кроків для кількох користувачів.
Увімкніть, коли:
- Ви постачаєте Skills, які очікують `command + payload` в одному повідомленні (dump, paste, save, queue тощо).
- - Ваші користувачі вставляють URL, зображення або довгий вміст разом із командами.
- - Ви можете прийняти додаткову затримку ходу DM (див. нижче).
+ - Ваші користувачі вставляють URL, зображення або довгий вміст поруч із командами.
+ - Ви можете прийняти додаткову затримку кроку DM (див. нижче).
Залиште вимкненим, коли:
- - Вам потрібна мінімальна затримка команд для однословних тригерів DM.
- - Усі ваші потоки є одноразовими командами без наступних payload.
+ - Вам потрібна мінімальна затримка команд для однословних DM-тригерів.
+ - Усі ваші потоки — це одноразові команди без подальших payload.
@@ -461,7 +453,7 @@ OpenClaw може показувати _короткі_ ID повідомлен
}
```
- Коли прапорець увімкнено й немає явного `messages.inbound.byChannel.bluebubbles`, debounce-вікно розширюється до **2500 мс** (типово для режиму без об’єднання — 500 мс). Ширше вікно потрібне, бо cadence split-send від Apple у 0,8-2,0 с не вкладається в тісніше типове значення.
+ Коли прапорець увімкнено і немає явного `messages.inbound.byChannel.bluebubbles`, вікно debounce розширюється до **2500 мс** (за замовчуванням для режиму без об’єднання — 500 мс). Ширше вікно потрібне — каденція розділеного надсилання Apple у 0.8-2.0 с не вкладається у вужче значення за замовчуванням.
Щоб налаштувати вікно самостійно:
@@ -481,39 +473,39 @@ OpenClaw може показувати _короткі_ ID повідомлен
- - **Додана затримка для керівних команд DM.** Коли прапорець увімкнено, повідомлення керівних команд DM (наприклад `Dump`, `Save` тощо) тепер чекають до завершення debounce-вікна перед dispatch, на випадок якщо надходить Webhook із payload. Команди групового чату зберігають миттєвий dispatch.
- - **Об’єднаний вивід обмежений** — об’єднаний текст обмежується 4000 символами з явним маркером `…[truncated]`; вкладення обмежуються 20; записи джерел обмежуються 10 (понад це зберігаються перший і найновіший). Кожен вихідний `messageId` усе одно доходить до inbound-dedupe, тож пізніший replay MessagePoller будь-якої окремої події розпізнається як дублікат.
- - **Opt-in, для окремого каналу.** Інші канали (Telegram, WhatsApp, Slack, …) не зачіпаються.
+ - **Додаткова затримка для керівних команд DM.** Коли прапорець увімкнено, повідомлення з керівними командами DM (наприклад, `Dump`, `Save` тощо) тепер чекають до завершення вікна debounce перед dispatch, на випадок якщо надходить webhook з payload. Команди в групових чатах зберігають миттєвий dispatch.
+ - **Об’єднаний вивід обмежений** — об’єднаний текст обмежено 4000 символами з явним маркером `…[truncated]`; вкладення обмежено 20; записи джерел обмежено 10 (понад це зберігаються перший і найновіший). Кожен вихідний `messageId` усе одно потрапляє до inbound-dedupe, тож пізніше повторне відтворення будь-якої окремої події MessagePoller розпізнається як дублікат.
+ - **Опційно, для окремого каналу.** Інші канали (Telegram, WhatsApp, Slack, …) не зачіпаються.
-### Сценарії й те, що бачить агент
+### Сценарії та що бачить агент
-| Користувач складає | Apple доставляє | Прапорець вимкнено (типово) | Прапорець увімкнено + вікно 2500 мс |
-| ------------------------------------------------------------------ | ------------------------------ | --------------------------------------- | ----------------------------------------------------------------------- |
-| `Dump https://example.com` (одне надсилання) | 2 Webhook з інтервалом ~1 с | Два ходи агента: лише "Dump", потім URL | Один хід: об’єднаний текст `Dump https://example.com` |
-| `Save this 📎image.jpg caption` (вкладення + текст) | 2 Webhook | Два ходи | Один хід: текст + зображення |
-| `/status` (окрема команда) | 1 Webhook | Миттєвий dispatch | **Чекати до вікна, потім dispatch** |
-| URL, вставлений окремо | 1 Webhook | Миттєвий dispatch | Миттєвий dispatch (лише один запис у bucket) |
-| Текст + URL, надіслані як два навмисно окремі повідомлення, з різницею в хвилини | 2 Webhook поза вікном | Два ходи | Два ходи (вікно завершується між ними) |
-| Швидкий потік (>10 малих DM у межах вікна) | N Webhook | N ходів | Один хід, обмежений вивід (перший + найновіший, застосовані обмеження тексту/вкладень) |
+| Користувач складає повідомлення | Apple доставляє | Прапорець вимкнено (за замовчуванням) | Прапорець увімкнено + вікно 2500 мс |
+| ------------------------------------------------------------------ | ------------------------- | ------------------------------------------ | ----------------------------------------------------------------------- |
+| `Dump https://example.com` (одне надсилання) | 2 webhook з інтервалом ~1 с | Два кроки агента: лише "Dump", потім URL | Один крок: об’єднаний текст `Dump https://example.com` |
+| `Save this 📎image.jpg caption` (вкладення + текст) | 2 webhook | Два кроки | Один крок: текст + зображення |
+| `/status` (самостійна команда) | 1 webhook | Миттєвий dispatch | **Очікування до завершення вікна, потім dispatch** |
+| URL вставлено окремо | 1 webhook | Миттєвий dispatch | Миттєвий dispatch (лише один запис у bucket) |
+| Текст + URL надіслано як два навмисно окремі повідомлення з інтервалом у хвилини | 2 webhook поза вікном | Два кроки | Два кроки (вікно спливає між ними) |
+| Швидкий потік (>10 малих DM у межах вікна) | N webhook | N кроків | Один крок, обмежений вивід (перший + найновіший, застосовано обмеження тексту/вкладень) |
-### Усунення несправностей об’єднання split-send
+### Усунення несправностей об’єднання розділених надсилань
-Якщо прапорець увімкнено, але split-send і далі надходять як два ходи, перевірте кожен рівень:
+Якщо прапорець увімкнено, але розділені надсилання все одно надходять як два кроки, перевірте кожен рівень:
-
+
```
grep coalesceSameSenderDms ~/.openclaw/openclaw.json
```
- Потім `openclaw gateway restart` — прапорець зчитується під час створення debouncer-registry.
+ Потім `openclaw gateway restart` — прапорець читається під час створення debouncer-registry.
-
- Перегляньте журнал сервера BlueBubbles у `~/Library/Logs/bluebubbles-server/main.log`:
+
+ Подивіться журнал сервера BlueBubbles у `~/Library/Logs/bluebubbles-server/main.log`:
```
grep -E "Dispatching event to webhook" main.log | tail -20
@@ -522,20 +514,20 @@ OpenClaw може показувати _короткі_ ID повідомлен
Виміряйте проміжок між dispatch тексту в стилі `"Dump"` і наступним dispatch `"https://..."; Attachments:`. Збільште `messages.inbound.byChannel.bluebubbles`, щоб із запасом покрити цей проміжок.
-
- Позначки часу подій сеансу (`~/.openclaw/agents//sessions/*.jsonl`) відображають момент, коли Gateway передає повідомлення агенту, **а не** момент надходження Webhook. Друге повідомлення в черзі, позначене `[Queued messages while agent was busy]`, означає, що перший хід усе ще виконувався, коли надійшов другий Webhook — bucket об’єднання вже було скинуто. Налаштовуйте вікно за журналом сервера BB, а не за журналом сеансу.
+
+ Мітки часу подій сесії (`~/.openclaw/agents//sessions/*.jsonl`) відображають, коли Gateway передає повідомлення агенту, **а не** коли надійшов webhook. Друге повідомлення в черзі з позначкою `[Queued messages while agent was busy]` означає, що перший крок ще виконувався, коли надійшов другий webhook — bucket об’єднання вже було скинуто. Налаштовуйте вікно за журналом сервера BB, а не за журналом сесії.
-
- На менших машинах (8 ГБ) ходи агента можуть тривати достатньо довго, щоб bucket об’єднання скинувся до завершення відповіді, і URL потрапив як другий хід у черзі. Перевірте `memory_pressure` і `ps -o rss -p $(pgrep openclaw-gateway)`; якщо Gateway використовує понад ~500 МБ RSS і compressor активний, закрийте інші важкі процеси або перейдіть на більший хост.
+
+ На менших машинах (8 ГБ) кроки агента можуть тривати достатньо довго, щоб bucket об’єднання скинувся до завершення відповіді, і URL потрапив як другий крок у черзі. Перевірте `memory_pressure` і `ps -o rss -p $(pgrep openclaw-gateway)`; якщо Gateway перевищує ~500 МБ RSS і compressor активний, закрийте інші важкі процеси або перейдіть на більший хост.
-
- Якщо користувач натиснув `Dump` як **відповідь** на наявну URL-бульбашку (iMessage показує бейдж "1 Reply" на бульбашці Dump), URL міститься в `replyToBody`, а не в другому Webhook. Об’єднання не застосовується — це питання skill/prompt, а не debouncer.
+
+ Якщо користувач натиснув `Dump` як **відповідь** на наявну URL-бульбашку (iMessage показує бейдж "1 Reply" на бульбашці Dump), URL міститься в `replyToBody`, а не в другому webhook. Об’єднання не застосовується — це питання skill/prompt, а не debouncer.
-## Блокове потокове передавання
+## Потокове надсилання блоками
-Керує тим, чи відповіді надсилаються як одне повідомлення, чи потоково блоками:
+Керуйте тим, чи відповіді надсилаються одним повідомленням, чи потоком блоків:
```json5
{
@@ -549,46 +541,46 @@ OpenClaw може показувати _короткі_ ID повідомлен
## Медіа + обмеження
-- Вхідні вкладення завантажуються та зберігаються в кеші медіа.
-- Обмеження медіа через `channels.bluebubbles.mediaMaxMb` для вхідних і вихідних медіа (типово: 8 МБ).
-- Вихідний текст розбивається на частини за `channels.bluebubbles.textChunkLimit` (типово: 4000 символів).
+- Вхідні вкладення завантажуються й зберігаються в кеші медіа.
+- Обмеження медіа через `channels.bluebubbles.mediaMaxMb` для вхідних і вихідних медіа (за замовчуванням: 8 МБ).
+- Вихідний текст розбивається на фрагменти відповідно до `channels.bluebubbles.textChunkLimit` (за замовчуванням: 4000 символів).
## Довідник конфігурації
Повна конфігурація: [Конфігурація](/uk/gateway/configuration)
-
+
- `channels.bluebubbles.enabled`: увімкнути/вимкнути канал.
- `channels.bluebubbles.serverUrl`: базовий URL REST API BlueBubbles.
- `channels.bluebubbles.password`: пароль API.
- - `channels.bluebubbles.webhookPath`: шлях endpoint Webhook (типово: `/bluebubbles-webhook`).
+ - `channels.bluebubbles.webhookPath`: шлях endpoint webhook (за замовчуванням: `/bluebubbles-webhook`).
- - `channels.bluebubbles.dmPolicy`: `pairing | allowlist | open | disabled` (типово: `pairing`).
- - `channels.bluebubbles.allowFrom`: allowlist DM (handles, email, номери E.164, `chat_id:*`, `chat_guid:*`).
- - `channels.bluebubbles.groupPolicy`: `open | allowlist | disabled` (типово: `allowlist`).
- - `channels.bluebubbles.groupAllowFrom`: allowlist відправників групи.
- - `channels.bluebubbles.enrichGroupParticipantsFromContacts`: на macOS, за бажанням доповнювати безіменних учасників групи з локальних Contacts після проходження gating. Типово: `false`.
+ - `channels.bluebubbles.dmPolicy`: `pairing | allowlist | open | disabled` (за замовчуванням: `pairing`).
+ - `channels.bluebubbles.allowFrom`: allowlist для DM (handles, emails, E.164 numbers, `chat_id:*`, `chat_guid:*`).
+ - `channels.bluebubbles.groupPolicy`: `open | allowlist | disabled` (за замовчуванням: `allowlist`).
+ - `channels.bluebubbles.groupAllowFrom`: allowlist відправників груп.
+ - `channels.bluebubbles.enrichGroupParticipantsFromContacts`: на macOS, за бажанням, збагачувати неназваних учасників групи з локальних Contacts після проходження gating. За замовчуванням: `false`.
- `channels.bluebubbles.groups`: конфігурація для окремих груп (`requireMention` тощо).
-
- - `channels.bluebubbles.sendReadReceipts`: Надсилати підтвердження прочитання (типово: `true`).
- - `channels.bluebubbles.blockStreaming`: Увімкнути блокове потокове передавання (типово: `false`; потрібно для потокових відповідей).
+
+ - `channels.bluebubbles.sendReadReceipts`: Надсилати сповіщення про прочитання (типово: `true`).
+ - `channels.bluebubbles.blockStreaming`: Увімкнути потокову передачу блоками (типово: `false`; потрібно для потокових відповідей).
- `channels.bluebubbles.textChunkLimit`: Розмір вихідного фрагмента в символах (типово: 4000).
- - `channels.bluebubbles.sendTimeoutMs`: Тайм-аут на запит у мс для надсилання вихідного тексту через `/api/v1/message/text` (типово: 30000). Збільште для налаштувань macOS 26, де надсилання iMessage через Private API може зависати на 60+ секунд усередині фреймворку iMessage; наприклад `45000` або `60000`. Зондування, пошук чатів, реакції, редагування та перевірки стану наразі зберігають коротше типове значення 10 с; розширення покриття на реакції та редагування заплановано як наступний крок. Перевизначення для окремого облікового запису: `channels.bluebubbles.accounts..sendTimeoutMs`.
- - `channels.bluebubbles.chunkMode`: `length` (типово) розбиває лише за перевищення `textChunkLimit`; `newline` розбиває за порожніми рядками (межами абзаців) перед розбиттям за довжиною.
+ - `channels.bluebubbles.sendTimeoutMs`: Тайм-аут на запит у мс для вихідного надсилання тексту через `/api/v1/message/text` (типово: 30000). Збільшіть для конфігурацій macOS 26, де надсилання iMessage через Private API може зависати на 60+ секунд усередині фреймворку iMessage; наприклад `45000` або `60000`. Зондування, пошук чатів, реакції, редагування та перевірки працездатності наразі зберігають коротше типове значення 10 с; розширення покриття на реакції та редагування заплановано як подальший крок. Перевизначення для облікового запису: `channels.bluebubbles.accounts..sendTimeoutMs`.
+ - `channels.bluebubbles.chunkMode`: `length` (типово) ділить лише за перевищення `textChunkLimit`; `newline` ділить за порожніми рядками (межами абзаців) перед поділом за довжиною.
- `channels.bluebubbles.mediaMaxMb`: Ліміт вхідних/вихідних медіа в МБ (типово: 8).
- - `channels.bluebubbles.mediaLocalRoots`: Явний список дозволених абсолютних локальних каталогів, дозволених для вихідних локальних шляхів медіа. Надсилання локальних шляхів типово заборонено, якщо це не налаштовано. Перевизначення для окремого облікового запису: `channels.bluebubbles.accounts..mediaLocalRoots`.
- - `channels.bluebubbles.coalesceSameSenderDms`: Об’єднувати послідовні DM-вебхуки від того самого відправника в один хід агента, щоб Apple-розділення текст+URL надходило як одне повідомлення (типово: `false`). Див. [Об’єднання розділених DM](#coalescing-split-send-dms-command--url-in-one-composition) для сценаріїв, налаштування вікна та компромісів. Розширює типове вікно debounce для вхідних повідомлень із 500 мс до 2500 мс, якщо ввімкнено без явного `messages.inbound.byChannel.bluebubbles`.
- - `channels.bluebubbles.historyLimit`: Максимальна кількість групових повідомлень для контексту (0 вимикає).
+ - `channels.bluebubbles.mediaLocalRoots`: Явний список дозволених абсолютних локальних каталогів, дозволених для вихідних локальних шляхів до медіа. Надсилання локальних шляхів типово заборонене, якщо це не налаштовано. Перевизначення для облікового запису: `channels.bluebubbles.accounts..mediaLocalRoots`.
+ - `channels.bluebubbles.coalesceSameSenderDms`: Об’єднувати послідовні DM Webhook від того самого відправника в один хід агента, щоб розділене Apple надсилання текст+URL надходило як одне повідомлення (типово: `false`). Див. [Об’єднання розділених DM](#coalescing-split-send-dms-command--url-in-one-composition) для сценаріїв, налаштування вікна та компромісів. Якщо ввімкнено без явного `messages.inbound.byChannel.bluebubbles`, розширює типове вікно debounce для вхідних повідомлень із 500 мс до 2500 мс.
+ - `channels.bluebubbles.historyLimit`: Максимум групових повідомлень для контексту (0 вимикає).
- `channels.bluebubbles.dmHistoryLimit`: Ліміт історії DM.
- - `channels.bluebubbles.replyContextApiFallback`: Коли вхідна відповідь надходить без `replyToBody`/`replyToSender` і кеш контексту відповіді в пам’яті не спрацьовує, отримувати оригінальне повідомлення з BlueBubbles HTTP API як резервний варіант best-effort (типово: `false`). Корисно для розгортань із кількома екземплярами, що спільно використовують один обліковий запис BlueBubbles, після перезапусків процесу або після витіснення з довготривалого кешу TTL/LRU. Отримання захищене від SSRF тією самою політикою, що й кожен інший запит клієнта BlueBubbles, ніколи не кидає виняток і заповнює кеш, щоб подальші відповіді амортизували витрати. Перевизначення для окремого облікового запису: `channels.bluebubbles.accounts..replyContextApiFallback`. Налаштування рівня каналу поширюється на облікові записи, які пропускають цей прапорець.
+ - `channels.bluebubbles.replyContextApiFallback`: Коли вхідна відповідь надходить без `replyToBody`/`replyToSender`, а кеш контексту відповіді в пам’яті не спрацьовує, отримати початкове повідомлення з HTTP API BlueBubbles як резервний варіант best-effort (типово: `false`). Корисно для розгортань із кількома інстансами, що спільно використовують один обліковий запис BlueBubbles, після перезапусків процесу або після витіснення довгоживучого кешу TTL/LRU. Отримання захищене від SSRF тією самою політикою, що й кожен інший клієнтський запит BlueBubbles, ніколи не викидає помилку та заповнює кеш, щоб наступні відповіді амортизували витрати. Перевизначення для облікового запису: `channels.bluebubbles.accounts..replyContextApiFallback`. Налаштування на рівні каналу поширюється на облікові записи, де цей прапорець не задано.
@@ -605,7 +597,7 @@ OpenClaw може показувати _короткі_ ID повідомлен
## Адресація / цілі доставки
-Віддавайте перевагу `chat_guid` для стабільної маршрутизації:
+Надавайте перевагу `chat_guid` для стабільної маршрутизації:
- `chat_guid:iMessage;-;+15555550123` (бажано для груп)
- `chat_id:123`
@@ -613,34 +605,34 @@ OpenClaw може показувати _короткі_ ID повідомлен
- Прямі дескриптори: `+15555550123`, `user@example.com`
- Якщо прямий дескриптор не має наявного DM-чату, OpenClaw створить його через `POST /api/v1/chat/new`. Для цього потрібно ввімкнути BlueBubbles Private API.
-### Маршрутизація iMessage проти SMS
+### Маршрутизація iMessage і SMS
-Коли той самий дескриптор має і iMessage, і SMS-чат на Mac (наприклад номер телефону, зареєстрований в iMessage, але який також отримував зелені fallback-повідомлення), OpenClaw віддає перевагу чату iMessage і ніколи безшумно не понижує до SMS. Щоб примусово використати SMS-чат, застосуйте явний цільовий префікс `sms:` (наприклад `sms:+15555550123`). Дескриптори без відповідного iMessage-чату все одно надсилаються через будь-який чат, який повідомляє BlueBubbles.
+Коли той самий дескриптор має на Mac і iMessage, і SMS-чат (наприклад, номер телефону, зареєстрований в iMessage, але який також отримував резервні green-bubble повідомлення), OpenClaw надає перевагу чату iMessage і ніколи непомітно не понижує маршрут до SMS. Щоб примусово використати SMS-чат, застосуйте явний префікс цілі `sms:` (наприклад `sms:+15555550123`). Дескриптори без відповідного iMessage-чату все одно надсилаються через будь-який чат, який повідомляє BlueBubbles.
## Безпека
-- Webhook-запити автентифікуються шляхом порівняння query-параметрів або заголовків `guid`/`password` із `channels.bluebubbles.password`.
-- Зберігайте пароль API та кінцеву точку Webhook у таємниці (ставтеся до них як до облікових даних).
-- Для автентифікації Webhook BlueBubbles немає обходу через localhost. Якщо ви проксіюєте Webhook-трафік, зберігайте пароль BlueBubbles у запиті наскрізно. `gateway.trustedProxies` тут не замінює `channels.bluebubbles.password`. Див. [Безпека Gateway](/uk/gateway/security#reverse-proxy-configuration).
-- Увімкніть HTTPS і правила firewall на сервері BlueBubbles, якщо відкриваєте його за межі своєї LAN.
+- Запити Webhook автентифікуються шляхом порівняння query params або заголовків `guid`/`password` із `channels.bluebubbles.password`.
+- Тримайте пароль API та кінцеву точку Webhook у секреті (ставтеся до них як до облікових даних).
+- Для автентифікації Webhook BlueBubbles немає обходу через localhost. Якщо ви проксіюєте Webhook-трафік, зберігайте пароль BlueBubbles у запиті від початку до кінця. `gateway.trustedProxies` тут не замінює `channels.bluebubbles.password`. Див. [Безпека Gateway](/uk/gateway/security#reverse-proxy-configuration).
+- Увімкніть HTTPS + правила firewall на сервері BlueBubbles, якщо відкриваєте його за межі своєї LAN.
-## Усунення несправностей
+## Усунення неполадок
-- Якщо події введення/прочитання перестали працювати, перевірте журнали Webhook BlueBubbles і переконайтеся, що шлях Gateway відповідає `channels.bluebubbles.webhookPath`.
+- Якщо події введення/прочитання перестають працювати, перевірте журнали Webhook BlueBubbles і переконайтеся, що шлях Gateway відповідає `channels.bluebubbles.webhookPath`.
- Коди сполучення спливають через одну годину; використовуйте `openclaw pairing list bluebubbles` і `openclaw pairing approve bluebubbles `.
-- Для реакцій потрібен приватний API BlueBubbles (`POST /api/v1/message/react`); переконайтеся, що версія сервера його надає.
-- Для редагування/скасування надсилання потрібні macOS 13+ і сумісна версія сервера BlueBubbles. На macOS 26 (Tahoe) редагування наразі зламане через зміни private API.
-- Оновлення іконки групи може бути нестабільним на macOS 26 (Tahoe): API може повернути успіх, але нова іконка не синхронізується.
-- OpenClaw автоматично приховує відомо зламані дії на основі версії macOS сервера BlueBubbles. Якщо редагування все ще відображається на macOS 26 (Tahoe), вимкніть його вручну за допомогою `channels.bluebubbles.actions.edit=false`.
-- `coalesceSameSenderDms` увімкнено, але розділені надсилання (наприклад `Dump` + URL) усе ще надходять як два ходи: див. контрольний список [усунення несправностей об’єднання розділених надсилань](#split-send-coalescing-troubleshooting) — поширені причини: занадто вузьке debounce-вікно, часові позначки журналу сесії помилково сприйняті як надходження Webhook, або надсилання цитати-відповіді (яке використовує `replyToBody`, а не другий Webhook).
-- Для інформації про статус/стан: `openclaw status --all` або `openclaw status --deep`.
+- Для реакцій потрібен private API BlueBubbles (`POST /api/v1/message/react`); переконайтеся, що версія сервера його надає.
+- Для редагування/скасування надсилання потрібні macOS 13+ і сумісна версія сервера BlueBubbles. У macOS 26 (Tahoe) редагування наразі зламане через зміни private API.
+- Оновлення групової іконки можуть бути нестабільними на macOS 26 (Tahoe): API може повернути успіх, але нова іконка не синхронізується.
+- OpenClaw автоматично приховує відомо зламані дії на основі версії macOS сервера BlueBubbles. Якщо редагування все ще з’являється на macOS 26 (Tahoe), вимкніть його вручну за допомогою `channels.bluebubbles.actions.edit=false`.
+- `coalesceSameSenderDms` увімкнено, але розділені надсилання (наприклад `Dump` + URL) все одно надходять як два ходи: див. контрольний список [усунення неполадок об’єднання розділених надсилань](#split-send-coalescing-troubleshooting) — поширені причини: занадто коротке вікно debounce, часові позначки журналу сеансу помилково сприйняті як надходження Webhook або надсилання цитати відповіді (яке використовує `replyToBody`, а не другий Webhook).
+- Для інформації про статус/працездатність: `openclaw status --all` або `openclaw status --deep`.
-Загальну довідку щодо робочого процесу каналів див. у [Канали](/uk/channels) та посібнику [Plugins](/uk/tools/plugin).
+Загальну довідку щодо workflow каналів див. у [Канали](/uk/channels) та посібнику [Plugins](/uk/tools/plugin).
## Пов’язане
-- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сесій для повідомлень
+- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сеансів для повідомлень
- [Огляд каналів](/uk/channels) — усі підтримувані канали
-- [Групи](/uk/channels/groups) — поведінка групового чату та контроль згадок
-- [Сполучення](/uk/channels/pairing) — автентифікація DM і процес сполучення
+- [Групи](/uk/channels/groups) — поведінка групових чатів і обмеження згадок
+- [Сполучення](/uk/channels/pairing) — автентифікація DM і потік сполучення
- [Безпека](/uk/gateway/security) — модель доступу та посилення захисту
diff --git a/docs/uk/channels/qqbot.md b/docs/uk/channels/qqbot.md
index e17b796ad..5df84ef86 100644
--- a/docs/uk/channels/qqbot.md
+++ b/docs/uk/channels/qqbot.md
@@ -1,26 +1,26 @@
---
read_when:
- Ви хочете підключити OpenClaw до QQ
- - Потрібно налаштувати облікові дані QQ Bot
- - Вам потрібна підтримка групового або приватного чату QQ Bot
-summary: Налаштування, конфігурація та використання QQ Bot
-title: бот QQ
+ - Потрібне налаштування облікових даних QQ Bot
+ - Вам потрібна підтримка групових або приватних чатів QQ Bot
+summary: Налаштування, конфігурація та використання бота QQ
+title: QQ бот
x-i18n:
- generated_at: "2026-05-03T11:35:25Z"
+ generated_at: "2026-05-03T22:33:30Z"
model: gpt-5.5
provider: openai
- source_hash: 471c24110bf0ab8896d22f5bb5932ac4e03ff5169560c99ba6b9d1ca4025d9a8
+ source_hash: e17fa0da2f6939ed28cac5f13b3e37e6c63b87a10250ff213f7a86685a6141d6
source_path: channels/qqbot.md
workflow: 16
---
-QQ Bot підключається до OpenClaw через офіційний QQ Bot API (WebSocket gateway). Plugin підтримує приватний чат C2C, групові @повідомлення та повідомлення в каналах guild із rich media (зображення, голос, відео, файли).
+QQ Bot підключається до OpenClaw через офіційний QQ Bot API (WebSocket gateway). Plugin підтримує приватний чат C2C, групові @повідомлення та повідомлення каналів гільдій із розширеними медіа (зображення, голос, відео, файли).
-Стан: Plugin доступний для завантаження. Прямі повідомлення, групові чати, канали guild і медіа підтримуються. Реакції та треди не підтримуються.
+Стан: завантажуваний Plugin. Підтримуються прямі повідомлення, групові чати, канали гільдій і медіа. Реакції та треди не підтримуються.
-## Встановлення
+## Установлення
-Встановіть QQ Bot перед налаштуванням:
+Установіть QQ Bot перед налаштуванням:
```bash
openclaw plugins install @openclaw/qqbot
@@ -28,9 +28,10 @@ openclaw plugins install @openclaw/qqbot
## Налаштування
-1. Перейдіть на [QQ Open Platform](https://q.qq.com/) і відскануйте QR-код за допомогою QQ на телефоні, щоб зареєструватися / увійти.
-2. Натисніть **Create Bot**, щоб створити нового QQ bot.
-3. Знайдіть **AppID** і **AppSecret** на сторінці налаштувань bot і скопіюйте їх.
+1. Перейдіть на [QQ Open Platform](https://q.qq.com/) і відскануйте QR-код своїм
+ телефоном із QQ, щоб зареєструватися / увійти.
+2. Натисніть **Створити бота**, щоб створити нового QQ-бота.
+3. Знайдіть **AppID** і **AppSecret** на сторінці налаштувань бота та скопіюйте їх.
> AppSecret не зберігається у відкритому тексті — якщо ви залишите сторінку, не зберігши його,
> вам доведеться згенерувати новий.
@@ -71,7 +72,7 @@ openclaw configure --section channels
- `QQBOT_APP_ID`
- `QQBOT_CLIENT_SECRET`
-AppSecret на основі файлу:
+AppSecret із файлу:
```json5
{
@@ -85,7 +86,7 @@ AppSecret на основі файлу:
}
```
-AppSecret через Env SecretRef:
+AppSecret Env SecretRef:
```json5
{
@@ -101,16 +102,16 @@ AppSecret через Env SecretRef:
Примітки:
-- Резервне значення з env застосовується лише до облікового запису QQ Bot за замовчуванням.
+- Резервний варіант через змінні середовища застосовується лише до облікового запису QQ Bot за замовчуванням.
- `openclaw channels add --channel qqbot --token-file ...` надає лише
- AppSecret; AppID вже має бути заданий у конфігурації або `QQBOT_APP_ID`.
-- `clientSecret` також приймає вхідні дані SecretRef, а не лише відкритий текстовий рядок.
+ AppSecret; AppID уже має бути встановлено в конфігурації або `QQBOT_APP_ID`.
+- `clientSecret` також приймає вхідні дані SecretRef, а не лише рядок у відкритому тексті.
- Застарілі рядки-маркери `secretref:/...` не є допустимими значеннями `clientSecret`;
використовуйте структуровані об'єкти SecretRef, як у прикладі вище.
### Налаштування кількох облікових записів
-Запускайте кілька QQ bot в одному екземплярі OpenClaw:
+Запустіть кілька QQ-ботів в одному екземплярі OpenClaw:
```json5
{
@@ -134,7 +135,7 @@ AppSecret через Env SecretRef:
Кожен обліковий запис запускає власне WebSocket-з'єднання та підтримує незалежний
кеш токенів (ізольований за `appId`).
-Додайте другого bot через CLI:
+Додайте другого бота через CLI:
```bash
openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-of-bot-2"
@@ -142,7 +143,7 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
### Групові чати
-Підтримка групових чатів QQ Bot використовує OpenID груп QQ, а не відображувані імена. Додайте bot
+Підтримка групових чатів QQ Bot використовує OpenID груп QQ, а не відображувані імена. Додайте бота
до групи, а потім згадайте його або налаштуйте групу для роботи без згадки.
```json5
@@ -170,30 +171,30 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
}
```
-`groups["*"]` задає стандартні значення для кожної групи, а конкретний
-запис `groups.GROUP_OPENID` перевизначає ці значення для однієї групи. Налаштування
-групи містять:
+`groups["*"]` задає стандартні параметри для кожної групи, а конкретний
+запис `groups.GROUP_OPENID` перевизначає ці параметри для однієї групи. Налаштування
+групи включають:
-- `requireMention`: вимагати @згадку перед тим, як bot відповість. За замовчуванням: `true`.
-- `ignoreOtherMentions`: відкидати повідомлення, які згадують когось іншого, але не bot.
-- `historyLimit`: зберігати останні групові повідомлення без згадки як контекст для наступного ходу зі згадкою. Установіть `0`, щоб вимкнути.
+- `requireMention`: вимагати @згадку перед тим, як бот відповість. За замовчуванням: `true`.
+- `ignoreOtherMentions`: відкидати повідомлення, які згадують когось іншого, але не бота.
+- `historyLimit`: зберігати нещодавні групові повідомлення без згадок як контекст для наступного ходу зі згадкою. Установіть `0`, щоб вимкнути.
- `toolPolicy`: `full`, `restricted` або `none` для інструментів у межах групи.
-- `name`: зручна мітка, що використовується в журналах і контексті групи.
-- `prompt`: запит поведінки для окремої групи, що додається до контексту агента.
+- `name`: зрозуміла мітка, що використовується в журналах і контексті групи.
+- `prompt`: підказка поведінки для окремої групи, додана до контексту агента.
Режими активації: `mention` і `always`. `requireMention: true` відповідає
`mention`; `requireMention: false` відповідає `always`. Перевизначення активації
-на рівні сеансу, якщо воно наявне, має пріоритет над конфігурацією.
+на рівні сеансу, якщо воно є, має пріоритет над конфігурацією.
-Вхідна черга є окремою для кожного учасника. Групові учасники отримують більший ліміт черги, зберігають людські
-повідомлення попереду повідомлень, створених bot, коли черга заповнена, і об'єднують серії звичайних
+Вхідна черга створюється для кожного однорангового учасника. Групові учасники отримують більший ліміт черги, зберігають людські
+повідомлення попереду повідомлень, написаних ботом, коли черга заповнена, і об'єднують сплески звичайних
групових повідомлень в один атрибутований хід. Slash-команди все одно виконуються по одній.
### Голос (STT / TTS)
Підтримка STT і TTS має дворівневу конфігурацію з пріоритетним резервним варіантом:
-| Налаштування | Специфічне для Plugin | Резервний варіант framework |
+| Параметр | Специфічно для Plugin | Резервний варіант фреймворку |
| ------- | -------------------------------------------------------- | ----------------------------- |
| STT | `channels.qqbot.stt` | `tools.media.audio.models[0]` |
| TTS | `channels.qqbot.tts`, `channels.qqbot.accounts..tts` | `messages.tts` |
@@ -212,7 +213,7 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
voice: "your-voice",
},
accounts: {
- qq-main: {
+ "qq-main": {
tts: {
providers: {
openai: { voice: "shimmer" },
@@ -226,15 +227,15 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
```
Установіть `enabled: false` для будь-якого з них, щоб вимкнути.
-Перевизначення TTS на рівні облікового запису використовують таку саму форму, як `messages.tts`, і глибоко об'єднуються
+Перевизначення TTS на рівні облікового запису використовують ту саму форму, що й `messages.tts`, і виконують глибоке злиття
поверх конфігурації TTS каналу/глобальної конфігурації.
-Вхідні голосові вкладення QQ доступні агентам як метадані аудіомедіа, тоді як
-сирі голосові файли не потрапляють до загальних `MediaPaths`. Відповіді звичайним
+Вхідні голосові вкладення QQ надаються агентам як метадані аудіомедіа, водночас
+сирі голосові файли не потрапляють до загальних `MediaPaths`. Відповіді відкритим
текстом `[[audio_as_voice]]` синтезують TTS і надсилають нативне голосове повідомлення QQ, коли TTS
налаштовано.
-Поведінку вихідного завантаження/transcode аудіо також можна налаштувати за допомогою
+Поведінку вихідного завантаження/транскодування аудіо також можна налаштувати за допомогою
`channels.qqbot.audioFormatPolicy`:
- `sttDirectFormats`
@@ -247,66 +248,66 @@ openclaw channels add --channel qqbot --account bot2 --token "222222222:secret-o
| -------------------------- | ------------------ |
| `qqbot:c2c:OPENID` | Приватний чат (C2C) |
| `qqbot:group:GROUP_OPENID` | Груповий чат |
-| `qqbot:channel:CHANNEL_ID` | Канал guild |
+| `qqbot:channel:CHANNEL_ID` | Канал гільдії |
-> Кожен bot має власний набір OpenID користувачів. OpenID, отриманий Bot A, **не можна**
-> використовувати для надсилання повідомлень через Bot B.
+> Кожен бот має власний набір OpenID користувачів. OpenID, отриманий Ботом A, **не можна**
+> використовувати для надсилання повідомлень через Бота B.
## Slash-команди
-Вбудовані команди, що перехоплюються перед чергою AI:
+Вбудовані команди, що перехоплюються перед чергою ШІ:
| Команда | Опис |
| -------------- | -------------------------------------------------------------------------------------------------------- |
| `/bot-ping` | Тест затримки |
-| `/bot-version` | Показати версію framework OpenClaw |
-| `/bot-help` | Показати список усіх команд |
-| `/bot-me` | Показати QQ user ID (openid) відправника для налаштування `allowFrom`/`groupAllowFrom` |
+| `/bot-version` | Показати версію фреймворку OpenClaw |
+| `/bot-help` | Перелічити всі команди |
+| `/bot-me` | Показати QQ ID користувача відправника (openid) для налаштування `allowFrom`/`groupAllowFrom` |
| `/bot-upgrade` | Показати посилання на посібник з оновлення QQBot |
-| `/bot-logs` | Експортувати останні журнали gateway як файл |
-| `/bot-approve` | Схвалити очікувану дію QQ Bot (наприклад, підтвердження завантаження C2C або групового завантаження) через нативний потік. |
+| `/bot-logs` | Експортувати нещодавні журнали Gateway як файл |
+| `/bot-approve` | Схвалити дію QQ Bot, що очікує на підтвердження (наприклад, підтвердження завантаження C2C або групового завантаження), через нативний потік. |
Додайте `?` до будь-якої команди, щоб отримати довідку з використання (наприклад, `/bot-upgrade ?`).
-Команди адміністратора (`/bot-me`, `/bot-upgrade`, `/bot-logs`, `/bot-clear-storage`, `/bot-streaming`, `/bot-approve`) доступні лише в прямих повідомленнях і вимагають openid відправника в явному списку `allowFrom` без wildcard. Wildcard `allowFrom: ["*"]` дозволяє чат, але не надає доступ до команд адміністратора. Групові повідомлення спочатку зіставляються з `groupAllowFrom`, а потім використовують резервний `allowFrom`. Запуск команди адміністратора в групі повертає підказку, а не мовчки відкидається.
+Адміністративні команди (`/bot-me`, `/bot-upgrade`, `/bot-logs`, `/bot-clear-storage`, `/bot-streaming`, `/bot-approve`) доступні лише в прямих повідомленнях і вимагають openid відправника в явному списку `allowFrom` без wildcard. Wildcard `allowFrom: ["*"]` дозволяє чат, але не надає доступу до адміністративних команд. Групові повідомлення спочатку звіряються з `groupAllowFrom`, а потім використовують резервний варіант `allowFrom`. Запуск адміністративної команди в групі повертає підказку, а не мовчки відкидає її.
## Архітектура рушія
QQ Bot постачається як самодостатній рушій усередині Plugin:
-- Кожен обліковий запис має ізольований стек ресурсів (WebSocket-з'єднання, API-клієнт, кеш токенів, корінь сховища медіа), прив'язаний до `appId`. Облікові записи ніколи не спільно використовують вхідний/вихідний стан.
-- Логер для кількох облікових записів позначає рядки журналу обліковим записом-власником, щоб діагностика залишалася відокремленою, коли ви запускаєте кілька bot під одним gateway.
-- Вхідні, вихідні та gateway bridge шляхи спільно використовують один корінь медіаданих у `~/.openclaw/media`, тому завантаження, вивантаження та кеші transcode потрапляють в один захищений каталог замість дерева для кожної підсистеми.
-- Доставка rich media проходить через один шлях `sendMedia` для цілей C2C і груп. Локальні файли та буфери, що перевищують поріг великого файлу, використовують chunked upload endpoints QQ, тоді як менші payload використовують одноразовий media API.
-- Облікові дані можна створювати в резервних копіях і відновлювати як частину стандартних snapshot облікових даних OpenClaw; рушій повторно приєднує стек ресурсів кожного облікового запису під час відновлення без потреби в новій QR-code pair.
+- Кожен обліковий запис володіє ізольованим стеком ресурсів (WebSocket-з'єднання, API-клієнт, кеш токенів, корінь сховища медіа), ключованим за `appId`. Облікові записи ніколи не спільно використовують вхідний/вихідний стан.
+- Журналювач для кількох облікових записів позначає рядки журналу обліковим записом-власником, щоб діагностика залишалася роздільною, коли ви запускаєте кілька ботів під одним Gateway.
+- Вхідні, вихідні та bridge-шляхи Gateway спільно використовують один корінь медіанавантажень у `~/.openclaw/media`, тому завантаження, вивантаження та кеші транскодування потрапляють в один захищений каталог замість дерева для кожної підсистеми.
+- Доставка розширених медіа проходить через один шлях `sendMedia` для цілей C2C і груп. Локальні файли та буфери, що перевищують поріг великих файлів, використовують chunked upload endpoints QQ, тоді як менші навантаження використовують одноразовий media API.
+- Облікові дані можна резервно копіювати та відновлювати як частину стандартних знімків облікових даних OpenClaw; рушій повторно приєднує стек ресурсів кожного облікового запису під час відновлення без потреби в новій парі QR-кодом.
-## Онбординг через QR-код
+## Онбординг за QR-кодом
-Як альтернативу ручному вставленню `AppID:AppSecret`, рушій підтримує потік онбордингу через QR-код для прив'язування QQ Bot до OpenClaw:
+Як альтернативу ручному вставленню `AppID:AppSecret`, рушій підтримує потік онбордингу за QR-кодом для зв'язування QQ Bot з OpenClaw:
-1. Запустіть шлях налаштування QQ Bot (наприклад, `openclaw channels add --channel qqbot`) і виберіть потік QR-коду, коли буде запропоновано.
-2. Відскануйте згенерований QR-код за допомогою телефонного застосунку, прив'язаного до цільового QQ Bot.
-3. Підтвердьте сполучення на телефоні. OpenClaw зберігає повернені облікові дані в `credentials/` у правильній області облікового запису.
+1. Запустіть шлях налаштування QQ Bot (наприклад, `openclaw channels add --channel qqbot`) і виберіть потік QR-коду, коли з'явиться запит.
+2. Відскануйте згенерований QR-код телефонним застосунком, прив'язаним до цільового QQ Bot.
+3. Схваліть сполучення на телефоні. OpenClaw зберігає повернуті облікові дані в `credentials/` у правильній області облікового запису.
-Запити на схвалення, згенеровані самим bot (наприклад, потоки "allow this action?", доступні через QQ Bot API), відображаються як нативні запити OpenClaw, які можна прийняти за допомогою `/bot-approve`, а не відповідати через сирий клієнт QQ.
+Запити на схвалення, згенеровані самим ботом (наприклад, потоки "дозволити цю дію?", надані QQ Bot API), відображаються як нативні запити OpenClaw, які можна прийняти за допомогою `/bot-approve`, а не відповідаючи через сирий клієнт QQ.
-## Усунення несправностей
+## Усунення неполадок
-- **Bot replies "gone to Mars":** облікові дані не налаштовано або Gateway не запущено.
-- **Немає вхідних повідомлень:** перевірте, що `appId` і `clientSecret` правильні, і що
- bot увімкнено на QQ Open Platform.
-- **Повторні відповіді самому собі:** OpenClaw записує вихідні ref indexes QQ як
- створені bot і ігнорує вхідні події, чий поточний `msgIdx` збігається з тим
- самим обліковим записом bot. Це запобігає echo loops платформи, водночас дозволяючи користувачам
- цитувати або відповідати на попередні повідомлення bot.
-- **Налаштування з `--token-file` все одно показує, що конфігурація відсутня:** `--token-file` задає лише
+- **Бот відповідає "gone to Mars":** облікові дані не налаштовано або Gateway не запущено.
+- **Немає вхідних повідомлень:** перевірте, що `appId` і `clientSecret` правильні, а
+ бот увімкнений на QQ Open Platform.
+- **Повторювані самовідповіді:** OpenClaw записує індекси вихідних посилань QQ як
+ написані ботом і ігнорує вхідні події, поточний `msgIdx` яких збігається з тим
+ самим обліковим записом бота. Це запобігає циклам відлуння платформи, водночас дозволяючи користувачам
+ цитувати попередні повідомлення бота або відповідати на них.
+- **Налаштування з `--token-file` все ще показує, що не налаштовано:** `--token-file` встановлює лише
AppSecret. Вам усе ще потрібен `appId` у конфігурації або `QQBOT_APP_ID`.
-- **Проактивні повідомлення не надходять:** QQ може перехоплювати повідомлення, ініційовані bot, якщо
- користувач останнім часом не взаємодіяв.
-- **Голос не транскрибується:** переконайтеся, що STT налаштовано, а provider доступний.
+- **Проактивні повідомлення не надходять:** QQ може перехоплювати повідомлення, ініційовані ботом, якщо
+ користувач не взаємодіяв нещодавно.
+- **Голос не транскрибується:** переконайтеся, що STT налаштовано, а провайдер доступний.
## Пов'язане
- [Сполучення](/uk/channels/pairing)
- [Групи](/uk/channels/groups)
-- [Усунення несправностей каналу](/uk/channels/troubleshooting)
+- [Усунення неполадок каналу](/uk/channels/troubleshooting)
diff --git a/docs/uk/channels/slack.md b/docs/uk/channels/slack.md
index 9c7a48b89..042fb3e98 100644
--- a/docs/uk/channels/slack.md
+++ b/docs/uk/channels/slack.md
@@ -1,47 +1,47 @@
---
read_when:
- Налаштування Slack або налагодження сокетного/HTTP-режиму Slack
-summary: Налаштування Slack і поведінка під час виконання (Socket Mode + URL-адреси HTTP-запитів)
+summary: Налаштування Slack і поведінка під час виконання (сокетний режим + URL-адреси HTTP-запитів)
title: Slack
x-i18n:
- generated_at: "2026-05-03T17:33:01Z"
+ generated_at: "2026-05-03T22:33:21Z"
model: gpt-5.5
provider: openai
- source_hash: d902fbbad23cee9b3f0ab7d240845b7b229e2d2507c5ea1d1a0fa3baa915d80a
+ source_hash: 72fecf4371107e2a0685886ef9f9d24cfd9cc59fdce69e36e85dac985cbd3fe4
source_path: channels/slack.md
workflow: 16
---
-Готово до продакшну для особистих повідомлень і каналів через інтеграції застосунків Slack. Режим за замовчуванням — Socket Mode; HTTP Request URLs також підтримуються.
+Готовий до production-використання для DM і каналів через інтеграції застосунку Slack. Режим за замовчуванням — Socket Mode; HTTP Request URLs також підтримуються.
-
- Особисті повідомлення Slack за замовчуванням використовують режим сполучення.
+
+ DM у Slack за замовчуванням використовують режим сполучення.
-
+
Нативна поведінка команд і каталог команд.
-
- Міжканальна діагностика та сценарії відновлення.
+
+ Міжканальна діагностика та інструкції з усунення несправностей.
## Швидке налаштування
-
+
-
- У налаштуваннях застосунку Slack натисніть кнопку **[Створити новий застосунок](https://api.slack.com/apps/new)**:
+
+ У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
- - виберіть **з маніфесту** й оберіть робочий простір для свого застосунку
+ - виберіть **from a manifest** і виберіть робочий простір для свого застосунку
- вставте [приклад маніфесту](#manifest-and-scope-checklist) нижче й продовжте створення
- - згенеруйте **App-Level Token** (`xapp-...`) з `connections:write`
- - установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
+ - згенеруйте **App-Level Token** (`xapp-...`) із `connections:write`
+ - встановіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
-
+
Рекомендоване налаштування SecretRef:
@@ -64,7 +64,7 @@ openclaw config patch --file ./slack.socket.patch.json5 --dry-run
openclaw config patch --file ./slack.socket.patch.json5
```
- Резервний варіант через змінні середовища (лише обліковий запис за замовчуванням):
+ Резервний варіант через env (лише обліковий запис за замовчуванням):
```bash
SLACK_APP_TOKEN=xapp-...
@@ -73,7 +73,7 @@ SLACK_BOT_TOKEN=xoxb-...
-
+
```bash
openclaw gateway
@@ -86,17 +86,17 @@ openclaw gateway
-
- У налаштуваннях застосунку Slack натисніть кнопку **[Створити новий застосунок](https://api.slack.com/apps/new)**:
+
+ У налаштуваннях застосунку Slack натисніть кнопку **[Create New App](https://api.slack.com/apps/new)**:
- - виберіть **з маніфесту** й оберіть робочий простір для свого застосунку
+ - виберіть **from a manifest** і виберіть робочий простір для свого застосунку
- вставте [приклад маніфесту](#manifest-and-scope-checklist) і оновіть URL-адреси перед створенням
- збережіть **Signing Secret** для перевірки запитів
- - установіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
+ - встановіть застосунок і скопіюйте показаний **Bot Token** (`xoxb-...`)
-
+
Рекомендоване налаштування SecretRef:
@@ -121,14 +121,14 @@ openclaw config patch --file ./slack.http.patch.json5
```
- Використовуйте унікальні шляхи Webhook для HTTP з кількома обліковими записами
+ Використовуйте унікальні шляхи Webhook для HTTP із кількома обліковими записами
Надайте кожному обліковому запису окремий `webhookPath` (за замовчуванням `/slack/events`), щоб реєстрації не конфліктували.
-
+
```bash
openclaw gateway
@@ -142,7 +142,7 @@ openclaw gateway
## Налаштування транспорту Socket Mode
-OpenClaw за замовчуванням установлює тайм-аут pong клієнта Slack SDK на 15 секунд для Socket Mode. Змінюйте параметри транспорту лише тоді, коли потрібне налаштування для конкретного робочого простору або хоста:
+OpenClaw за замовчуванням установлює для клієнта Slack SDK тайм-аут pong у 15 секунд для Socket Mode. Перевизначайте налаштування транспорту лише тоді, коли потрібне налаштування під конкретний робочий простір або хост:
```json5
{
@@ -159,11 +159,11 @@ OpenClaw за замовчуванням установлює тайм-аут po
}
```
-Використовуйте це лише для робочих просторів Socket Mode, які журналюють тайм-аути Slack websocket pong/server-ping або працюють на хостах із відомим виснаженням циклу подій. `clientPingTimeout` — це очікування pong після того, як SDK надсилає клієнтський ping; `serverPingTimeout` — це очікування ping від сервера Slack. Повідомлення та події застосунку залишаються станом застосунку, а не сигналами життєздатності транспорту.
+Використовуйте це лише для робочих просторів Socket Mode, які журналюють тайм-аути Slack websocket pong/server-ping, або працюють на хостах із відомим блокуванням циклу подій. `clientPingTimeout` — це очікування pong після того, як SDK надсилає client ping; `serverPingTimeout` — це очікування ping від сервера Slack. Повідомлення й події застосунку залишаються станом застосунку, а не сигналами життєздатності транспорту.
-## Контрольний список маніфесту й областей доступу
+## Контрольний список маніфесту та областей доступу
-Базовий маніфест застосунку Slack однаковий для Socket Mode і HTTP Request URLs. Відрізняється лише блок `settings` (і `url` slash-команди).
+Базовий маніфест застосунку Slack однаковий для Socket Mode і HTTP Request URLs. Відрізняється лише блок `settings` (і `url` для slash-команди).
Базовий маніфест (Socket Mode за замовчуванням):
@@ -270,16 +270,16 @@ OpenClaw за замовчуванням установлює тайм-аут po
}
```
-### Додаткові параметри маніфесту
+### Додаткові налаштування маніфесту
-Увімкніть інші функції, які розширюють наведені вище стандартні параметри.
+Увімкніть інші функції, що розширюють наведені вище стандартні значення.
-Стандартний маніфест вмикає вкладку **Home** у Slack App Home і підписується на `app_home_opened`. Коли учасник робочого простору відкриває вкладку Home, OpenClaw публікує безпечне стандартне подання Home через `views.publish`; payload розмови або приватна конфігурація не включаються. Вкладка **Messages** залишається ввімкненою для Slack DM.
+Маніфест за замовчуванням вмикає вкладку **Home** у Slack App Home і підписується на `app_home_opened`. Коли учасник робочого простору відкриває вкладку Home, OpenClaw публікує безпечне подання Home за замовчуванням через `views.publish`; дані розмови або приватна конфігурація не включаються. Вкладка **Messages** залишається ввімкненою для DM у Slack.
-
+
- Замість однієї налаштованої команди можна використовувати кілька [нативних slash-команд](#commands-and-slash-behavior), з урахуванням нюансів:
+ Замість однієї налаштованої команди можна використовувати кілька [нативних slash-команд](#commands-and-slash-behavior) з такими нюансами:
- Використовуйте `/agentstatus` замість `/status`, оскільки команда `/status` зарезервована.
- Одночасно можна зробити доступними не більше 25 slash-команд.
@@ -287,124 +287,126 @@ OpenClaw за замовчуванням установлює тайм-аут po
Замініть наявний розділ `features.slash_commands` підмножиною [доступних команд](/uk/tools/slash-commands#command-list):
-
+
```json
- "slash_commands": [
- {
- "command": "/new",
- "description": "Start a new session",
- "usage_hint": "[model]"
- },
- {
- "command": "/reset",
- "description": "Reset the current session"
- },
- {
- "command": "/compact",
- "description": "Compact the session context",
- "usage_hint": "[instructions]"
- },
- {
- "command": "/stop",
- "description": "Stop the current run"
- },
- {
- "command": "/session",
- "description": "Manage thread-binding expiry",
- "usage_hint": "idle or max-age "
- },
- {
- "command": "/think",
- "description": "Set the thinking level",
- "usage_hint": ""
- },
- {
- "command": "/verbose",
- "description": "Toggle verbose output",
- "usage_hint": "on|off|full"
- },
- {
- "command": "/fast",
- "description": "Show or set fast mode",
- "usage_hint": "[status|on|off]"
- },
- {
- "command": "/reasoning",
- "description": "Toggle reasoning visibility",
- "usage_hint": "[on|off|stream]"
- },
- {
- "command": "/elevated",
- "description": "Toggle elevated mode",
- "usage_hint": "[on|off|ask|full]"
- },
- {
- "command": "/exec",
- "description": "Show or set exec defaults",
- "usage_hint": "host= security= ask= node="
- },
- {
- "command": "/model",
- "description": "Show or set the model",
- "usage_hint": "[name|#|status]"
- },
- {
- "command": "/models",
- "description": "List providers/models",
- "usage_hint": "[provider] [page] [limit=|size=|all]"
- },
- {
- "command": "/help",
- "description": "Show the short help summary"
- },
- {
- "command": "/commands",
- "description": "Show the generated command catalog"
- },
- {
- "command": "/tools",
- "description": "Show what the current agent can use right now",
- "usage_hint": "[compact|verbose]"
- },
- {
- "command": "/agentstatus",
- "description": "Show runtime status, including provider usage/quota when available"
- },
- {
- "command": "/tasks",
- "description": "List active/recent background tasks for the current session"
- },
- {
- "command": "/context",
- "description": "Explain how context is assembled",
- "usage_hint": "[list|detail|json]"
- },
- {
- "command": "/whoami",
- "description": "Show your sender identity"
- },
- {
- "command": "/skill",
- "description": "Run a skill by name",
- "usage_hint": " [input]"
- },
- {
- "command": "/btw",
- "description": "Ask a side question without changing session context",
- "usage_hint": ""
- },
- {
- "command": "/side",
- "description": "Ask a side question without changing session context",
- "usage_hint": ""
- },
- {
- "command": "/usage",
- "description": "Control the usage footer or show cost summary",
- "usage_hint": "off|tokens|full|cost"
- }
- ]
+{
+ "slash_commands": [
+ {
+ "command": "/new",
+ "description": "Start a new session",
+ "usage_hint": "[model]"
+ },
+ {
+ "command": "/reset",
+ "description": "Reset the current session"
+ },
+ {
+ "command": "/compact",
+ "description": "Compact the session context",
+ "usage_hint": "[instructions]"
+ },
+ {
+ "command": "/stop",
+ "description": "Stop the current run"
+ },
+ {
+ "command": "/session",
+ "description": "Manage thread-binding expiry",
+ "usage_hint": "idle or max-age "
+ },
+ {
+ "command": "/think",
+ "description": "Set the thinking level",
+ "usage_hint": ""
+ },
+ {
+ "command": "/verbose",
+ "description": "Toggle verbose output",
+ "usage_hint": "on|off|full"
+ },
+ {
+ "command": "/fast",
+ "description": "Show or set fast mode",
+ "usage_hint": "[status|on|off]"
+ },
+ {
+ "command": "/reasoning",
+ "description": "Toggle reasoning visibility",
+ "usage_hint": "[on|off|stream]"
+ },
+ {
+ "command": "/elevated",
+ "description": "Toggle elevated mode",
+ "usage_hint": "[on|off|ask|full]"
+ },
+ {
+ "command": "/exec",
+ "description": "Show or set exec defaults",
+ "usage_hint": "host= security= ask= node="
+ },
+ {
+ "command": "/model",
+ "description": "Show or set the model",
+ "usage_hint": "[name|#|status]"
+ },
+ {
+ "command": "/models",
+ "description": "List providers/models",
+ "usage_hint": "[provider] [page] [limit=|size=|all]"
+ },
+ {
+ "command": "/help",
+ "description": "Show the short help summary"
+ },
+ {
+ "command": "/commands",
+ "description": "Show the generated command catalog"
+ },
+ {
+ "command": "/tools",
+ "description": "Show what the current agent can use right now",
+ "usage_hint": "[compact|verbose]"
+ },
+ {
+ "command": "/agentstatus",
+ "description": "Show runtime status, including provider usage/quota when available"
+ },
+ {
+ "command": "/tasks",
+ "description": "List active/recent background tasks for the current session"
+ },
+ {
+ "command": "/context",
+ "description": "Explain how context is assembled",
+ "usage_hint": "[list|detail|json]"
+ },
+ {
+ "command": "/whoami",
+ "description": "Show your sender identity"
+ },
+ {
+ "command": "/skill",
+ "description": "Run a skill by name",
+ "usage_hint": " [input]"
+ },
+ {
+ "command": "/btw",
+ "description": "Ask a side question without changing session context",
+ "usage_hint": ""
+ },
+ {
+ "command": "/side",
+ "description": "Ask a side question without changing session context",
+ "usage_hint": ""
+ },
+ {
+ "command": "/usage",
+ "description": "Control the usage footer or show cost summary",
+ "usage_hint": "off|tokens|full|cost"
+ }
+ ]
+}
```
@@ -412,34 +414,36 @@ OpenClaw за замовчуванням установлює тайм-аут po
Використовуйте той самий список `slash_commands`, що й для Socket Mode вище, і додайте `"url": "https://gateway-host.example.com/slack/events"` до кожного запису. Приклад:
```json
- "slash_commands": [
- {
- "command": "/new",
- "description": "Start a new session",
- "usage_hint": "[model]",
- "url": "https://gateway-host.example.com/slack/events"
- },
- {
- "command": "/help",
- "description": "Show the short help summary",
- "url": "https://gateway-host.example.com/slack/events"
- }
- // ...repeat for every command with the same `url` value
- ]
+{
+ "slash_commands": [
+ {
+ "command": "/new",
+ "description": "Start a new session",
+ "usage_hint": "[model]",
+ "url": "https://gateway-host.example.com/slack/events"
+ },
+ {
+ "command": "/help",
+ "description": "Show the short help summary",
+ "url": "https://gateway-host.example.com/slack/events"
+ }
+ // ...repeat for every command with the same `url` value
+ ]
+}
```
-
- Додайте область бота `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували активну ідентичність агента (власне ім’я користувача та піктограму) замість стандартної ідентичності застосунку Slack.
+
+ Додайте область доступу бота `chat:write.customize`, якщо хочете, щоб вихідні повідомлення використовували ідентичність активного агента (власне ім’я користувача й іконку) замість стандартної ідентичності застосунку Slack.
- Якщо ви використовуєте піктограму emoji, Slack очікує синтаксис `:emoji_name:`.
+ Якщо ви використовуєте emoji-іконку, Slack очікує синтаксис `:emoji_name:`.
-
- Якщо ви налаштовуєте `channels.slack.userToken`, типові області читання такі:
+
+ Якщо ви налаштовуєте `channels.slack.userToken`, типовими областями доступу для читання є:
- `channels:history`, `groups:history`, `im:history`, `mpim:history`
- `channels:read`, `groups:read`, `im:read`, `mpim:read`
@@ -455,35 +459,35 @@ OpenClaw за замовчуванням установлює тайм-аут po
## Модель токенів
- `botToken` + `appToken` потрібні для Socket Mode.
-- Режим HTTP потребує `botToken` + `signingSecret`.
-- `botToken`, `appToken`, `signingSecret` і `userToken` приймають відкриті
+- HTTP-режим потребує `botToken` + `signingSecret`.
+- `botToken`, `appToken`, `signingSecret` і `userToken` приймають відкриті текстові
рядки або об’єкти SecretRef.
-- Токени конфігурації перевизначають резервне значення env.
-- Резервне значення env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовується лише до стандартного облікового запису.
-- `userToken` (`xoxp-...`) задається лише в конфігурації (без резервного значення env) і за замовчуванням працює лише для читання (`userTokenReadOnly: true`).
+- Токени конфігурації перевизначають резервні env.
+- Резервні env `SLACK_BOT_TOKEN` / `SLACK_APP_TOKEN` застосовуються лише до облікового запису за замовчуванням.
+- `userToken` (`xoxp-...`) задається лише в конфігурації (без резервного env) і за замовчуванням працює лише для читання (`userTokenReadOnly: true`).
Поведінка знімка стану:
-- Перевірка облікового запису Slack відстежує для кожних облікових даних поля `*Source` і `*Status`
- (`botToken`, `appToken`, `signingSecret`, `userToken`).
+- Перевірка облікового запису Slack відстежує поля `*Source` і `*Status`
+ для кожних облікових даних (`botToken`, `appToken`, `signingSecret`, `userToken`).
- Стан може бути `available`, `configured_unavailable` або `missing`.
- `configured_unavailable` означає, що обліковий запис налаштовано через SecretRef
- або інше неінлайнове джерело секрету, але поточний командний чи runtime-шлях
+ або інше неінлайнове джерело секретів, але поточна команда/шлях виконання
не зміг отримати фактичне значення.
-- У режимі HTTP включається `signingSecretStatus`; у Socket Mode
+- У HTTP-режимі включено `signingSecretStatus`; у Socket Mode
обов’язкова пара — `botTokenStatus` + `appTokenStatus`.
-Для дій/читання каталогу токен користувача може мати пріоритет, коли його налаштовано. Для записів токен бота лишається пріоритетним; записи через токен користувача дозволені лише коли `userTokenReadOnly: false` і токен бота недоступний.
+Для дій/читання каталогу можна надавати перевагу токену користувача, якщо його налаштовано. Для запису токен бота залишається пріоритетним; записи токеном користувача дозволені лише коли `userTokenReadOnly: false` і токен бота недоступний.
## Дії та шлюзи
Дії Slack керуються `channels.slack.actions.*`.
-Доступні групи дій у поточному інструментарії Slack:
+Доступні групи дій у поточних інструментах Slack:
-| Група | Типово |
+| Група | За замовчуванням |
| ---------- | ------- |
| messages | увімкнено |
| reactions | увімкнено |
@@ -499,26 +503,26 @@ OpenClaw за замовчуванням установлює тайм-аут po
`channels.slack.dmPolicy` керує доступом до DM. `channels.slack.allowFrom` — канонічний список дозволених DM.
- - `pairing` (типово)
+ - `pairing` (за замовчуванням)
- `allowlist`
- - `open` (потребує, щоб `channels.slack.allowFrom` містив `"*"`)
+ - `open` (потребує, щоб `channels.slack.allowFrom` включав `"*"`)
- `disabled`
Прапорці DM:
- - `dm.enabled` (типово true)
+ - `dm.enabled` (за замовчуванням true)
- `channels.slack.allowFrom`
- `dm.allowFrom` (застаріле)
- - `dm.groupEnabled` (групові DM типово false)
+ - `dm.groupEnabled` (групові DM за замовчуванням false)
- `dm.groupChannels` (необов’язковий список дозволених MPIM)
- Пріоритетність для кількох облікових записів:
+ Пріоритет для кількох облікових записів:
- `channels.slack.accounts.default.allowFrom` застосовується лише до облікового запису `default`.
- Іменовані облікові записи успадковують `channels.slack.allowFrom`, коли їхній власний `allowFrom` не задано.
- Іменовані облікові записи не успадковують `channels.slack.accounts.default.allowFrom`.
- Застарілі `channels.slack.dm.policy` і `channels.slack.dm.allowFrom` усе ще читаються для сумісності. `openclaw doctor --fix` мігрує їх до `dmPolicy` і `allowFrom`, коли може зробити це без зміни доступу.
+ Застарілі `channels.slack.dm.policy` і `channels.slack.dm.allowFrom` усе ще читаються для сумісності. `openclaw doctor --fix` переносить їх у `dmPolicy` і `allowFrom`, коли може зробити це без зміни доступу.
Сполучення в DM використовує `openclaw pairing approve slack `.
@@ -531,20 +535,20 @@ OpenClaw за замовчуванням установлює тайм-аут po
- `allowlist`
- `disabled`
- Список дозволених каналів міститься в `channels.slack.channels` і **має використовувати стабільні ідентифікатори каналів Slack** (наприклад, `C12345678`) як ключі конфігурації.
+ Список дозволених каналів міститься в `channels.slack.channels` і **має використовувати стабільні ідентифікатори каналів Slack** (наприклад `C12345678`) як ключі конфігурації.
- Примітка щодо runtime: якщо `channels.slack` повністю відсутній (налаштування лише через env), runtime повертається до `groupPolicy="allowlist"` і записує попередження (навіть якщо задано `channels.defaults.groupPolicy`).
+ Примітка щодо виконання: якщо `channels.slack` повністю відсутній (налаштування лише через env), середовище виконання повертається до `groupPolicy="allowlist"` і записує попередження в журнал (навіть якщо `channels.defaults.groupPolicy` задано).
- Розв’язання імен/ідентифікаторів:
+ Розпізнавання імен/ID:
- - записи списку дозволених каналів і записи списку дозволених DM розв’язуються під час запуску, коли доступ токена це дозволяє
- - нерозв’язані записи імен каналів зберігаються як налаштовані, але типово ігноруються для маршрутизації
- - вхідна авторизація та маршрутизація каналів типово спершу використовують ID; пряме зіставлення імені користувача/slug потребує `channels.slack.dangerouslyAllowNameMatching: true`
+ - записи списку дозволених каналів і записи списку дозволених DM розпізнаються під час запуску, коли доступ токена це дозволяє
+ - нерозпізнані записи імен каналів зберігаються як налаштовані, але за замовчуванням ігноруються для маршрутизації
+ - вхідна авторизація та маршрутизація каналів за замовчуванням працюють передусім за ID; пряме зіставлення імен користувачів/слагів потребує `channels.slack.dangerouslyAllowNameMatching: true`
- Ключі на основі імен (`#channel-name` або `channel-name`) **не** збігаються за `groupPolicy: "allowlist"`. Пошук каналу типово спершу використовує ID, тому ключ на основі імені ніколи не маршрутизуватиметься успішно, а всі повідомлення в цьому каналі буде мовчки заблоковано. Це відрізняється від `groupPolicy: "open"`, де ключ каналу не потрібен для маршрутизації і ключ на основі імені виглядає робочим.
+ Ключі на основі імен (`#channel-name` або `channel-name`) **не** збігаються під `groupPolicy: "allowlist"`. Пошук каналу за замовчуванням працює передусім за ID, тому ключ на основі імені ніколи не маршрутизуватиметься успішно, а всі повідомлення в цьому каналі буде тихо заблоковано. Це відрізняється від `groupPolicy: "open"`, де ключ каналу не потрібен для маршрутизації, і ключ на основі імені здається робочим.
- Завжди використовуйте ID каналу Slack як ключ. Щоб його знайти: клацніть канал у Slack правою кнопкою → **Copy link** — ID (`C...`) буде в кінці URL.
+ Завжди використовуйте ID каналу Slack як ключ. Щоб знайти його: клацніть канал правою кнопкою в Slack → **Copy link** — ID (`C...`) з’являється в кінці URL.
Правильно:
@@ -561,7 +565,7 @@ OpenClaw за замовчуванням установлює тайм-аут po
}
```
- Неправильно (мовчки блокується за `groupPolicy: "allowlist"`):
+ Неправильно (тихо блокується під `groupPolicy: "allowlist"`):
```json5
{
@@ -580,16 +584,16 @@ OpenClaw за замовчуванням установлює тайм-аут po
- Повідомлення каналів типово пропускаються через шлюз згадок.
+ Повідомлення каналів за замовчуванням обмежені згадками.
Джерела згадок:
- явна згадка застосунку (`<@botId>`)
- згадка групи користувачів Slack (``), коли користувач-бот є учасником цієї групи користувачів; потребує `usergroups:read`
- - regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, резервно `messages.groupChat.mentionPatterns`)
- - неявна поведінка відповіді на потік бота (вимкнена, коли `thread.requireExplicitMention` дорівнює `true`)
+ - regex-шаблони згадок (`agents.list[].groupChat.mentionPatterns`, резервний варіант `messages.groupChat.mentionPatterns`)
+ - неявна поведінка відповіді в гілці на повідомлення бота (вимкнено, коли `thread.requireExplicitMention` дорівнює `true`)
- Поканальні елементи керування (`channels.slack.channels.`; імена лише через розв’язання під час запуску або `dangerouslyAllowNameMatching`):
+ Налаштування для кожного каналу (`channels.slack.channels.`; імена лише через зіставлення під час запуску або `dangerouslyAllowNameMatching`):
- `requireMention`
- `users` (список дозволених)
@@ -598,75 +602,75 @@ OpenClaw за замовчуванням установлює тайм-аут po
- `systemPrompt`
- `tools`, `toolsBySender`
- формат ключа `toolsBySender`: `id:`, `e164:`, `username:`, `name:` або wildcard `"*"`
- (застарілі ключі без префікса все ще зіставляються лише з `id:`)
+ (застарілі ключі без префікса досі зіставляються лише з `id:`)
- `allowBots` консервативний для каналів і приватних каналів: повідомлення кімнати, автором яких є бот, приймаються лише коли бот-відправник явно вказаний у списку дозволених `users` цієї кімнати або коли принаймні один явний ID власника Slack із `channels.slack.allowFrom` наразі є учасником кімнати. Wildcard і записи власників за відображуваним іменем не задовольняють присутність власника. Присутність власника використовує Slack `conversations.members`; переконайтеся, що застосунок має відповідну область читання для типу кімнати (`channels:read` для публічних каналів, `groups:read` для приватних каналів). Якщо пошук учасників не вдається, OpenClaw відкидає повідомлення кімнати, автором якого є бот.
+ `allowBots` є консервативним для каналів і приватних каналів: повідомлення кімнати, створені ботом, приймаються лише тоді, коли бот-відправник явно вказаний у списку дозволених `users` цієї кімнати, або коли принаймні один явний ID власника Slack із `channels.slack.allowFrom` зараз є учасником кімнати. Wildcard-и та записи власників за відображуваним ім’ям не задовольняють наявність власника. Наявність власника використовує Slack `conversations.members`; переконайтеся, що застосунок має відповідний read scope для типу кімнати (`channels:read` для публічних каналів, `groups:read` для приватних каналів). Якщо пошук учасників завершується невдало, OpenClaw відкидає повідомлення кімнати, створене ботом.
-## Потоки, сесії та теги відповіді
+## Гілки, сесії та теги відповідей
-- DM маршрутизуються як `direct`; канали як `channel`; MPIM як `group`.
-- Прив’язки маршрутів Slack приймають необроблені ID співрозмовників, а також цільові форми Slack, як-от `channel:C12345678`, `user:U12345678` і `<@U12345678>`.
-- За стандартного `session.dmScope=main` DM Slack згортаються до головної сесії агента.
+- DM-и маршрутизуються як `direct`; канали як `channel`; MPIM-и як `group`.
+- Прив’язки маршрутів Slack приймають необроблені ID співрозмовників, а також форми цілей Slack, як-от `channel:C12345678`, `user:U12345678` і `<@U12345678>`.
+- Із типовим `session.dmScope=main` DM-и Slack згортаються до головної сесії агента.
- Сесії каналів: `agent::slack:channel:`.
-- Відповіді в потоках можуть створювати суфікси потокових сесій (`:thread:`), коли це застосовно.
+- Відповіді в гілках можуть створювати суфікси сесій гілок (`:thread:`), коли це застосовно.
- Типове значення `channels.slack.thread.historyScope` — `thread`; типове значення `thread.inheritParent` — `false`.
-- `channels.slack.thread.initialHistoryLimit` керує тим, скільки наявних повідомлень потоку витягується під час запуску нової потокової сесії (типово `20`; задайте `0`, щоб вимкнути).
-- `channels.slack.thread.requireExplicitMention` (типово `false`): коли `true`, пригнічує неявні згадки в потоках, щоб бот відповідав лише на явні згадки `@bot` усередині потоків, навіть якщо бот уже брав участь у потоці. Без цього відповіді в потоці за участю бота обходять шлюз `requireMention`.
+- `channels.slack.thread.initialHistoryLimit` керує тим, скільки наявних повідомлень гілки отримується під час запуску нової сесії гілки (типово `20`; установіть `0`, щоб вимкнути).
+- `channels.slack.thread.requireExplicitMention` (типово `false`): коли `true`, пригнічує неявні згадки в гілці, щоб бот відповідав лише на явні згадки `@bot` усередині гілок, навіть якщо бот уже брав участь у гілці. Без цього відповіді в гілці, де брав участь бот, обходять обмеження `requireMention`.
-Елементи керування потоками відповідей:
+Налаштування гілок відповідей:
- `channels.slack.replyToMode`: `off|first|all|batched` (типово `off`)
- `channels.slack.replyToModeByChatType`: для кожного `direct|group|channel`
-- застаріле резервне значення для прямих чатів: `channels.slack.dm.replyToMode`
+- застарілий резервний варіант для прямих чатів: `channels.slack.dm.replyToMode`
-Підтримуються ручні теги відповіді:
+Підтримуються ручні теги відповідей:
- `[[reply_to_current]]`
- `[[reply_to:]]`
-`replyToMode="off"` вимикає **всі** потоки відповідей у Slack, включно з явними тегами `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги все ще враховуються в режимі `"off"`. Потоки Slack приховують повідомлення з каналу, тоді як відповіді Telegram лишаються видимими в рядку.
+`replyToMode="off"` вимикає **всі** гілки відповідей у Slack, включно з явними тегами `[[reply_to_*]]`. Це відрізняється від Telegram, де явні теги все ще враховуються в режимі `"off"`. Гілки Slack приховують повідомлення з каналу, тоді як відповіді Telegram залишаються видимими inline.
## Реакції підтвердження
-`ackReaction` надсилає emoji підтвердження, поки OpenClaw обробляє вхідне повідомлення.
+`ackReaction` надсилає емодзі підтвердження, поки OpenClaw обробляє вхідне повідомлення.
-Порядок розв’язання:
+Порядок визначення:
- `channels.slack.accounts..ackReaction`
- `channels.slack.ackReaction`
- `messages.ackReaction`
-- резервне emoji ідентичності агента (`agents.list[].identity.emoji`, інакше "👀")
+- резервний емодзі ідентичності агента (`agents.list[].identity.emoji`, інакше "👀")
Примітки:
-- Slack очікує короткі коди (наприклад, `"eyes"`).
+- Slack очікує shortcodes (наприклад, `"eyes"`).
- Використовуйте `""`, щоб вимкнути реакцію для облікового запису Slack або глобально.
-## Потокова передача тексту
+## Потокове передавання тексту
`channels.slack.streaming` керує поведінкою live preview:
-- `off`: вимкнути потокову передачу live preview.
+- `off`: вимкнути потокове передавання live preview.
- `partial` (типово): замінювати текст попереднього перегляду найновішим частковим виводом.
- `block`: додавати фрагментовані оновлення попереднього перегляду.
-- `progress`: показувати текст стану прогресу під час генерації, а потім надсилати фінальний текст.
-- `streaming.preview.toolProgress`: коли чернетковий попередній перегляд активний, маршрутизувати оновлення інструментів/прогресу до того самого редагованого повідомлення попереднього перегляду (типово: `true`). Задайте `false`, щоб зберігати окремі повідомлення інструментів/прогресу.
+- `progress`: показувати текст статусу прогресу під час генерації, а потім надіслати фінальний текст.
+- `streaming.preview.toolProgress`: коли чернетковий попередній перегляд активний, спрямовувати оновлення інструментів/прогресу в те саме редаговане повідомлення попереднього перегляду (типово: `true`). Установіть `false`, щоб зберігати окремі повідомлення інструментів/прогресу.
-`channels.slack.streaming.nativeTransport` керує нативною потоковою передачею тексту Slack, коли `channels.slack.streaming.mode` дорівнює `partial` (типово: `true`).
+`channels.slack.streaming.nativeTransport` керує нативним потоковим передаванням тексту Slack, коли `channels.slack.streaming.mode` дорівнює `partial` (типово: `true`).
-- Потік відповіді має бути доступний, щоб з’явилися нативна потокова передача тексту та стан потоку асистента Slack. Вибір потоку все ще відповідає `replyToMode`.
-- Корені каналів, групових чатів і DM верхнього рівня все ще можуть використовувати звичайний чернетковий попередній перегляд, коли нативна потокова передача недоступна або немає потоку відповіді.
-- DM Slack верхнього рівня типово лишаються поза потоком, тому вони не показують нативний потоковий/статусний попередній перегляд Slack у стилі потоку; натомість OpenClaw публікує й редагує чернетковий попередній перегляд у DM.
-- Медіа та нетекстові payload повертаються до звичайної доставки.
-- Фінальні медіа/помилки скасовують очікувані редагування попереднього перегляду; відповідні фінальні тексти/блоки скидаються лише коли можуть редагувати попередній перегляд на місці.
-- Якщо потокова передача переривається посеред відповіді, OpenClaw повертається до звичайної доставки для решти payload.
+- Для появи нативного потокового передавання тексту та статусу гілки помічника Slack має бути доступна гілка відповіді. Вибір гілки все ще відповідає `replyToMode`.
+- Корені каналів, групових чатів і DM верхнього рівня все ще можуть використовувати звичайний чернетковий попередній перегляд, коли нативне потокове передавання недоступне або гілки відповіді не існує.
+- DM-и Slack верхнього рівня типово залишаються поза гілками, тому вони не показують нативний stream/status preview у стилі гілок Slack; натомість OpenClaw публікує й редагує чернетковий попередній перегляд у DM.
+- Медіа та нетекстові payload-и повертаються до звичайної доставки.
+- Фінали медіа/помилок скасовують очікувані редагування попереднього перегляду; придатні фінали тексту/блоків скидаються лише тоді, коли можуть відредагувати попередній перегляд на місці.
+- Якщо потокове передавання завершується невдало посеред відповіді, OpenClaw повертається до звичайної доставки для решти payload-ів.
-Використовуйте чернетковий попередній перегляд замість нативної потокової передачі тексту Slack:
+Використовуйте чернетковий попередній перегляд замість нативного потокового передавання тексту Slack:
```json5
{
@@ -684,57 +688,57 @@ OpenClaw за замовчуванням установлює тайм-аут po
Застарілі ключі:
- `channels.slack.streamMode` (`replace | status_final | append`) автоматично мігрується до `channels.slack.streaming.mode`.
-- boolean `channels.slack.streaming` автоматично мігрується до `channels.slack.streaming.mode` і `channels.slack.streaming.nativeTransport`.
+- булевий `channels.slack.streaming` автоматично мігрується до `channels.slack.streaming.mode` і `channels.slack.streaming.nativeTransport`.
- застарілий `channels.slack.nativeStreaming` автоматично мігрується до `channels.slack.streaming.nativeTransport`.
## Резервна реакція набору тексту
-`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення запуску. Це найкорисніше поза відповідями в потоках, які використовують типовий індикатор стану "is typing...".
+`typingReaction` додає тимчасову реакцію до вхідного повідомлення Slack, поки OpenClaw обробляє відповідь, а потім видаляє її після завершення запуску. Це найкорисніше поза відповідями в гілках, які використовують типовий індикатор статусу "is typing...".
-Порядок розв’язання:
+Порядок визначення:
- `channels.slack.accounts..typingReaction`
- `channels.slack.typingReaction`
Примітки:
-- Slack очікує короткі коди (наприклад, `"hourglass_flowing_sand"`).
-- Реакція виконується за принципом best-effort, а очищення автоматично запускається після завершення відповіді або шляху помилки.
+- Slack очікує shortcodes (наприклад, `"hourglass_flowing_sand"`).
+- Реакція виконується best-effort, а очищення автоматично запускається після завершення відповіді або шляху помилки.
## Медіа, фрагментація та доставка
- Файлові вкладення Slack завантажуються з приватних URL-адрес, розміщених у Slack (потік запитів з автентифікацією токеном), і записуються до медіасховища, коли отримання успішне й обмеження розміру це дозволяють. Заповнювачі файлів містять Slack `fileId`, щоб агенти могли отримати оригінальний файл за допомогою `download-file`.
+ Файлові вкладення Slack завантажуються з приватних URL, розміщених у Slack (потік запиту з автентифікацією токеном), і записуються до сховища медіа, коли отримання успішне й обмеження розміру це дозволяють. Плейсхолдери файлів містять Slack `fileId`, щоб агенти могли отримати оригінальний файл за допомогою `download-file`.
- Завантаження використовують обмежені тайм-аути простою та загального часу. Якщо отримання файлу Slack зависає або завершується помилкою, OpenClaw продовжує обробляти повідомлення й повертається до заповнювача файлу.
+ Завантаження використовують обмежені тайм-аути бездіяльності та загального часу. Якщо отримання файла Slack зависає або завершується помилкою, OpenClaw продовжує обробляти повідомлення й повертається до заповнювача файла.
- Стандартне обмеження розміру для вхідних даних під час виконання становить `20MB`, якщо його не перевизначено через `channels.slack.mediaMaxMb`.
+ Обмеження розміру вхідних даних під час виконання за замовчуванням становить `20MB`, якщо його не перевизначено через `channels.slack.mediaMaxMb`.
- текстові фрагменти використовують `channels.slack.textChunkLimit` (за замовчуванням 4000)
- - `channels.slack.chunkMode="newline"` вмикає поділ із пріоритетом абзаців
- - надсилання файлів використовує API завантаження Slack і може включати відповіді в гілках (`thread_ts`)
- - обмеження вихідних медіа відповідає `channels.slack.mediaMaxMb`, якщо налаштовано; інакше надсилання через канал використовує стандартні значення за типом MIME з медіаконвеєра
+ - `channels.slack.chunkMode="newline"` вмикає розбиття з пріоритетом абзаців
+ - надсилання файлів використовує API завантаження Slack і може включати відповіді в тредах (`thread_ts`)
+ - обмеження вихідних медіа дотримується `channels.slack.mediaMaxMb`, коли це налаштовано; інакше надсилання в канали використовує стандартні значення MIME-типів із медіаконвеєра
Бажані явні цілі:
- - `user:` для DM-повідомлень
+ - `user:` для DM
- `channel:` для каналів
- Текстові або блокові DM-повідомлення Slack можуть публікуватися безпосередньо за ідентифікаторами користувачів; завантаження файлів і надсилання в гілках спочатку відкривають DM через API розмов Slack, оскільки ці шляхи потребують конкретного ідентифікатора розмови.
+ Текстові або лише блочні Slack DM можуть публікуватися безпосередньо в ідентифікатори користувачів; завантаження файлів і надсилання в треди спочатку відкривають DM через API розмов Slack, оскільки ці шляхи потребують конкретного ідентифікатора розмови.
## Команди та поведінка slash-команд
-Slash-команди з’являються у Slack або як одна налаштована команда, або як кілька нативних команд. Налаштуйте `channels.slack.slashCommand`, щоб змінити стандартні параметри команд:
+Slash-команди з'являються в Slack або як одна налаштована команда, або як кілька нативних команд. Налаштуйте `channels.slack.slashCommand`, щоб змінити стандартні параметри команд:
- `enabled: false`
- `name: "openclaw"`
@@ -745,7 +749,7 @@ Slash-команди з’являються у Slack або як одна на
/openclaw /help
```
-Нативні команди потребують [додаткових налаштувань маніфесту](#additional-manifest-settings) у вашому застосунку Slack і натомість вмикаються через `channels.slack.commands.native: true` або `commands.native: true` у глобальних конфігураціях.
+Нативні команди потребують [додаткових налаштувань маніфесту](#additional-manifest-settings) у вашій програмі Slack і натомість вмикаються через `channels.slack.commands.native: true` або `commands.native: true` у глобальних конфігураціях.
- Автоматичний режим нативних команд **вимкнено** для Slack, тому `commands.native: "auto"` не вмикає нативні команди Slack.
@@ -753,22 +757,22 @@ Slash-команди з’являються у Slack або як одна на
/help
```
-Меню нативних аргументів використовують адаптивну стратегію рендерингу, яка показує модальне вікно підтвердження перед передаванням вибраного значення опції:
+Меню нативних аргументів використовують адаптивну стратегію відображення, яка показує модальне підтвердження перед передаванням вибраного значення параметра:
-- до 5 опцій: блоки кнопок
-- 6-100 опцій: статичне меню вибору
-- понад 100 опцій: зовнішній вибір з асинхронним фільтруванням опцій, коли доступні обробники опцій інтерактивності
-- перевищено обмеження Slack: закодовані значення опцій повертаються до кнопок
+- до 5 параметрів: блоки кнопок
+- 6-100 параметрів: статичне меню вибору
+- понад 100 параметрів: зовнішній вибір з асинхронною фільтрацією параметрів, коли доступні обробники параметрів інтерактивності
+- перевищено обмеження Slack: закодовані значення параметрів повертаються до кнопок
```txt
/think
```
-Slash-сесії використовують ізольовані ключі на кшталт `agent::slack:slash:` і все одно спрямовують виконання команд до цільової сесії розмови за допомогою `CommandTargetSessionKey`.
+Slash-сеанси використовують ізольовані ключі на кшталт `agent::slack:slash:` і все одно спрямовують виконання команд до цільового сеансу розмови за допомогою `CommandTargetSessionKey`.
## Інтерактивні відповіді
-Slack може рендерити створені агентом інтерактивні елементи керування відповіддю, але ця функція за замовчуванням вимкнена.
+Slack може відображати створені агентом інтерактивні елементи керування відповідями, але ця функція за замовчуванням вимкнена.
Увімкніть її глобально:
@@ -802,44 +806,44 @@ Slack може рендерити створені агентом інтерак
}
```
-Коли ввімкнено, агенти можуть створювати директиви відповідей лише для Slack:
+Коли це ввімкнено, агенти можуть надсилати директиви відповідей лише для Slack:
- `[[slack_buttons: Approve:approve, Reject:reject]]`
- `[[slack_select: Choose a target | Canary:canary, Production:production]]`
-Ці директиви компілюються у Slack Block Kit і спрямовують кліки або вибори назад через наявний шлях подій взаємодії Slack.
+Ці директиви компілюються в Slack Block Kit і спрямовують кліки або вибори назад через наявний шлях подій взаємодії Slack.
Примітки:
-- Це інтерфейс, специфічний для Slack. Інші канали не перетворюють директиви Slack Block Kit на власні системи кнопок.
-- Значення інтерактивних callback є непрозорими токенами, згенерованими OpenClaw, а не сирими значеннями, створеними агентом.
-- Якщо згенеровані інтерактивні блоки перевищуватимуть обмеження Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання недійсного payload блоків.
+- Це UI, специфічний для Slack. Інші канали не перетворюють директиви Slack Block Kit на власні системи кнопок.
+- Значення інтерактивних callback-ів є непрозорими токенами, згенерованими OpenClaw, а не сирими значеннями, створеними агентом.
+- Якщо згенеровані інтерактивні блоки перевищили б обмеження Slack Block Kit, OpenClaw повертається до початкової текстової відповіді замість надсилання недійсного payload блоків.
-## Підтвердження виконання у Slack
+## Схвалення виконання в Slack
-Slack може працювати як нативний клієнт підтверджень з інтерактивними кнопками та взаємодіями, замість повернення до вебінтерфейсу або термінала.
+Slack може діяти як нативний клієнт схвалення з інтерактивними кнопками та взаємодіями замість повернення до веб-UI або термінала.
-- Підтвердження виконання використовують `channels.slack.execApprovals.*` для нативної маршрутизації DM/каналів.
-- Підтвердження Plugin усе ще можуть оброблятися через ту саму нативну поверхню кнопок Slack, коли запит уже потрапляє в Slack, а тип ідентифікатора підтвердження є `plugin:`.
-- Авторизація підтверджувача й далі примусово застосовується: лише користувачі, визначені як підтверджувачі, можуть схвалювати або відхиляти запити через Slack.
+- Схвалення виконання використовують `channels.slack.execApprovals.*` для нативного маршрутування DM/каналу.
+- Схвалення Plugin все одно можуть розв'язуватися через ту саму нативну для Slack поверхню кнопок, коли запит уже потрапляє в Slack, а тип ідентифікатора схвалення — `plugin:`.
+- Авторизація схвалювача все одно застосовується: лише користувачі, визначені як схвалювачі, можуть схвалювати або відхиляти запити через Slack.
-Це використовує ту саму спільну поверхню кнопок підтвердження, що й інші канали. Коли `interactivity` увімкнено в налаштуваннях вашого застосунку Slack, запити підтвердження рендеряться як кнопки Block Kit безпосередньо в розмові.
-Коли ці кнопки присутні, вони є основним UX підтвердження; OpenClaw
-має включати ручну команду `/approve` лише тоді, коли результат інструмента повідомляє, що підтвердження в чаті
-недоступні або ручне підтвердження є єдиним шляхом.
+Це використовує ту саму спільну поверхню кнопок схвалення, що й інші канали. Коли `interactivity` увімкнено в налаштуваннях вашої програми Slack, запити схвалення відображаються як кнопки Block Kit безпосередньо в розмові.
+Коли ці кнопки присутні, вони є основним UX схвалення; OpenClaw
+має включати ручну команду `/approve` лише тоді, коли результат інструмента каже, що схвалення
+в чаті недоступні або ручне схвалення є єдиним шляхом.
Шлях конфігурації:
- `channels.slack.execApprovals.enabled`
-- `channels.slack.execApprovals.approvers` (необов’язково; за можливості повертається до `commands.ownerAllowFrom`)
+- `channels.slack.execApprovals.approvers` (необов'язково; за можливості повертається до `commands.ownerAllowFrom`)
- `channels.slack.execApprovals.target` (`dm` | `channel` | `both`, за замовчуванням: `dm`)
- `agentFilter`, `sessionFilter`
-Slack автоматично вмикає власні схвалення exec, коли `enabled` не задано або має значення `"auto"` і визначено принаймні одного
-схвалювача. Установіть `enabled: false`, щоб явно вимкнути Slack як власний клієнт схвалень.
-Установіть `enabled: true`, щоб примусово ввімкнути власні схвалення, коли схвалювачів визначено.
+Slack автоматично вмикає нативні схвалення виконання, коли `enabled` не задано або має значення `"auto"`, і щонайменше один
+схвалювач розв'язується. Установіть `enabled: false`, щоб явно вимкнути Slack як нативний клієнт схвалення.
+Установіть `enabled: true`, щоб примусово ввімкнути нативні схвалення, коли схвалювачі розв'язуються.
-Поведінка за замовчуванням без явної конфігурації схвалень Slack exec:
+Стандартна поведінка без явної конфігурації схвалення виконання Slack:
```json5
{
@@ -849,8 +853,8 @@ Slack автоматично вмикає власні схвалення exec,
}
```
-Явна власна конфігурація Slack потрібна лише тоді, коли потрібно перевизначити схвалювачів, додати фільтри або
-ввімкнути доставлення до початкового чату:
+Явна нативна конфігурація Slack потрібна лише тоді, коли ви хочете перевизначити схвалювачів, додати фільтри або
+увімкнути доставку в початковий чат:
```json5
{
@@ -866,25 +870,25 @@ Slack автоматично вмикає власні схвалення exec,
}
```
-Спільне пересилання `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити на схвалення exec також мають
-спрямовуватися в інші чати або явні позаканальні цілі. Спільне пересилання `approvals.plugin` також
-є окремим; власні кнопки Slack усе ще можуть обробляти схвалення Plugin, коли ці запити вже надходять
+Спільне переспрямування `approvals.exec` є окремим. Використовуйте його лише тоді, коли запити схвалення виконання також мають
+спрямовуватися до інших чатів або явних позасмугових цілей. Спільне переспрямування `approvals.plugin` також
+окреме; нативні кнопки Slack усе одно можуть розв'язувати схвалення Plugin, коли ці запити вже потрапляють
у Slack.
-Команда `/approve` у тому самому чаті також працює в каналах Slack і DM, які вже підтримують команди. Див. [Схвалення exec](/uk/tools/exec-approvals) для повної моделі пересилання схвалень.
+Одночатова команда `/approve` також працює в каналах Slack і DM, які вже підтримують команди. Див. [Схвалення виконання](/uk/tools/exec-approvals), щоб ознайомитися з повною моделлю переспрямування схвалень.
## Події та операційна поведінка
-- Редагування/видалення повідомлень зіставляються із системними подіями.
-- Трансляції гілок (відповіді в гілках із "Also send to channel") обробляються як звичайні повідомлення користувача.
+- Редагування й видалення повідомлень зіставляються із системними подіями.
+- Трансляції тредів (відповіді в тредах "Also send to channel") обробляються як звичайні повідомлення користувача.
- Події додавання/видалення реакцій зіставляються із системними подіями.
-- Події входу/виходу учасника, створення/перейменування каналу та додавання/видалення закріплення зіставляються із системними подіями.
+- Події приєднання/виходу учасника, створення/перейменування каналу та додавання/видалення закріплення зіставляються із системними подіями.
- `channel_id_changed` може мігрувати ключі конфігурації каналу, коли ввімкнено `configWrites`.
-- Метадані теми/призначення каналу вважаються ненадійним контекстом і можуть бути впроваджені в контекст маршрутизації.
-- Початкове повідомлення гілки та початкове заповнення контексту історії гілки фільтруються за налаштованими списками дозволених відправників, коли це застосовно.
-- Дії блоків і модальні взаємодії генерують структуровані системні події `Slack interaction: ...` із розширеними полями корисного навантаження:
- - дії блоків: вибрані значення, мітки, значення вибирачів і метадані `workflow_*`
- - події модального вікна `view_submission` і `view_closed` з метаданими маршрутизованого каналу та введенням форм
+- Метадані теми/призначення каналу вважаються ненадійним контекстом і можуть вводитися в контекст маршрутизації.
+- Початкове повідомлення треду й початкове засівання контексту історії треду фільтруються налаштованими allowlist-ами відправників, коли це застосовно.
+- Дії блоків і модальні взаємодії випускають структуровані системні події `Slack interaction: ...` з багатими полями payload:
+ - дії блоків: вибрані значення, мітки, значення picker-ів і метадані `workflow_*`
+ - події модальних `view_submission` і `view_closed` з маршрутизованими метаданими каналу та введеними даними форми
## Довідник конфігурації
@@ -895,9 +899,9 @@ Slack автоматично вмикає власні схвалення exec,
- режим/автентифікація: `mode`, `botToken`, `appToken`, `signingSecret`, `webhookPath`, `accounts.*`
- доступ до DM: `dm.enabled`, `dmPolicy`, `allowFrom` (застаріле: `dm.policy`, `dm.allowFrom`), `dm.groupEnabled`, `dm.groupChannels`
- перемикач сумісності: `dangerouslyAllowNameMatching` (аварійний; залишайте вимкненим, якщо не потрібно)
-- доступ до каналу: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
-- гілки/історія: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
-- доставлення: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
+- доступ до каналів: `groupPolicy`, `channels.*`, `channels.*.users`, `channels.*.requireMention`
+- треди/історія: `replyToMode`, `replyToModeByChatType`, `thread.*`, `historyLimit`, `dmHistoryLimit`, `dms.*.historyLimit`
+- доставка: `textChunkLimit`, `chunkMode`, `mediaMaxMb`, `streaming`, `streaming.nativeTransport`, `streaming.preview.toolProgress`
- операції/функції: `configWrites`, `commands.native`, `slashCommand.*`, `actions.*`, `userToken`, `userTokenReadOnly`
@@ -906,12 +910,12 @@ Slack автоматично вмикає власні схвалення exec,
- Перевірте в такому порядку:
+ Перевірте по черзі:
- `groupPolicy`
- - список дозволених каналів (`channels.slack.channels`) — **ключі мають бути ідентифікаторами каналів** (`C12345678`), а не назвами (`#channel-name`). Ключі на основі назв тихо не спрацьовують із `groupPolicy: "allowlist"`, тому що маршрутизація каналів за замовчуванням насамперед використовує ідентифікатор. Щоб знайти ідентифікатор: клацніть канал у Slack правою кнопкою миші → **Copy link** — значення `C...` наприкінці URL є ідентифікатором каналу.
+ - allowlist каналу (`channels.slack.channels`) — **ключі мають бути ідентифікаторами каналів** (`C12345678`), а не назвами (`#channel-name`). Ключі на основі назв непомітно не спрацьовують із `groupPolicy: "allowlist"`, оскільки маршрутизація каналів за замовчуванням спершу використовує ідентифікатори. Щоб знайти ідентифікатор: клацніть канал у Slack правою кнопкою → **Copy link** — значення `C...` наприкінці URL є ідентифікатором каналу.
- `requireMention`
- - список дозволених `users` для окремого каналу
+ - поканальний allowlist `users`
Корисні команди:
@@ -928,10 +932,10 @@ openclaw doctor
- `channels.slack.dm.enabled`
- `channels.slack.dmPolicy` (або застаріле `channels.slack.dm.policy`)
- - схвалення сполучення / записи списку дозволених
+ - схвалення спарювання / записи allowlist
- події DM Slack Assistant: докладні журнали зі згадкою `drop message_changed`
- зазвичай означають, що Slack надіслав подію відредагованої гілки Assistant без
- відновлюваного відправника-людини в метаданих повідомлення
+ зазвичай означають, що Slack надіслав відредаговану подію треду Assistant без
+ відновлюваного людського відправника в метаданих повідомлення
```bash
openclaw pairing list slack
@@ -940,71 +944,71 @@ openclaw pairing list slack
- Перевірте токени бота й застосунку та ввімкнення Socket Mode у налаштуваннях застосунку Slack.
+ Перевірте токени бота й програми, а також увімкнення Socket Mode у налаштуваннях програми Slack.
Якщо `openclaw channels status --probe --json` показує `botTokenStatus` або
`appTokenStatus: "configured_unavailable"`, обліковий запис Slack
- налаштовано, але поточне середовище виконання не змогло визначити значення,
- підтримане SecretRef.
+ налаштований, але поточне середовище виконання не змогло розв'язати значення,
+ підкріплене SecretRef.
Перевірте:
- - секрет підписування
+ - signing secret
- шлях Webhook
- - URL запитів Slack (події + інтерактивність + Slash Commands)
- - унікальний `webhookPath` для кожного облікового запису HTTP
+ - Slack Request URLs (Events + Interactivity + Slash Commands)
+ - унікальний `webhookPath` для кожного HTTP-облікового запису
- Якщо `signingSecretStatus: "configured_unavailable"` з’являється у знімках
- облікового запису, обліковий запис HTTP налаштовано, але поточне середовище
- виконання не змогло визначити секрет підписування, підтриманий SecretRef.
+ Якщо `signingSecretStatus: "configured_unavailable"` з'являється у знімках
+ облікових записів, HTTP-обліковий запис налаштований, але поточне середовище виконання не змогло
+ розв'язати signing secret, підкріплений SecretRef.
-
- Перевірте, що саме ви планували:
+
+ Перевірте, що саме ви мали на увазі:
- - режим власних команд (`channels.slack.commands.native: true`) із відповідними slash-командами, зареєстрованими в Slack
+ - режим нативних команд (`channels.slack.commands.native: true`) з відповідними slash-командами, зареєстрованими в Slack
- або режим однієї slash-команди (`channels.slack.slashCommand.enabled: true`)
- Також перевірте `commands.useAccessGroups` і списки дозволених каналів/користувачів.
+ Також перевірте `commands.useAccessGroups` і allowlist-и каналів/користувачів.
## Довідник зору для вкладень
-Slack може додавати завантажені медіа до ходу агента, коли завантаження файлів Slack успішне й обмеження розміру це дозволяють. Файли зображень можна передавати через шлях розуміння медіа або безпосередньо до моделі відповіді з підтримкою зору; інші файли зберігаються як контекст завантажуваного файлу, а не обробляються як вхідне зображення.
+Slack може прикріплювати завантажені медіа до ходу агента, коли завантаження файлів Slack успішні й обмеження розміру це дозволяють. Файли зображень можуть передаватися через шлях розуміння медіа або безпосередньо до моделі відповіді з підтримкою зору; інші файли зберігаються як контекст завантажуваних файлів, а не обробляються як вхідні зображення.
### Підтримувані типи медіа
-| Тип медіа | Джерело | Поточна поведінка | Примітки |
-| ------------------------------ | -------------------- | ---------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
-| Зображення JPEG / PNG / GIF / WebP | URL файлу Slack | Завантажується й додається до ходу для обробки моделями з підтримкою зображень | Ліміт на файл: `channels.slack.mediaMaxMb` (за замовчуванням 20 MB) |
-| PDF-файли | URL файлу Slack | Завантажується й надається як файловий контекст для інструментів, як-от `download-file` або `pdf` | Вхідні повідомлення Slack не перетворюють PDF на вхід для аналізу зображень автоматично |
-| Інші файли | URL файлу Slack | Завантажуються, коли це можливо, і надаються як файловий контекст | Бінарні файли не розглядаються як вхідні зображення |
-| Відповіді в треді | Файли початкового повідомлення треду | Файли кореневого повідомлення можуть бути підвантажені як контекст, коли відповідь не має власних медіа | Для початкових повідомлень лише з файлами використовується заповнювач вкладення |
-| Повідомлення з кількома зображеннями | Кілька файлів Slack | Кожен файл оцінюється незалежно | Обробка Slack обмежена вісьмома файлами на повідомлення |
+| Тип медіа | Джерело | Поточна поведінка | Примітки |
+| ------------------------------ | -------------------- | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
+| Зображення JPEG / PNG / GIF / WebP | URL файлу Slack | Завантажуються й прикріплюються до ходу для обробки з підтримкою бачення | Обмеження на файл: `channels.slack.mediaMaxMb` (типово 20 MB) |
+| PDF-файли | URL файлу Slack | Завантажуються й надаються як файловий контекст для інструментів, таких як `download-file` або `pdf` | Вхідний Slack не перетворює PDF на вхідні дані для бачення зображень автоматично |
+| Інші файли | URL файлу Slack | Завантажуються, коли це можливо, і надаються як файловий контекст | Двійкові файли не обробляються як вхідні зображення |
+| Відповіді в треді | Файли початкового повідомлення треду | Файли кореневого повідомлення можуть бути гідровані як контекст, коли відповідь не має безпосередніх медіа | Початкові повідомлення лише з файлами використовують заповнювач вкладення |
+| Повідомлення з кількома зображеннями | Кілька файлів Slack | Кожен файл оцінюється незалежно | Обробка Slack обмежена вісьмома файлами на повідомлення |
### Вхідний конвеєр
Коли надходить повідомлення Slack із файловими вкладеннями:
-1. OpenClaw завантажує файл із приватної URL-адреси Slack за допомогою токена бота (`xoxb-...`).
-2. У разі успіху файл записується до сховища медіа.
-3. Завантажені шляхи медіа та типи вмісту додаються до вхідного контексту.
+1. OpenClaw завантажує файл із приватного URL Slack, використовуючи токен бота (`xoxb-...`).
+2. Після успіху файл записується до сховища медіа.
+3. Шляхи завантажених медіа та типи вмісту додаються до вхідного контексту.
4. Шляхи моделей/інструментів із підтримкою зображень можуть використовувати вкладення зображень із цього контексту.
5. Файли, що не є зображеннями, залишаються доступними як файлові метадані або посилання на медіа для інструментів, які можуть їх обробляти.
-### Успадкування вкладень кореня треду
+### Наслідування вкладень кореня треду
Коли повідомлення надходить у тред (має батьківський `thread_ts`):
-- Якщо сама відповідь не має безпосередніх медіа, а включене кореневе повідомлення має файли, Slack може підвантажити кореневі файли як контекст початкового повідомлення треду.
+- Якщо сама відповідь не має безпосередніх медіа, а включене кореневе повідомлення має файли, Slack може гідрувати кореневі файли як контекст початкового повідомлення треду.
- Безпосередні вкладення відповіді мають пріоритет над вкладеннями кореневого повідомлення.
-- Кореневе повідомлення, яке має лише файли й не має тексту, представляється із заповнювачем вкладення, щоб резервний шлях усе одно міг включити його файли.
+- Кореневе повідомлення, яке має лише файли й не має тексту, представляється заповнювачем вкладення, щоб резервний варіант усе одно міг включити його файли.
### Обробка кількох вкладень
@@ -1015,27 +1019,27 @@ Slack може додавати завантажені медіа до ходу
- Порядок обробки відповідає порядку файлів Slack у корисному навантаженні події.
- Помилка завантаження одного вкладення не блокує інші.
-### Обмеження розміру, завантаження та моделей
+### Обмеження розміру, завантаження та моделі
-- **Ліміт розміру**: За замовчуванням 20 MB на файл. Налаштовується через `channels.slack.mediaMaxMb`.
-- **Помилки завантаження**: Файли, які Slack не може віддати, прострочені URL-адреси, недоступні файли, завеликі файли та HTML-відповіді автентифікації/входу Slack пропускаються, а не повідомляються як непідтримувані формати.
-- **Модель для зображень**: Аналіз зображень використовує активну модель відповіді, якщо вона підтримує зображення, або модель зображень, налаштовану в `agents.defaults.imageModel`.
+- **Обмеження розміру**: типово 20 MB на файл. Налаштовується через `channels.slack.mediaMaxMb`.
+- **Помилки завантаження**: файли, які Slack не може надати, протерміновані URL, недоступні файли, завеликі файли та HTML-відповіді автентифікації/входу Slack пропускаються, а не повідомляються як непідтримувані формати.
+- **Модель бачення**: аналіз зображень використовує активну модель відповіді, коли вона підтримує бачення, або модель зображень, налаштовану в `agents.defaults.imageModel`.
### Відомі обмеження
-| Сценарій | Поточна поведінка | Обхідний шлях |
-| -------------------------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
-| Прострочена URL-адреса файлу Slack | Файл пропускається; помилка не показується | Повторно завантажте файл у Slack |
-| Модель для зображень не налаштована | Вкладення зображень зберігаються як посилання на медіа, але не аналізуються як зображення | Налаштуйте `agents.defaults.imageModel` або використовуйте модель відповіді з підтримкою зображень |
-| Дуже великі зображення (> 20 MB за замовчуванням) | Пропускаються відповідно до ліміту розміру | Збільште `channels.slack.mediaMaxMb`, якщо Slack дозволяє |
-| Переслані/поширені вкладення | Текст і медіа зображень/файлів, розміщені в Slack, обробляються за принципом найкращої спроби | Повторно поділіться безпосередньо в треді OpenClaw |
-| PDF-вкладення | Зберігаються як файловий/медійний контекст, але не маршрутизуються автоматично через аналіз зображень | Використовуйте `download-file` для файлових метаданих або інструмент `pdf` для аналізу PDF |
+| Сценарій | Поточна поведінка | Обхідний шлях |
+| -------------------------------------- | ---------------------------------------------------------------------------- | -------------------------------------------------------------------------- |
+| Протермінований URL файлу Slack | Файл пропущено; помилка не показується | Повторно завантажте файл у Slack |
+| Модель бачення не налаштована | Вкладення зображень зберігаються як посилання на медіа, але не аналізуються як зображення | Налаштуйте `agents.defaults.imageModel` або використовуйте модель відповіді з підтримкою бачення |
+| Дуже великі зображення (> 20 MB типово) | Пропускаються через обмеження розміру | Збільште `channels.slack.mediaMaxMb`, якщо Slack дозволяє |
+| Переслані/поширені вкладення | Текст і розміщені у Slack медіа зображень/файлів обробляються за принципом найкращого зусилля | Повторно поширте безпосередньо в треді OpenClaw |
+| PDF-вкладення | Зберігаються як файловий/медійний контекст, не маршрутизуються автоматично через бачення зображень | Використовуйте `download-file` для файлових метаданих або інструмент `pdf` для аналізу PDF |
### Пов’язана документація
- [Конвеєр розуміння медіа](/uk/nodes/media-understanding)
- [Інструмент PDF](/uk/tools/pdf)
-- Епік: [#51349](https://github.com/openclaw/openclaw/issues/51349) — увімкнення аналізу зображень у вкладеннях Slack
+- Епік: [#51349](https://github.com/openclaw/openclaw/issues/51349) — увімкнення бачення вкладень Slack
- Регресійні тести: [#51353](https://github.com/openclaw/openclaw/issues/51353)
- Жива перевірка: [#51354](https://github.com/openclaw/openclaw/issues/51354)
@@ -1043,19 +1047,19 @@ Slack може додавати завантажені медіа до ходу
- Зв’яжіть користувача Slack із Gateway.
+ З’єднайте користувача Slack із gateway.
- Поведінка каналів і групових DM.
+ Поведінка каналу та групових DM.
- Спрямовуйте вхідні повідомлення агентам.
+ Маршрутизуйте вхідні повідомлення до агентів.
Модель загроз і посилення захисту.
- Структура конфігурації та пріоритети.
+ Структура конфігурації та пріоритетність.
Каталог команд і поведінка.