diff --git a/docs/uk/channels/irc.md b/docs/uk/channels/irc.md index 752507147..e82fa7fa2 100644 --- a/docs/uk/channels/irc.md +++ b/docs/uk/channels/irc.md @@ -1,19 +1,19 @@ --- read_when: - - Ви хочете підключити OpenClaw до IRC-каналів або приватних повідомлень - - Ви налаштовуєте IRC allowlist-и, політику груп або шлюзування за згадками + - Ви хочете підключити OpenClaw до каналів IRC або приватних повідомлень + - Ви налаштовуєте списки дозволених для IRC, політику груп або контроль згадок summary: Налаштування IRC Plugin, керування доступом і усунення несправностей title: IRC x-i18n: - generated_at: "2026-04-23T20:44:04Z" - model: gpt-5.4 + generated_at: "2026-05-04T00:58:56Z" + model: gpt-5.5 provider: openai - source_hash: 76f316c0f026d0387a97dc5dcb6d8967f6e4841d94b95b36e42f6f6284882a69 + source_hash: 43c3098fe49a5e7405443df73e1bf752a579460dc0b2070c3d07f43b512bb555 source_path: channels/irc.md - workflow: 15 + workflow: 16 --- -Використовуйте IRC, коли хочете підключити OpenClaw до класичних каналів (`#room`) і приватних повідомлень. +Використовуйте IRC, коли вам потрібен OpenClaw у класичних каналах (`#room`) і прямих повідомленнях. IRC постачається як вбудований Plugin, але налаштовується в основній конфігурації в `channels.irc`. ## Швидкий старт @@ -36,50 +36,51 @@ IRC постачається як вбудований Plugin, але налаш } ``` -Для координації ботів бажано використовувати приватний IRC-сервер. Якщо ви свідомо використовуєте публічну IRC-мережу, поширені варіанти включають Libera.Chat, OFTC і Snoonet. Уникайте передбачуваних публічних каналів для бекканального трафіку бота або swarm. +Для координації ботів віддавайте перевагу приватному IRC-серверу. Якщо ви навмисно використовуєте публічну IRC-мережу, поширені варіанти включають Libera.Chat, OFTC і Snoonet. Уникайте передбачуваних публічних каналів для трафіку бота або зворотного каналу рою. -3. Запустіть/перезапустіть Gateway: +3. Запустіть або перезапустіть Gateway: ```bash openclaw gateway run ``` -## Типові налаштування безпеки +## Стандартні налаштування безпеки -- `channels.irc.dmPolicy` типово має значення `"pairing"`. -- `channels.irc.groupPolicy` типово має значення `"allowlist"`. -- Якщо `groupPolicy="allowlist"`, задайте `channels.irc.groups`, щоб визначити дозволені канали. -- Використовуйте TLS (`channels.irc.tls=true`), якщо тільки ви свідомо не погоджуєтеся на незашифрований транспорт. +- IRC використовує сирі TCP/TLS-сокети поза маршрутизацією через керований оператором OpenClaw прямий проксі. У розгортаннях, які вимагають, щоб увесь вихідний трафік проходив через цей прямий проксі, задайте `channels.irc.enabled=false`, якщо прямий вихідний IRC-трафік не схвалено явно. +- `channels.irc.dmPolicy` за замовчуванням має значення `"pairing"`. +- `channels.irc.groupPolicy` за замовчуванням має значення `"allowlist"`. +- З `groupPolicy="allowlist"` задайте `channels.irc.groups`, щоб визначити дозволені канали. +- Використовуйте TLS (`channels.irc.tls=true`), якщо ви навмисно не приймаєте передавання відкритим текстом. ## Керування доступом -Для IRC-каналів є два окремі «бар’єри»: +Для IRC-каналів є два окремі «шлюзи»: 1. **Доступ до каналу** (`groupPolicy` + `groups`): чи приймає бот повідомлення з каналу взагалі. -2. **Доступ відправника** (`groupAllowFrom` / `groups["#channel"].allowFrom` для конкретного каналу): хто має право запускати бота в цьому каналі. +2. **Доступ відправника** (`groupAllowFrom` / `groups["#channel"].allowFrom` для окремого каналу): хто має право запускати бота всередині цього каналу. Ключі конфігурації: -- Allowlist DM (доступ відправників у DM): `channels.irc.allowFrom` -- Allowlist відправників у групах (доступ відправників у каналах): `channels.irc.groupAllowFrom` -- Елементи керування для окремого каналу (канал + відправник + правила згадок): `channels.irc.groups["#channel"]` -- `channels.irc.groupPolicy="open"` дозволяє не налаштовані канали (**типово вони все одно проходять шлюзування за згадками**) +- Список дозволених для DM (доступ відправника DM): `channels.irc.allowFrom` +- Список дозволених відправників групи (доступ відправника каналу): `channels.irc.groupAllowFrom` +- Елементи керування для окремого каналу (правила каналу, відправника й згадок): `channels.irc.groups["#channel"]` +- `channels.irc.groupPolicy="open"` дозволяє неналаштовані канали (**однак за замовчуванням усе ще вимагає згадки**) -Записи allowlist слід задавати через стабільні ідентичності відправників (`nick!user@host`). -Зіставлення лише за nick є змінним і вмикається тільки коли `channels.irc.dangerouslyAllowNameMatching: true`. +Записи списку дозволених мають використовувати стабільні ідентичності відправників (`nick!user@host`). +Зіставлення лише за псевдонімом є змінним і вмикається тільки коли `channels.irc.dangerouslyAllowNameMatching: true`. -### Поширена пастка: `allowFrom` призначений для DM, а не для каналів +### Поширена пастка: `allowFrom` призначено для DM, а не каналів -Якщо ви бачите такі логи: +Якщо ви бачите журнали на кшталт: - `irc: drop group sender alice!ident@host (policy=allowlist)` -…це означає, що відправник не був дозволений для повідомлень **групи/каналу**. Виправити це можна так: +…це означає, що відправника не було дозволено для **групових/канальних** повідомлень. Виправте це одним зі способів: -- задати `channels.irc.groupAllowFrom` (глобально для всіх каналів), або -- задати allowlist-и відправників для конкретного каналу: `channels.irc.groups["#channel"].allowFrom` +- задайте `channels.irc.groupAllowFrom` (глобально для всіх каналів), або +- задайте списки дозволених відправників для окремих каналів: `channels.irc.groups["#channel"].allowFrom` -Приклад (дозволити будь-кому в `#tuirc-dev` звертатися до бота): +Приклад (дозволити будь-кому в `#tuirc-dev` спілкуватися з ботом): ```json5 { @@ -96,11 +97,11 @@ openclaw gateway run ## Запуск відповіді (згадки) -Навіть якщо канал дозволено (через `groupPolicy` + `groups`) і відправник дозволений, у групових контекстах OpenClaw типово використовує **шлюзування за згадками**. +Навіть якщо канал дозволено (через `groupPolicy` + `groups`) і відправника дозволено, OpenClaw за замовчуванням застосовує **вимогу згадки** в групових контекстах. -Це означає, що ви можете бачити логи на кшталт `drop channel … (missing-mention)`, якщо повідомлення не містить шаблон згадки, який збігається з ботом. +Це означає, що ви можете бачити журнали на кшталт `drop channel … (missing-mention)`, якщо повідомлення не містить шаблону згадки, що відповідає боту. -Щоб бот відповідав в IRC-каналі **без потреби в згадці**, вимкніть шлюзування за згадками для цього каналу: +Щоб бот відповідав в IRC-каналі **без потреби в згадці**, вимкніть вимогу згадки для цього каналу: ```json5 { @@ -118,7 +119,7 @@ openclaw gateway run } ``` -Або, щоб дозволити **всі** IRC-канали (без allowlist для окремих каналів) і при цьому відповідати без згадок: +Або, щоб дозволити **всі** IRC-канали (без списку дозволених для окремих каналів) і все одно відповідати без згадок: ```json5 { @@ -157,9 +158,9 @@ openclaw gateway run } ``` -### Різні інструменти для різних відправників (власник отримує більше можливостей) +### Різні інструменти для кожного відправника (власник отримує більше повноважень) -Використовуйте `toolsBySender`, щоб застосувати суворішу політику до `"*"` і м’якшу — до вашого nick: +Використовуйте `toolsBySender`, щоб застосувати суворішу політику до `"*"` і м’якшу до вашого псевдоніма: ```json5 { @@ -185,12 +186,12 @@ openclaw gateway run Примітки: -- Ключі `toolsBySender` слід задавати з `id:` для значень ідентичності IRC-відправника: +- Ключі `toolsBySender` мають використовувати `id:` для значень ідентичності IRC-відправника: `id:eigen` або `id:eigen!~eigen@174.127.248.171` для надійнішого зіставлення. - Застарілі ключі без префікса все ще приймаються й зіставляються лише як `id:`. -- Перемагає перша політика відправника, що збіглася; `"*"` є запасним wildcard-варіантом. +- Перемагає перша відповідна політика відправника; `"*"` є резервним шаблоном-джокером. -Докладніше про доступ до груп і шлюзування за згадками (та про їхню взаємодію) див.: [/channels/groups](/uk/channels/groups). +Докладніше про доступ до груп і вимогу згадки (та як вони взаємодіють) дивіться: [/channels/groups](/uk/channels/groups). ## NickServ @@ -225,11 +226,11 @@ openclaw gateway run } ``` -Після реєстрації nick вимкніть `register`, щоб уникнути повторних спроб REGISTER. +Вимкніть `register` після реєстрації псевдоніма, щоб уникнути повторних спроб REGISTER. ## Змінні середовища -Типовий акаунт підтримує: +Обліковий запис за замовчуванням підтримує: - `IRC_HOST` - `IRC_PORT` @@ -238,22 +239,22 @@ openclaw gateway run - `IRC_USERNAME` - `IRC_REALNAME` - `IRC_PASSWORD` -- `IRC_CHANNELS` (через кому) +- `IRC_CHANNELS` (розділені комами) - `IRC_NICKSERV_PASSWORD` - `IRC_NICKSERV_REGISTER_EMAIL` -`IRC_HOST` не можна задавати з workspace `.env`; див. [Файли workspace `.env`](/uk/gateway/security). +`IRC_HOST` не можна задавати з робочого `.env`; дивіться [Файли `.env` робочої області](/uk/gateway/security). ## Усунення несправностей -- Якщо бот підключається, але ніколи не відповідає в каналах, перевірте `channels.irc.groups` **і** чи не відкидає повідомлення шлюзування за згадками (`missing-mention`). Якщо ви хочете, щоб він відповідав без пінгів, задайте `requireMention:false` для каналу. -- Якщо вхід не вдається, перевірте доступність nick і пароль сервера. -- Якщо TLS не працює в кастомній мережі, перевірте host/port і налаштування сертифікатів. +- Якщо бот підключається, але ніколи не відповідає в каналах, перевірте `channels.irc.groups` **і** чи вимога згадки не відкидає повідомлення (`missing-mention`). Якщо ви хочете, щоб він відповідав без згадок, задайте `requireMention:false` для каналу. +- Якщо вхід не вдається, перевірте доступність псевдоніма й пароль сервера. +- Якщо TLS не працює в користувацькій мережі, перевірте хост/порт і налаштування сертифіката. ## Пов’язане - [Огляд каналів](/uk/channels) — усі підтримувані канали -- [Pairing](/uk/channels/pairing) — автентифікація DM і потік pairing -- [Групи](/uk/channels/groups) — поведінка групового чату та шлюзування за згадками -- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сесій для повідомлень -- [Безпека](/uk/gateway/security) — модель доступу та зміцнення безпеки +- [Pairing](/uk/channels/pairing) — автентифікація DM і процес pairing +- [Групи](/uk/channels/groups) — поведінка групового чату й вимога згадки +- [Маршрутизація каналів](/uk/channels/channel-routing) — маршрутизація сеансів для повідомлень +- [Безпека](/uk/gateway/security) — модель доступу й посилення захисту diff --git a/docs/uk/concepts/mantis.md b/docs/uk/concepts/mantis.md index e37757c66..2c38c359e 100644 --- a/docs/uk/concepts/mantis.md +++ b/docs/uk/concepts/mantis.md @@ -1,77 +1,77 @@ --- read_when: - - Створення або запуск візуального QA у реальному часі для помилок OpenClaw - - Додавання перевірки «до» та «після» для запиту на злиття - - Додавання сценаріїв Discord, Slack, WhatsApp або інших живих транспортів + - Створення або запуск візуального контролю якості в реальному часі для помилок OpenClaw + - Додавання перевірки до і після для запиту на злиття + - Додавання сценаріїв Discord, Slack, WhatsApp або інших реальних транспортів - Налагодження запусків QA, яким потрібні знімки екрана, автоматизація браузера або доступ VNC -summary: Mantis — це система візуальної наскрізної перевірки для відтворення помилок OpenClaw на реальних транспортах, фіксації доказів до й після та прикріплення артефактів до запитів на злиття. +summary: Mantis — це система візуальної наскрізної перевірки для відтворення помилок OpenClaw на реальних транспортах, фіксації доказів до й після та прикріплення артефактів до PR. title: Богомол x-i18n: - generated_at: "2026-05-04T00:35:16Z" + generated_at: "2026-05-04T00:59:13Z" model: gpt-5.5 provider: openai - source_hash: 7d1fe1e6cb57406fab351892b43c7057a0d08e26455d76a50157f958474e363e + source_hash: 42161d802c8601e58af1abef69277b5b3eac37750480326e1f56b2898a6af3fb source_path: concepts/mantis.md workflow: 16 --- -Mantis — це система наскрізної перевірки OpenClaw для помилок, яким потрібні справжнє -середовище виконання, справжній транспорт і видимий доказ. Вона запускає сценарій на відомому -поганому ref, збирає докази, запускає той самий сценарій на кандидатному ref і -публікує порівняння як артефакти, які мейнтейнер може переглянути з PR або +Mantis — це система наскрізної перевірки OpenClaw для помилок, яким потрібні реальний +runtime, реальний транспорт і видимий доказ. Вона запускає сценарій проти відомого +поганого ref, збирає докази, запускає той самий сценарій проти candidate ref і +публікує порівняння як артефакти, які maintainer може перевірити з PR або з локальної команди. -Mantis починає з Discord, тому що Discord дає нам цінну першу смугу: -справжню автентифікацію бота, справжні канали guild, реакції, треди, нативні команди та -інтерфейс браузера, де люди можуть візуально підтвердити, що показав транспорт. +Mantis починає з Discord, тому що Discord дає нам першу lane з високою цінністю: +реальна автентифікація бота, реальні канали guild, реакції, threads, нативні команди та +браузерний UI, де люди можуть візуально підтвердити те, що показав транспорт. ## Цілі - Відтворити помилку з GitHub issue або PR з тією самою формою транспорту, яку бачать користувачі. -- Зібрати артефакт **до** на baseline ref перед застосуванням виправлення. -- Зібрати артефакт **після** на кандидатному ref після застосування виправлення. -- Використовувати детермінований оракул, коли це можливо, наприклад читання реакції через Discord REST - або перевірку транскрипту каналу. -- Знімати скриншоти, коли помилка має видиму поверхню UI. -- Запускатися локально з CLI, керованого агентом, і віддалено з GitHub. -- Зберігати достатньо стану машини для VNC-порятунку, коли вхід, автоматизація браузера або - автентифікація провайдера застрягають. +- Захопити артефакт **before** на baseline ref до застосування виправлення. +- Захопити артефакт **after** на candidate ref після застосування виправлення. +- Використовувати детермінований oracle, коли це можливо, наприклад читання реакції + через Discord REST або перевірку transcript каналу. +- Захоплювати скриншоти, коли помилка має видиму UI-поверхню. +- Запускати локально з CLI, керованого агентом, і віддалено з GitHub. +- Зберігати достатньо стану машини для VNC-рятування, коли login, браузерна автоматизація або + автентифікація provider зависають. - Публікувати стислий статус в операторський канал Discord, коли запуск заблокований, - потребує ручної допомоги через VNC або завершується. + потребує ручної VNC-допомоги або завершується. ## Нецілі -- Mantis не є заміною юніт-тестів. Запуск Mantis зазвичай має стати - меншим регресійним тестом після того, як виправлення стане зрозумілим. -- Mantis не є звичайним швидким CI-гейтом. Він повільніший, використовує живі облікові дані та - призначений для помилок, де живе середовище має значення. -- Mantis не має вимагати людини для звичайної роботи. Ручний VNC — це шлях порятунку, - а не основний шлях. -- Mantis не зберігає необроблені секрети в артефактах, логах, скриншотах, Markdown - звітах або коментарях PR. +- Mantis не є заміною unit tests. Запуск Mantis зазвичай має перетворитися + на менший regression test після того, як виправлення зрозуміле. +- Mantis не є звичайним швидким CI gate. Він повільніший, використовує live credentials і + призначений для помилок, де live environment має значення. +- Mantis не має вимагати участі людини для нормальної роботи. Ручний VNC — це шлях + рятування, а не happy path. +- Mantis не зберігає сирі secrets в артефактах, логах, скриншотах, Markdown + звітах або PR-коментарях. -## Власність +## Відповідальність -Mantis належить до QA-стека OpenClaw. +Mantis належить до QA-стеку OpenClaw. -- OpenClaw володіє середовищем виконання сценаріїв, транспортними адаптерами, схемою доказів і - локальним CLI під `pnpm openclaw qa mantis`. -- QA Lab володіє частинами живого транспортного harness, допоміжними засобами захоплення браузера та - записувачами артефактів. -- Crabbox володіє прогрітими Linux-машинами, коли потрібна віддалена VM. -- GitHub Actions володіє віддаленою точкою входу workflow і збереженням артефактів. -- ClawSweeper володіє маршрутизацією коментарів GitHub: розбором команд мейнтейнерів, - запуском workflow і публікацією фінального коментаря PR. -- Агенти OpenClaw керують Mantis через Codex, коли сценарію потрібні агентне налаштування, - налагодження або звітування про застряглий стан. +- OpenClaw відповідає за runtime сценаріїв, transport adapters, схему доказів і + локальний CLI під `pnpm openclaw qa mantis`. +- QA Lab відповідає за компоненти live transport harness, helper-и для browser capture і + artifact writers. +- Crabbox відповідає за прогріті Linux-машини, коли потрібна віддалена VM. +- GitHub Actions відповідає за entrypoint віддаленого workflow і зберігання артефактів. +- ClawSweeper відповідає за маршрутизацію GitHub-коментарів: parsing maintainer commands, + dispatching the workflow і публікацію фінального PR-коментаря. +- Агенти OpenClaw керують Mantis через Codex, коли сценарію потрібні agentic setup, + debugging або stuck-state reporting. -Ця межа утримує знання про транспорт в OpenClaw, планування машин у -Crabbox, а клей мейнтейнерського workflow — у ClawSweeper. +Ця межа зберігає знання про транспорт в OpenClaw, планування машин у +Crabbox, а maintainer workflow glue у ClawSweeper. -## Форма команди +## Форма команд -Перша локальна команда перевіряє бота Discord, guild, канал, надсилання повідомлення, +Перша локальна команда перевіряє Discord-бота, guild, канал, надсилання повідомлення, надсилання реакції та шлях артефактів: ```bash @@ -79,7 +79,7 @@ pnpm openclaw qa mantis discord-smoke \ --output-dir .artifacts/qa-e2e/mantis/discord-smoke ``` -Локальний runner до і після приймає таку форму: +Локальний runner before і after приймає таку форму: ```bash pnpm openclaw qa mantis run \ @@ -90,55 +90,58 @@ pnpm openclaw qa mantis run \ --output-dir .artifacts/qa-e2e/mantis/local-discord-status-reactions ``` -Runner створює від’єднані worktree baseline і candidate під вихідним -каталогом, встановлює залежності, збирає кожен ref, запускає сценарій з +Runner створює від'єднані baseline і candidate worktrees під output +directory, встановлює залежності, збирає кожен ref, запускає сценарій з `--allow-failures`, потім записує `baseline/`, `candidate/`, `comparison.json` і `mantis-report.md`. Для першого сценарію Discord успішна перевірка -означає, що статус baseline — `fail`, а статус candidate — `pass`. +означає, що baseline status — `fail`, а candidate status — `pass`. -Перший примітив VM/браузера — desktop smoke: +Перший примітив VM/browser — це desktop smoke: ```bash pnpm openclaw qa mantis desktop-browser-smoke \ --output-dir .artifacts/qa-e2e/mantis/desktop-browser ``` -Він орендує або повторно використовує desktop-машину Crabbox, запускає видимий браузер усередині -VNC-сесії, захоплює desktop, витягує артефакти назад у локальний вихідний -каталог і записує команду повторного підключення у звіт. Команда за замовчуванням -використовує провайдера Hetzner, тому що це перший провайдер із робочим покриттям desktop/VNC -у смузі Mantis. Перевизначте його через `--provider`, `--crabbox-bin` або -`OPENCLAW_MANTIS_CRABBOX_PROVIDER`, коли запускаєте проти іншого флоту Crabbox. +Він орендує або повторно використовує desktop-машину Crabbox, запускає видимий браузер всередині +VNC-сесії, захоплює desktop, витягує артефакти назад у локальний output +directory і записує команду перепідключення у звіт. Команда за замовчуванням +використовує Hetzner provider, тому що це перший provider з робочим desktop/VNC +coverage у Mantis lane. Перевизначте це через `--provider`, `--crabbox-bin` або +`OPENCLAW_MANTIS_CRABBOX_PROVIDER`, коли запускаєте проти іншого Crabbox fleet. Корисні прапорці desktop smoke: - `--lease-id ` або `OPENCLAW_MANTIS_CRABBOX_LEASE_ID` повторно використовує прогрітий desktop. - `--browser-url ` змінює сторінку, відкриту у видимому браузері. -- `--keep-lease` або `OPENCLAW_MANTIS_KEEP_VM=1` залишає новостворену успішну оренду відкритою для VNC-інспекції. Невдалі запуски за замовчуванням залишають оренду, якщо її було створено, щоб оператор міг перепідключитися. -- `--class`, `--idle-timeout` і `--ttl` налаштовують розмір машини та час життя оренди. +- `--html-file ` рендерить локальний для repo HTML-артефакт у видимому браузері. Mantis використовує це, щоб захопити згенерований Discord status-reaction timeline через реальний Crabbox desktop. +- `--keep-lease` або `OPENCLAW_MANTIS_KEEP_VM=1` зберігає новостворений успішний lease відкритим для VNC-перевірки. Невдалі запуски за замовчуванням зберігають lease, якщо його було створено, щоб оператор міг перепідключитися. +- `--class`, `--idle-timeout` і `--ttl` налаштовують розмір машини та lifetime lease. -GitHub smoke workflow — це `Mantis Discord Smoke`. GitHub workflow до і після -для першого реального сценарію — `Mantis Discord Status Reactions`. Він +GitHub smoke workflow — це `Mantis Discord Smoke`. GitHub workflow before і after +для першого реального сценарію — це `Mantis Discord Status Reactions`. Він приймає: -- `baseline_ref`: ref, який, як очікується, відтворює поведінку лише queued. -- `candidate_ref`: ref, який, як очікується, показує `queued -> thinking -> done`. +- `baseline_ref`: ref, який має відтворювати queued-only behavior. +- `candidate_ref`: ref, який має показати `queued -> thinking -> done`. -Він checkout-ить ref workflow harness, збирає окремі worktree baseline і candidate, -запускає `discord-status-reactions-tool-only` проти кожного worktree і +Він checkout-ить workflow harness ref, збирає окремі baseline і candidate +worktrees, запускає `discord-status-reactions-tool-only` проти кожного worktree і завантажує `baseline/`, `candidate/`, `comparison.json` і `mantis-report.md` як -артефакти Actions. +Actions artifacts. Він також рендерить timeline HTML кожної lane у desktop-браузері +Crabbox і публікує ці VNC-скриншоти поруч із детермінованими +timeline PNG у PR-коментарі. -Ви також можете запустити status-reactions run напряму з коментаря PR: +Також можна запустити status-reactions run напряму з PR-коментаря: ```text @Mantis discord status reactions ``` -Тригер коментаря навмисно вузький. Він запускається лише на коментарях pull request -від користувачів із доступом write, maintain або admin, і розпізнає лише -запити status-reaction Discord. За замовчуванням він використовує відомий поганий baseline ref -і поточний SHA head PR як candidate. Мейнтейнери можуть перевизначити будь-який +Comment trigger навмисно вузький. Він запускається лише на pull request +comments від користувачів із write, maintain або admin access і розпізнає лише +Discord status-reaction requests. За замовчуванням він використовує відомий поганий baseline ref +і поточний PR head SHA як candidate. Maintainers можуть перевизначити будь-який ref: ```text @@ -152,48 +155,48 @@ ref: @clawsweeper verify e2e discord ``` -Перша команда явна й зосереджена на сценарії. Друга згодом може зіставляти PR -або issue з рекомендованими сценаріями Mantis на основі міток, змінених файлів і -знахідок рев’ю ClawSweeper. +Перша команда явна та зосереджена на сценарії. Друга згодом може зіставляти PR +або issue з рекомендованими сценаріями Mantis на основі labels, changed files і +ClawSweeper review findings. ## Життєвий цикл запуску -1. Отримати облікові дані. +1. Отримати credentials. 2. Виділити або повторно використати VM. -3. Підготувати desktop/профіль браузера, коли сценарію потрібні докази UI. -4. Підготувати чистий checkout для baseline ref. +3. Підготувати desktop/browser profile, коли сценарію потрібні UI-докази. +4. Підготувати clean checkout для baseline ref. 5. Встановити залежності та зібрати лише те, що потрібно сценарію. -6. Запустити дочірній OpenClaw Gateway з ізольованим каталогом стану. -7. Налаштувати живий транспорт, провайдера, модель і профіль браузера. -8. Запустити сценарій і зібрати докази baseline. -9. Зупинити gateway і зберегти логи. +6. Запустити дочірній OpenClaw Gateway з ізольованим state directory. +7. Налаштувати live transport, provider, model і browser profile. +8. Запустити сценарій і захопити baseline evidence. +9. Зупинити gateway і зберегти logs. 10. Підготувати candidate ref у тій самій VM. -11. Запустити той самий сценарій і зібрати докази candidate. -12. Порівняти результати оракула та візуальні докази. -13. Записати Markdown, JSON, логи, скриншоти та необов’язкові trace-артефакти. -14. Завантажити артефакти GitHub Actions. -15. Опублікувати стислий статусний допис у PR або Discord. +11. Запустити той самий сценарій і захопити candidate evidence. +12. Порівняти oracle results і visual evidence. +13. Записати Markdown, JSON, logs, screenshots і optional trace artifacts. +14. Завантажити GitHub Actions artifacts. +15. Опублікувати стислий PR або Discord status message. -Сценарій має бути здатний завершуватися невдачею двома різними способами: +Сценарій має мати змогу завершитися невдало двома різними способами: -- **Помилку відтворено**: baseline завершився невдачею очікуваним способом. -- **Збій harness**: налаштування середовища, облікові дані, Discord API, браузер або - провайдер зазнали збою до того, як оракул помилки став meaningful. +- **Помилку відтворено**: baseline завершився невдало очікуваним способом. +- **Збій harness**: environment setup, credentials, Discord API, browser або + provider завершилися невдало до того, як bug oracle став meaningful. -Фінальний звіт має розділяти ці випадки, щоб мейнтейнери не плутали нестабільне -середовище з поведінкою продукту. +Фінальний звіт має розділяти ці випадки, щоб maintainers не плутали flaky +environment із product behavior. ## Discord MVP -Перший сценарій має націлюватися на status reactions Discord у guild-каналах, де -режим доставки вихідної відповіді — `message_tool_only`. +Перший сценарій має націлюватися на Discord status reactions у guild channels, де +source reply delivery mode — `message_tool_only`. -Чому це хороший початковий сценарій Mantis: +Чому це хороший seed для Mantis: -- Він видимий у Discord як реакції на повідомлення, що запускає сценарій. -- Він має сильний REST-оракул через стан реакцій повідомлення Discord. -- Він перевіряє справжній OpenClaw Gateway, автентифікацію бота Discord, диспетчеризацію повідомлень, - режим доставки вихідної відповіді, стан status reaction і життєвий цикл модельного turn. +- Це видно в Discord як reactions на triggering message. +- Він має сильний REST oracle через Discord message reaction state. +- Він перевіряє реальний OpenClaw Gateway, автентифікацію Discord-бота, message dispatch, + source reply delivery mode, status reaction state і model turn lifecycle. - Він достатньо вузький, щоб перша реалізація залишалася чесною. Очікувана форма сценарію: @@ -227,12 +230,12 @@ evidence: screenshotMessageRow: true ``` -Докази baseline мають показувати queued acknowledgement reaction, але без -lifecycle transition у режимі tool-only. Докази candidate мають показувати, що lifecycle +Baseline evidence має показувати queued acknowledgement reaction, але без +lifecycle transition у tool-only mode. Candidate evidence має показувати, що lifecycle status reactions працюють, коли `messages.statusReactions.enabled` явно -дорівнює true. +true. -Виконуваний перший зріз — це opt-in живий QA-сценарій Discord: +Перший executable slice — це opt-in Discord live QA scenario: ```bash pnpm openclaw qa discord \ @@ -244,34 +247,34 @@ pnpm openclaw qa discord \ --output-dir .artifacts/qa-e2e/mantis/discord-status-reactions-candidate ``` -Він налаштовує SUT із завжди ввімкненою обробкою guild, `visibleReplies: -"message_tool"`, `ackReaction: "👀"` і явними status reactions. Оракул -опитує справжнє повідомлення Discord, що запустило сценарій, і очікує спостережувану послідовність -`👀 -> 🤔 -> 👍`. Артефакти містять `discord-qa-reaction-timelines.json`, +Він налаштовує SUT з always-on guild handling, `visibleReplies: +"message_tool"`, `ackReaction: "👀"` і explicit status reactions. Oracle +опитує реальне Discord triggering message і очікує observed sequence +`👀 -> 🤔 -> 👍`. Артефакти включають `discord-qa-reaction-timelines.json`, `discord-status-reactions-tool-only-timeline.html` і `discord-status-reactions-tool-only-timeline.png`. ## Наявні компоненти QA -Mantis має будуватися на наявному приватному QA-стеку, а не починати з +Mantis має спиратися на наявний private QA stack замість того, щоб починати з нуля: -- `pnpm openclaw qa discord` уже запускає живу смугу Discord з ботами driver і - SUT. -- Живий transport runner уже записує звіти та артефакти observed-message - під `.artifacts/qa-e2e/`. -- Оренди облікових даних Convex уже надають ексклюзивний доступ до спільних живих - транспортних облікових даних. -- Сервіс керування браузером уже підтримує скриншоти, snapshots, - headless керовані профілі та віддалені CDP-профілі. -- QA Lab уже має UI налагоджувача й шину для тестування у формі транспорту. +- `pnpm openclaw qa discord` уже запускає live Discord lane з driver і + SUT bots. +- Live transport runner уже записує reports і observed-message + artifacts під `.artifacts/qa-e2e/`. +- Convex credential leases уже надають exclusive access до shared live + transport credentials. +- Browser control service уже підтримує screenshots, snapshots, + headless managed profiles і remote CDP profiles. +- QA Lab уже має debugger UI і bus для transport-shaped testing. -Перша реалізація Mantis може бути тонким runner до/після над цими -компонентами плюс один шар візуальних доказів. +Перша реалізація Mantis може бути тонким before/after runner поверх цих +компонентів плюс один шар visual evidence. ## Модель доказів -Кожен запуск записує стабільний каталог артефактів: +Кожен запуск записує стабільний artifact directory: ```text .artifacts/qa-e2e/mantis// @@ -291,76 +294,76 @@ Mantis має будуватися на наявному приватному QA run.log ``` -`mantis-summary.json` має бути машинозчитуваним джерелом істини. Markdown -звіт призначений для коментарів PR і людського рев’ю. +`mantis-summary.json` має бути machine-readable source of truth. Markdown +report призначений для PR comments і human review. -Підсумок має містити: +Summary має включати: -- протестовані refs і SHA +- refs і SHAs, які тестувалися - transport і scenario id -- провайдера машини та machine id або lease id -- джерело облікових даних без значень секретів -- результат baseline -- результат candidate -- чи помилку відтворено на baseline -- чи candidate виправив її -- шляхи артефактів -- санітизовані проблеми налаштування або очищення +- machine provider і machine id або lease id +- credential source без secret values +- baseline result +- candidate result +- чи помилка відтворилася на baseline +- чи candidate її виправив +- artifact paths +- sanitized setup або cleanup issues -Скриншоти — це докази, а не секрети. Вони все одно потребують дисципліни редагування: -можуть з’являтися назви приватних каналів, імена користувачів або вміст повідомлень. Для публічних PR -надавайте перевагу посиланням на артефакти GitHub Actions замість inline-зображень, доки історія -редагування не стане сильнішою. +Screenshots — це докази, а не secrets. Вони все одно потребують redaction discipline: +private channel names, user names або message content можуть з'явитися. Для public PRs +віддавайте перевагу GitHub Actions artifact links над inline images, доки redaction story +не стане сильнішою. ## Браузер і VNC -Смуга браузера має два режими: +Browser lane має два режими: -- **Headless automation**: стандартно для CI. Chrome запускається з увімкненим CDP, а - Playwright або керування браузером OpenClaw захоплює скриншоти. -- **VNC rescue**: увімкнено на тій самій VM, коли вхід, MFA, антиавтоматизація Discord - або візуальне налагодження потребують людини. +- **Headless automation**: за замовчуванням для CI. Chrome запускається з увімкненим CDP, а + Playwright або OpenClaw browser control захоплює screenshots. +- **VNC rescue**: увімкнено на тій самій VM, коли login, MFA, Discord anti-automation + або visual debugging потребують людини. -Профіль браузера спостерігача Discord має бути достатньо persistent, щоб не доводилося -входити під час кожного запуску, але ізольованим від особистого стану браузера. Профіль +Профіль браузера спостерігача Discord має бути достатньо постійним, щоб уникати +входу під час кожного запуску, але ізольованим від особистого стану браузера. Профіль належить пулу машин Mantis, а не ноутбуку розробника. -Коли Mantis застрягає, він публікує статусне повідомлення Discord з: +Коли Mantis застрягає, він публікує статусне повідомлення Discord із: -- run id -- scenario id -- провайдером машини +- id запуску +- id сценарію +- постачальником машини - каталогом артефактів -- інструкціями підключення VNC або noVNC, якщо доступні +- інструкціями з підключення через VNC або noVNC, якщо доступно - коротким текстом блокера Перше приватне розгортання може публікувати ці повідомлення в наявний канал -операторів і пізніше перейти до окремого каналу Mantis. +операторів, а пізніше перейти до окремого каналу Mantis. ## Машини Mantis має надавати перевагу AWS через Crabbox для першої віддаленої реалізації. -Crabbox дає нам розігріті машини, відстеження оренди, гідратацію, журнали, результати та -очищення. Якщо потужності AWS надто повільні або недоступні, додайте провайдера Hetzner +Crabbox надає нам попередньо прогріті машини, відстеження оренди, гідратацію, журнали, результати та +очищення. Якщо місткість AWS надто повільна або недоступна, додайте постачальника Hetzner за тим самим інтерфейсом машин. Мінімальні вимоги до VM: -- Linux із встановленим Chrome або Chromium, здатним працювати з робочим столом +- Linux з інсталяцією Chrome або Chromium, здатною працювати з робочим столом - доступ CDP для автоматизації браузера -- VNC або noVNC для відновлення +- VNC або noVNC для аварійного доступу - Node 22 і pnpm -- клон OpenClaw і кеш залежностей +- checkout OpenClaw і кеш залежностей - кеш браузера Playwright Chromium, коли використовується Playwright - достатньо CPU та пам’яті для одного OpenClaw Gateway, одного браузера й одного запуску моделі -- вихідний доступ до Discord, GitHub, провайдерів моделей і брокера облікових даних +- вихідний доступ до Discord, GitHub, постачальників моделей і брокера облікових даних -VM не має зберігати довготривалі сирі секрети поза очікуваними сховищами облікових даних або +VM не має зберігати довготривалі необроблені секрети поза очікуваними сховищами облікових даних або профілів браузера. ## Секрети -Секрети зберігаються в секретах організації або репозиторію GitHub для віддалених запусків і в +Секрети зберігаються в секретах організації або репозиторію GitHub для віддалених запусків, а також у локальному файлі секретів під контролем оператора для локальних запусків. Рекомендовані назви секретів: @@ -371,43 +374,43 @@ VM не має зберігати довготривалі сирі секрет - `OPENCLAW_QA_DISCORD_GUILD_ID` - `OPENCLAW_QA_DISCORD_CHANNEL_ID` - `OPENCLAW_QA_DISCORD_NOTIFY_CHANNEL_ID` -- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` для завантаження публічних артефактів GitHub +- `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` для публічних завантажень артефактів GitHub - `OPENCLAW_QA_CONVEX_SITE_URL` - `OPENCLAW_QA_CONVEX_SECRET_CI` -У довгостроковій перспективі пул облікових даних Convex має залишатися звичайним джерелом живих +У довгостроковій перспективі пул облікових даних Convex має залишатися звичайним джерелом для живих облікових даних транспорту. Секрети GitHub початково завантажують брокер і резервні лінії. -Запускач Mantis ніколи не повинен друкувати: +Runner Mantis ніколи не має друкувати: - токени ботів Discord -- API-ключі провайдерів +- API-ключі постачальників - cookies браузера -- вміст профілів автентифікації +- вміст профілю автентифікації - паролі VNC -- сирі корисні навантаження облікових даних +- необроблені payloads облікових даних -Публічні завантаження артефактів також мають редагувати цільові метадані Discord, як-от ідентифікатори ботів, -серверів, каналів і повідомлень. Робочий процес smoke GitHub вмикає +Публічні завантаження артефактів також мають редагувати цільові метадані Discord, як-от id бота, +guild, каналу й повідомлення. Smoke workflow GitHub вмикає `OPENCLAW_QA_REDACT_PUBLIC_METADATA=1` саме з цієї причини. -Якщо токен випадково вставлено в issue, PR, чат або журнал, оберніть його +Якщо токен випадково вставлено в issue, PR, чат або журнал, поверніть його після збереження нового секрету. ## Артефакти GitHub і коментарі PR -Робочі процеси Mantis мають завантажувати повний пакет доказів як короткоживучий артефакт Actions. -Коли робочий процес запускається для звіту про помилку або PR із виправленням, він також має -опублікувати відредаговані PNG-знімки екрана в гілку `qa-artifacts` і оновити або створити -коментар до цієї помилки чи PR із виправленням із вбудованими знімками до/після. Не публікуйте -основний доказ лише в загальному PR автоматизації QA. Сирі журнали, спостережені +Workflow Mantis мають завантажувати повний пакет доказів як короткоживучий артефакт Actions. +Коли workflow запускається для звіту про bug або PR з виправленням, він також має +публікувати відредаговані PNG-знімки екрана в гілку `qa-artifacts` і upsert-коментар +до цього bug або PR з виправленням із вбудованими знімками до/після. Не публікуйте +основний доказ лише в загальному PR автоматизації QA. Необроблені журнали, спостережені повідомлення та інші об’ємні докази залишаються в артефакті Actions. -Виробничі робочі процеси мають публікувати ці коментарі через GitHub App Mantis, а не +Production workflows мають публікувати ці коментарі через Mantis GitHub App, а не через `github-actions[bot]`. Зберігайте app id і приватний ключ як секрети GitHub Actions -`MANTIS_GITHUB_APP_ID` і `MANTIS_GITHUB_APP_PRIVATE_KEY`. Робочий процес використовує прихований маркер -як ключ upsert, оновлює цей коментар, коли токен може його редагувати, і створює новий -коментар від імені Mantis, коли старіший маркер від бота не можна відредагувати. +`MANTIS_GITHUB_APP_ID` і `MANTIS_GITHUB_APP_PRIVATE_KEY`. Workflow використовує прихований маркер як ключ upsert, +оновлює цей коментар, коли токен може його редагувати, і створює новий коментар від імені Mantis, +коли старіший маркер, що належить боту, не можна редагувати. Коментар PR має бути коротким і візуальним: @@ -429,70 +432,72 @@ candidate showed the expected queued -> thinking -> done sequence. | | | ``` -Коли запуск завершується невдало через збій harness, коментар має повідомляти саме це, -а не натякати, що кандидат не пройшов. +Коли запуск завершується невдало через збій harness, у коментарі має бути сказано саме це, +а не створюватися враження, що candidate не пройшов. -## Примітки щодо приватного розгортання +## Нотатки щодо приватного розгортання -Приватне розгортання вже може мати застосунок Discord Mantis. Використовуйте цей -застосунок повторно замість створення іншого app, якщо він має потрібні дозволи бота -і його можна безпечно обернути. +Приватне розгортання вже може мати застосунок Discord Mantis. Повторно використовуйте цей +застосунок замість створення іншого app, якщо він має правильні дозволи бота +і його можна безпечно ротувати. -Задайте початковий канал сповіщень оператора через секрети або конфігурацію розгортання. -Спочатку він може вказувати на наявний канал мейнтейнерів або операцій, а потім перейти -до окремого каналу Mantis, щойно такий з’явиться. +Задайте початковий канал сповіщень операторів через секрети або конфігурацію розгортання. +Спершу він може вказувати на наявний канал maintainer або operations, +а потім перейти до окремого каналу Mantis, коли він з’явиться. -Не додавайте в цей документ ідентифікатори серверів, ідентифікатори каналів, токени ботів, cookies браузера або паролі VNC. -Зберігайте їх у секретах GitHub, брокері облікових даних або локальному сховищі секретів оператора. +Не додавайте guild ids, channel ids, токени ботів, cookies браузера або паролі VNC +до цього документа. Зберігайте їх у секретах GitHub, брокері облікових даних або +локальному сховищі секретів оператора. ## Додавання сценарію Сценарій Mantis має оголошувати: -- id і title +- id і назву - транспорт - необхідні облікові дані -- політику базового ref -- політику кандидатного ref -- патч конфігурації OpenClaw +- політику baseline ref +- політику candidate ref +- patch конфігурації OpenClaw - кроки налаштування - стимул -- очікуваний oracle базової версії -- очікуваний oracle кандидата +- очікуваний oracle baseline +- очікуваний oracle candidate - цілі візуального захоплення -- бюджет тайм-ауту +- бюджет часу очікування - кроки очищення -Сценарії мають надавати перевагу невеликим типізованим oracle: +Сценарії мають надавати перевагу невеликим типізованим oracles: -- стан реакцій Discord для помилок реакцій -- посилання на повідомлення Discord для помилок потоків -- thread ts Slack і стан API реакцій для помилок Slack -- ідентифікатори повідомлень і заголовки email для помилок email +- стан реакцій Discord для bugs реакцій +- посилання на повідомлення Discord для bugs тредингу +- thread ts Slack і стан API реакцій для bugs Slack +- ids повідомлень електронної пошти та заголовки для bugs електронної пошти - знімки екрана браузера, коли UI є єдиним надійним спостережуваним сигналом -Перевірки зором мають бути додатковими. Якщо API платформи може довести помилку, використовуйте -API як oracle проходження/збою, а знімки екрана залишайте для впевненості людини. +Перевірки зору мають бути додатковими. Якщо API платформи може довести bug, використовуйте +API як oracle pass/fail і залишайте знімки екрана для впевненості людини. -## Розширення провайдерів +## Розширення постачальників -Після Discord той самий запускач може додати: +Після Discord той самий runner може додати: -- Slack: реакції, потоки, згадки app, модальні вікна, завантаження файлів. -- Email: автентифікація Gmail і потоки повідомлень із використанням `gog`, коли connectors недостатньо. +- Slack: реакції, треди, згадки app, модальні вікна, завантаження файлів. +- Email: автентифікація Gmail і трединг повідомлень із використанням `gog`, коли connectors недостатньо. - WhatsApp: QR-вхід, повторна ідентифікація, доставка повідомлень, медіа, реакції. -- Telegram: gate для згадок у групах, команди, реакції там, де доступні. -- Matrix: зашифровані кімнати, зв’язки потоків або відповідей, відновлення після перезапуску. +- Telegram: gating групових згадок, команди, реакції, де доступно. +- Matrix: зашифровані кімнати, зв’язки тредів або відповідей, resume після рестарту. -Кожен транспорт має мати один дешевий smoke-сценарій і один або кілька сценаріїв класів помилок. +Кожен транспорт має мати один дешевий smoke-сценарій і один або більше сценаріїв класу bug. Дорогі візуальні сценарії мають залишатися opt-in. ## Відкриті питання -- Який бот Discord має бути driver, а який SUT, коли наявний бот Mantis використовується повторно? -- Чи має вхід браузера observer використовувати людський обліковий запис Discord, тестовий обліковий запис - або лише доступні боту REST-докази для першої фази? -- Як довго GitHub має зберігати артефакти Mantis для PR? -- Коли ClawSweeper має автоматично рекомендувати Mantis замість очікування команди - мейнтейнера? -- Чи потрібно редагувати або обрізати знімки екрана перед завантаженням для публічних PR? +- Який бот Discord має бути driver, а який SUT, коли + наявний бот Mantis використовується повторно? +- Чи має вхід браузера спостерігача використовувати людський обліковий запис Discord, тестовий обліковий запис + або лише bot-readable REST-докази для першої фази? +- Як довго GitHub має зберігати артефакти Mantis для PRs? +- Коли ClawSweeper має автоматично рекомендувати Mantis замість очікування + команди maintainer? +- Чи слід редагувати або обрізати знімки екрана перед завантаженням для публічних PRs? diff --git a/docs/uk/plugins/google-meet.md b/docs/uk/plugins/google-meet.md index 3514c1ea1..8b28457dd 100644 --- a/docs/uk/plugins/google-meet.md +++ b/docs/uk/plugins/google-meet.md @@ -1,43 +1,43 @@ --- read_when: - Ви хочете, щоб агент OpenClaw приєднався до дзвінка Google Meet - - Ви хочете, щоб агент OpenClaw створив нову зустріч Google Meet + - Ви хочете, щоб агент OpenClaw створив новий дзвінок Google Meet - Ви налаштовуєте Chrome, вузол Chrome або Twilio як транспорт Google Meet -summary: 'Plugin Google Meet: приєднання до явних URL-адрес Meet через Chrome або Twilio з типовими параметрами голосу в реальному часі' -title: Plugin Google Meet +summary: 'Plugin Google Meet: приєднання до явних URL-адрес Meet через Chrome або Twilio з типовими налаштуваннями голосу в реальному часі' +title: Plugin для Google Meet x-i18n: - generated_at: "2026-05-04T00:29:59Z" + generated_at: "2026-05-04T00:59:12Z" model: gpt-5.5 provider: openai - source_hash: 7635306e880d37f6f86afc0732322167ff785105201b5dd38658215b5439e6b0 + source_hash: 46b5a78c09ea1fa1ea1afd6cd8a3d607877f370ca56341753eac9cd7647fe3c3 source_path: plugins/google-meet.md workflow: 16 --- -Підтримка учасника Google Meet для OpenClaw — Plugin навмисно працює явно: +Підтримка учасника Google Meet для OpenClaw — Plugin навмисно спроєктований як явний: - Він приєднується лише до явної URL-адреси `https://meet.google.com/...`. -- Він може створити новий простір Meet через Google Meet API, а потім приєднатися до - повернутої URL-адреси. -- `realtime` voice є режимом за замовчуванням. -- Realtime voice може звертатися назад до повного агента OpenClaw, коли потрібні глибше +- Він може створити новий простір Meet через Google Meet API, а потім приєднатися за + поверненою URL-адресою. +- Голос `realtime` є режимом за замовчуванням. +- Голос у реальному часі може звертатися назад до повного агента OpenClaw, коли потрібні глибші міркування або інструменти. - Агенти вибирають поведінку приєднання за допомогою `mode`: використовуйте `realtime` для живого - прослуховування/відповіді голосом або `transcribe`, щоб приєднатися й керувати браузером без - realtime voice bridge. -- Автентифікація починається як особистий Google OAuth або вже авторизований профіль Chrome. -- Автоматичного оголошення про згоду немає. + прослуховування/відповіді голосом або `transcribe`, щоб приєднатися/керувати браузером без + голосового мосту реального часу. +- Автентифікація починається як особистий Google OAuth або вже виконаний вхід у профілі Chrome. +- Автоматичного оголошення згоди немає. - Стандартний аудіобекенд Chrome — `BlackHole 2ch`. - Chrome може працювати локально або на спареному вузловому хості. -- Twilio приймає номер для дозвону плюс необов’язковий PIN або DTMF-послідовність; він - не може напряму набирати URL Meet. -- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших агентських - телеконференційних робочих процесів. +- Twilio приймає номер дозвону плюс необов’язковий PIN або послідовність DTMF; він + не може набрати URL Meet напряму. +- Команда CLI — `googlemeet`; `meet` зарезервовано для ширших + телеконференційних робочих процесів агента. ## Швидкий старт -Установіть локальні аудіозалежності та налаштуйте бекенд realtime voice -провайдера. OpenAI використовується за замовчуванням; Google Gemini Live також працює з +Установіть локальні аудіозалежності та налаштуйте бекенд-провайдера голосу реального часу. +OpenAI використовується за замовчуванням; Google Gemini Live також працює з `realtime.provider: "google"`: ```bash @@ -47,8 +47,8 @@ export OPENAI_API_KEY=sk-... export GEMINI_API_KEY=... ``` -`blackhole-2ch` встановлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор Homebrew -потребує перезавантаження, перш ніж macOS покаже пристрій: +`blackhole-2ch` установлює віртуальний аудіопристрій `BlackHole 2ch`. Інсталятор +Homebrew потребує перезавантаження, перш ніж macOS покаже пристрій: ```bash sudo reboot @@ -82,33 +82,33 @@ command -v sox openclaw googlemeet setup ``` -Вивід налаштування призначений бути читабельним для агентів і враховувати режим. Він повідомляє про профіль Chrome -, прив’язку до вузла, а для realtime-приєднань через Chrome — про аудіоміст -BlackHole/SoX і перевірки відкладеного realtime-вступу. Для приєднань лише для спостереження перевірте той самий -транспорт за допомогою `--mode transcribe`; цей режим пропускає передумови realtime-аудіо, -оскільки він не слухає через міст і не говорить через нього: +Вивід налаштування призначений для читання агентом і враховує режим. Він повідомляє про профіль Chrome, +закріплення вузла та, для приєднань Chrome у реальному часі, аудіоміст BlackHole/SoX +і відкладені перевірки вступу в реальному часі. Для приєднань лише для спостереження перевірте той самий +транспорт за допомогою `--mode transcribe`; цей режим пропускає передумови аудіо реального часу, +оскільки він не слухає й не говорить через міст: ```bash openclaw googlemeet setup --transport chrome-node --mode transcribe ``` -Коли налаштовано делегування Twilio, налаштування також повідомляє, чи готові -Plugin `voice-call`, облікові дані Twilio та публічна доступність Webhook. -Сприймайте будь-яку перевірку `ok: false` як блокер для перевіреного транспорту та режиму -перед тим, як просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для +Коли делегування Twilio налаштовано, налаштування також повідомляє, чи готові +Plugin `voice-call`, облікові дані Twilio та публічне відкриття Webhook. +Вважайте будь-яку перевірку `ok: false` блокером для перевірюваного транспорту й режиму, +перш ніж просити агента приєднатися. Використовуйте `openclaw googlemeet setup --json` для скриптів або машинозчитуваного виводу. Використовуйте `--transport chrome`, `--transport chrome-node` або `--transport twilio`, щоб попередньо перевірити конкретний -транспорт до того, як агент спробує його використати. +транспорт перед тим, як агент спробує його використати. -Для Twilio завжди явно попередньо перевіряйте транспорт, коли типовий транспорт -— Chrome: +Для Twilio завжди явно виконуйте попередню перевірку транспорту, коли стандартний транспорт — +Chrome: ```bash openclaw googlemeet setup --transport twilio ``` -Це виявить відсутнє підключення `voice-call`, облікові дані Twilio або недоступну -експозицію Webhook до того, як агент спробує набрати зустріч. +Це виявляє відсутню прив’язку `voice-call`, облікові дані Twilio або недоступне +відкриття Webhook до того, як агент спробує набрати зустріч. Приєднайтеся до зустрічі: @@ -127,12 +127,12 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij } ``` -Агентський інструмент `google_meet` залишається доступним на хостах не-macOS для +Агентський інструмент `google_meet` залишається доступним на хостах не з macOS для артефактів, календаря, налаштування, транскрибування, Twilio та потоків `chrome-node`. Локальні -realtime-дії Chrome там заблоковані, бо вбудований realtime-аудіошлях Chrome -зараз залежить від macOS `BlackHole 2ch`. На Linux використовуйте -`mode: "transcribe"`, дозвін Twilio або macOS-хост `chrome-node` для realtime -участі через Chrome. +дії Chrome у реальному часі там заблоковані, оскільки вбудований аудіошлях Chrome +реального часу наразі залежить від macOS `BlackHole 2ch`. На Linux використовуйте +`mode: "transcribe"`, дозвін Twilio або macOS-хост `chrome-node` для участі Chrome +у реальному часі. Створіть нову зустріч і приєднайтеся до неї: @@ -140,8 +140,8 @@ realtime-дії Chrome там заблоковані, бо вбудований openclaw googlemeet create --transport chrome-node --mode realtime ``` -Для кімнат, створених API, використовуйте Google Meet `SpaceConfig.accessType`, коли хочете, -щоб політика кімнати щодо входу без стуку була явною, а не успадкованою з типових налаштувань +Для кімнат, створених через API, використовуйте Google Meet `SpaceConfig.accessType`, коли хочете, +щоб політика кімнати без стуку була явною, а не успадкованою зі стандартних параметрів облікового запису Google: ```bash @@ -149,14 +149,14 @@ openclaw googlemeet create --access-type OPEN --transport chrome-node --mode rea ``` `OPEN` дозволяє будь-кому з URL Meet приєднатися без стуку. `TRUSTED` дозволяє -довіреним користувачам організації хоста, запрошеним зовнішнім користувачам і користувачам дозвону -приєднуватися без стуку. `RESTRICTED` обмежує вхід без стуку лише запрошеними. Ці -налаштування застосовуються лише до офіційного шляху створення через Google Meet API, тому OAuth -облікові дані мають бути налаштовані. +довіреним користувачам організації хоста, запрошеним зовнішнім користувачам і користувачам +дозвону приєднуватися без стуку. `RESTRICTED` обмежує вхід без стуку запрошеними. +Ці параметри застосовуються лише до офіційного шляху створення Google Meet API, тому +облікові дані OAuth мають бути налаштовані. -Якщо ви автентифікували Google Meet до появи цієї опції, повторно запустіть -`openclaw googlemeet auth login --json` після додавання scope -`meetings.space.settings` на екрані згоди Google OAuth. +Якщо ви автентифікували Google Meet до появи цієї опції, повторно виконайте +`openclaw googlemeet auth login --json` після додавання області +`meetings.space.settings` до вашого екрана згоди Google OAuth. Створіть лише URL без приєднання: @@ -166,27 +166,27 @@ openclaw googlemeet create --no-join `googlemeet create` має два шляхи: -- Створення через API: використовується, коли налаштовано OAuth-облікові дані Google Meet. Це - найбільш детермінований шлях, який не залежить від стану інтерфейсу браузера. -- Резервний браузерний шлях: використовується, коли OAuth-облікові дані відсутні. OpenClaw використовує +- Створення через API: використовується, коли налаштовано облікові дані Google Meet OAuth. Це + найдетермінованіший шлях, який не залежить від стану інтерфейсу браузера. +- Резервний браузерний шлях: використовується, коли облікові дані OAuth відсутні. OpenClaw використовує закріплений вузол Chrome, відкриває `https://meet.google.com/new`, чекає, доки Google - перенаправить на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях вимагає, - щоб профіль OpenClaw Chrome на вузлі вже був авторизований у Google. - Браузерна автоматизація обробляє власну першу підказку Meet щодо мікрофона; ця підказка + перенаправить на справжню URL-адресу з кодом зустрічі, а потім повертає цю URL-адресу. Цей шлях потребує, + щоб профіль OpenClaw Chrome на вузлі вже був увійшов у Google. + Автоматизація браузера обробляє власний запит Meet першого запуску щодо мікрофона; цей запит не вважається помилкою входу Google. Потоки приєднання та створення також намагаються повторно використати наявну вкладку Meet перед відкриттям - нової. Зіставлення ігнорує безпечні рядки запиту URL, такі як `authuser`, тому + нової. Зіставлення ігнорує нешкідливі рядки запиту URL, такі як `authuser`, тож повторна спроба агента має сфокусувати вже відкриту зустріч замість створення другої вкладки Chrome. Вивід команди/інструмента містить поле `source` (`api` або `browser`), щоб агенти могли пояснити, який шлях було використано. `create` за замовчуванням приєднується до нової зустрічі та -повертає `joined: true` плюс сеанс приєднання. Щоб лише створити URL, -використовуйте `create --no-join` у CLI або передайте `"join": false` в інструмент. +повертає `joined: true` плюс сеанс приєднання. Щоб лише створити URL, використовуйте +`create --no-join` у CLI або передайте `"join": false` до інструмента. -Або скажіть агенту: "Створи Google Meet, приєднайся до нього з realtime voice і надішли -мені посилання." Агент має викликати `google_meet` з `action: "create"`, а -потім поділитися повернутим `meetingUri`. +Або скажіть агенту: «Створи Google Meet, приєднайся з голосом у реальному часі та надішли +мені посилання». Агент має викликати `google_meet` з `action: "create"`, а потім +поширити повернений `meetingUri`. ```json { @@ -197,52 +197,52 @@ openclaw googlemeet create --no-join ``` Для приєднання лише для спостереження/керування браузером задайте `"mode": "transcribe"`. Це -не запускає двобічний realtime voice bridge, не потребує BlackHole або SoX -і не відповідатиме голосом у зустрічі. Приєднання Chrome у цьому режимі також уникають -надання OpenClaw дозволу на мікрофон/камеру та обходять шлях Meet **Використовувати -мікрофон**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація намагається -використати шлях без мікрофона, а в іншому разі повідомляє про ручну дію замість відкриття -локального мікрофона. У режимі transcribe керовані транспорти Chrome також установлюють +не запускає дуплексний голосовий міст реального часу, не потребує BlackHole або SoX +і не відповідатиме голосом у зустріч. Приєднання Chrome у цьому режимі також уникають +надання OpenClaw дозволу на мікрофон/камеру та уникають шляху Meet **Use +microphone**. Якщо Meet показує проміжний екран вибору аудіо, автоматизація намагається +шлях без мікрофона, а інакше повідомляє про ручну дію замість відкриття +локального мікрофона. У режимі транскрибування керовані транспорти Chrome також установлюють best-effort спостерігач субтитрів Meet. `googlemeet status --json` і `googlemeet doctor` показують `captioning`, `captionsEnabledAttempted`, -`transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText` +`transcriptLines`, `lastCaptionAt`, `lastCaptionSpeaker`, `lastCaptionText`, і короткий хвіст `recentTranscript`, щоб оператори могли зрозуміти, чи браузер -приєднався до дзвінка і чи субтитри Meet створюють текст. +приєднався до дзвінка та чи субтитри Meet створюють текст. Використовуйте `openclaw googlemeet test-listen --transport chrome-node`, коли -потрібна перевірка так/ні: вона приєднується в режимі transcribe, чекає свіжого руху субтитрів або -транскрипту та повертає `listenVerified`, `listenTimedOut`, поля ручних -дій і останній стан субтитрів. +потрібна перевірка так/ні: він приєднується в режимі транскрибування, чекає свіжого руху субтитрів або +транскрипту та повертає `listenVerified`, `listenTimedOut`, поля ручної +дії та останній стан субтитрів. -Під час realtime-сеансів статус `google_meet` містить стан браузера й аудіомоста, -як-от `inCall`, `manualActionRequired`, `providerConnected`, -`realtimeReady`, `audioInputActive`, `audioOutputActive`, останні часові мітки вводу/виводу, -лічильники байтів і стан закриття моста. Якщо з’являється безпечна підказка сторінки Meet, -браузерна автоматизація обробляє її, коли може. Вхід, допуск хостом і -підказки дозволів браузера/ОС повідомляються як ручна дія з причиною та -повідомленням, яке агент може передати. Керовані сеанси Chrome видають вступ або +Під час сеансів реального часу статус `google_meet` містить стан браузера й аудіомосту, +зокрема `inCall`, `manualActionRequired`, `providerConnected`, +`realtimeReady`, `audioInputActive`, `audioOutputActive`, останні часові позначки введення/виведення, +лічильники байтів і стан закриття мосту. Якщо з’являється безпечний запит сторінки Meet, +автоматизація браузера обробляє його, коли може. Вхід, допуск хостом і +запити дозволів браузера/ОС повідомляються як ручна дія з причиною та +повідомленням, яке агент має передати. Керовані сеанси Chrome відтворюють вступ або тестову фразу лише після того, як стан браузера повідомить `inCall: true`; інакше статус повідомляє -`speechReady: false`, а спроба мовлення блокується замість того, щоб удавати, ніби -агент говорив у зустрічі. +`speechReady: false`, а спроба мовлення блокується замість удавання, що +агент говорив у зустріч. -Локальні приєднання Chrome використовують авторизований профіль браузера OpenClaw. Realtime-режим +Локальні приєднання Chrome відбуваються через профіль браузера OpenClaw із виконаним входом. Режим реального часу потребує `BlackHole 2ch` для шляху мікрофона/динаміка, який використовує OpenClaw. Для -чистого двобічного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; одного -пристрою BlackHole достатньо для першого smoke test, але він може давати відлуння. +чистого дуплексного аудіо використовуйте окремі віртуальні пристрої або граф у стилі Loopback; +одного пристрою BlackHole достатньо для першого smoke test, але він може створювати луну. -### Локальний Gateway + Parallels Chrome +### Локальний Gateway + Chrome у Parallels -Вам **не** потрібен повний OpenClaw Gateway або ключ API моделі всередині macOS VM +Вам **не** потрібен повний OpenClaw Gateway або ключ model API всередині macOS VM лише для того, щоб VM володіла Chrome. Запустіть Gateway і агента локально, а потім запустіть -вузловий хост у VM. Один раз увімкніть вбудований Plugin у VM, щоб вузол +вузловий хост у VM. Увімкніть вбудований Plugin на VM один раз, щоб вузол оголошував команду Chrome: Що де працює: -- Хост Gateway: OpenClaw Gateway, робочий простір агента, ключі моделі/API, realtime - провайдер і конфігурація Plugin Google Meet. +- Хост Gateway: OpenClaw Gateway, робочий простір агента, model/API-ключі, провайдер + реального часу та конфігурація Plugin Google Meet. - Parallels macOS VM: OpenClaw CLI/вузловий хост, Google Chrome, SoX, BlackHole 2ch - і профіль Chrome, авторизований у Google. -- Не потрібно у VM: служба Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування + і профіль Chrome із входом у Google. +- Не потрібно у VM: сервіс Gateway, конфігурація агента, ключ OpenAI/GPT або налаштування провайдера моделі. Установіть залежності VM: @@ -276,8 +276,8 @@ openclaw plugins enable google-meet openclaw node run --host --port 18789 --display-name parallels-macos ``` -Якщо `` — це LAN IP і ви не використовуєте TLS, вузол відмовиться від -plaintext WebSocket, якщо ви явно не дозволите його для цієї довіреної приватної мережі: +Якщо `` — це LAN IP і ви не використовуєте TLS, вузол відхиляє +відкритий WebSocket, якщо ви явно не дозволите його для цієї довіреної приватної мережі: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -292,11 +292,11 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node restart ``` -`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не налаштування +`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` — це середовище процесу, а не параметр `openclaw.json`. `openclaw node install` зберігає його в середовищі LaunchAgent, -коли воно присутнє в команді встановлення. +коли він присутній у команді встановлення. -Схваліть вузол із хоста Gateway: +Схваліть вузол з хоста Gateway: ```bash openclaw devices list @@ -355,49 +355,98 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij ``` -Під час realtime-приєднання автоматизація браузера OpenClaw заповнює ім’я гостя, натискає Join/Ask to join і приймає початковий вибір Meet "Use microphone", коли з’являється цей запит. Під час приєднання лише для спостереження або створення зустрічі лише через браузер вона проходить той самий запит без мікрофона, коли такий вибір доступний. Якщо профіль браузера не ввійшов в обліковий запис, Meet очікує допуску від організатора, Chrome потребує дозволу на мікрофон/камеру для realtime-приєднання або Meet застряг на запиті, який автоматизація не змогла розв’язати, результат join/test-speech повідомляє `manualActionRequired: true` з `manualActionReason` і `manualActionMessage`. Агенти мають припинити повторювати приєднання, повідомити саме це повідомлення разом із поточними `browserUrl`/`browserTitle` і повторити спробу лише після завершення ручної дії в браузері. +Під час realtime-приєднання браузерна автоматизація OpenClaw заповнює ім’я гостя, натискає +Join/Ask to join і приймає вибір Meet першого запуску "Use microphone", коли такий +запит з’являється. Під час observe-only-приєднання або створення browser-only зустрічі вона +продовжує повз той самий запит без мікрофона, коли такий варіант доступний. +Якщо профіль браузера не авторизований, Meet очікує допуску від організатора, +Chrome потребує дозволу на мікрофон/камеру для realtime-приєднання, або Meet завис +на запиті, який автоматизація не змогла розв’язати, результат join/test-speech повідомляє +`manualActionRequired: true` із `manualActionReason` та +`manualActionMessage`. Агенти мають припинити повторювати приєднання, повідомити це точне +повідомлення разом із поточними `browserUrl`/`browserTitle` і повторити спробу лише після +завершення ручної дії в браузері. -Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно один підключений Node оголошує і `googlemeet.chrome`, і керування браузером. Якщо підключено кілька придатних Node, задайте `chromeNode.node` як ідентифікатор Node, відображуване ім’я або віддалену IP-адресу. +Якщо `chromeNode.node` пропущено, OpenClaw автоматично вибирає лише тоді, коли рівно один +підключений вузол оголошує і `googlemeet.chrome`, і керування браузером. Якщо +підключено кілька придатних вузлів, задайте `chromeNode.node` як id вузла, +відображуване ім’я або віддалену IP-адресу. -Типові перевірки збоїв: +Поширені перевірки збоїв: -- `Configured Google Meet node ... is not usable: offline`: закріплений Node відомий Gateway, але недоступний. Агенти мають розглядати цей Node як діагностичний стан, а не як придатний хост Chrome, і повідомляти про блокер налаштування замість переходу на інший транспорт, якщо користувач не попросив про це. -- `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, схваліть спарювання і переконайтеся, що `openclaw plugins enable google-meet` та `openclaw plugins enable browser` були виконані у VM. Також підтвердьте, що хост Gateway дозволяє обидві команди Node через `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`. -- `BlackHole 2ch audio device not found`: установіть `blackhole-2ch` на хості, який перевіряється, і перезавантажте його перед використанням локального аудіо Chrome. -- `BlackHole 2ch audio device not found on the node`: установіть `blackhole-2ch` у VM і перезавантажте VM. -- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або залиште `chrome.guestName` заданим для гостьового приєднання. Автоматичне гостьове приєднання використовує автоматизацію браузера OpenClaw через проксі браузера Node; переконайтеся, що конфігурація браузера Node вказує на потрібний профіль, наприклад `browser.defaultProfile: "user"` або іменований профіль існуючого сеансу. -- Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw активує наявну вкладку для тієї самої URL-адреси Meet перед відкриттям нової, а створення зустрічі в браузері повторно використовує незавершену вкладку `https://meet.google.com/new` або вкладку запиту облікового запису Google перед відкриттям іншої. -- Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою, який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію у стилі Loopback для чистого дуплексного аудіо. +- `Configured Google Meet node ... is not usable: offline`: закріплений вузол + відомий Gateway, але недоступний. Агенти мають сприймати цей вузол як + діагностичний стан, а не як придатний Chrome-хост, і повідомляти про блокер налаштування + замість перемикання на інший транспорт, якщо користувач цього не просив. +- `No connected Google Meet-capable node`: запустіть `openclaw node run` у VM, + підтвердьте спарювання і переконайтеся, що `openclaw plugins enable google-meet` та + `openclaw plugins enable browser` були виконані у VM. Також підтвердьте, що + хост Gateway дозволяє обидві команди вузла за допомогою + `gateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]`. +- `BlackHole 2ch audio device not found`: встановіть `blackhole-2ch` на хості, + який перевіряється, і перезавантажтеся перед використанням локального аудіо Chrome. +- `BlackHole 2ch audio device not found on the node`: встановіть `blackhole-2ch` + у VM і перезавантажте VM. +- Chrome відкривається, але не може приєднатися: увійдіть у профіль браузера всередині VM або + залиште `chrome.guestName` заданим для гостьового приєднання. Гостьове автоприєднання використовує браузерну + автоматизацію OpenClaw через браузерний проксі вузла; переконайтеся, що браузерна + конфігурація вузла вказує на потрібний вам профіль, наприклад + `browser.defaultProfile: "user"` або іменований профіль наявного сеансу. +- Дублікати вкладок Meet: залиште `chrome.reuseExistingTab: true` увімкненим. OpenClaw + активує наявну вкладку для тієї самої Meet URL перед відкриттям нової, а + браузерне створення зустрічі повторно використовує поточну вкладку `https://meet.google.com/new` + або вкладку запиту Google-акаунта перед відкриттям іншої. +- Немає аудіо: у Meet спрямуйте мікрофон/динамік через шлях віртуального аудіопристрою, + який використовує OpenClaw; використовуйте окремі віртуальні пристрої або маршрутизацію у стилі Loopback + для чистого дуплексного аудіо. -## Нотатки щодо встановлення +## Нотатки зі встановлення -Realtime-типовий режим Chrome використовує два зовнішні інструменти: +Стандартна Chrome realtime-конфігурація використовує два зовнішні інструменти: -- `sox`: аудіоутиліта командного рядка. Плагін використовує явні команди пристроїв CoreAudio для стандартного аудіомоста 24 kHz PCM16. -- `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, через який Chrome/Meet може виконувати маршрутизацію. +- `sox`: утиліта командного рядка для аудіо. Plugin використовує явні команди пристроїв CoreAudio + для стандартного 24 kHz PCM16 аудіомоста. +- `blackhole-2ch`: віртуальний аудіодрайвер macOS. Він створює аудіопристрій `BlackHole 2ch`, + через який Chrome/Meet можуть маршрутизувати аудіо. -OpenClaw не вбудовує й не розповсюджує жоден із цих пакетів. Документація просить користувачів установити їх як залежності хоста через Homebrew. SoX ліцензовано як `LGPL-2.0-only AND GPL-2.0-only`; BlackHole має ліцензію GPL-3.0. Якщо ви створюєте інсталятор або appliance, який комплектує BlackHole разом з OpenClaw, перегляньте умови ліцензування upstream BlackHole або отримайте окрему ліцензію від Existential Audio. +OpenClaw не вбудовує і не розповсюджує жоден із цих пакетів. Документація просить користувачів +встановити їх як залежності хоста через Homebrew. SoX ліцензовано як +`LGPL-2.0-only AND GPL-2.0-only`; BlackHole має GPL-3.0. Якщо ви створюєте +інсталятор або appliance, який постачає BlackHole разом з OpenClaw, перегляньте +умови ліцензування upstream BlackHole або отримайте окрему ліцензію від Existential Audio. ## Транспорти ### Chrome -Транспорт Chrome відкриває URL-адресу Meet через керування браузером OpenClaw і приєднується як профіль браузера OpenClaw, що ввійшов в обліковий запис. На macOS плагін перевіряє наявність `BlackHole 2ch` перед запуском. Якщо налаштовано, він також запускає команду перевірки стану аудіомоста і стартову команду перед відкриттям Chrome. Використовуйте `chrome`, коли Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють на спареному Node, наприклад Parallels macOS VM. Для локального Chrome виберіть профіль через `browser.defaultProfile`; `chrome.browserProfile` передається хостам `chrome-node`. +Транспорт Chrome відкриває Meet URL через керування браузером OpenClaw і приєднується +як авторизований браузерний профіль OpenClaw. На macOS Plugin перевіряє наявність +`BlackHole 2ch` перед запуском. Якщо налаштовано, він також запускає команду перевірки стану +аудіомоста і команду запуску перед відкриттям Chrome. Використовуйте `chrome`, коли +Chrome/аудіо працюють на хості Gateway; використовуйте `chrome-node`, коли Chrome/аудіо працюють +на спареному вузлі, наприклад Parallels macOS VM. Для локального Chrome виберіть +профіль за допомогою `browser.defaultProfile`; `chrome.browserProfile` передається +хостам `chrome-node`. ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node ``` -Спрямуйте аудіо мікрофона і динаміка Chrome через локальний аудіоміст OpenClaw. Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування замість тихого приєднання без аудіошляху. +Маршрутизуйте аудіо мікрофона і динаміка Chrome через локальний аудіоміст OpenClaw. +Якщо `BlackHole 2ch` не встановлено, приєднання завершується помилкою налаштування +замість тихого приєднання без аудіошляху. ### Twilio -Транспорт Twilio — це строгий план набору, делегований плагіну Voice Call. Він не розбирає сторінки Meet для пошуку телефонних номерів. +Транспорт Twilio є суворим планом набору, делегованим Plugin Voice Call. Він +не аналізує сторінки Meet для пошуку телефонних номерів. -Використовуйте це, коли участь через Chrome недоступна або потрібен запасний варіант телефонного дозвону. Google Meet має надати телефонний номер дозвону і PIN для зустрічі; OpenClaw не виявляє їх зі сторінки Meet. +Використовуйте це, коли участь через Chrome недоступна або потрібен резервний варіант +телефонного дозвону. Google Meet має надати номер телефонного дозвону і PIN для +зустрічі; OpenClaw не виявляє їх зі сторінки Meet. -Увімкніть плагін Voice Call на хості Gateway, а не на Node Chrome: +Увімкніть Plugin Voice Call на хості Gateway, а не на вузлі Chrome: ```json5 { @@ -422,7 +471,8 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome } ``` -Надайте облікові дані Twilio через середовище або конфігурацію. Середовище не допускає потрапляння секретів у `openclaw.json`: +Надайте облікові дані Twilio через середовище або конфігурацію. Середовище тримає +секрети поза `openclaw.json`: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -430,7 +480,8 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації плагіна не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться. +Перезапустіть або перезавантажте Gateway після ввімкнення `voice-call`; зміни конфігурації Plugin +не з’являються в уже запущеному процесі Gateway, доки він не перезавантажиться. Потім перевірте: @@ -440,7 +491,9 @@ openclaw plugins list | grep -E 'google-meet|voice-call' openclaw googlemeet setup ``` -Коли делегування Twilio підключено, `googlemeet setup` містить успішні перевірки `twilio-voice-call-plugin`, `twilio-voice-call-credentials` і `twilio-voice-call-webhook`. +Коли делегування Twilio під’єднано, `googlemeet setup` включає успішні +перевірки `twilio-voice-call-plugin`, `twilio-voice-call-credentials` і +`twilio-voice-call-webhook`. ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -449,7 +502,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --pin 123456 ``` -Використовуйте `--dtmf-sequence`, коли зустріч потребує власної послідовності: +Використовуйте `--dtmf-sequence`, коли зустріч потребує спеціальної послідовності: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -460,29 +513,39 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ ## OAuth і preflight -OAuth необов’язковий для створення посилання Meet, оскільки `googlemeet create` може повернутися до автоматизації браузера. Налаштуйте OAuth, коли потрібне офіційне створення через API, розв’язання простору або preflight-перевірки Meet Media API. +OAuth необов’язковий для створення посилання Meet, тому що `googlemeet create` може +повернутися до браузерної автоматизації. Налаштуйте OAuth, коли потрібне офіційне створення через API, +визначення простору або preflight-перевірки Meet Media API. -Доступ до Google Meet API використовує OAuth користувача: створіть OAuth-клієнт Google Cloud, запросіть потрібні scopes, авторизуйте обліковий запис Google, а потім збережіть отриманий refresh token у конфігурації плагіна Google Meet або надайте змінні середовища `OPENCLAW_GOOGLE_MEET_*`. +Доступ до Google Meet API використовує OAuth користувача: створіть OAuth-клієнт Google Cloud, +запросіть потрібні області доступу, авторизуйте обліковий запис Google, а потім збережіть +отриманий токен оновлення в конфігурації Plugin Google Meet або надайте +змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -OAuth не замінює шлях приєднання Chrome. Транспорти Chrome і Chrome-node все одно приєднуються через профіль Chrome, що ввійшов в обліковий запис, BlackHole/SoX і підключений Node, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного шляху Google Meet API: створення просторів зустрічей, розв’язання просторів і виконання preflight-перевірок Meet Media API. +OAuth не замінює шлях приєднання через Chrome. Транспорти Chrome і Chrome-node +досі приєднуються через профіль Chrome із виконаним входом, BlackHole/SoX і підключений +вузол, коли ви використовуєте участь через браузер. OAuth призначений лише для офіційного +шляху Google Meet API: створення просторів зустрічей, розпізнавання просторів і запуск +передпольотних перевірок Meet Media API. -### Створення облікових даних Google +### Створіть облікові дані Google У Google Cloud Console: 1. Створіть або виберіть проєкт Google Cloud. 2. Увімкніть **Google Meet REST API** для цього проєкту. 3. Налаштуйте екран згоди OAuth. - - **Internal** найпростіший для організації Google Workspace. - - **External** працює для особистих/тестових налаштувань; поки застосунок перебуває в Testing, додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача. -4. Додайте scopes, які запитує OpenClaw: + - **Internal** — найпростіший варіант для організації Google Workspace. + - **External** працює для особистих/тестових налаштувань; доки застосунок перебуває в режимі Testing, + додайте кожен обліковий запис Google, який авторизуватиме застосунок, як тестового користувача. +4. Додайте області доступу, які запитує OpenClaw: - `https://www.googleapis.com/auth/meetings.space.created` - `https://www.googleapis.com/auth/meetings.space.readonly` - `https://www.googleapis.com/auth/meetings.space.settings` - `https://www.googleapis.com/auth/meetings.conference.media.readonly` 5. Створіть OAuth client ID. - Тип застосунку: **Web application**. - - Авторизована URI перенаправлення: + - Авторизований URI переспрямування: ```text http://localhost:8085/oauth2callback @@ -490,21 +553,26 @@ OAuth не замінює шлях приєднання Chrome. Транспор 6. Скопіюйте client ID і client secret. -`meetings.space.created` потрібен Google Meet `spaces.create`. -`meetings.space.readonly` дає OpenClaw змогу розв’язувати URL-адреси/коди Meet у простори. -`meetings.space.settings` дає OpenClaw змогу передавати налаштування `SpaceConfig`, такі як `accessType`, під час створення кімнати через API. -`meetings.conference.media.readonly` призначений для preflight Meet Media API і роботи з медіа; Google може вимагати реєстрації в Developer Preview для фактичного використання Media API. -Якщо вам потрібні лише приєднання Chrome на основі браузера, повністю пропустіть OAuth. +`meetings.space.created` потрібен для Google Meet `spaces.create`. +`meetings.space.readonly` дає OpenClaw змогу розпізнавати URL/коди Meet як простори. +`meetings.space.settings` дає OpenClaw змогу передавати налаштування `SpaceConfig`, як-от +`accessType`, під час створення кімнати через API. +`meetings.conference.media.readonly` призначений для передпольотної перевірки Meet Media API і роботи +з медіа; Google може вимагати реєстрації в Developer Preview для фактичного використання Media API. +Якщо вам потрібні лише приєднання через Chrome на основі браузера, повністю пропустіть OAuth. -### Отримання refresh token +### Згенеруйте токен оновлення -Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, або передайте їх як змінні середовища, а потім виконайте: +Налаштуйте `oauth.clientId` і, за потреби, `oauth.clientSecret`, або передайте їх як +змінні середовища, а потім виконайте: ```bash openclaw googlemeet auth login --json ``` -Команда друкує конфігураційний блок `oauth` із refresh token. Вона використовує PKCE, localhost callback на `http://localhost:8085/oauth2callback` і ручний потік копіювання/вставлення з `--manual`. +Команда виводить блок конфігурації `oauth` із токеном оновлення. Вона використовує PKCE, +localhost callback на `http://localhost:8085/oauth2callback` і ручний +потік копіювання/вставлення з `--manual`. Приклади: @@ -514,7 +582,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \ openclaw googlemeet auth login --json ``` -Використовуйте ручний режим, коли браузер не може дістатися локального callback: +Використовуйте ручний режим, коли браузер не може досягти локального callback: ```bash OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \ @@ -522,7 +590,7 @@ OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \ openclaw googlemeet auth login --json --manual ``` -JSON-вивід містить: +Вивід JSON містить: ```json { @@ -537,7 +605,7 @@ JSON-вивід містить: } ``` -Збережіть об’єкт `oauth` у конфігурації плагіна Google Meet: +Збережіть об’єкт `oauth` у конфігурації Plugin Google Meet: ```json5 { @@ -558,11 +626,16 @@ JSON-вивід містить: } ``` -Надавайте перевагу змінним середовища, коли не хочете зберігати refresh token у конфігурації. Якщо присутні і конфігураційні, і середовищні значення, плагін спочатку розв’язує конфігурацію, а потім використовує середовище як fallback. +Надавайте перевагу змінним середовища, коли не хочете зберігати токен оновлення в конфігурації. +Якщо присутні і значення конфігурації, і значення середовища, Plugin спершу використовує конфігурацію, +а потім резервно звертається до середовища. -Згода OAuth включає створення просторів Meet, доступ на читання просторів Meet і доступ на читання медіа конференцій Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей, повторно виконайте `openclaw googlemeet auth login --json`, щоб refresh token мав scope `meetings.space.created`. +Згода OAuth включає створення просторів Meet, доступ до читання просторів Meet і доступ до читання +медіа конференцій Meet. Якщо ви автентифікувалися до появи підтримки створення зустрічей, +повторно виконайте `openclaw googlemeet auth login --json`, щоб токен оновлення мав область доступу +`meetings.space.created`. -### Перевірка OAuth через doctor +### Перевірте OAuth за допомогою doctor Запустіть OAuth doctor, коли потрібна швидка перевірка стану без секретів: @@ -570,27 +643,31 @@ JSON-вивід містить: openclaw googlemeet doctor --oauth --json ``` -Це не завантажує runtime Chrome і не потребує підключеного Node Chrome. Воно перевіряє, що конфігурація OAuth існує і що refresh token може видати access token. JSON-звіт містить лише поля стану, такі як `ok`, `configured`, `tokenSource`, `expiresAt`, і повідомлення перевірок; він не друкує access token, refresh token або client secret. +Це не завантажує runtime Chrome і не потребує підключеного вузла Chrome. Перевіряється, +що конфігурація OAuth існує і що токен оновлення може згенерувати токен доступу. Звіт JSON містить +лише поля стану, як-от `ok`, `configured`, `tokenSource`, `expiresAt`, і повідомлення перевірок; +він не друкує токен доступу, токен оновлення або client secret. -Типові результати: +Поширені результати: | Перевірка | Значення | | -------------------- | --------------------------------------------------------------------------------------- | -| `oauth-config` | Наявні `oauth.clientId` плюс `oauth.refreshToken` або кешований access token. | -| `oauth-token` | Кешований access token усе ще чинний або refresh token видав новий access token. | -| `meet-spaces-get` | Необов’язкова перевірка `--meeting` розв’язала наявний простір Meet. | -| `meet-spaces-create` | Необов’язкова перевірка `--create-space` створила новий простір Meet. | +| `oauth-config` | Наявний `oauth.clientId` разом із `oauth.refreshToken` або кешований токен доступу. | +| `oauth-token` | Кешований токен доступу досі чинний, або токен оновлення згенерував новий токен доступу. | +| `meet-spaces-get` | Додаткова перевірка `--meeting` розпізнала наявний простір Meet. | +| `meet-spaces-create` | Додаткова перевірка `--create-space` створила новий простір Meet. | -Щоб також підтвердити ввімкнення Google Meet API і scope `spaces.create`, виконайте перевірку створення з побічним ефектом: +Щоб також підтвердити ввімкнення Google Meet API і область доступу `spaces.create`, виконайте +перевірку створення з побічним ефектом: ```bash openclaw googlemeet doctor --oauth --create-space --json openclaw googlemeet create --no-join --json ``` -`--create-space` створює одноразову URL-адресу Meet. Використовуйте це, коли потрібно підтвердити, +`--create-space` створює одноразову URL-адресу Meet. Використовуйте її, коли потрібно підтвердити, що в проєкті Google Cloud увімкнено Meet API і що авторизований -обліковий запис має область `meetings.space.created`. +обліковий запис має scope `meetings.space.created`. Щоб підтвердити доступ на читання для наявного простору зустрічі: @@ -602,15 +679,15 @@ openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij `doctor --oauth --meeting` і `resolve-space` підтверджують доступ на читання до наявного простору, до якого авторизований обліковий запис Google має доступ. `403` від цих перевірок зазвичай означає, що Google Meet REST API вимкнено, погоджений refresh token -не має потрібної області або обліковий запис Google не може отримати доступ до цього простору -Meet. Помилка refresh-token означає, що потрібно повторно виконати `openclaw googlemeet auth login +не має потрібного scope або обліковий запис Google не може отримати доступ до цього простору +Meet. Помилка refresh token означає, що потрібно повторно виконати `openclaw googlemeet auth login --json` і зберегти новий блок `oauth`. -Для резервного браузерного режиму облікові дані OAuth не потрібні. У цьому режимі автентифікація Google -береться з профілю Chrome, у який виконано вхід на вибраному вузлі, а не з +Для резервного браузерного режиму облікові дані OAuth не потрібні. У цьому режимі авторизація Google +надходить із профілю Chrome, у який виконано вхід на вибраному вузлі, а не з конфігурації OpenClaw. -Ці змінні середовища приймаються як резервні: +Ці змінні середовища приймаються як резервні значення: - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` - `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` або `GOOGLE_MEET_CLIENT_SECRET` @@ -621,7 +698,7 @@ Meet. Помилка refresh-token означає, що потрібно пов - `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` або `GOOGLE_MEET_DEFAULT_MEETING` - `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` або `GOOGLE_MEET_PREVIEW_ACK` -Визначте Meet URL, код або `spaces/{id}` через `spaces.get`: +Розв’яжіть URL-адресу Meet, код або `spaces/{id}` через `spaces.get`: ```bash openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij @@ -641,11 +718,11 @@ openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export ``` -З `--meeting`, `artifacts` і `attendance` типово використовують найновіший запис конференції. +З `--meeting` команди `artifacts` і `attendance` за замовчуванням використовують останній запис конференції. Передайте `--all-conference-records`, якщо потрібні всі збережені записи для цієї зустрічі. -Пошук у календарі може визначити URL зустрічі з Google Calendar перед читанням +Пошук у календарі може визначити URL-адресу зустрічі з Google Calendar перед читанням артефактів Meet: ```bash @@ -656,13 +733,13 @@ openclaw googlemeet attendance --today --format csv --output attendance.csv ``` `--today` шукає в сьогоднішньому календарі `primary` подію Calendar із -посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події, і -`--calendar ` для неосновного календаря. Пошук у календарі потребує свіжого -входу OAuth, який включає область readonly для подій Calendar. +посиланням Google Meet. Використовуйте `--event ` для пошуку відповідного тексту події та +`--calendar ` для неосновного календаря. Пошук у календарі потребує нового +входу OAuth, який включає scope лише для читання подій Calendar. `calendar-events` попередньо показує відповідні події Meet і позначає подію, яку -виберуть `latest`, `artifacts`, `attendance` або `export`. +вибере `latest`, `artifacts`, `attendance` або `export`. -Якщо ви вже знаєте id запису конференції, звертайтеся до нього напряму: +Якщо ви вже знаєте ідентифікатор запису конференції, звертайтеся до нього напряму: ```bash openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij @@ -677,11 +754,11 @@ openclaw googlemeet attendance --conference-record conferenceRecords/abc123 --js openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hij ``` -Це викликає Google Meet `spaces.endActiveConference` і потребує OAuth з областю -`meetings.space.created` для простору, яким авторизований обліковий запис може керувати. -OpenClaw приймає на вході Meet URL, код зустрічі або `spaces/{id}` і перетворює його +Це викликає Google Meet `spaces.endActiveConference` і потребує OAuth зі +scope `meetings.space.created` для простору, яким авторизований обліковий запис може керувати. +OpenClaw приймає URL-адресу Meet, код зустрічі або вхідні дані `spaces/{id}` і перетворює їх на ресурс простору API перед завершенням активної конференції. -Це окремо від `googlemeet leave`: `leave` зупиняє локальну/сеансову +Це окремо від `googlemeet leave`: `leave` зупиняє локальну/сесійну участь OpenClaw, тоді як `end-active-conference` просить Google Meet завершити активну конференцію для простору. @@ -701,27 +778,27 @@ openclaw googlemeet export --conference-record conferenceRecords/abc123 \ ``` `artifacts` повертає метадані запису конференції, а також метадані ресурсів учасників, записів, -стенограм, структурованих записів стенограми та розумних нотаток, коли +транскриптів, структурованих записів транскрипту та розумних нотаток, коли Google надає їх для зустрічі. Використовуйте `--no-transcript-entries`, щоб пропустити пошук записів для великих зустрічей. `attendance` розгортає учасників у -рядки сеансів учасників із часом першої/останньої появи, загальною тривалістю сеансу, -прапорцями запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем, -що ввійшов у систему, або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб тримати необроблені ресурси учасників -окремо, `--late-after-minutes`, щоб налаштувати визначення запізнення, і +рядки сесій учасників із часом першої/останньої появи, загальною тривалістю сесії, +позначками запізнення/раннього виходу та дубльованими ресурсами учасників, об’єднаними за користувачем, +що ввійшов у систему, або відображуваним іменем. Передайте `--no-merge-duplicates`, щоб залишити сирі ресурси +учасників окремо, `--late-after-minutes`, щоб налаштувати визначення запізнення, і `--early-before-minutes`, щоб налаштувати визначення раннього виходу. `export` записує папку, що містить `summary.md`, `attendance.csv`, `transcript.md`, `artifacts.json`, `attendance.json` і `manifest.json`. -`manifest.json` записує вибраний вхід, параметри експорту, записи конференції, -вихідні файли, лічильники, джерело токена, подію Calendar, якщо вона використовувалася, і будь-які +`manifest.json` записує вибрані вхідні дані, параметри експорту, записи конференції, +вихідні файли, лічильники, джерело токена, подію Calendar, якщо її було використано, і всі попередження про часткове отримання. Передайте `--zip`, щоб також записати переносний архів поруч -із папкою. Передайте `--include-doc-bodies`, щоб експортувати текст пов’язаних стенограм і +із папкою. Передайте `--include-doc-bodies`, щоб експортувати текст пов’язаних транскриптів і розумних нотаток Google Docs через Google Drive `files.export`; для цього потрібен -свіжий вхід OAuth, який включає область Drive Meet readonly. Без -`--include-doc-bodies` експорти включають лише метадані Meet і структуровані записи стенограми. -Якщо Google повертає часткову помилку артефакта, як-от помилку списку розумних нотаток, -запису стенограми або тіла документа Drive, підсумок і -маніфест зберігають попередження замість провалу всього експорту. +новий вхід OAuth, який включає scope лише для читання Drive Meet. Без +`--include-doc-bodies` експорти містять лише метадані Meet і структуровані записи транскрипту. +Якщо Google повертає часткову помилку артефакту, як-от помилку списку розумних нотаток, +запису транскрипту або тіла документа Drive, зведення й +маніфест зберігають попередження замість збою всього експорту. Використовуйте `--dry-run`, щоб отримати ті самі дані артефактів/відвідуваності та надрукувати JSON маніфесту без створення папки або ZIP. Це корисно перед записом великого експорту або коли агенту потрібні лише лічильники, вибрані записи та @@ -739,7 +816,7 @@ JSON маніфесту без створення папки або ZIP. Це к } ``` -Задайте `"dryRun": true`, щоб повернути лише маніфест експорту й пропустити записи файлів. +Установіть `"dryRun": true`, щоб повернути лише маніфест експорту та пропустити запис файлів. Агенти також можуть створити кімнату на базі API з явною політикою доступу: @@ -781,18 +858,18 @@ OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \ pnpm test:live -- extensions/google-meet/google-meet.live.test.ts ``` -Запустіть live браузерну перевірку з пріоритетом прослуховування для зустрічі, де хтось -говоритиме, а субтитри Meet будуть доступні: +Запустіть live браузерний пробник із пріоритетом прослуховування для зустрічі, де хтось +говоритиме з доступними субтитрами Meet: ```bash openclaw googlemeet setup --transport chrome-node --mode transcribe openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000 ``` -Середовище live smoke: +Live smoke середовище: - `OPENCLAW_LIVE_TEST=1` вмикає захищені live тести. -- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережений Meet URL, код або +- `OPENCLAW_GOOGLE_MEET_LIVE_MEETING` вказує на збережену URL-адресу Meet, код або `spaces/{id}`. - `OPENCLAW_GOOGLE_MEET_CLIENT_ID` або `GOOGLE_MEET_CLIENT_ID` надає OAuth client id. @@ -810,19 +887,19 @@ openclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport потребує `https://www.googleapis.com/auth/drive.meet.readonly`. -Створіть свіжий простір Meet: +Створіть новий простір Meet: ```bash openclaw googlemeet create ``` -Команда друкує новий `meeting uri`, джерело та сеанс приєднання. З обліковими даними OAuth +Команда друкує новий `meeting uri`, джерело та сесію приєднання. З обліковими даними OAuth вона використовує офіційний Google Meet API. Без облікових даних OAuth вона -використовує як резервний варіант профіль браузера закріпленого вузла Chrome, у який виконано вхід. Агенти можуть -використовувати інструмент `google_meet` з `action: "create"`, щоб створити й приєднатися за один -крок. Для створення лише URL передайте `"join": false`. +використовує як резервний варіант браузерний профіль закріпленого вузла Chrome, у який виконано вхід. Агенти можуть +використовувати інструмент `google_meet` з `action: "create"`, щоб створити зустріч і приєднатися за один +крок. Для створення лише URL-адреси передайте `"join": false`. -Приклад JSON-виводу з резервного браузерного режиму: +Приклад JSON-виводу з браузерного резервного режиму: ```json { @@ -842,9 +919,9 @@ openclaw googlemeet create } ``` -Якщо резервний браузерний режим натрапляє на вхід у Google або блокування дозволів Meet до того, як -зможе створити URL, метод Gateway повертає невдалу відповідь, а -інструмент `google_meet` повертає структуровані подробиці замість простого рядка: +Якщо браузерний резервний режим натрапляє на вхід Google або блокування дозволів Meet, перш ніж він +зможе створити URL-адресу, метод Gateway повертає невдалу відповідь, а +інструмент `google_meet` повертає структуровані деталі замість простого рядка: ```json { @@ -864,7 +941,7 @@ openclaw googlemeet create Коли агент бачить `manualActionRequired: true`, він має повідомити `manualActionMessage` разом із контекстом браузерного вузла/вкладки та припинити відкривати нові -вкладки Meet, доки оператор не завершить браузерний крок. +вкладки Meet, доки оператор не завершить крок у браузері. Приклад JSON-виводу зі створення через API: @@ -887,20 +964,20 @@ openclaw googlemeet create } ``` -Створення Meet типово приєднується до зустрічі. Транспорт Chrome або Chrome-node все ще +Створення Meet за замовчуванням приєднується до зустрічі. Транспорт Chrome або Chrome-node все ще потребує профілю Google Chrome, у який виконано вхід, щоб приєднатися через браузер. Якщо з профілю виконано вихід, OpenClaw повідомляє `manualActionRequired: true` або -помилку резервного браузерного режиму й просить оператора завершити вхід у Google перед +помилку браузерного резервного режиму й просить оператора завершити вхід Google перед повторною спробою. -Задавайте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш проєкт Cloud, -принципал OAuth і учасники зустрічі зареєстровані в Google +Установлюйте `preview.enrollmentAcknowledged: true` лише після підтвердження, що ваш Cloud +проєкт, OAuth principal і учасники зустрічі зареєстровані в Google Workspace Developer Preview Program для Meet media APIs. ## Конфігурація -Загальний шлях Chrome realtime потребує лише увімкненого Plugin, BlackHole, SoX -і ключа бекенд-постачальника realtime voice. OpenAI є типовим; задайте +Загальний шлях Chrome у режимі realtime потребує лише ввімкненого Plugin, BlackHole, SoX +і ключа backend постачальника realtime voice. OpenAI є типовим; установіть `realtime.provider: "google"`, щоб використовувати Google Gemini Live: ```bash @@ -929,28 +1006,50 @@ export GEMINI_API_KEY=... - `defaultTransport: "chrome"` - `defaultMode: "realtime"` -- `chromeNode.node`: необов'язковий ідентифікатор/назва/IP вузла для `chrome-node` +- `chromeNode.node`: необов’язковий ідентифікатор/назва/IP вузла для `chrome-node` - `chrome.audioBackend: "blackhole-2ch"` -- `chrome.guestName: "OpenClaw Agent"`: ім'я, що використовується на екрані гостя Meet без входу в обліковий запис -- `chrome.autoJoin: true`: найкраща спроба заповнити ім'я гостя й натиснути Join Now через браузерну автоматизацію OpenClaw на `chrome-node` -- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість відкривання дублікатів -- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить про стан у дзвінку, перш ніж буде запущено realtime-вступ -- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат пари команд. Використовуйте `"g711-ulaw-8khz"` лише для застарілих/користувацьких пар команд, які досі видають телефонний аудіосигнал. -- `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` і записує аудіо у форматі `chrome.audioFormat` -- `chrome.audioOutputCommand`: команда SoX, що читає аудіо у форматі `chrome.audioFormat` і записує в CoreAudio `BlackHole 2ch` -- `chrome.bargeInInputCommand`: необов'язкова команда локального мікрофона, що записує знаковий 16-бітний little-endian моно PCM для виявлення людського втручання, поки відтворення асистента активне. Наразі це застосовується до розміщеного на Gateway мосту пари команд `chrome`. -- `chrome.bargeInRmsThreshold: 650`: рівень RMS, що вважається людським перериванням на `chrome.bargeInInputCommand` -- `chrome.bargeInPeakThreshold: 2500`: піковий рівень, що вважається людським перериванням на `chrome.bargeInInputCommand` -- `chrome.bargeInCooldownMs: 900`: мінімальна затримка між повторними очищеннями людського переривання -- `realtime.strategy: "agent"`: типово. Мовлення учасника транскрибується, надсилається налаштованому агенту OpenClaw в окремій sub-agent-сесії для зустрічі, а отримана відповідь озвучується через realtime-провайдера. -- `realtime.strategy: "bidi"`: прямий двонапрямний режим realtime-моделі. Realtime-провайдер відповідає на мовлення учасника напряму й може викликати `openclaw_agent_consult` для глибших відповідей або відповідей із використанням інструментів. +- `chrome.guestName: "OpenClaw Agent"`: ім’я, що використовується на екрані + гостя Meet без входу в обліковий запис +- `chrome.autoJoin: true`: найкраща спроба заповнити ім’я гостя й натиснути + Join Now через автоматизацію браузера OpenClaw на `chrome-node` +- `chrome.reuseExistingTab: true`: активувати наявну вкладку Meet замість + відкривання дублікатів +- `chrome.waitForInCallMs: 20000`: чекати, доки вкладка Meet повідомить про + стан у дзвінку, перед запуском вступу в реальному часі +- `chrome.audioFormat: "pcm16-24khz"`: аудіоформат пари команд. Використовуйте + `"g711-ulaw-8khz"` лише для застарілих/власних пар команд, які досі видають + телефонне аудіо. +- `chrome.audioInputCommand`: команда SoX, що читає з CoreAudio `BlackHole 2ch` + і записує аудіо у `chrome.audioFormat` +- `chrome.audioOutputCommand`: команда SoX, що читає аудіо у `chrome.audioFormat` + і записує до CoreAudio `BlackHole 2ch` +- `chrome.bargeInInputCommand`: необов’язкова команда локального мікрофона, яка + записує підписаний 16-бітний little-endian моно PCM для виявлення втручання + людини під час активного відтворення асистента. Наразі це застосовується до + розміщеного на Gateway мосту пари команд `chrome`. +- `chrome.bargeInRmsThreshold: 650`: рівень RMS, який зараховується як + переривання людиною у `chrome.bargeInInputCommand` +- `chrome.bargeInPeakThreshold: 2500`: піковий рівень, який зараховується як + переривання людиною у `chrome.bargeInInputCommand` +- `chrome.bargeInCooldownMs: 900`: мінімальна затримка між повторними очищеннями + переривань людиною +- `realtime.strategy: "agent"`: типово. Мовлення учасників транскрибується, + надсилається налаштованому агенту OpenClaw у сеансі підагента для окремої + зустрічі, а повернена відповідь озвучується через провайдера реального часу. +- `realtime.strategy: "bidi"`: прямий двонапрямний режим моделі реального часу. + Провайдер реального часу відповідає на мовлення учасників напряму й може + викликати `openclaw_agent_consult` для глибших відповідей із підтримкою + інструментів. - `realtime.provider: "openai"` - `realtime.toolPolicy: "safe-read-only"` -- `realtime.instructions`: короткі усні відповіді, з `openclaw_agent_consult` для глибших відповідей -- `realtime.introMessage`: коротка усна перевірка готовності, коли realtime-міст підключається; встановіть `""`, щоб приєднатися мовчки -- `realtime.agentId`: необов'язковий ідентифікатор агента OpenClaw для `openclaw_agent_consult`; типово `main` +- `realtime.instructions`: короткі усні відповіді з + `openclaw_agent_consult` для глибших відповідей +- `realtime.introMessage`: коротка усна перевірка готовності, коли міст + реального часу підключається; задайте `""`, щоб приєднатися без звуку +- `realtime.agentId`: необов’язковий ідентифікатор агента OpenClaw для + `openclaw_agent_consult`; типово `main` -Необов'язкові перевизначення: +Необов’язкові перевизначення: ```json5 { @@ -1016,7 +1115,12 @@ export GEMINI_API_KEY=... } ``` -`voiceCall.enabled` типово має значення `true`; з транспортом Twilio він делегує фактичний PSTN-дзвінок, DTMF і вступне привітання Plugin Voice Call. Voice Call відтворює DTMF-послідовність перед відкриттям realtime-медіапотоку, а потім використовує збережений вступний текст як початкове realtime-привітання. Якщо `voice-call` не ввімкнено, Google Meet усе ще може перевірити й записати план набору, але не може здійснити Twilio-дзвінок. +`voiceCall.enabled` типово має значення `true`; із транспортом Twilio він +делегує фактичний PSTN-дзвінок, DTMF і вступне привітання Plugin Voice Call. +Voice Call відтворює послідовність DTMF перед відкриттям медіапотоку реального +часу, а потім використовує збережений вступний текст як початкове привітання в +реальному часі. Якщо `voice-call` не ввімкнено, Google Meet усе одно може +перевірити й записати план набору, але не може здійснити Twilio-дзвінок. ## Інструмент @@ -1031,20 +1135,45 @@ export GEMINI_API_KEY=... } ``` -Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. Використовуйте `transport: "chrome-node"`, коли Chrome працює на спареному вузлі, наприклад VM Parallels. В обох випадках realtime-модель і `openclaw_agent_consult` працюють на хості Gateway, тому облікові дані моделі залишаються там. З типовою стратегією `realtime.strategy: "agent"` realtime-провайдер обробляє аудіо й транскрипцію, а налаштований агент OpenClaw створює усну відповідь. З `realtime.strategy: "bidi"` realtime-модель відповідає напряму. +Використовуйте `transport: "chrome"`, коли Chrome працює на хості Gateway. +Використовуйте `transport: "chrome-node"`, коли Chrome працює на спареному +вузлі, як-от VM Parallels. В обох випадках модель реального часу та +`openclaw_agent_consult` працюють на хості Gateway, тож облікові дані моделі +залишаються там. Із типовою `realtime.strategy: "agent"` провайдер реального +часу обробляє аудіо й транскрипцію, а налаштований агент OpenClaw створює +усну відповідь. Із `realtime.strategy: "bidi"` модель реального часу відповідає +напряму. -Використовуйте `action: "status"`, щоб перелічити активні сесії або переглянути ідентифікатор сесії. Використовуйте `action: "speak"` із `sessionId` і `message`, щоб realtime-агент заговорив негайно. Використовуйте `action: "test_speech"`, щоб створити або повторно використати сесію, запустити відому фразу й повернути стан `inCall`, коли хост Chrome може про нього повідомити. `test_speech` завжди примусово встановлює `mode: "realtime"` і завершується помилкою, якщо його просять працювати в `mode: "transcribe"`, бо сесії лише для спостереження навмисно не можуть видавати мовлення. Його результат `speechOutputVerified` базується на збільшенні байтів realtime-аудіовиходу під час цього тестового виклику, тому повторно використана сесія зі старішим аудіо не зараховується як свіжа успішна перевірка мовлення. Використовуйте `action: "leave"`, щоб позначити сесію завершеною. +Використовуйте `action: "status"`, щоб перелічити активні сеанси або перевірити +ідентифікатор сеансу. Використовуйте `action: "speak"` із `sessionId` і +`message`, щоб агент реального часу заговорив негайно. Використовуйте +`action: "test_speech"`, щоб створити або повторно використати сеанс, запустити +відому фразу й повернути стан здоров’я `inCall`, коли хост Chrome може про це +повідомити. `test_speech` завжди примусово задає `mode: "realtime"` і завершується +помилкою, якщо його просять працювати в `mode: "transcribe"`, бо сеанси лише +для спостереження навмисно не можуть видавати мовлення. Його результат +`speechOutputVerified` базується на збільшенні байтів аудіовиходу реального +часу під час цього тестового виклику, тож повторно використаний сеанс зі старішим +аудіо не зараховується як нова успішна перевірка мовлення. Використовуйте +`action: "leave"`, щоб позначити сеанс завершеним. `status` містить стан Chrome, коли він доступний: - `inCall`: Chrome, схоже, перебуває всередині дзвінка Meet - `micMuted`: найкраща спроба визначити стан мікрофона Meet -- `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профіль браузера потребує ручного входу, допуску хостом Meet, дозволів або відновлення керування браузером, перш ніж мовлення зможе працювати -- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи дозволене зараз кероване Chrome мовлення. `speechReady: false` означає, що OpenClaw не надіслав вступну/тестову фразу в аудіоміст. -- `providerConnected` / `realtimeReady`: стан realtime-голосового мосту -- `lastInputAt` / `lastOutputAt`: останнє аудіо, отримане з мосту або надіслане до нього -- `audioOutputRouted` / `audioOutputDeviceLabel`: чи медіавихід вкладки Meet було активно спрямовано на пристрій BlackHole, який використовує міст -- `lastSuppressedInputAt` / `suppressedInputBytes`: loopback-вхід, проігнорований, поки відтворення асистента активне +- `manualActionRequired` / `manualActionReason` / `manualActionMessage`: профілю + браузера потрібен ручний вхід, допуск хостом Meet, дозволи або відновлення + керування браузером, перш ніж мовлення зможе працювати +- `speechReady` / `speechBlockedReason` / `speechBlockedMessage`: чи дозволене + зараз кероване мовлення Chrome. `speechReady: false` означає, що OpenClaw не + надіслав вступну/тестову фразу в аудіоміст. +- `providerConnected` / `realtimeReady`: стан голосового мосту реального часу +- `lastInputAt` / `lastOutputAt`: останнє аудіо, побачене з мосту або надіслане + до нього +- `audioOutputRouted` / `audioOutputDeviceLabel`: чи медіавихід вкладки Meet + було активно спрямовано на пристрій BlackHole, який використовує міст +- `lastSuppressedInputAt` / `suppressedInputBytes`: вхід local loopback, + проігнорований під час активного відтворення асистента ```json { @@ -1054,41 +1183,68 @@ export GEMINI_API_KEY=... } ``` -## Realtime-консультація агента +## Консультація агента в реальному часі -Realtime-режим Chrome оптимізований для живого голосового циклу. Realtime-голосовий провайдер чує аудіо зустрічі й говорить через налаштований аудіоміст. Типова стратегія `realtime.strategy: "agent"` використовує realtime-провайдера для аудіовводу/виводу й транскрипції, але спрямовує фінальні транскрипти учасників через налаштованого агента OpenClaw перед озвученням. Встановіть `realtime.strategy: "bidi"`, коли потрібно, щоб realtime-модель відповідала напряму. -Близькі фінальні фрагменти транскрипту об'єднуються перед консультацією, щоб один усний хід не створював кілька застарілих часткових відповідей. +Режим реального часу Chrome оптимізовано для живого голосового циклу. Голосовий +провайдер реального часу чує аудіо зустрічі й говорить через налаштований +аудіоміст. Типова `realtime.strategy: "agent"` використовує провайдера реального +часу для аудіо I/O та транскрипції, але спрямовує фінальні транскрипти учасників +через налаштованого агента OpenClaw перед озвученням. Задайте +`realtime.strategy: "bidi"`, коли потрібно, щоб модель реального часу відповідала +напряму. +Близькі фінальні фрагменти транскрипту об’єднуються перед консультацією, щоб +один усний хід не створював кілька застарілих часткових відповідей. +Вхід реального часу також пригнічується, поки аудіо асистента в черзі ще +відтворюється, а нещодавні схожі на асистента відлуння транскрипту ігноруються +перед консультацією агента, щоб local loopback BlackHole не змушував агента +відповідати на власне мовлення. -| Стратегія | Хто визначає відповідь | Поведінка контексту | Коли використовувати | +| Стратегія | Хто визначає відповідь | Поведінка контексту | Коли використовувати | | -------- | ----------------------------- | ------------------------------------------------------------------------------------ | ----------------------------------------------------- | -| `agent` | Налаштований агент OpenClaw | Окрема sub-agent-сесія для зустрічі плюс звичайна політика агента, інструменти, workspace і memory | Потрібна поведінка «мій агент присутній на зустрічі» | -| `bidi` | Realtime-голосова модель | Контекст realtime-сесії з необов'язковими викликами `openclaw_agent_consult` | Потрібен голосовий цикл розмови з найменшою затримкою | +| `agent` | Налаштований агент OpenClaw | Сеанс підагента для окремої зустрічі плюс звичайна політика агента, інструменти, робочий простір і пам’ять | Коли потрібна поведінка "мій агент на зустрічі" | +| `bidi` | Голосова модель реального часу | Контекст сеансу реального часу з необов’язковими викликами `openclaw_agent_consult` | Коли потрібен розмовний голосовий цикл із найменшою затримкою | -У стратегії `bidi`, коли realtime-моделі потрібне глибше міркування, актуальна інформація або звичайні інструменти OpenClaw, вона може викликати `openclaw_agent_consult`. +У стратегії `bidi`, коли моделі реального часу потрібні глибше міркування, +актуальна інформація або звичайні інструменти OpenClaw, вона може викликати +`openclaw_agent_consult`. -Інструмент консультації запускає звичайного агента OpenClaw у фоновому режимі з контекстом останніх транскриптів зустрічі та повертає стислу усну відповідь у realtime-голосову сесію. Потім голосова модель може озвучити цю відповідь назад у зустріч. Він використовує той самий спільний realtime-інструмент консультації, що й Voice Call. +Інструмент консультації запускає звичайного агента OpenClaw за лаштунками з +контекстом нещодавнього транскрипту зустрічі й повертає стислу усну відповідь до +голосового сеансу реального часу. Потім голосова модель може озвучити цю +відповідь у зустріч. Він використовує той самий спільний інструмент консультації +реального часу, що й Voice Call. -Типово консультації виконуються для агента `main`. Встановіть `realtime.agentId`, коли канал Meet має консультуватися з виділеним workspace агента OpenClaw, типовими налаштуваннями моделі, політикою інструментів, memory та історією сесії. +Типово консультації виконуються для агента `main`. Задайте `realtime.agentId`, +коли канал Meet має консультуватися з виділеним робочим простором агента +OpenClaw, типовими параметрами моделі, політикою інструментів, пам’яттю та +історією сеансу. -Консультації зі стратегії агента використовують ключ сеансу `agent::subagent:google-meet:` для кожної зустрічі, щоб подальші запитання зберігали контекст зустрічі й водночас успадковували звичайну політику агента від налаштованого агента. +Консультації стратегії агента використовують ключ сеансу для окремої зустрічі +`agent::subagent:google-meet:`, щоб подальші запитання зберігали +контекст зустрічі, успадковуючи звичайну політику агента від налаштованого +агента. `realtime.toolPolicy` керує запуском консультації: -- `safe-read-only`: показувати інструмент консультації та обмежити звичайного агента до - `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і +- `safe-read-only`: надати інструмент консультації й обмежити звичайного агента + до `read`, `web_search`, `web_fetch`, `x_search`, `memory_search` і `memory_get`. -- `owner`: показувати інструмент консультації та дозволити звичайному агенту використовувати звичайну політику інструментів агента. -- `none`: не показувати інструмент консультації голосовій моделі реального часу. +- `owner`: надати інструмент консультації й дозволити звичайному агенту + використовувати звичайну політику інструментів агента. +- `none`: не надавати інструмент консультації голосовій моделі реального часу. -Ключ сеансу консультації обмежений окремим сеансом Meet, тому подальші виклики консультації можуть повторно використовувати попередній контекст консультації під час тієї самої зустрічі. +Ключ сеансу консультації обмежений окремим сеансом Meet, тож подальші виклики +консультації можуть повторно використовувати попередній контекст консультації в +межах тієї самої зустрічі. -Щоб примусово виконати голосову перевірку готовності після того, як Chrome повністю приєднався до виклику: +Щоб примусово запустити усну перевірку готовності після повного приєднання +Chrome до дзвінка: ```bash openclaw googlemeet speak meet_... "Say exactly: I'm here and listening." ``` -Для повної перевірки приєднання й мовлення: +Для повної димової перевірки приєднання й мовлення: ```bash openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ @@ -1096,9 +1252,9 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --message "Say exactly: I'm here and listening." ``` -## Контрольний список live-тесту +## Контрольний список живого тесту -Використовуйте цю послідовність перед передаванням зустрічі автономному агенту: +Використовуйте цю послідовність перед передаванням зустрічі агенту без нагляду: ```bash openclaw googlemeet setup @@ -1111,15 +1267,15 @@ openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ Очікуваний стан Chrome-node: - `googlemeet setup` повністю зелений. -- `googlemeet setup` включає `chrome-node-connected`, коли Chrome-node є - транспортом за замовчуванням або Node закріплено. -- `nodes status` показує, що вибраний Node підключено. -- Вибраний Node оголошує і `googlemeet.chrome`, і `browser.proxy`. -- Вкладка Meet приєднується до виклику, а `test-speech` повертає стан Chrome з +- `googlemeet setup` містить `chrome-node-connected`, коли Chrome-node є типовим + транспортом або вузол закріплено. +- `nodes status` показує, що вибраний вузол підключено. +- Вибраний вузол оголошує і `googlemeet.chrome`, і `browser.proxy`. +- Вкладка Meet приєднується до дзвінка, а `test-speech` повертає стан Chrome із `inCall: true`. -Для віддаленого хоста Chrome, наприклад Parallels macOS VM, це найкоротша -безпечна перевірка після оновлення Gateway або VM: +Для віддаленого хоста Chrome, як-от VM Parallels macOS, це найкоротша безпечна +перевірка після оновлення Gateway або VM: ```bash openclaw googlemeet setup @@ -1130,11 +1286,12 @@ openclaw nodes invoke \ --params '{"action":"setup"}' ``` -Це доводить, що Plugin Gateway завантажено, Node VM підключено з -поточним токеном, а аудіоміст Meet доступний до того, як агент відкриє -справжню вкладку зустрічі. +Це доводить, що Plugin Gateway завантажено, вузол VM підключено з поточним +токеном, а аудіоміст Meet доступний перед тим, як агент відкриє справжню вкладку +зустрічі. -Для Twilio smoke використовуйте зустріч, яка надає дані телефонного дозвону: +Для димової перевірки Twilio використовуйте зустріч, яка надає дані телефонного +додзвону: ```bash openclaw googlemeet setup @@ -1146,13 +1303,13 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ Очікуваний стан Twilio: -- `googlemeet setup` включає зелені перевірки `twilio-voice-call-plugin`, +- `googlemeet setup` містить зелені перевірки `twilio-voice-call-plugin`, `twilio-voice-call-credentials` і `twilio-voice-call-webhook`. - `voicecall` доступний у CLI після перезавантаження Gateway. -- Повернута сесія має `transport: "twilio"` і `twilio.voiceCallId`. -- `openclaw logs --follow` показує, що DTMF TwiML віддано перед TwiML реального +- Повернений сеанс має `transport: "twilio"` і `twilio.voiceCallId`. +- `openclaw logs --follow` показує, що DTMF TwiML подано перед TwiML реального часу, а потім міст реального часу з початковим привітанням у черзі. -- `googlemeet leave ` завершує делегований голосовий виклик. +- `googlemeet leave ` завершує делегований голосовий дзвінок. ## Усунення несправностей @@ -1166,10 +1323,14 @@ openclaw googlemeet setup ``` Якщо ви щойно відредагували `plugins.entries.google-meet`, перезапустіть або перезавантажте Gateway. -Запущений агент бачить лише інструменти плагінів, зареєстровані поточним процесом Gateway. +Запущений агент бачить лише інструменти Plugin, зареєстровані поточним процесом +Gateway. -На хостах Gateway, що не є macOS, інструмент `google_meet`, видимий агенту, залишається видимим, але локальні realtime-дії Chrome блокуються до того, як вони потрапляють до аудіомоста. -Локальний realtime-аудіо Chrome зараз залежить від macOS `BlackHole 2ch`, тому агенти Linux мають використовувати `mode: "transcribe"`, Twilio dial-in або macOS-хост `chrome-node` замість стандартного локального realtime-шляху Chrome. +На хостах Gateway не macOS інструмент `google_meet`, видимий агенту, залишається доступним, +але локальні realtime-дії Chrome блокуються до того, як потраплять в аудіоміст. +Локальний realtime-аудіо Chrome наразі залежить від macOS `BlackHole 2ch`, тому +агентам Linux слід використовувати `mode: "transcribe"`, dial-in Twilio або хост macOS +`chrome-node` замість стандартного локального realtime-шляху Chrome. ### Немає підключеного вузла з підтримкою Google Meet @@ -1190,7 +1351,7 @@ openclaw devices approve openclaw nodes status ``` -Вузол має бути підключений і перелічувати `googlemeet.chrome` плюс `browser.proxy`. +Вузол має бути підключений і містити `googlemeet.chrome` та `browser.proxy`. Конфігурація Gateway має дозволяти ці команди вузла: ```json5 @@ -1203,8 +1364,9 @@ openclaw nodes status } ``` -Якщо `googlemeet setup` не проходить перевірку `chrome-node-connected` або журнал Gateway повідомляє `gateway token mismatch`, перевстановіть або перезапустіть вузол із поточним токеном Gateway. -Для LAN Gateway це зазвичай означає: +Якщо `googlemeet setup` завершується помилкою `chrome-node-connected` або журнал Gateway повідомляє +`gateway token mismatch`, перевстановіть або перезапустіть вузол із поточним токеном Gateway. +Для Gateway у LAN це зазвичай означає: ```bash OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ @@ -1215,7 +1377,7 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ --force ``` -Потім перезавантажте службу вузла й повторно виконайте: +Потім перезавантажте сервіс вузла й повторно виконайте: ```bash openclaw googlemeet setup @@ -1224,28 +1386,55 @@ openclaw nodes status --connected ### Браузер відкривається, але агент не може приєднатися -Запустіть `googlemeet test-listen` для приєднань лише для спостереження або `googlemeet test-speech` для realtime-приєднань, а потім перевірте повернений стан Chrome. Якщо будь-яка перевірка повідомляє `manualActionRequired: true`, покажіть `manualActionMessage` оператору й припиніть повторні спроби, доки дія в браузері не буде завершена. +Запустіть `googlemeet test-listen` для приєднань лише в режимі спостереження або `googlemeet test-speech` +для realtime-приєднань, а потім перевірте повернутий стан Chrome. Якщо будь-яка перевірка +повідомляє `manualActionRequired: true`, покажіть оператору `manualActionMessage` +і припиніть повторні спроби, доки дію в браузері не буде завершено. Поширені ручні дії: -- Увійти в профіль Chrome. -- Допустити гостя з облікового запису хоста Meet. -- Надати Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу Chrome. -- Закрити або виправити завислий діалог дозволів Meet. +- Увійдіть у профіль Chrome. +- Допустіть гостя з облікового запису організатора Meet. +- Надайте Chrome дозволи на мікрофон/камеру, коли з’явиться нативний запит дозволу + Chrome. +- Закрийте або виправте зависле діалогове вікно дозволів Meet. -Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує чекати на реальний стан зустрічі. Для create-only резервного сценарію браузера OpenClaw може натиснути **Continue without microphone**, бо створення URL не потребує realtime-аудіошляху. +Не повідомляйте "not signed in" лише тому, що Meet показує "Do you want people to +hear you in the meeting?" Це проміжний екран вибору аудіо Meet; OpenClaw +натискає **Use microphone** через автоматизацію браузера, коли це доступно, і продовжує +очікувати реального стану зустрічі. Для резервного створення лише через браузер OpenClaw +може натиснути **Continue without microphone**, оскільки для створення URL не потрібен +realtime-аудіошлях. ### Не вдається створити зустріч -`googlemeet create` спочатку використовує endpoint `spaces.create` Google Meet API, коли налаштовані облікові дані OAuth. Без облікових даних OAuth він переходить до резервного pinned браузера Chrome node. Перевірте: +`googlemeet create` спочатку використовує endpoint Google Meet API `spaces.create`, +коли облікові дані OAuth налаштовані. Без облікових даних OAuth він переходить до +резервного варіанта із закріпленим браузером вузла Chrome. Переконайтеся: -- Для створення через API: налаштовані `oauth.clientId` і `oauth.refreshToken` або наявні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. -- Для створення через API: refresh token було створено після додавання підтримки створення. У старіших токенів може бракувати scope `meetings.space.created`; повторно виконайте `openclaw googlemeet auth login --json` і оновіть конфігурацію плагіна. -- Для резервного браузерного сценарію: `defaultTransport: "chrome-node"` і `chromeNode.node` вказують на підключений вузол із `browser.proxy` і `googlemeet.chrome`. -- Для резервного браузерного сценарію: профіль Chrome OpenClaw на цьому вузлі виконано вхід у Google і може відкрити `https://meet.google.com/new`. -- Для резервного браузерного сценарію: повторні спроби повторно використовують наявну вкладку `https://meet.google.com/new` або вкладку запиту облікового запису Google перед відкриттям нової вкладки. Якщо в агента спливає час очікування, повторіть виклик інструмента замість того, щоб вручну відкривати ще одну вкладку Meet. -- Для резервного браузерного сценарію: якщо інструмент повертає `manualActionRequired: true`, використайте повернені `browser.nodeId`, `browser.targetId`, `browserUrl` і `manualActionMessage`, щоб скерувати оператора. Не повторюйте спроби в циклі, доки ця дія не буде завершена. -- Для резервного браузерного сценарію: якщо Meet показує "Do you want people to hear you in the meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** або, для create-only резервного сценарію, **Continue without microphone** через автоматизацію браузера й продовжити чекати на згенерований Meet URL. Якщо це неможливо, помилка має згадувати `meet-audio-choice-required`, а не `google-login-required`. +- Для створення через API: `oauth.clientId` і `oauth.refreshToken` налаштовані, + або наявні відповідні змінні середовища `OPENCLAW_GOOGLE_MEET_*`. +- Для створення через API: refresh token було створено після додавання підтримки + створення. У старіших токенах може бракувати scope `meetings.space.created`; повторно виконайте + `openclaw googlemeet auth login --json` і оновіть конфігурацію Plugin. +- Для резервного варіанта через браузер: `defaultTransport: "chrome-node"` і + `chromeNode.node` вказують на підключений вузол із `browser.proxy` та + `googlemeet.chrome`. +- Для резервного варіанта через браузер: профіль Chrome OpenClaw на цьому вузлі ввійшов + у Google і може відкрити `https://meet.google.com/new`. +- Для резервного варіанта через браузер: повторні спроби повторно використовують наявну вкладку + `https://meet.google.com/new` або вкладку запиту облікового запису Google перед відкриттям + нової вкладки. Якщо в агента стається timeout, повторіть виклик інструмента замість + ручного відкриття ще однієї вкладки Meet. +- Для резервного варіанта через браузер: якщо інструмент повертає `manualActionRequired: true`, використовуйте + повернуті `browser.nodeId`, `browser.targetId`, `browserUrl` і + `manualActionMessage`, щоб скерувати оператора. Не повторюйте спроби в циклі, доки цю + дію не буде завершено. +- Для резервного варіанта через браузер: якщо Meet показує "Do you want people to hear you in the + meeting?", залиште вкладку відкритою. OpenClaw має натиснути **Use microphone** або, для + резервного створення лише через браузер, **Continue without microphone** через автоматизацію + браузера й продовжити чекати на згенерований URL Meet. Якщо він не може, помилка + має згадувати `meet-audio-choice-required`, а не `google-login-required`. ### Агент приєднується, але не говорить @@ -1256,34 +1445,61 @@ openclaw googlemeet setup openclaw googlemeet doctor ``` -Використовуйте `mode: "realtime"` для прослуховування/відповіді голосом. `mode: "transcribe"` навмисно не запускає дуплексний realtime-голосовий міст. Для налагодження лише зі спостереженням виконайте `openclaw googlemeet status --json ` після того, як учасники заговорять, і перевірте `captioning`, `transcriptLines` і `lastCaptionText`. Якщо `inCall` дорівнює true, але `transcriptLines` залишається `0`, субтитри Meet можуть бути вимкнені, ніхто не говорив після встановлення спостерігача, інтерфейс Meet змінився або live captions недоступні для мови/облікового запису зустрічі. +Використовуйте `mode: "realtime"` для прослуховування/відповіді голосом. `mode: "transcribe"` навмисно +не запускає дуплексний realtime-голосовий міст. Для налагодження лише в режимі спостереження +запустіть `openclaw googlemeet status --json ` після того, як учасники заговорять, +і перевірте `captioning`, `transcriptLines` та `lastCaptionText`. Якщо `inCall` має +значення true, але `transcriptLines` залишається `0`, субтитри Meet можуть бути вимкнені, ніхто +не говорив після встановлення спостерігача, інтерфейс Meet змінився або живі +субтитри недоступні для мови/облікового запису зустрічі. -`googlemeet test-speech` завжди перевіряє realtime-шлях і повідомляє, чи були помічені вихідні байти моста для цього виклику. Якщо `speechOutputVerified` дорівнює false, а `speechOutputTimedOut` дорівнює true, realtime-провайдер міг прийняти висловлювання, але OpenClaw не побачив, щоб нові вихідні байти дійшли до аудіомоста Chrome. +`googlemeet test-speech` завжди перевіряє realtime-шлях і повідомляє, чи +було спостережено вихідні байти мосту для цього виклику. Якщо `speechOutputVerified` має значення false, а +`speechOutputTimedOut` має значення true, realtime-провайдер міг прийняти +висловлювання, але OpenClaw не побачив, щоб нові вихідні байти дійшли до аудіомоста +Chrome. Також перевірте: -- На хості Gateway доступний ключ realtime-провайдера, наприклад `OPENAI_API_KEY` або `GEMINI_API_KEY`. +- Ключ realtime-провайдера доступний на хості Gateway, наприклад + `OPENAI_API_KEY` або `GEMINI_API_KEY`. - `BlackHole 2ch` видимий на хості Chrome. - `sox` існує на хості Chrome. -- Мікрофон і динамік Meet спрямовані через віртуальний аудіошлях, який використовує OpenClaw. `doctor` має показати `meet output routed: yes` для локальних realtime-приєднань Chrome. +- Мікрофон і динамік Meet спрямовані через віртуальний аудіошлях, який використовує + OpenClaw. `doctor` має показувати `meet output routed: yes` для локальних realtime-приєднань Chrome. -`googlemeet doctor [session-id]` виводить сесію, вузол, стан in-call, причину ручної дії, підключення realtime-провайдера, `realtimeReady`, активність аудіовходу/аудіовиходу, останні аудіомітки часу, лічильники байтів і URL браузера. Використовуйте `googlemeet status [session-id] --json`, коли потрібен сирий JSON. Використовуйте `googlemeet doctor --oauth`, коли потрібно перевірити Google Meet OAuth refresh без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібен доказ Google Meet API. +`googlemeet doctor [session-id]` виводить сесію, вузол, стан у дзвінку, +причину ручної дії, підключення realtime-провайдера, `realtimeReady`, активність +аудіовходу/виходу, останні часові мітки аудіо, лічильники байтів і URL браузера. +Використовуйте `googlemeet status [session-id] --json`, коли потрібен необроблений JSON. Використовуйте +`googlemeet doctor --oauth`, коли потрібно перевірити Google Meet OAuth refresh +без розкриття токенів; додайте `--meeting` або `--create-space`, коли також потрібне +підтвердження Google Meet API. -Якщо в агента сплив час очікування і ви бачите вже відкриту вкладку Meet, перевірте цю вкладку, не відкриваючи ще одну: +Якщо в агента стався timeout і ви бачите вже відкриту вкладку Meet, перевірте цю вкладку +без відкриття іншої: ```bash openclaw googlemeet recover-tab openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij ``` -Еквівалентна дія інструмента — `recover_current_tab`. Вона фокусує й перевіряє наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує локальне керування браузером через Gateway; з `chrome-node` вона використовує налаштований вузол Chrome. Вона не відкриває нову вкладку й не створює нову сесію; вона повідомляє поточний блокер, наприклад стан входу, допуску, дозволів або вибору аудіо. Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений; `chrome-node` також потребує підключеного вузла Chrome. +Еквівалентна дія інструмента — `recover_current_tab`. Вона фокусує й перевіряє +наявну вкладку Meet для вибраного транспорту. З `chrome` вона використовує локальне +керування браузером через Gateway; з `chrome-node` вона використовує налаштований +вузол Chrome. Вона не відкриває нову вкладку й не створює нову сесію; вона повідомляє +поточний блокер, наприклад вхід, допуск, дозволи або стан вибору аудіо. +Команда CLI звертається до налаштованого Gateway, тому Gateway має бути запущений; +`chrome-node` також вимагає, щоб вузол Chrome був підключений. -### Перевірки налаштування Twilio не проходять +### Перевірки налаштування Twilio завершуються помилкою -`twilio-voice-call-plugin` завершується помилкою, коли `voice-call` не дозволений або не ввімкнений. -Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте Gateway. +`twilio-voice-call-plugin` завершується помилкою, коли `voice-call` не дозволено або не ввімкнено. +Додайте його до `plugins.allow`, увімкніть `plugins.entries.voice-call` і перезавантажте +Gateway. -`twilio-voice-call-credentials` завершується помилкою, коли в бекенді Twilio бракує account SID, auth token або caller number. Задайте їх на хості Gateway: +`twilio-voice-call-credentials` завершується помилкою, коли backend Twilio не має account +SID, auth token або номера абонента. Налаштуйте їх на хості Gateway: ```bash export TWILIO_ACCOUNT_SID=AC... @@ -1291,10 +1507,14 @@ export TWILIO_AUTH_TOKEN=... export TWILIO_FROM_NUMBER=+15550001234 ``` -`twilio-voice-call-webhook` завершується помилкою, коли `voice-call` не має публічного Webhook-доступу або коли `publicUrl` вказує на local loopback чи приватний мережевий простір. -Задайте `plugins.entries.voice-call.config.publicUrl` як публічний URL провайдера або налаштуйте tunnel/Tailscale-доступ для `voice-call`. +`twilio-voice-call-webhook` завершується помилкою, коли `voice-call` не має публічного webhook +доступу або коли `publicUrl` вказує на local loopback чи приватний мережевий простір. +Установіть `plugins.entries.voice-call.config.publicUrl` на публічний URL провайдера або +налаштуйте tunnel/Tailscale-доступ для `voice-call`. -Loopback і приватні URL не є дійсними для carrier callbacks. Не використовуйте `localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, `192.168.x`, `169.254.x`, `fc00::/7` або `fd00::/8` як `publicUrl`. +Loopback і приватні URL не є допустимими для carrier callbacks. Не використовуйте +`localhost`, `127.0.0.1`, `0.0.0.0`, `10.x`, `172.16.x`-`172.31.x`, +`192.168.x`, `169.254.x`, `fc00::/7` або `fd00::/8` як `publicUrl`. Для стабільного публічного URL: @@ -1315,7 +1535,8 @@ Loopback і приватні URL не є дійсними для carrier callbac } ``` -Для локальної розробки використовуйте tunnel або Tailscale-доступ замість приватного URL хоста: +Для локальної розробки використовуйте tunnel або Tailscale-доступ замість приватного +URL хоста: ```json5 { @@ -1341,13 +1562,14 @@ openclaw voicecall setup openclaw voicecall smoke ``` -`voicecall smoke` за замовчуванням перевіряє лише готовність. Щоб виконати dry-run для конкретного номера: +`voicecall smoke` за замовчуванням лише перевіряє готовність. Щоб виконати dry-run для конкретного номера: ```bash openclaw voicecall smoke --to "+15555550123" ``` -Додавайте `--yes` лише тоді, коли навмисно хочете здійснити live outbound notify call: +Додавайте `--yes` лише тоді, коли навмисно хочете здійснити живий вихідний +notify-виклик: ```bash openclaw voicecall smoke --to "+15555550123" --yes @@ -1355,7 +1577,8 @@ openclaw voicecall smoke --to "+15555550123" --yes ### Виклик Twilio починається, але ніколи не входить у зустріч -Переконайтеся, що подія Meet надає дані phone dial-in. Передайте точний dial-in number і PIN або спеціальну DTMF-послідовність: +Переконайтеся, що подія Meet надає дані phone dial-in. Передайте точний dial-in +номер і PIN або власну послідовність DTMF: ```bash openclaw googlemeet join https://meet.google.com/abc-defg-hij \ @@ -1364,55 +1587,75 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --dtmf-sequence ww123456# ``` -Використовуйте початковий `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза перед введенням PIN. +Використовуйте початкову `w` або коми в `--dtmf-sequence`, якщо провайдеру потрібна пауза +перед введенням PIN. -Якщо телефонний виклик створено, але roster Meet так і не показує dial-in учасника: +Якщо телефонний виклик створено, але список учасників Meet ніколи не показує dial-in +учасника: -- Виконайте `openclaw googlemeet doctor `, щоб підтвердити делегований Twilio call ID, чи DTMF було поставлено в чергу, і чи було запитано вступне привітання. -- Виконайте `openclaw voicecall status --call-id ` і переконайтеся, що виклик усе ще активний. -- Виконайте `openclaw voicecall tail` і перевірте, що Twilio webhooks надходять до Gateway. -- Виконайте `openclaw logs --follow` і знайдіть послідовність Twilio Meet: Google Meet делегує приєднання, Voice Call запускає phone leg, Google Meet чекає `voiceCall.dtmfDelayMs`, надсилає DTMF через `voicecall.dtmf`, чекає `voiceCall.postDtmfSpeechDelayMs`, а потім запитує вступну промову через `voicecall.speak`. -- Повторно виконайте `openclaw googlemeet setup --transport twilio`; зелена перевірка налаштування потрібна, але не доводить, що послідовність PIN зустрічі правильна. -- Переконайтеся, що dial-in number належить до того самого запрошення Meet і регіону, що й PIN. -- Збільште `voiceCall.dtmfDelayMs`, якщо Meet відповідає повільно або транскрипт виклику все ще показує запит на PIN після надсилання DTMF. -- Якщо учасник приєднується, але ви не чуєте привітання, перевірте `openclaw logs --follow` на наявність post-DTMF запиту `voicecall.speak` і або media-stream TTS playback, або резервного Twilio ``. Якщо транскрипт виклику все ще містить "enter the meeting PIN", phone leg ще не приєднався до кімнати Meet, тому учасники зустрічі не почують мовлення. +- Запустіть `openclaw googlemeet doctor `, щоб підтвердити делегований Twilio + call ID, чи DTMF було поставлено в чергу та чи було запитано вступне привітання. +- Запустіть `openclaw voicecall status --call-id ` і переконайтеся, що виклик досі + активний. +- Запустіть `openclaw voicecall tail` і перевірте, що webhook Twilio надходять до + Gateway. +- Запустіть `openclaw logs --follow` і шукайте послідовність Twilio Meet: Google + Meet делегує приєднання, Voice Call запускає телефонну гілку, Google Meet чекає + `voiceCall.dtmfDelayMs`, надсилає DTMF через `voicecall.dtmf`, чекає + `voiceCall.postDtmfSpeechDelayMs`, а потім запитує вступне мовлення через + `voicecall.speak`. +- Повторно запустіть `openclaw googlemeet setup --transport twilio`; зелена перевірка налаштування + обов’язкова, але не доводить, що послідовність PIN зустрічі правильна. +- Переконайтеся, що dial-in номер належить до того самого запрошення Meet і регіону, що й + PIN. +- Збільште `voiceCall.dtmfDelayMs`, якщо Meet відповідає повільно або transcript виклику + все ще показує запит на PIN після надсилання DTMF. +- Якщо учасник приєднується, але ви не чуєте привітання, перевірте + `openclaw logs --follow` на наявність post-DTMF запиту `voicecall.speak` і + або відтворення TTS через media-stream, або резервного Twilio ``. Якщо transcript виклику + все ще містить "enter the meeting PIN", телефонна гілка ще не приєдналася + до кімнати Meet, тому учасники зустрічі не почують мовлення. -Якщо webhooks не надходять, спершу налагодьте Plugin Voice Call: провайдер має дістатися до `plugins.entries.voice-call.config.publicUrl` або налаштованого tunnel. -Див. [усунення несправностей голосового виклику](/uk/plugins/voice-call#troubleshooting). +Якщо webhook не надходять, спочатку налагодьте Voice Call Plugin: провайдер має +досягати `plugins.entries.voice-call.config.publicUrl` або налаштованого tunnel. +Див. [Усунення несправностей голосових викликів](/uk/plugins/voice-call#troubleshooting). ## Примітки -Офіційний media API Google Meet орієнтований на отримання, тому мовлення в Meet-виклик усе ще потребує шляху учасника. Цей плагін робить цю межу видимою: Chrome обробляє участь у браузері й локальну маршрутизацію аудіо; Twilio обробляє участь через phone dial-in. +Офіційний медіа API Google Meet орієнтований на приймання, тому мовлення в +дзвінок Meet усе ще потребує шляху учасника. Цей Plugin зберігає цю межу видимою: +Chrome обробляє участь через браузер і локальну маршрутизацію аудіо; Twilio обробляє +участь через phone dial-in. -Chrome realtime mode потребує `BlackHole 2ch` плюс будь-що з: +Realtime-режим Chrome потребує `BlackHole 2ch` плюс одного з таких: -- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw керує - мостом голосу в реальному часі та передає аудіо у `chrome.audioFormat` між цими - командами й вибраним провайдером голосу в реальному часі. Типовий шлях Chrome — - PCM16 24 кГц; G.711 mu-law 8 кГц залишається доступним для застарілих пар команд. -- `chrome.audioBridgeCommand`: зовнішня команда мосту керує всім локальним +- `chrome.audioInputCommand` плюс `chrome.audioOutputCommand`: OpenClaw володіє + голосовим мостом реального часу та передає аудіо у `chrome.audioFormat` між цими + командами й вибраним постачальником голосу реального часу. Стандартний шлях Chrome - + 24 кГц PCM16; 8 кГц G.711 mu-law залишається доступним для застарілих пар команд. +- `chrome.audioBridgeCommand`: зовнішня команда мосту володіє всім локальним аудіошляхом і має завершитися після запуску або перевірки свого демона. -Для чистого дуплексного аудіо спрямуйте вихід Meet і мікрофон Meet через окремі +Для чистого дуплексного аудіо спрямовуйте вивід Meet і мікрофон Meet через окремі віртуальні пристрої або граф віртуальних пристроїв у стилі Loopback. Один спільний -пристрій BlackHole може відлунювати інших учасників назад у виклик. +пристрій BlackHole може повертати луну інших учасників назад у виклик. З мостом Chrome на основі пари команд `chrome.bargeInInputCommand` може слухати окремий локальний мікрофон і очищати відтворення асистента, коли людина починає -говорити. Це утримує людське мовлення попереду виводу асистента, навіть коли спільний -loopback-вхід BlackHole тимчасово приглушено під час відтворення асистента. +говорити. Це зберігає пріоритет людського мовлення над виводом асистента, навіть коли +спільний вхід BlackHole loopback тимчасово приглушено під час відтворення асистента. Як і `chrome.audioInputCommand` та `chrome.audioOutputCommand`, це локальна команда, -налаштована оператором. Використовуйте явний довірений шлях до команди або -список аргументів і не вказуйте їй скрипти з недовірених розташувань. +налаштована оператором. Використовуйте явний довірений шлях команди або список +аргументів і не вказуйте на скрипти з недовірених розташувань. `googlemeet speak` запускає активний аудіоміст реального часу для сеансу Chrome. `googlemeet leave` зупиняє цей міст. Для сеансів Twilio, делегованих через Plugin -голосових викликів, `leave` також завершує базовий голосовий виклик. +голосового виклику, `leave` також завершує базовий голосовий виклик. Використовуйте `googlemeet end-active-conference`, коли також потрібно закрити активну конференцію Google Meet для простору, керованого API. ## Пов’язане -- [Plugin голосових викликів](/uk/plugins/voice-call) +- [Plugin голосового виклику](/uk/plugins/voice-call) - [Режим розмови](/uk/nodes/talk) - [Створення Plugin](/uk/plugins/building-plugins) diff --git a/docs/uk/security/network-proxy.md b/docs/uk/security/network-proxy.md index e8f642465..6e6067fdc 100644 --- a/docs/uk/security/network-proxy.md +++ b/docs/uk/security/network-proxy.md @@ -1,14 +1,14 @@ --- read_when: - - Вам потрібен багаторівневий захист від атак SSRF і повторного прив’язування DNS + - Вам потрібен багаторівневий захист від атак SSRF і переприв’язування DNS. - Налаштування зовнішнього прямого проксі для трафіку середовища виконання OpenClaw -summary: Як маршрутизувати HTTP- і WebSocket-трафік середовища виконання OpenClaw через керований оператором фільтрувальний проксі +summary: Як маршрутизувати HTTP- та WebSocket-трафік середовища виконання OpenClaw через фільтрувальний проксі, керований оператором title: Мережевий проксі x-i18n: - generated_at: "2026-05-01T05:23:47Z" + generated_at: "2026-05-04T00:58:55Z" model: gpt-5.5 provider: openai - source_hash: 9207d349e4410e38631ae7665be19b536e4a4128a4e80dd095e802804dfd66a3 + source_hash: cd5594324e8c6b7da51d903e98fda0feacb8970e0b15d980f7a249d6641461c9 source_path: security/network-proxy.md workflow: 16 --- @@ -17,53 +17,53 @@ x-i18n: OpenClaw може спрямовувати runtime HTTP- і WebSocket-трафік через керований оператором прямий проксі. Це необов’язковий додатковий рівень захисту для розгортань, яким потрібні централізований контроль вихідного трафіку, сильніший захист від SSRF і краща можливість аудиту мережі. -OpenClaw не постачає, не завантажує, не запускає, не налаштовує й не сертифікує проксі. Ви запускаєте проксі-технологію, яка відповідає вашому середовищу, а OpenClaw спрямовує через неї звичайні process-local HTTP- і WebSocket-клієнти. +OpenClaw не постачає, не завантажує, не запускає, не налаштовує й не сертифікує проксі. Ви запускаєте проксі-технологію, яка підходить вашому середовищу, а OpenClaw спрямовує звичайні локальні для процесу HTTP- і WebSocket-клієнти через неї. ## Навіщо використовувати проксі? Проксі дає операторам одну точку мережевого контролю для вихідного HTTP- і WebSocket-трафіку. Це може бути корисно навіть поза посиленням захисту від SSRF: -- Централізована політика: підтримуйте одну політику вихідного трафіку замість того, щоб покладатися на те, що кожне місце HTTP-виклику в застосунку правильно застосує мережеві правила. -- Перевірки під час підключення: оцінюйте призначення після DNS-розв’язання й безпосередньо перед тим, як проксі відкриє upstream-з’єднання. -- Захист від DNS rebinding: зменшуйте розрив між DNS-перевіркою на рівні застосунку й фактичним вихідним з’єднанням. -- Ширше покриття JavaScript: спрямовуйте звичайні `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch і подібні клієнти одним і тим самим шляхом. -- Можливість аудиту: журналюйте дозволені й заборонені призначення на межі вихідного трафіку. -- Операційний контроль: застосовуйте правила призначень, сегментацію мережі, обмеження швидкості або allowlist-и вихідного трафіку без перебудови OpenClaw. +- Централізована політика: підтримуйте одну політику вихідного трафіку замість покладатися на те, що кожне місце HTTP-виклику в застосунку правильно застосує мережеві правила. +- Перевірки під час підключення: оцінюйте призначення після DNS-резолюції та безпосередньо перед тим, як проксі відкриє вихідне з’єднання. +- Захист від DNS rebinding: зменшуйте проміжок між DNS-перевіркою на рівні застосунку та фактичним вихідним з’єднанням. +- Ширше покриття JavaScript: спрямовуйте звичайні `fetch`, `node:http`, `node:https`, WebSocket, axios, got, node-fetch і подібні клієнти одним шляхом. +- Можливість аудиту: журналюйте дозволені та заборонені призначення на межі вихідного трафіку. +- Операційний контроль: застосовуйте правила призначення, сегментацію мережі, ліміти швидкості або allowlist вихідних призначень без перебудови OpenClaw. -Маршрутизація через проксі — це запобіжник рівня процесу для звичайного вихідного HTTP- і WebSocket-трафіку. Вона дає операторам fail-closed шлях для спрямування підтримуваних JavaScript HTTP-клієнтів через власний фільтрувальний проксі, але не є мережевою пісочницею рівня ОС і не змушує OpenClaw сертифікувати політику призначень проксі. +Маршрутизація через проксі є захисною межею на рівні процесу для звичайного вихідного HTTP- і WebSocket-трафіку. Вона дає операторам fail-closed шлях для маршрутизації підтримуваних JavaScript HTTP-клієнтів через їхній власний фільтрувальний проксі, але не є мережевою пісочницею на рівні ОС і не змушує OpenClaw сертифікувати політику призначень проксі. -## Як OpenClaw спрямовує трафік +## Як OpenClaw маршрутизує трафік Коли `proxy.enabled=true` і налаштовано URL проксі, захищені runtime-процеси, як-от `openclaw gateway run`, `openclaw node run` і `openclaw agent --local`, спрямовують звичайний вихідний HTTP- і WebSocket-трафік через налаштований проксі: ```text -Процес OpenClaw - fetch -> керований оператором фільтрувальний проксі -> публічний інтернет - node:http and https -> керований оператором фільтрувальний проксі -> публічний інтернет - WebSocket clients -> керований оператором фільтрувальний проксі -> публічний інтернет +OpenClaw process + fetch -> operator-managed filtering proxy -> public internet + node:http and https -> operator-managed filtering proxy -> public internet + WebSocket clients -> operator-managed filtering proxy -> public internet ``` -Публічний контракт — це поведінка маршрутизації, а не внутрішні Node-хуки, використані для її реалізації. WebSocket-клієнти control-plane OpenClaw Gateway використовують вузький прямий шлях для local loopback Gateway RPC-трафіку, коли URL Gateway використовує `localhost` або буквальну loopback IP-адресу, як-от `127.0.0.1` чи `[::1]`. Цей control-plane шлях має мати змогу досягати loopback Gateway, навіть коли операторський проксі блокує loopback-призначення. Звичайні runtime HTTP- і WebSocket-запити все одно використовують налаштований проксі. +Публічний контракт — це поведінка маршрутизації, а не внутрішні Node-хуки, використані для її реалізації. Клієнти WebSocket площини керування OpenClaw Gateway використовують вузький прямий шлях для local loopback Gateway RPC-трафіку, коли URL Gateway використовує `localhost` або буквальну loopback IP-адресу, як-от `127.0.0.1` чи `[::1]`. Цей шлях площини керування має бути здатний досягати loopback Gateway навіть тоді, коли операторський проксі блокує loopback-призначення. Звичайні runtime HTTP- і WebSocket-запити й надалі використовують налаштований проксі. -Внутрішньо OpenClaw використовує два хуки маршрутизації рівня процесу для цієї функції: +Внутрішньо OpenClaw використовує два хуки маршрутизації на рівні процесу для цієї функції: -- Маршрутизація диспетчера Undici покриває `fetch`, клієнти на основі undici та транспорти, які надають власний диспетчер undici. -- Маршрутизація `global-agent` покриває виклики Node core `node:http` і `node:https`, включно з багатьма бібліотеками, побудованими поверх `http.request`, `https.request`, `http.get` і `https.get`. Керований режим проксі примусово застосовує цей глобальний агент, щоб явні Node HTTP-агенти випадково не обходили операторський проксі. +- Маршрутизація dispatcher Undici покриває `fetch`, клієнти на базі undici та транспорти, що надають власний dispatcher undici. +- Маршрутизація `global-agent` покриває виклики ядра Node `node:http` і `node:https`, зокрема багато бібліотек, побудованих поверх `http.request`, `https.request`, `http.get` і `https.get`. Керований режим проксі примусово використовує цей глобальний агент, щоб явні Node HTTP-агенти випадково не обходили операторський проксі. -Деякі plugins мають власні транспорти, яким потрібне явне проксі-підключення навіть за наявності маршрутизації рівня процесу. Наприклад, транспорт Bot API для Telegram використовує власний HTTP/1-диспетчер undici, тому враховує env проксі процесу, а також керований fallback `OPENCLAW_PROXY_URL` у цьому owner-specific транспортному шляху. +Деякі плагіни володіють власними транспортами, яким потрібне явне підключення проксі навіть за наявності маршрутизації на рівні процесу. Наприклад, транспорт Bot API Telegram використовує власний HTTP/1 undici dispatcher і тому враховує env проксі процесу плюс керований fallback `OPENCLAW_PROXY_URL` у цьому owner-specific транспортному шляху. -Сам URL проксі має використовувати `http://`. HTTPS-призначення все одно підтримуються через проксі за допомогою HTTP `CONNECT`; це лише означає, що OpenClaw очікує простий HTTP forward-proxy listener, як-от `http://127.0.0.1:3128`. +Сам URL проксі має використовувати `http://`. HTTPS-призначення все одно підтримуються через проксі за допомогою HTTP `CONNECT`; це лише означає, що OpenClaw очікує звичайний HTTP forward-proxy listener, наприклад `http://127.0.0.1:3128`. -Поки проксі активний, OpenClaw очищає `no_proxy`, `NO_PROXY` і `GLOBAL_AGENT_NO_PROXY`. Ці списки обходу базуються на призначеннях, тому залишення там `localhost` або `127.0.0.1` дозволило б високоризиковим SSRF-цілям пропускати фільтрувальний проксі. +Поки проксі активний, OpenClaw очищає `no_proxy`, `NO_PROXY` і `GLOBAL_AGENT_NO_PROXY`. Ці списки обходу базуються на призначенні, тож якби там залишилися `localhost` або `127.0.0.1`, це дозволило б високоризиковим SSRF-цілям оминути фільтрувальний проксі. -Під час завершення роботи OpenClaw відновлює попереднє проксі-середовище й скидає кешований стан маршрутизації процесу. +Під час завершення роботи OpenClaw відновлює попереднє proxy environment і скидає кешований стан маршрутизації процесу. ## Пов’язані терміни проксі -- `proxy.enabled` / `proxy.proxyUrl`: маршрутизація вихідного forward-proxy для runtime вихідного трафіку OpenClaw. Ця сторінка документує цю функцію. -- `gateway.auth.mode: "trusted-proxy"`: inbound identity-aware reverse-proxy authentication для доступу до Gateway. Див. [Автентифікація довіреного проксі](/uk/gateway/trusted-proxy-auth). -- `openclaw proxy`: локальний debug proxy і capture inspector для розробки й підтримки. Див. [openclaw proxy](/uk/cli/proxy). -- Налаштування проксі, специфічні для каналу або провайдера: owner-specific перевизначення для конкретного транспорту. Віддавайте перевагу керованому мережевому проксі, коли метою є централізований контроль вихідного трафіку в усьому runtime. +- `proxy.enabled` / `proxy.proxyUrl`: маршрутизація вихідного forward-proxy для runtime-вихідного трафіку OpenClaw. Ця сторінка документує цю функцію. +- `gateway.auth.mode: "trusted-proxy"`: вхідна автентифікація через identity-aware reverse-proxy для доступу до Gateway. Див. [Автентифікація trusted proxy](/uk/gateway/trusted-proxy-auth). +- `openclaw proxy`: локальний debug proxy та capture inspector для розробки й підтримки. Див. [openclaw proxy](/uk/cli/proxy). +- Налаштування проксі, специфічні для каналу або провайдера: owner-specific перевизначення для конкретного транспорту. Надавайте перевагу керованому мережевому проксі, коли мета — централізований контроль вихідного трафіку в усьому runtime. ## Конфігурація @@ -81,9 +81,9 @@ OPENCLAW_PROXY_URL=http://127.0.0.1:3128 openclaw gateway run `proxy.proxyUrl` має пріоритет над `OPENCLAW_PROXY_URL`. -Якщо `enabled=true`, але не налаштовано чинний URL проксі, захищені команди завершують запуск з помилкою замість fallback до прямого доступу до мережі. +Якщо `enabled=true`, але не налаштовано дійсний URL проксі, захищені команди завершують запуск з помилкою замість відкату до прямого мережевого доступу. -Для керованих сервісів Gateway, запущених через `openclaw gateway start`, краще зберігати URL у конфігурації: +Для керованих gateway-сервісів, запущених через `openclaw gateway start`, краще зберігати URL у конфігурації: ```bash openclaw config set proxy.enabled true @@ -92,9 +92,9 @@ openclaw gateway install --force openclaw gateway start ``` -Fallback через середовище найкраще підходить для запусків у передньому плані. Якщо ви використовуєте його з установленим сервісом, помістіть `OPENCLAW_PROXY_URL` у durable environment сервісу, наприклад `$OPENCLAW_STATE_DIR/.env` або `~/.openclaw/.env`, а потім перевстановіть сервіс, щоб launchd, systemd або Scheduled Tasks запускали Gateway із цим значенням. +Fallback через середовище найкраще підходить для запусків у передньому плані. Якщо ви використовуєте його з інстальованим сервісом, помістіть `OPENCLAW_PROXY_URL` у довговічне середовище сервісу, наприклад `$OPENCLAW_STATE_DIR/.env` або `~/.openclaw/.env`, а потім перевстановіть сервіс, щоб launchd, systemd або Scheduled Tasks запускали gateway з цим значенням. -Для команд `openclaw --container ...` OpenClaw передає `OPENCLAW_PROXY_URL` у child CLI, націлений на контейнер, коли його задано. URL має бути доступним зсередини контейнера; `127.0.0.1` вказує на сам контейнер, а не на хост. OpenClaw відхиляє loopback URL проксі для команд, націлених на контейнер, якщо ви явно не перевизначите цю перевірку безпеки. +Для команд `openclaw --container ...` OpenClaw передає `OPENCLAW_PROXY_URL` до дочірнього CLI, націленого на контейнер, коли його задано. URL має бути доступним зсередини контейнера; `127.0.0.1` означає сам контейнер, а не хост. OpenClaw відхиляє loopback URL проксі для команд, націлених на контейнер, якщо ви явно не перевизначите цю перевірку безпеки. ## Вимоги до проксі @@ -103,50 +103,50 @@ Fallback через середовище найкраще підходить д Налаштуйте проксі так, щоб він: - Прив’язувався лише до loopback або приватного довіреного інтерфейсу. -- Обмежував доступ так, щоб ним могли користуватися лише процес OpenClaw, хост, контейнер або сервісний обліковий запис. -- Самостійно розв’язував призначення й блокував IP-адреси призначення після DNS-розв’язання. -- Застосовував політику під час підключення як для простих HTTP-запитів, так і для HTTPS-тунелів `CONNECT`. -- Відхиляв destination-based обходи для loopback, приватних, link-local, metadata, multicast, reserved або documentation діапазонів. -- Уникав allowlist-ів імен хостів, якщо ви повністю не довіряєте шляху DNS-розв’язання. -- Журналював призначення, рішення, статус і причину без журналювання тіл запитів, заголовків авторизації, cookies або інших секретів. +- Обмежував доступ так, щоб ним могли користуватися лише процес OpenClaw, хост, контейнер або обліковий запис сервісу. +- Самостійно резолвив призначення та блокував IP-адреси призначення після DNS-резолюції. +- Застосовував політику під час підключення як для звичайних HTTP-запитів, так і для HTTPS-тунелів `CONNECT`. +- Відхиляв обходи на основі призначення для loopback, приватних, link-local, metadata, multicast, reserved або documentation діапазонів. +- Уникав allowlist імен хостів, якщо ви повністю не довіряєте шляху DNS-резолюції. +- Журналював призначення, рішення, статус і причину без журналювання тіл запитів, заголовків авторизації, cookie або інших секретів. - Тримав політику проксі під контролем версій і переглядав зміни як security-sensitive конфігурацію. ## Рекомендовані заблоковані призначення Використовуйте цей denylist як початкову точку для будь-якого forward proxy, firewall або політики вихідного трафіку. -Логіка класифікатора на рівні застосунку OpenClaw розташована в `src/infra/net/ssrf.ts` і `src/shared/net/ip.ts`. Відповідні parity hooks — це `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` і вбудована обробка sentinel IPv4 для NAT64, 6to4, Teredo, ISATAP і IPv4-mapped форм. Ці файли корисні як довідка під час підтримки зовнішньої політики проксі, але OpenClaw не експортує й не застосовує ці правила автоматично у вашому проксі. +Логіка класифікатора OpenClaw на рівні застосунку міститься в `src/infra/net/ssrf.ts` і `src/shared/net/ip.ts`. Відповідні parity hooks — це `BLOCKED_HOSTNAMES`, `BLOCKED_IPV4_SPECIAL_USE_RANGES`, `BLOCKED_IPV6_SPECIAL_USE_RANGES`, `RFC2544_BENCHMARK_PREFIX` і вбудована обробка IPv4 sentinel для NAT64, 6to4, Teredo, ISATAP і IPv4-mapped форм. Ці файли є корисними довідковими матеріалами під час підтримки зовнішньої політики проксі, але OpenClaw не експортує й не застосовує ці правила автоматично у вашому проксі. -| Діапазон або хост | Чому блокувати | +| Діапазон або хост | Навіщо блокувати | | ------------------------------------------------------------------------------------ | --------------------------------------------------- | | `127.0.0.0/8`, `localhost`, `localhost.localdomain` | IPv4 loopback | | `::1/128` | IPv6 loopback | -| `0.0.0.0/8`, `::/128` | Невизначені адреси та адреси цієї мережі | +| `0.0.0.0/8`, `::/128` | Невказані адреси та адреси цієї мережі | | `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | Приватні мережі RFC1918 | -| `169.254.0.0/16`, `fe80::/10` | Link-local адреси й поширені шляхи cloud metadata | +| `169.254.0.0/16`, `fe80::/10` | Link-local адреси та поширені шляхи cloud metadata | | `169.254.169.254`, `metadata.google.internal` | Сервіси cloud metadata | | `100.64.0.0/10` | Спільний адресний простір carrier-grade NAT | -| `198.18.0.0/15`, `2001:2::/48` | Діапазони для benchmarking | -| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | Діапазони special-use і documentation | +| `198.18.0.0/15`, `2001:2::/48` | Діапазони для benchmark | +| `192.0.0.0/24`, `192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`, `2001:db8::/32` | Special-use і documentation діапазони | | `224.0.0.0/4`, `ff00::/8` | Multicast | -| `240.0.0.0/4` | Reserved IPv4 | +| `240.0.0.0/4` | Зарезервований IPv4 | | `fc00::/7`, `fec0::/10` | Локальні/приватні діапазони IPv6 | -| `100::/64`, `2001:20::/28` | Діапазони IPv6 discard і ORCHIDv2 | -| `64:ff9b::/96`, `64:ff9b:1::/48` | NAT64 prefixes із вбудованим IPv4 | -| `2002::/16`, `2001::/32` | 6to4 і Teredo із вбудованим IPv4 | +| `100::/64`, `2001:20::/28` | IPv6 discard і ORCHIDv2 діапазони | +| `64:ff9b::/96`, `64:ff9b:1::/48` | Префікси NAT64 з вбудованим IPv4 | +| `2002::/16`, `2001::/32` | 6to4 і Teredo з вбудованим IPv4 | | `::/96`, `::ffff:0:0/96` | IPv4-compatible і IPv4-mapped IPv6 | -Якщо ваш cloud provider або мережева платформа документує додаткові metadata hosts чи reserved ranges, додайте їх також. +Якщо ваш хмарний провайдер або мережева платформа документує додаткові metadata hosts чи reserved ranges, додайте також їх. ## Валідація -Перевіряйте проксі з того самого хоста, контейнера або сервісного облікового запису, на якому працює OpenClaw: +Валідуйте проксі з того самого хоста, контейнера або облікового запису сервісу, який запускає OpenClaw: ```bash openclaw proxy validate --proxy-url http://127.0.0.1:3128 ``` -За замовчуванням, коли не надано власних призначень, команда перевіряє, що `https://example.com/` успішно відкривається, і запускає тимчасовий loopback canary, до якого проксі не повинен дістатися. Перевірка default denied проходить, коли проксі повертає не-2xx denial response або блокує canary з transport failure; вона провалюється, якщо успішна відповідь доходить до canary. Якщо проксі не ввімкнено й не налаштовано, валідація повідомляє про проблему конфігурації; використовуйте `--proxy-url` для одноразового preflight перед зміною конфігурації. Використовуйте `--allowed-url` і `--denied-url`, щоб перевірити deployment-specific очікування. Власні заборонені призначення є fail-closed: будь-яка HTTP-відповідь означає, що призначення було доступне через проксі, а будь-яка transport error повідомляється як inconclusive, бо OpenClaw не може довести, що проксі заблокував reachable origin. У разі помилки валідації команда завершується з кодом 1. +За замовчуванням, коли власні призначення не надано, команда перевіряє, що `https://example.com/` успішний, і запускає тимчасовий loopback canary, до якого проксі не має дістатися. Типова заборонена перевірка проходить, коли проксі повертає non-2xx denial response або блокує canary через транспортний збій; вона провалюється, якщо успішна відповідь досягає canary. Якщо проксі не ввімкнено й не налаштовано, валідація повідомляє про проблему конфігурації; використовуйте `--proxy-url` для одноразового preflight перед зміною конфігурації. Використовуйте `--allowed-url` і `--denied-url`, щоб перевірити очікування, специфічні для розгортання. Власні заборонені призначення є fail-closed: будь-яка HTTP-відповідь означає, що призначення було доступне через проксі, а будь-яка транспортна помилка повідомляється як непереконлива, оскільки OpenClaw не може довести, що проксі заблокував доступне джерело. У разі помилки валідації команда завершується з кодом 1. Використовуйте `--json` для автоматизації. JSON-вивід містить загальний результат, ефективне джерело конфігурації проксі, будь-які помилки конфігурації та кожну перевірку призначення. Облікові дані URL проксі редагуються в текстовому та JSON-виводі: @@ -170,7 +170,7 @@ openclaw proxy validate --proxy-url http://127.0.0.1:3128 } ``` -Ви також можете перевірити вручну за допомогою `curl`: +Також можна перевірити вручну за допомогою `curl`: ```bash curl -x http://127.0.0.1:3128 https://example.com/ @@ -178,9 +178,9 @@ curl -x http://127.0.0.1:3128 http://127.0.0.1/ curl -x http://127.0.0.1:3128 http://169.254.169.254/ ``` -Публічний запит має виконатися успішно. Запити до loopback і метаданих має заблокувати проксі. Для `openclaw proxy validate` вбудований loopback canary може відрізнити відмову проксі від доступного джерела. Користувацькі перевірки `--denied-url` не мають цього canary, тому вважайте як HTTP-відповіді, так і неоднозначні транспортні збої помилками валідації, якщо ваш проксі не надає специфічний для розгортання сигнал відмови, який можна перевірити окремо. +Публічний запит має бути успішним. Запити до loopback і метаданих мають блокуватися проксі. Для `openclaw proxy validate` вбудована canary-перевірка loopback може відрізнити відмову проксі від доступного джерела. Користувацькі перевірки `--denied-url` не мають такої canary-перевірки, тому вважайте як HTTP-відповіді, так і неоднозначні транспортні збої помилками перевірки, якщо ваш проксі не надає специфічний для розгортання сигнал відмови, який можна перевірити окремо. -Потім увімкніть маршрутизацію через проксі OpenClaw: +Потім увімкніть маршрутизацію OpenClaw через проксі: ```bash openclaw config set proxy.enabled true @@ -198,9 +198,10 @@ proxy: ## Обмеження -- Проксі покращує покриття для процес-локальних HTTP- і WebSocket-клієнтів JavaScript, але це не мережевий sandbox рівня ОС. -- Необроблені сокети `net`, `tls` і `http2`, нативні addons і дочірні процеси можуть обходити маршрутизацію через проксі на рівні Node, якщо вони не успадковують і не дотримуються змінних середовища проксі. -- Локальні WebUI користувача та локальні сервери моделей за потреби слід додати до списку дозволених у політиці проксі оператора; OpenClaw не надає для них загального обходу локальної мережі. -- Обхід проксі для площини керування Gateway навмисно обмежено `localhost` і буквальними URL-адресами loopback IP. Використовуйте `ws://127.0.0.1:18789`, `ws://[::1]:18789` або `ws://localhost:18789` для локальних прямих підключень до площини керування Gateway; інші імена хостів маршрутизуються як звичайний трафік на основі імен хостів. +- Проксі покращує покриття для процесно-локальних JavaScript HTTP- і WebSocket-клієнтів, але не є мережевою пісочницею рівня ОС. +- Необроблені сокети `net`, `tls` і `http2`, нативні аддони та дочірні процеси можуть обходити маршрутизацію проксі рівня Node, якщо вони не успадковують і не дотримуються змінних середовища проксі. +- IRC — це необроблений TCP/TLS-канал поза маршрутизацією через прямий проксі, керований оператором. У розгортаннях, де весь вихідний трафік має проходити через цей прямий проксі, задайте `channels.irc.enabled=false`, якщо прямий вихідний IRC-трафік не схвалено явно. +- Локальні WebUI користувачів і локальні сервери моделей за потреби слід додати до списку дозволених у політиці проксі оператора; OpenClaw не надає для них загального обходу локальної мережі. +- Обхід проксі для контрольної площини Gateway навмисно обмежено `localhost` і URL-адресами з буквальними loopback IP. Використовуйте `ws://127.0.0.1:18789`, `ws://[::1]:18789` або `ws://localhost:18789` для локальних прямих підключень до контрольної площини Gateway; інші імена хостів маршрутизуються як звичайний трафік на основі імен хостів. - OpenClaw не перевіряє, не тестує й не сертифікує вашу політику проксі. - Розглядайте зміни політики проксі як безпеково чутливі операційні зміни.