diff --git a/docs/uk/web/control-ui.md b/docs/uk/web/control-ui.md index 365147947..46c1ebffd 100644 --- a/docs/uk/web/control-ui.md +++ b/docs/uk/web/control-ui.md @@ -1,28 +1,28 @@ --- read_when: - Ви хочете керувати Gateway з браузера - - Ви хочете доступ до Tailnet без SSH-тунелів -summary: Браузерний інтерфейс керування для Gateway (чат, вузли, конфігурація) -title: Інтерфейс керування + - Ви хочете доступ Tailnet без SSH-тунелів +summary: Браузерний UI керування для Gateway (чат, вузли, конфігурація) +title: UI керування x-i18n: - generated_at: "2026-04-24T04:35:30Z" + generated_at: "2026-04-24T04:49:08Z" model: gpt-5.4 provider: openai - source_hash: 3dd1234ef8c7fbb753cdb1015426323b75916833d4245b212793a7ee66cfa86f + source_hash: 2ad0d0cef7d842eddf665ba50f37403df258b17d4c072d22a30d1bc3830dc467 source_path: web/control-ui.md workflow: 15 --- -Інтерфейс керування — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговується через Gateway: +UI керування — це невеликий односторінковий застосунок **Vite + Lit**, який Gateway віддає: -- типово: `http://:18789/` +- за замовчуванням: `http://:18789/` - необов’язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`) -Він працює **безпосередньо з WebSocket Gateway** на тому самому порту. +Він звертається **безпосередньо до WebSocket Gateway** на тому самому порту. ## Швидке відкриття (локально) -Якщо Gateway запущений на тому самому комп’ютері, відкрийте: +Якщо Gateway запущено на тому самому комп’ютері, відкрийте: - [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (або [http://localhost:18789/](http://localhost:18789/)) @@ -36,15 +36,15 @@ x-i18n: - заголовки ідентифікації trusted-proxy, коли `gateway.auth.mode: "trusted-proxy"` Панель налаштувань інформаційної панелі зберігає токен для поточної сесії вкладки браузера -і вибрану URL-адресу gateway; паролі не зберігаються. Onboarding зазвичай -генерує токен gateway для автентифікації зі спільним секретом під час першого підключення, але +та вибрану URL-адресу gateway; паролі не зберігаються. Під час початкового налаштування зазвичай +створюється токен gateway для автентифікації зі спільним секретом при першому підключенні, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`. ## Сполучення пристрою (перше підключення) -Коли ви підключаєтеся до Control UI з нового браузера або пристрою, Gateway +Коли ви підключаєтеся до UI керування з нового браузера або пристрою, Gateway вимагає **одноразове підтвердження сполучення** — навіть якщо ви в тій самій Tailnet -з `gateway.auth.allowTailscale: true`. Це захід безпеки для запобігання +із `gateway.auth.allowTailscale: true`. Це захід безпеки для запобігання несанкціонованому доступу. **Що ви побачите:** "disconnected (1008): pairing required" @@ -52,147 +52,148 @@ x-i18n: **Щоб підтвердити пристрій:** ```bash -# Перелічити запити, що очікують +# Показати список запитів, що очікують openclaw devices list # Підтвердити за ID запиту openclaw devices approve ``` -Якщо браузер повторює спробу сполучення зі зміненими даними автентифікації (роль/області доступу/public +Якщо браузер повторно надсилає запит на сполучення зі зміненими даними автентифікації (роль/області доступу/public key), попередній запит, що очікує, замінюється, і створюється новий `requestId`. Перед підтвердженням знову виконайте `openclaw devices list`. -Якщо браузер уже сполучений і ви змінюєте для нього доступ із читання на -доступ на запис/адміністрування, це розглядається як підвищення рівня підтвердження, а не як тихе -повторне підключення. OpenClaw зберігає попереднє підтвердження активним, блокує ширше повторне підключення +Якщо браузер уже сполучений і ви змінюєте доступ із читання на +доступ запису/адміністратора, це вважається підвищенням рівня підтвердження, а не +тихим повторним підключенням. OpenClaw зберігає старе підтвердження активним, блокує ширше повторне підключення і просить вас явно підтвердити новий набір областей доступу. -Після підтвердження пристрій запам’ятовується і не потребуватиме повторного підтвердження, якщо +Після підтвердження пристрій запам’ятовується і не вимагатиме повторного підтвердження, якщо ви не відкличете його через `openclaw devices revoke --device --role `. Див. -[CLI пристроїв](/uk/cli/devices) щодо ротації токенів і відкликання. +[Devices CLI](/uk/cli/devices) щодо ротації токенів і відкликання. **Примітки:** - Прямі локальні браузерні підключення через local loopback (`127.0.0.1` / `localhost`) підтверджуються автоматично. -- Браузерні підключення через Tailnet і LAN однаково вимагають явного підтвердження, навіть коли - вони походять із тієї самої машини. +- Підключення браузера через Tailnet і LAN все одно вимагають явного підтвердження, навіть якщо + вони виконуються з тієї самої машини. - Кожен профіль браузера генерує унікальний ID пристрою, тому зміна браузера або - очищення даних браузера потребуватиме повторного сполучення. + очищення даних браузера вимагатиме повторного сполучення. ## Особиста ідентичність (локально в браузері) -Control UI підтримує особисту ідентичність для кожного браузера (відображуване ім’я та +UI керування підтримує особисту ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції в спільних сесіях. Вона -зберігається у сховищі браузера, прив’язана до поточного профілю браузера та не -синхронізується з іншими пристроями і не зберігається на сервері, окрім звичайних -метаданих авторства в транскрипті для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або -зміна браузера скидає її до порожнього стану. +зберігається в сховищі браузера, прив’язана до поточного профілю браузера і не +синхронізується з іншими пристроями та не зберігається на сервері понад звичайні +метадані авторства в стенограмі для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або +зміна браузера скидає її до порожнього значення. -## Endpoint конфігурації середовища виконання +## Кінцева точка конфігурації виконання -Control UI отримує свої налаштування середовища виконання з -`/__openclaw/control-ui-config.json`. Доступ до цього endpoint захищений тією ж +UI керування отримує свої налаштування виконання з +`/__openclaw/control-ui-config.json`. Доступ до цієї кінцевої точки захищений тією самою автентифікацією gateway, що й решта HTTP-поверхні: неавтентифіковані браузери не можуть -отримати його, а успішне отримання вимагає або вже дійсного токена/пароля gateway, -ідентифікації Tailscale Serve, або ідентичності trusted-proxy. +отримати її, а успішне отримання вимагає або вже дійсного токена/пароля gateway, +ідентифікації Tailscale Serve, або ідентифікації trusted-proxy. ## Підтримка мов -Control UI може локалізуватися під час першого завантаження на основі локалі вашого браузера. -Щоб змінити її пізніше, відкрийте **Overview -> Gateway Access -> Language**. Засіб вибору -локалі розташований у картці Gateway Access, а не в розділі Appearance. +UI керування може локалізуватися під час першого завантаження на основі локалі вашого браузера. +Щоб пізніше перевизначити її, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Перемикач +локалі знаходиться в картці доступу до Gateway, а не в розділі «Зовнішній вигляд». - Підтримувані локалі: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `tr`, `uk`, `id`, `pl`, `th` -- Неанглійські переклади ліниво завантажуються в браузері. -- Вибрана локаль зберігається у сховищі браузера і використовується при наступних відвідуваннях. +- Переклади, відмінні від англійської, ледаче завантажуються в браузері. +- Вибрана локаль зберігається в сховищі браузера й повторно використовується під час майбутніх відвідувань. - Відсутні ключі перекладу повертаються до англійської. ## Що він може робити (сьогодні) - Чат із моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`) -- Безпосередньо взаємодіяти з OpenAI Realtime із браузера через WebRTC. Gateway - створює короткочасний секрет клієнта Realtime за допомогою `talk.realtime.session`; браузер +- Напряму взаємодіяти з OpenAI Realtime з браузера через WebRTC. Gateway + випускає короткоживучий клієнтський секрет Realtime через `talk.realtime.session`; браузер надсилає аудіо з мікрофона безпосередньо до OpenAI і пересилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw. -- Потокова передача викликів інструментів + картки виводу інструментів у реальному часі в Chat (події агента) -- Канали: статус вбудованих, bundled і external каналів Plugin, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`) +- Потокове передавання викликів інструментів + картки виводу інструментів у реальному часі в чаті (події агента) +- Канали: вбудовані, а також стан bundled/external plugin каналів, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`) - Екземпляри: список присутності + оновлення (`system-presence`) -- Сесії: список + перевизначення model/thinking/fast/verbose/trace/reasoning для кожної сесії (`sessions.list`, `sessions.patch`) -- Dreams: статус dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`) +- Сесії: список + перевизначення для кожної сесії моделі/thinking/fast/verbose/trace/reasoning (`sessions.list`, `sessions.patch`) +- Dreams: статус Dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`) - Завдання Cron: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`) - Skills: статус, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`) -- Nodes: список + обмеження (`node.list`) -- Підтвердження exec: редагування списків дозволів gateway або node + політика запиту для `exec host=gateway/node` (`exec.approvals.*`) +- Node: список + обмеження (`node.list`) +- Підтвердження exec: редагування списків дозволів gateway або node + політика запитів для `exec host=gateway/node` (`exec.approvals.*`) - Конфігурація: перегляд/редагування `~/.openclaw/openclaw.json` (`config.get`, `config.set`) -- Конфігурація: застосування + перезапуск із перевіркою (`config.apply`) і пробудження останньої активної сесії -- Запис конфігурації включає захист base-hash, щоб запобігти перезапису одночасних змін -- Записи конфігурації (`config.set`/`config.apply`/`config.patch`) також заздалегідь перевіряють активне розв’язання SecretRef для посилань у надісланому payload конфігурації; нерозв’язані активні надіслані посилання відхиляються до запису +- Конфігурація: застосування + перезапуск із валідацією (`config.apply`) і пробудження останньої активної сесії +- Записи конфігурації містять захист base-hash, щоб запобігти перезапису одночасних змін +- Записи конфігурації (`config.set`/`config.apply`/`config.patch`) також виконують попередню перевірку активного розв’язання SecretRef для посилань у надісланому конфігураційному payload; нерозв’язані активні надіслані посилання відхиляються до запису - Схема конфігурації + рендеринг форми (`config.schema` / `config.schema.lookup`, - включно з полями `title` / `description`, відповідними підказками UI, негайними підсумками - дочірніх елементів, метаданими docs для вкладених вузлів object/wildcard/array/composition, - а також схемами Plugin і каналів, коли вони доступні); редактор Raw JSON - доступний лише тоді, коли знімок має безпечний круговий перехід raw -- Якщо знімок не може безпечно пройти круговий перехід raw text, Control UI примусово вмикає режим Form і вимикає режим Raw для цього знімка -- У редакторі Raw JSON дія "Reset to saved" зберігає форму, створену в raw (форматування, коментарі, макет `$include`), замість повторного рендерингу сплощеного знімка, тож зовнішні зміни зберігаються після скидання, коли знімок може безпечно пройти круговий перехід -- Структуровані значення об’єктів SecretRef відображаються лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню через перетворення object-to-string -- Налагодження: знімки status/health/models + журнал подій + ручні виклики RPC (`status`, `health`, `models.list`) -- Логи: tail у реальному часі для файлових логів gateway із фільтрацією/експортом (`logs.tail`) -- Оновлення: запуск оновлення package/git + перезапуск (`update.run`) зі звітом про перезапуск + включно з `title` / `description` поля, відповідними UI-підказками, зведеннями + безпосередніх дочірніх елементів, метаданими документації для вузлів вкладених об’єктів/wildcard/масивів/композицій, + а також схемами plugin і каналів, коли вони доступні); редактор Raw JSON + доступний лише тоді, коли snapshot має безпечний round-trip необробленого вигляду +- Якщо snapshot не можна безпечно виконати round-trip як необроблений текст, UI керування примусово вмикає режим Form і вимикає режим Raw для цього snapshot +- У редакторі Raw JSON кнопка "Reset to saved" зберігає форму, створену в raw (форматування, коментарі, розмітку `$include`), замість повторного рендерингу сплощеного snapshot, тож зовнішні зміни переживають скидання, коли snapshot можна безпечно виконати round-trip +- Структуровані значення об’єктів SecretRef рендеряться як лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню через перетворення об’єкта на рядок +- Налагодження: знімки status/health/models + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`) +- Журнали: live tail журналів файлів gateway із фільтрацією/експортом (`logs.tail`) +- Оновлення: запуск оновлення пакунка/git + перезапуск (`update.run`) зі звітом про перезапуск Примітки до панелі завдань Cron: -- Для ізольованих завдань типовою доставкою є оголошення підсумку. За потреби можна переключити на none для лише внутрішніх запусків. +- Для ізольованих завдань доставлення за замовчуванням оголошує зведення. Ви можете перемкнути на none, якщо хочете лише внутрішні запуски. - Поля channel/target з’являються, коли вибрано announce. -- Режим Webhook використовує `delivery.mode = "webhook"` із `delivery.to`, встановленим на дійсну HTTP(S) URL-адресу Webhook. -- Для завдань main-session доступні режими доставки webhook і none. -- Розширені елементи редагування включають delete-after-run, clear agent override, параметри cron exact/stagger, - перевизначення agent model/thinking та перемикачі best-effort delivery. -- Перевірка форми виконується вбудовано з помилками на рівні полів; недійсні значення вимикають кнопку збереження, доки їх не буде виправлено. +- Режим Webhook використовує `delivery.mode = "webhook"` із `delivery.to`, установленим на дійсну HTTP(S) URL-адресу Webhook. +- Для завдань main-session доступні режими доставлення webhook і none. +- Розширені елементи редагування містять видалення після запуску, очищення перевизначення агента, точні/зміщені параметри cron, + перевизначення model/thinking агента та перемикачі доставлення best-effort. +- Валідація форми вбудована з помилками на рівні полів; некоректні значення вимикають кнопку збереження, доки їх не буде виправлено. - Установіть `cron.webhookToken`, щоб надсилати окремий bearer token; якщо його не задано, webhook надсилається без заголовка auth. -- Застарілий запасний варіант: збережені legacy jobs із `notify: true` усе ще можуть використовувати `cron.webhook`, доки не буде виконано міграцію. +- Застарілий fallback: збережені legacy-завдання з `notify: true` все ще можуть використовувати `cron.webhook`, доки не буде виконано міграцію. ## Поведінка чату - `chat.send` є **неблокувальним**: він одразу підтверджується з `{ runId, status: "started" }`, а відповідь передається потоком через події `chat`. - Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }` під час виконання і `{ status: "ok" }` після завершення. -- Відповіді `chat.history` обмежені за розміром для безпеки UI. Якщо записи транскрипту надто великі, Gateway може обрізати довгі текстові поля, пропускати важкі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`). -- Зображення assistant/generated зберігаються як керовані посилання на медіа й повертаються через автентифіковані URL-адреси медіа Gateway, тож повторні завантаження не залежать від того, чи залишився raw payload зображення base64 у відповіді історії чату. -- `chat.history` також прибирає з видимого тексту assistant inline-теги директив лише для відображення (наприклад, `[[reply_to_*]]` і `[[audio_as_voice]]`), plain-text XML payloads викликів інструментів (включно з `...`, `...`, `...`, `...` і обрізаними блоками викликів інструментів), а також leaked ASCII/full-width токени керування моделлю, і пропускає записи assistant, у яких увесь видимий текст — це лише точний silent token `NO_REPLY` / `no_reply`. -- `chat.inject` додає примітку assistant до транскрипту сесії та транслює подію `chat` для оновлень лише UI (без запуску агента, без доставки в канал). -- Засоби вибору model і thinking у заголовку чату негайно змінюють активну сесію через `sessions.patch`; це постійні перевизначення сесії, а не параметри надсилання лише на один хід. -- Режим Talk використовує зареєстрованого постачальника realtime voice. Налаштуйте OpenAI через - `talk.provider: "openai"` разом із `talk.providers.openai.apiKey`, або повторно використайте конфігурацію - постачальника realtime для Voice Call. Браузер ніколи не отримує стандартний - API-ключ OpenAI; він отримує лише тимчасовий секрет клієнта Realtime. -- У компоновщику Chat елемент керування Talk — це кнопка з хвилями поруч із - кнопкою диктування з мікрофона. Коли Talk запускається, у рядку стану компоновщика - показується `Connecting Talk...`, потім `Talk live`, коли аудіо підключено, або - `Asking OpenClaw...`, коли виклик інструмента realtime консультується з налаштованою +- Відповіді `chat.history` обмежені за розміром для безпеки UI. Коли записи стенограми надто великі, Gateway може усікати довгі текстові поля, пропускати важкі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`). +- Зображення помічника/згенеровані зображення зберігаються як керовані медіапосилання і знову віддаються через автентифіковані медіа-URL Gateway, тож перезавантаження не залежать від того, чи залишаються необроблені payload-и зображень base64 у відповіді історії чату. +- `chat.history` також прибирає inline-теги директив, призначені лише для відображення, із видимого тексту помічника (наприклад, `[[reply_to_*]]` і `[[audio_as_voice]]`), XML payload-и викликів інструментів у звичайному тексті (зокрема `...`, `...`, `...`, `...` і усічені блоки викликів інструментів), а також leaked ASCII/full-width токени керування моделлю, і пропускає записи помічника, у яких увесь видимий текст — це лише точний тихий токен `NO_REPLY` / `no_reply`. +- `chat.inject` додає примітку помічника до стенограми сесії та розсилає подію `chat` для оновлень лише UI (без запуску агента, без доставлення через канал). +- Перемикачі моделі й thinking у заголовку чату одразу змінюють активну сесію через `sessions.patch`; це постійні перевизначення сесії, а не параметри надсилання лише на один хід. +- Режим Talk використовує зареєстрованого постачальника голосу realtime. Налаштуйте OpenAI за допомогою + `talk.provider: "openai"` разом із `talk.providers.openai.apiKey`, або повторно використайте + конфігурацію realtime-постачальника Voice Call. Браузер ніколи не отримує стандартний + API-ключ OpenAI; він отримує лише ефемерний клієнтський секрет Realtime. Підказка сесії + Realtime збирається Gateway; `talk.realtime.session` не приймає перевизначення інструкцій, надані викликачем. +- У composer чату елемент керування Talk — це кнопка з хвилями поруч із + кнопкою диктування з мікрофона. Коли Talk запускається, рядок статусу composer показує + `Connecting Talk...`, потім `Talk live`, поки підключено аудіо, або + `Asking OpenClaw...`, поки realtime-виклик інструмента консультується з налаштованою більшою моделлю через `chat.send`. - Зупинка: - Натисніть **Stop** (викликає `chat.abort`) - - Поки запуск активний, звичайні наступні повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це продовження в поточний хід. - - Введіть `/stop` (або окремі фрази для переривання, як-от `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза основним потоком - - `chat.abort` підтримує `{ sessionKey }` (без `runId`) для переривання всіх активних запусків цієї сесії -- Збереження часткових результатів після переривання: - - Коли запуск переривається, частковий текст assistant усе ще може відображатися в UI - - Gateway зберігає частковий текст assistant у історії транскрипту, коли існує буферизований вивід - - Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізняти часткові результати після переривання від звичайного завершеного виводу + - Поки запуск активний, звичайні подальші повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це подальше повідомлення в поточний хід. + - Введіть `/stop` (або окремі фрази переривання, як-от `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза смугою + - `chat.abort` підтримує `{ sessionKey }` (без `runId`) для переривання всіх активних запусків для цієї сесії +- Часткове збереження під час переривання: + - Коли запуск переривається, частковий текст помічника все одно може відображатися в UI + - Gateway зберігає частковий текст помічника в історію стенограми перерваного запуску, коли існує буферизований вивід + - Збережені записи містять метадані переривання, щоб споживачі стенограми могли відрізнити часткові фрагменти переривання від звичайного завершеного виводу ## Hosted embeds -Повідомлення assistant можуть відображати вбудований hosted web content за допомогою shortcode `[embed ...]`. -Політика sandbox для iframe контролюється параметром +Повідомлення помічника можуть відображати вбудований розміщений вебвміст за допомогою shortcode `[embed ...]`. +Політика sandbox iframe керується через `gateway.controlUi.embedSandbox`: - `strict`: вимикає виконання скриптів усередині hosted embeds - `scripts`: дозволяє інтерактивні embeds, зберігаючи ізоляцію origin; це - типове значення, і його зазвичай достатньо для самодостатніх браузерних ігор/віджетів -- `trusted`: додає `allow-same-origin` поверх `allow-scripts` для same-site - документів, яким навмисно потрібні ширші привілеї + значення за замовчуванням і зазвичай його достатньо для самодостатніх браузерних ігор/віджетів +- `trusted`: додає `allow-same-origin` поверх `allow-scripts` для документів того самого сайту, + яким навмисно потрібні ширші привілеї Приклад: @@ -206,19 +207,19 @@ Control UI може локалізуватися під час першого з } ``` -Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна поведінка -same-origin. Для більшості створених агентом ігор та інтерактивних canvas -`scripts` є безпечнішим вибором. +Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна +поведінка same-origin. Для більшості згенерованих агентом ігор та інтерактивних canvas +`cripts` є безпечнішим вибором. -Абсолютні зовнішні URL-адреси embed `http(s)` типово залишаються заблокованими. Якщо ви +Абсолютні зовнішні URL-адреси embed `http(s)` за замовчуванням залишаються заблокованими. Якщо ви свідомо хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, установіть `gateway.controlUi.allowExternalEmbedUrls: true`. ## Доступ Tailnet (рекомендовано) -### Інтегрований Tailscale Serve (бажано) +### Інтегрований Tailscale Serve (рекомендовано) -Залишайте Gateway на loopback і дозвольте Tailscale Serve проксувати його через HTTPS: +Залиште Gateway на loopback і дозвольте Tailscale Serve проксіювати його через HTTPS: ```bash openclaw gateway --tailscale serve @@ -228,19 +229,19 @@ openclaw gateway --tailscale serve - `https:///` (або ваш налаштований `gateway.controlUi.basePath`) -Типово запити Serve для Control UI/WebSocket можуть автентифікуватися через заголовки ідентичності Tailscale +За замовчуванням запити Serve до UI керування/WebSocket можуть автентифікуватися через заголовки ідентифікації Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw -перевіряє ідентичність, визначаючи адресу `x-forwarded-for` через -`tailscale whois` і звіряючи її із заголовком, і приймає це лише тоді, коли +перевіряє ідентичність, розв’язуючи адресу `x-forwarded-for` за допомогою +`tailscale whois` і звіряючи її із заголовком, і приймає їх лише тоді, коли запит потрапляє на loopback із заголовками Tailscale `x-forwarded-*`. Установіть -`gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані -зі спільним секретом навіть для трафіку Serve. Тоді використовуйте `gateway.auth.mode: "token"` або +`gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані зі спільним секретом +навіть для трафіку Serve. Тоді використовуйте `gateway.auth.mode: "token"` або `"password"`. -Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта -та області автентифікації серіалізуються перед записами rate-limit. Тому паралельні -невдалі повторні спроби з того самого браузера можуть показати `retry later` у другому запиті +Для цього асинхронного шляху ідентифікації Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта +та області автентифікації серіалізуються перед записами обмеження швидкості. Тому одночасні хибні повторні спроби +з того самого браузера можуть показувати `retry later` у другому запиті замість двох звичайних невідповідностей, що змагаються паралельно. -Автентифікація Serve без токена припускає, що вузол gateway є довіреним. Якщо на цьому вузлі +Автентифікація Serve без токена припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте автентифікацію токеном/паролем. ### Прив’язка до tailnet + токен @@ -253,27 +254,27 @@ openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)" - `http://:18789/` (або ваш налаштований `gateway.controlUi.basePath`) -Вставте відповідний спільний секрет у налаштування UI (надсилається як +Вставте відповідний спільний секрет у налаштування UI (він надсилається як `connect.params.auth.token` або `connect.params.auth.password`). ## Незахищений HTTP Якщо ви відкриваєте інформаційну панель через звичайний HTTP (`http://` або `http://`), -браузер працює в **незахищеному контексті** і блокує WebCrypto. Типово -OpenClaw **блокує** підключення Control UI без ідентичності пристрою. +браузер працює в **незахищеному контексті** і блокує WebCrypto. За замовчуванням +OpenClaw **блокує** підключення UI керування без ідентичності пристрою. Задокументовані винятки: -- сумісність із незахищеним HTTP лише для localhost через `gateway.controlUi.allowInsecureAuth=true` -- успішна автентифікація оператора в Control UI через `gateway.auth.mode: "trusted-proxy"` +- сумісність localhost-only для незахищеного HTTP з `gateway.controlUi.allowInsecureAuth=true` +- успішна автентифікація оператора UI керування через `gateway.auth.mode: "trusted-proxy"` - аварійний варіант `gateway.controlUi.dangerouslyDisableDeviceAuth=true` -**Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкривайте UI локально: +**Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкрийте UI локально: - `https:///` (Serve) -- `http://127.0.0.1:18789/` (на вузлі gateway) +- `http://127.0.0.1:18789/` (на хості gateway) -**Поведінка перемикача insecure-auth:** +**Поведінка перемикача незахищеної автентифікації:** ```json5 { @@ -287,7 +288,7 @@ OpenClaw **блокує** підключення Control UI без іденти `allowInsecureAuth` — це лише локальний перемикач сумісності: -- Він дозволяє сесіям Control UI на localhost продовжувати роботу без ідентичності пристрою в +- Він дозволяє сесіям UI керування на localhost продовжуватися без ідентичності пристрою в незахищених HTTP-контекстах. - Він не обходить перевірки сполучення. - Він не послаблює вимоги до ідентичності пристрою для віддалених підключень (не localhost). @@ -304,44 +305,44 @@ OpenClaw **блокує** підключення Control UI без іденти } ``` -`dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою в Control UI і є -серйозним зниженням безпеки. Швидко поверніть попередні налаштування після аварійного використання. +`dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою в UI керування і є +серйозним зниженням безпеки. Після аварійного використання швидко скасуйте цю зміну. Примітка щодо trusted-proxy: -- успішна автентифікація trusted-proxy може допускати **операторські** сесії Control UI без +- успішна автентифікація trusted-proxy може допускати **операторські** сесії UI керування без ідентичності пристрою -- це **не** поширюється на сесії Control UI з роллю node -- reverse proxy на loopback на тому самому вузлі все одно не задовольняють автентифікацію trusted-proxy; див. +- це **не** поширюється на сесії UI керування з роллю node +- reverse proxy на loopback того самого хоста все одно не задовольняють автентифікацію trusted-proxy; див. [Автентифікація Trusted Proxy](/uk/gateway/trusted-proxy-auth) -Див. [Tailscale](/uk/gateway/tailscale) для вказівок із налаштування HTTPS. +Див. [Tailscale](/uk/gateway/tailscale) для рекомендацій щодо налаштування HTTPS. -## Content Security Policy +## Політика безпеки вмісту -Control UI постачається з жорсткою політикою `img-src`: дозволені лише ресурси **того самого origin** і URL `data:`. Віддалені URL з `http(s)` і URL з відносним до протоколу записом відхиляються браузером і не ініціюють мережевих запитів. +UI керування постачається зі суворою політикою `img-src`: дозволені лише ресурси **same-origin** і URL `data:`. Віддалені URL з `http(s)` і відносні до протоколу URL зображень відхиляються браузером і не ініціюють мережевих запитів. Що це означає на практиці: -- Аватари та зображення, що обслуговуються за відносними шляхами (наприклад, `/avatars/`), як і раніше відображаються. -- Вбудовані URL `data:image/...` як і раніше відображаються (це корисно для payloads усередині протоколу). -- Віддалені URL аватарів, що надходять із метаданих каналу, видаляються допоміжними засобами аватарів у Control UI і замінюються вбудованим logo/badge, тому скомпрометований або зловмисний канал не може змусити браузер оператора виконувати довільні віддалені запити зображень. +- Аватари й зображення, що віддаються за відносними шляхами (наприклад, `/avatars/`), як і раніше відображаються. +- Вбудовані URL `data:image/...` як і раніше відображаються (це корисно для payload-ів усередині протоколу). +- Віддалені URL аватарів, які надсилає метадані каналу, видаляються в допоміжних функціях аватарів UI керування та замінюються вбудованим логотипом/значком, тому скомпрометований або зловмисний канал не може змусити браузер оператора виконувати довільні віддалені запити зображень. -Щоб отримати цю поведінку, вам нічого не потрібно змінювати — вона завжди ввімкнена і не налаштовується. +Щоб отримати таку поведінку, нічого змінювати не потрібно — вона завжди ввімкнена й не налаштовується. ## Автентифікація маршруту аватара -Коли налаштована автентифікація gateway, endpoint аватара в Control UI вимагає той самий токен gateway, що й решта API: +Коли налаштовано автентифікацію gateway, кінцева точка аватарів UI керування вимагає той самий токен gateway, що й решта API: - `GET /avatar/` повертає зображення аватара лише автентифікованим викликачам. `GET /avatar/?meta=1` повертає метадані аватара за тим самим правилом. -- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (аналогічно до сусіднього маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на вузлах, які інакше захищені. -- Сам Control UI пересилає токен gateway як заголовок bearer під час отримання аватарів і використовує автентифіковані blob URL, тому зображення все одно відображається в інформаційних панелях. +- Неавтентифіковані запити до будь-якого з маршрутів відхиляються (аналогічно до сусіднього маршруту медіа помічника). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які в іншому разі захищені. +- Сам UI керування пересилає токен gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані blob URL, тож зображення як і раніше відображається в інформаційних панелях. -Якщо ви вимкнете автентифікацію gateway (не рекомендовано на спільних вузлах), маршрут аватара також стане неавтентифікованим, відповідно до решти gateway. +Якщо ви вимкнете автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стане неавтентифікованим, відповідно до решти gateway. ## Збирання UI -Gateway обслуговує статичні файли з `dist/control-ui`. Зберіть їх за допомогою: +Gateway віддає статичні файли з `dist/control-ui`. Зберіть їх за допомогою: ```bash pnpm ui:build @@ -359,16 +360,16 @@ OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build pnpm ui:dev ``` -Потім вкажіть UI URL вашого Gateway WS (наприклад, `ws://127.0.0.1:18789`). +Потім вкажіть для UI URL вашого Gateway WS (наприклад, `ws://127.0.0.1:18789`). ## Налагодження/тестування: dev server + віддалений Gateway -Control UI — це статичні файли; ціль WebSocket можна налаштувати, і вона може -відрізнятися від HTTP origin. Це зручно, коли ви хочете мати локальний dev server Vite, -а Gateway запущений деінде. +UI керування — це статичні файли; ціль WebSocket налаштовується і може +відрізнятися від HTTP origin. Це зручно, коли ви хочете використовувати Vite dev server +локально, але Gateway працює в іншому місці. 1. Запустіть dev server UI: `pnpm ui:dev` -2. Відкрийте URL на кшталт: +2. Відкрийте URL такого вигляду: ```text http://localhost:5173/?gatewayUrl=ws://:18789 @@ -382,20 +383,20 @@ http://localhost:5173/?gatewayUrl=wss://:18789#token=:18789#token=