chore(i18n): refresh uk translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-05-04 03:32:31 +00:00
parent 1ea204ad67
commit fd3341b30f

View File

@ -1,25 +1,25 @@
---
read_when:
- Ви хочете керувати Gateway з браузера
- Ви хочете керувати Gateway із браузера
- Вам потрібен доступ до Tailnet без SSH-тунелів
sidebarTitle: Control UI
summary: Браузерний інтерфейс керування для Gateway (чат, вузли, конфігурація)
title: Інтерфейс керування
x-i18n:
generated_at: "2026-05-04T00:49:51Z"
generated_at: "2026-05-04T03:30:45Z"
model: gpt-5.5
provider: openai
source_hash: c890d83da2c296b600e4b5a00a538f37e6bd54da31fbe62113ecd6177b15626e
source_hash: 99a40ab77276fbc3180aefb103c2dd46804829c7b1b6966a8456ed35b85ed644
source_path: web/control-ui.md
workflow: 16
---
Control UI — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговує Gateway:
Інтерфейс керування — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговує Gateway:
- типово: `http://<host>:18789/`
- необов’язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`)
Він взаємодіє **безпосередньо з Gateway WebSocket** на тому самому порту.
Він взаємодіє **безпосередньо з WebSocket Gateway** на тому самому порту.
## Швидке відкриття (локально)
@ -29,23 +29,23 @@ Control UI — це невеликий односторінковий засто
Якщо сторінка не завантажується, спочатку запустіть Gateway: `openclaw gateway`.
Автентифікація передається під час рукостискання WebSocket через:
Автентифікація передається під час WebSocket-рукостискання через:
- `connect.params.auth.token`
- `connect.params.auth.password`
- заголовки ідентичності Tailscale Serve, коли `gateway.auth.allowTailscale: true`
- заголовки ідентичності довіреного проксі, коли `gateway.auth.mode: "trusted-proxy"`
Панель налаштувань дашборда зберігає токен для поточної сесії вкладки браузера й вибраної URL-адреси Gateway; паролі не зберігаються. Onboarding зазвичай генерує токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`.
Панель налаштувань дашборда зберігає токен для поточного сеансу вкладки браузера й вибраного URL Gateway; паролі не зберігаються. Початкове налаштування зазвичай генерує токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`.
## Сполучення пристрою (перше підключення)
## Спарювання пристрою (перше підключення)
Коли ви підключаєтеся до Control UI з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового схвалення сполучення**. Це захід безпеки для запобігання несанкціонованому доступу.
Коли ви підключаєтеся до інтерфейсу керування з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового схвалення спарювання**. Це захід безпеки для запобігання несанкціонованому доступу.
**Що ви побачите:** "disconnected (1008): pairing required"
**Що ви побачите:** "відключено (1008): потрібне спарювання"
<Steps>
<Step title="Перелічити запити, що очікують">
<Step title="Перелічити запити в очікуванні">
```bash
openclaw devices list
```
@ -57,96 +57,96 @@ Control UI — це невеликий односторінковий засто
</Step>
</Steps>
Якщо браузер повторює спробу сполучення зі зміненими даними автентифікації (роль/області дії/публічний ключ), попередній запит, що очікував, замінюється, і створюється новий `requestId`. Перед схваленням повторно виконайте `openclaw devices list`.
Якщо браузер повторює спарювання зі зміненими даними автентифікації (роль/області дії/відкритий ключ), попередній запит в очікуванні замінюється, і створюється новий `requestId`. Перед схваленням повторно виконайте `openclaw devices list`.
Якщо браузер уже сполучено і ви змінюєте його доступ із читання на доступ запису/адміністратора, це обробляється як підвищення рівня схвалення, а не як тихе повторне підключення. OpenClaw зберігає старе схвалення активним, блокує повторне підключення з ширшими правами й просить явно схвалити новий набір областей дії.
Якщо браузер уже спарено, і ви змінюєте його доступ із читання на запис/адміністрування, це розглядається як підвищення рівня схвалення, а не як тихе повторне підключення. OpenClaw зберігає старе схвалення активним, блокує ширше повторне підключення й просить явно схвалити новий набір областей дії.
Після схвалення пристрій запам’ятовується і не потребуватиме повторного схвалення, доки ви не відкличете його командою `openclaw devices revoke --device <id> --role <role>`. Див. [CLI пристроїв](/uk/cli/devices) щодо ротації та відкликання токенів.
Після схвалення пристрій запам’ятовується й не потребуватиме повторного схвалення, якщо ви не відкличете його командою `openclaw devices revoke --device <id> --role <role>`. Див. [CLI пристроїв](/uk/cli/devices) щодо ротації та відкликання токенів.
<Note>
- Прямі браузерні підключення через local loopback (`127.0.0.1` / `localhost`) схвалюються автоматично.
- Tailscale Serve може пропустити цикл сполучення для операторських сесій Control UI, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale перевірена, а браузер подає ідентичність свого пристрою.
- Прямі прив’язки Tailnet, браузерні підключення через LAN і профілі браузера без ідентичності пристрою все одно потребують явного схвалення.
- Кожен профіль браузера генерує унікальний ID пристрою, тому зміна браузера або очищення даних браузера потребуватиме повторного сполучення.
- Tailscale Serve може пропустити цикл спарювання для операторських сеансів інтерфейсу керування, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale підтверджено, а браузер надає ідентичність свого пристрою.
- Прямі прив’язки Tailnet, браузерні підключення з LAN і профілі браузера без ідентичності пристрою все ще потребують явного схвалення.
- Кожен профіль браузера генерує унікальний ID пристрою, тож зміна браузера або очищення даних браузера вимагатиме повторного спарювання.
</Note>
## Персональна ідентичність (локальна для браузера)
## Особиста ідентичність (локальна для браузера)
Control UI підтримує персональну ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сесіях. Вона зберігається у сховищі браузера, обмежена поточним профілем браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства транскрипту для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або зміна браузера скидає її до порожнього стану.
Інтерфейс керування підтримує особисту ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сеансах. Вона зберігається в сховищі браузера, прив’язана до поточного профілю браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства в транскрипті для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або зміна браузера скидає її до порожнього стану.
Та сама локальна для браузера схема застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не передаються туди й назад через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для клієнтів не з UI, які записують це поле напряму (наприклад, скриптові шлюзи або власні дашборди).
Та сама локальна для браузера схема застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не проходять повний цикл через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для клієнтів без UI, які записують це поле напряму (наприклад, скриптових gateway або користувацьких дашбордів).
## Кінцева точка конфігурації середовища виконання
## Ендпоїнт конфігурації часу виконання
Control UI отримує свої налаштування середовища виконання з `/__openclaw/control-ui-config.json`. Ця кінцева точка захищена тією самою автентифікацією Gateway, що й решта HTTP-поверхні: неавтентифіковані браузери не можуть її отримати, а успішне отримання потребує або вже дійсного токена/пароля Gateway, ідентичності Tailscale Serve, або ідентичності довіреного проксі.
Інтерфейс керування отримує свої налаштування часу виконання з `/__openclaw/control-ui-config.json`. Цей ендпоїнт захищено тією самою автентифікацією gateway, що й решту HTTP-поверхні: неавтентифіковані браузери не можуть його отримати, а успішне отримання потребує вже дійсного токена/пароля Gateway, ідентичності Tailscale Serve або ідентичності довіреного проксі.
## Підтримка мов
Control UI може локалізувати себе під час першого завантаження на основі локалі вашого браузера. Щоб перевизначити її пізніше, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Вибір локалі розміщено в картці доступу до Gateway, а не в розділі зовнішнього вигляду.
Інтерфейс керування може локалізуватися під час першого завантаження на основі локалі вашого браузера. Щоб перевизначити її пізніше, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Вибір локалі розміщено в картці доступу до Gateway, а не в розділі вигляду.
- Підтримувані локалі: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa`
- Переклади не англійською мовою ледаче завантажуються в браузері.
- Вибрана локаль зберігається у сховищі браузера й повторно використовується під час майбутніх відвідувань.
- Неанглійські переклади ліниво завантажуються в браузері.
- Вибрана локаль зберігається в сховищі браузера й повторно використовується під час майбутніх відвідувань.
- Відсутні ключі перекладу повертаються до англійської.
Переклади документації генеруються для того самого набору неанглійських локалей, але вбудований у сайт документації перемикач мов Mintlify обмежений кодами локалей, які приймає Mintlify. Документація тайською (`th`) і перською (`fa`) мовами все одно генерується в репозиторії публікації; вона може не з’являтися в цьому перемикачі, доки Mintlify не підтримуватиме ці коди.
Переклади документації генеруються для того самого набору неанглійських локалей, але вбудований перемикач мов сайту документації Mintlify обмежений кодами локалей, які приймає Mintlify. Документація тайською (`th`) і перською (`fa`) все ще генерується в репозиторії публікації; вона може не з’являтися в цьому перемикачі, доки Mintlify не підтримуватиме ці коди.
## Теми зовнішнього вигляду
## Теми вигляду
Панель зовнішнього вигляду зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [теми tweakcn](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Поділитися** й вставте скопійоване посилання на тему в розділ зовнішнього вигляду. Імпортер також приймає URL-адреси реєстру `https://tweakcn.com/r/themes/<id>`, URL-адреси редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/<id>`, сирі ID тем і назви типових тем, як-от `amethyst-haze`.
Панель вигляду зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [редактор tweakcn](https://tweakcn.com/editor/theme), виберіть або створіть тему, натисніть **Поділитися** й вставте скопійоване посилання теми у вигляд. Імпортер також приймає URL реєстру `https://tweakcn.com/r/themes/<id>`, URL редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/<id>`, сирі ID тем і стандартні назви тем, такі як `amethyst-haze`.
Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються в конфігурацію Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо імпортовану тему було вибрано.
Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються в конфігурацію gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо імпортовану тему було вибрано.
## Що він може робити (сьогодні)
<AccordionGroup>
<Accordion title="Чат і голосова розмова">
- Спілкуватися з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Розмовляти через браузерні сесії реального часу. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а бекендові плагіни голосу реального часу використовують релейний транспорт Gateway. Релей зберігає облікові дані провайдера на Gateway, тоді як браузер транслює PCM з мікрофона через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw.
- Потоково передавати виклики інструментів + живі картки виводу інструментів у чаті (події агента).
<Accordion title="Чат і розмова">
- Спілкуватися в чаті з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`).
- Розмовляти через браузерні сеанси реального часу. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а голосові Plugin реального часу лише з бекендом використовують relay-транспорт Gateway. Relay зберігає облікові дані провайдера на Gateway, поки браузер передає мікрофонний PCM через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw.
- Транслювати виклики інструментів і картки виводу інструментів наживо в чаті (події агента).
</Accordion>
<Accordion title="Канали, екземпляри, сесії, сни">
- Канали: статус вбудованих, а також комплектних/зовнішніх каналів плагінів, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`).
- Екземпляри: список присутності + оновлення (`system-presence`).
- Сесії: список + перевизначення моделі/мислення/швидкого режиму/докладності/трасування/міркування для кожної сесії (`sessions.list`, `sessions.patch`).
- Сни: статус Dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
<Accordion title="Канали, інстанси, сеанси, сни">
- Канали: статус вбудованих, а також комплектних/зовнішніх plugin-каналів, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`).
- Інстанси: список присутності + оновлення (`system-presence`).
- Сеанси: список + перевизначення моделі/мислення/швидкого режиму/докладності/трасування/reasoning для кожного сеансу (`sessions.list`, `sessions.patch`).
- Сни: статус Dreaming, перемикач увімкнення/вимкнення та читач щоденника снів (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`).
</Accordion>
<Accordion title="Cron, Skills, вузли, схвалення exec">
<Accordion title="Cron, skills, nodes, схвалення exec">
- Завдання Cron: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`).
- Skills: статус, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`).
- Вузли: список + можливості (`node.list`).
- Схвалення exec: редагування allowlist для Gateway або вузла + політика запитів для `exec host=gateway/node` (`exec.approvals.*`).
- Схвалення exec: редагування списків дозволів gateway або вузла + політика запитів для `exec host=gateway/node` (`exec.approvals.*`).
</Accordion>
<Accordion title="Конфігурація">
- Перегляд/редагування `~/.openclaw/openclaw.json` (`config.get`, `config.set`).
- Застосування + перезапуск із валідацією (`config.apply`) і пробудження останньої активної сесії.
- Записи містять захист базовим хешем, щоб запобігти перезапису паралельних змін.
- Записи (`config.set`/`config.apply`/`config.patch`) попередньо перевіряють розв’язання активних SecretRef для посилань у поданому payload конфігурації; нерозв’язані активні подані посилання відхиляються до запису.
- Схема + рендеринг форми (`config.schema` / `config.schema.lookup`, зокрема поля `title` / `description`, зіставлені підказки UI, підсумки безпосередніх дочірніх елементів, метадані документації на вкладених вузлах об’єктів/шаблонів/масивів/композицій, а також схеми плагінів + каналів, коли вони доступні); редактор сирого JSON доступний лише тоді, коли snapshot має безпечний сирий round-trip.
- Якщо snapshot не може безпечно виконати round-trip сирого тексту, Control UI примусово вмикає режим форми та вимикає сирий режим для цього snapshot.
- У редакторі сирого JSON "Скинути до збереженого" зберігає сиро створену форму (форматування, коментарі, компонування `$include`) замість повторного рендерингу сплощеного snapshot, тому зовнішні редагування переживають скидання, коли snapshot може безпечно виконати round-trip.
- Структуровані об’єктні значення SecretRef рендеряться лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню через перетворення об’єкта на рядок.
- Застосування + перезапуск із валідацією (`config.apply`) і пробудження останнього активного сеансу.
- Записи містять захист базовим хешем, щоб запобігти перезапису паралельних редагувань.
- Записи (`config.set`/`config.apply`/`config.patch`) попередньо перевіряють розв’язання активних SecretRef для посилань у надісланому payload конфігурації; нерозв’язані активні надіслані посилання відхиляються до запису.
- Схема + рендеринг форми (`config.schema` / `config.schema.lookup`, включно з полями `title` / `description`, підібраними UI-підказками, зведеннями безпосередніх дочірніх елементів, метаданими документації на вкладених вузлах object/wildcard/array/composition, а також схемами plugin + channel, коли вони доступні); редактор Raw JSON доступний лише тоді, коли знімок має безпечний сирий повний цикл.
- Якщо знімок не може безпечно виконати повний цикл сирого тексту, інтерфейс керування примусово вмикає режим форми й вимикає сирий режим для цього знімка.
- "Скинути до збереженого" в редакторі Raw JSON зберігає сиро створену форму (форматування, коментарі, компонування `$include`) замість повторного рендерингу сплощеного знімка, тож зовнішні редагування переживають скидання, коли знімок може безпечно виконати повний цикл.
- Структуровані об’єктні значення SecretRef відображаються лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню через перетворення об’єкта на рядок.
</Accordion>
<Accordion title="Налагодження, журнали, оновлення">
- Налагодження: snapshots статусу/справності/моделей + журнал подій + ручні виклики RPC (`status`, `health`, `models.list`).
- Журнали: живий tail файлових журналів Gateway із фільтром/експортом (`logs.tail`).
- Оновлення: запуск оновлення пакета/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після повторного підключення, щоб перевірити версію запущеного Gateway.
- Налагодження: знімки статусу/стану/моделей + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`).
- Журнали: live-tail файлових журналів gateway із фільтром/експортом (`logs.tail`).
- Оновлення: запуск оновлення пакета/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після повторного підключення для перевірки запущеної версії gateway.
</Accordion>
<Accordion title="Примітки до панелі завдань Cron">
- Для ізольованих завдань доставка типово оголошує підсумок. Ви можете перемкнути на none, якщо хочете лише внутрішні запуски.
<Accordion title="Нотатки панелі завдань Cron">
- Для ізольованих завдань доставка типово оголошує зведення. Ви можете перемкнути на «немає», якщо потрібні лише внутрішні запуски.
- Поля каналу/цілі з’являються, коли вибрано оголошення.
- Режим Webhook використовує `delivery.mode = "webhook"` з `delivery.to`, заданим як дійсна HTTP(S) URL-адреса Webhook.
- Для завдань основної сесії доступні режими доставки webhook і none.
- Розширені елементи керування редагуванням включають видалення після запуску, очищення перевизначення агента, параметри точного/stagger cron, перевизначення моделі/мислення агента та перемикачі доставки best-effort.
- Режим Webhook використовує `delivery.mode = "webhook"` із `delivery.to`, заданим як дійсний URL Webhook HTTP(S).
- Для завдань головного сеансу доступні режими доставки Webhook і «немає».
- Розширені елементи керування редагуванням включають видалення після запуску, очищення перевизначення агента, точні/рознесені параметри cron, перевизначення моделі/мислення агента та перемикачі доставки за принципом best effort.
- Валідація форми виконується inline з помилками на рівні полів; недійсні значення вимикають кнопку збереження, доки їх не буде виправлено.
- Задайте `cron.webhookToken`, щоб надсилати окремий bearer-токен; якщо його пропущено, Webhook надсилається без заголовка автентифікації.
- Застарілий fallback: збережені legacy-завдання з `notify: true` все ще можуть використовувати `cron.webhook`, доки їх не буде мігровано.
- Застарілий fallback: збережені legacy-завдання з `notify: true` усе ще можуть використовувати `cron.webhook`, доки їх не буде мігровано.
</Accordion>
</AccordionGroup>
@ -155,85 +155,85 @@ Control UI може локалізувати себе під час першог
<AccordionGroup>
<Accordion title="Семантика надсилання та історії">
- `chat.send` є **неблокувальним**: він одразу підтверджує отримання через `{ runId, status: "started" }`, а відповідь передається потоком через події `chat`.
- Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають власний шлях до зображення; інші файли зберігаються як керовані медіа й показуються в історії як посилання на вкладення.
- `chat.send` є **неблокувальним**: він одразу підтверджує отримання через `{ runId, status: "started" }`, а відповідь передається потоково через події `chat`.
- Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають нативний шлях до зображення; інші файли зберігаються як керовані медіа й показуються в історії як посилання на вкладення.
- Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }` під час виконання та `{ status: "ok" }` після завершення.
- Відповіді `chat.history` обмежені за розміром для безпеки UI. Коли записи стенограми надто великі, Gateway може обрізати довгі текстові поля, пропускати важкі блоки метаданих і замінювати завеликі повідомлення заповнювачем (`[chat.history omitted: message too large]`).
- Зображення помічника/згенеровані зображення зберігаються як посилання на керовані медіа та віддаються назад через автентифіковані медіа-URL Gateway, тому перезавантаження не залежать від того, чи залишаються сирі base64-навантаження зображень у відповіді історії чату.
- `chat.history` також прибирає лише-відображувальні вбудовані теги директив із видимого тексту помічника (наприклад, `[[reply_to_*]]` і `[[audio_as_voice]]`), текстові XML-навантаження викликів інструментів (зокрема `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` і обрізані блоки викликів інструментів), а також витеклі ASCII/повноширинні токени керування моделі, і пропускає записи помічника, весь видимий текст яких є лише точним тихим токеном `NO_REPLY` / `no_reply`.
- Під час активного надсилання та фінального оновлення історії подання чату зберігає локальні оптимістичні повідомлення користувача/помічника видимими, якщо `chat.history` на короткий час повертає старіший знімок; канонічна стенограма замінює ці локальні повідомлення, щойно історія Gateway наздоганяє.
- Живі події `chat` є станом доставки, тоді як `chat.history` перебудовується зі сталої стенограми сесії. Після фінальних подій інструментів Control UI перезавантажує історію та об’єднує лише невеликий оптимістичний хвіст; межа стенограми задокументована в [WebChat](/uk/web/webchat).
- `chat.inject` додає нотатку помічника до стенограми сесії та транслює подію `chat` для оновлень лише UI (без запуску агента й без доставки каналом).
- Вибірники моделі та thinking у заголовку чату негайно виправляють активну сесію через `sessions.patch`; це сталі перевизначення сесії, а не параметри надсилання лише для одного ходу.
- Введення `/new` у Control UI створює та перемикає на ту саму свіжу сесію панелі, що й New Chat. Введення `/reset` зберігає явне скидання Gateway на місці для поточної сесії.
- Вибірник моделі чату запитує налаштоване подання моделей Gateway. Якщо присутній `agents.defaults.models`, цей список дозволених значень керує вибірником. Інакше вибірник показує явні записи `models.providers.*.models` плюс провайдерів із придатною автентифікацією. Повний каталог залишається доступним через налагоджувальний RPC `models.list` із `view: "all"`.
- Коли свіжі звіти використання сесії Gateway показують високий тиск контексту, область компоновника чату показує сповіщення про контекст і, на рекомендованих рівнях Compaction, компактну кнопку, яка запускає звичайний шлях Compaction сесії. Застарілі знімки токенів приховані, доки Gateway знову не повідомить свіже використання.
- Відповіді `chat.history` обмежені за розміром для безпеки UI. Коли записи транскрипту завеликі, Gateway може обрізати довгі текстові поля, пропускати важкі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`).
- Зображення, створені асистентом, зберігаються як керовані медіапосилання та повертаються через автентифіковані медіа-URL Gateway, тому перезавантаження не залежать від того, чи залишаються сирі base64-навантаження зображень у відповіді історії чату.
- `chat.history` також вилучає з видимого тексту асистента службові вбудовані теги директив лише для відображення (наприклад `[[reply_to_*]]` і `[[audio_as_voice]]`), текстові XML-навантаження викликів інструментів (зокрема `<tool_call>...</tool_call>`, `<function_call>...</function_call>`, `<tool_calls>...</tool_calls>`, `<function_calls>...</function_calls>` і обрізані блоки викликів інструментів), а також просочені ASCII/повноширинні керівні токени моделі, і пропускає записи асистента, увесь видимий текст яких є лише точним мовчазним токеном `NO_REPLY` / `no_reply`.
- Під час активного надсилання та фінального оновлення історії подання чату зберігає видимими локальні оптимістичні повідомлення користувача/асистента, якщо `chat.history` на короткий час повертає старіший знімок; канонічний транскрипт замінює ці локальні повідомлення, щойно історія Gateway наздоганяє.
- Події `chat` наживо є станом доставки, тоді як `chat.history` перебудовується зі стійкого транскрипту сеансу. Після фінальних подій інструментів інтерфейс керування перезавантажує історію та зливає лише невеликий оптимістичний хвіст; межу транскрипту задокументовано в [WebChat](/uk/web/webchat).
- `chat.inject` додає нотатку асистента до транскрипту сеансу та транслює подію `chat` для оновлень лише UI (без запуску агента й без доставки каналом).
- Перемикачі моделі та мислення в заголовку чату негайно виправляють активний сеанс через `sessions.patch`; це сталі перевизначення сеансу, а не одноразові параметри надсилання на один хід.
- Введення `/new` в інтерфейсі керування створює та перемикає на такий самий новий сеанс панелі, як New Chat. Введення `/reset` зберігає явне скидання Gateway на місці для поточного сеансу.
- Перемикач моделі чату запитує налаштоване подання моделей Gateway. Якщо наявний `agents.defaults.models`, цей список дозволених значень керує перемикачем. Інакше перемикач показує явні записи `models.providers.*.models` плюс провайдерів із придатною автентифікацією. Повний каталог залишається доступним через налагоджувальний RPC `models.list` із `view: "all"`.
- Коли свіжі звіти про використання сеансу Gateway показують високий тиск контексту, область компонувальника чату показує повідомлення про контекст і, на рекомендованих рівнях Compaction, компактну кнопку, яка запускає звичайний шлях Compaction сеансу. Застарілі знімки токенів приховані, доки Gateway знову не повідомить свіже використання.
</Accordion>
<Accordion title="Режим розмови (браузерний realtime)">
Режим розмови використовує зареєстрованого realtime-провайдера голосу. Налаштуйте OpenAI через `talk.provider: "openai"` плюс `talk.providers.openai.apiKey` або налаштуйте Google через `talk.provider: "google"` плюс `talk.providers.google.apiKey`; конфігурацію realtime-провайдера Voice Call все ще можна повторно використовувати як резервну. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний клієнтський секрет Realtime для WebRTC. Google Live отримує одноразовий обмежений токен автентифікації Live API для браузерної WebSocket-сесії, з інструкціями та деклараціями інструментів, зафіксованими в токені Gateway. Провайдери, які надають лише backend realtime bridge, працюють через ретрансляційний транспорт Gateway, тож облікові дані та vendor sockets залишаються на сервері, тоді як браузерне аудіо проходить через автентифіковані RPC Gateway. Prompt Realtime-сесії збирається Gateway; `talk.realtime.session` не приймає перевизначення інструкцій, надані викликачем.
Режим розмови використовує зареєстрованого realtime-провайдера голосу. Налаштуйте OpenAI з `talk.provider: "openai"` плюс `talk.providers.openai.apiKey` або налаштуйте Google з `talk.provider: "google"` плюс `talk.providers.google.apiKey`; конфігурацію realtime-провайдера Voice Call усе ще можна повторно використати як резервну. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний клієнтський секрет Realtime для WebRTC. Google Live отримує одноразовий обмежений токен автентифікації Live API для браузерного сеансу WebSocket, причому інструкції та декларації інструментів зафіксовані в токені Gateway. Провайдери, які відкривають лише бекендний realtime-міст, працюють через ретрансляційний транспорт Gateway, тож облікові дані та сокети постачальника залишаються на сервері, а браузерне аудіо проходить через автентифіковані RPC Gateway. Підказку сеансу Realtime збирає Gateway; `talk.realtime.session` не приймає перевизначень інструкцій, наданих викликачем.
У компоновнику Chat елемент керування Talk — це кнопка з хвилями поруч із кнопкою диктування через мікрофон. Коли Talk запускається, рядок стану компоновника показує `Connecting Talk...`, потім `Talk live`, доки аудіо підключене, або `Asking OpenClaw...`, доки realtime-виклик інструмента консультується з налаштованою більшою моделлю через `chat.send`.
У компонувальнику чату керування Talk — це кнопка з хвилями поруч із кнопкою диктування мікрофоном. Коли Talk запускається, рядок стану компонувальника показує `Connecting Talk...`, потім `Talk live`, поки аудіо підключене, або `Asking OpenClaw...`, поки realtime-виклик інструмента консультується з налаштованою більшою моделлю через `chat.send`.
Живий smoke для мейнтейнерів: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє обмін OpenAI browser WebRTC SDP, налаштування Google Live constrained-token browser WebSocket і браузерний адаптер ретрансляції Gateway із фейковим мікрофонним медіа. Команда виводить лише статус провайдера й не журналює секрети.
Живий smoke для супровідників: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє браузерний обмін SDP WebRTC OpenAI, налаштування браузерного WebSocket Google Live з обмеженим токеном і браузерний адаптер ретрансляції Gateway з фейковим медіа мікрофона. Команда друкує лише стан провайдера й не журналює секрети.
</Accordion>
<Accordion title="Зупинка та переривання">
- Натисніть **Stop** (викликає `chat.abort`).
- Поки запуск активний, звичайні наступні повідомлення ставляться в чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це наступне повідомлення в поточний хід.
- Введіть `/stop` (або окремі фрази переривання, як-от `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза основним каналом.
- `chat.abort` підтримує `{ sessionKey }` (без `runId`), щоб перервати всі активні запуски для цієї сесії.
- Поки виконання активне, звичайні наступні повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це наступне повідомлення в поточний хід.
- Введіть `/stop` (або окремі фрази переривання на кшталт `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза основним каналом.
- `chat.abort` підтримує `{ sessionKey }` (без `runId`) для переривання всіх активних виконань цього сеансу.
</Accordion>
<Accordion title="Збереження часткового виводу після переривання">
- Коли запуск перервано, частковий текст помічника все ще може показуватися в UI.
- Gateway зберігає перерваний частковий текст помічника в історію стенограми, коли існує буферизований вивід.
- Збережені записи містять метадані переривання, щоб споживачі стенограми могли відрізнити часткові виводи після переривання від звичайного виводу завершення.
<Accordion title="Збереження часткового результату після переривання">
- Коли виконання перервано, частковий текст асистента все ще може показуватися в UI.
- Gateway зберігає перерваний частковий текст асистента в історію транскрипту, коли буферизований вивід існує.
- Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізняти часткові результати переривання від звичайного виводу завершення.
</Accordion>
</AccordionGroup>
## Установлення PWA та web push
## Встановлення PWA та Web Push
Control UI постачається з `manifest.webmanifest` і service worker, тож сучасні браузери можуть установити його як окрему PWA. Web Push дає Gateway змогу будити встановлену PWA сповіщеннями навіть тоді, коли вкладка або вікно браузера не відкриті.
Інтерфейс керування постачається з `manifest.webmanifest` і service worker, тому сучасні браузери можуть установлювати його як самостійну PWA. Web Push дає Gateway змогу будити встановлену PWA сповіщеннями, навіть коли вкладка або вікно браузера не відкриті.
| Поверхня | Що вона робить |
| ----------------------------------------------------- | ------------------------------------------------------------------ |
| `ui/public/manifest.webmanifest` | Маніфест PWA. Браузери пропонують "Install app", щойно він стає доступним. |
| `ui/public/manifest.webmanifest` | Маніфест PWA. Браузери пропонують "Install app", щойно він доступний. |
| `ui/public/sw.js` | Service worker, який обробляє події `push` і кліки сповіщень. |
| `push/vapid-keys.json` (у каталозі стану OpenClaw) | Автоматично згенерована пара ключів VAPID, що використовується для підписування Web Push-навантажень. |
| `push/web-push-subscriptions.json` | Збережені endpoint-и браузерних підписок. |
| `push/vapid-keys.json` (у каталозі стану OpenClaw) | Автоматично згенерована пара ключів VAPID, використана для підписування навантажень Web Push. |
| `push/web-push-subscriptions.json` | Збережені кінцеві точки підписок браузера. |
Перевизначте пару ключів VAPID через змінні середовища в процесі Gateway, коли потрібно зафіксувати ключі (для багатохостових розгортань, ротації секретів або тестів):
Перевизначте пару ключів VAPID через змінні середовища в процесі Gateway, коли потрібно зафіксувати ключі (для розгортань на кількох хостах, ротації секретів або тестів):
- `OPENCLAW_VAPID_PUBLIC_KEY`
- `OPENCLAW_VAPID_PRIVATE_KEY`
- `OPENCLAW_VAPID_SUBJECT` (за замовчуванням `mailto:openclaw@localhost`)
Control UI використовує ці scope-gated методи Gateway для реєстрації та тестування браузерних підписок:
Інтерфейс керування використовує ці обмежені областю методи Gateway для реєстрації та тестування браузерних підписок:
- `push.web.vapidPublicKey` — отримує активний публічний ключ VAPID.
- `push.web.subscribe` — реєструє `endpoint` плюс `keys.p256dh`/`keys.auth`.
- `push.web.unsubscribe` — видаляє зареєстрований endpoint.
- `push.web.unsubscribe` — видаляє зареєстровану кінцеву точку.
- `push.web.test` — надсилає тестове сповіщення до підписки викликача.
<Note>
Web Push незалежний від шляху ретрансляції iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із ретрансляцією) та наявного методу `push.test`, які націлені на нативне мобільне спарювання.
Web Push не залежить від шляху ретрансляції iOS APNS (див. [Конфігурацію](/uk/gateway/configuration) для push із підтримкою ретрансляції) і наявного методу `push.test`, які націлені на нативне мобільне сполучення.
</Note>
## Hosted embeds
## Розміщені вбудовування
Повідомлення помічника можуть рендерити розміщений вебвміст inline через shortcode `[embed ...]`. Політика sandbox iframe керується `gateway.controlUi.embedSandbox`:
Повідомлення асистента можуть показувати розміщений вебвміст вбудовано за допомогою шорткоду `[embed ...]`. Політикою пісочниці iframe керує `gateway.controlUi.embedSandbox`:
<Tabs>
<Tab title="strict">
Вимикає виконання скриптів усередині розміщених embeds.
Вимикає виконання скриптів усередині розміщених вбудовувань.
</Tab>
<Tab title="scripts (default)">
Дозволяє інтерактивні embeds, зберігаючи ізоляцію origin; це значення за замовчуванням і зазвичай достатнє для самодостатніх браузерних ігор/віджетів.
<Tab title="scripts (за замовчуванням)">
Дозволяє інтерактивні вбудовування, зберігаючи ізоляцію origin; це типовий режим, і його зазвичай достатньо для самодостатніх браузерних ігор/віджетів.
</Tab>
<Tab title="trusted">
Додає `allow-same-origin` поверх `allow-scripts` для same-site документів, яким навмисно потрібні сильніші привілеї.
Додає `allow-same-origin` поверх `allow-scripts` для документів того самого сайту, яким навмисно потрібні сильніші привілеї.
</Tab>
</Tabs>
@ -250,14 +250,14 @@ Web Push незалежний від шляху ретрансляції iOS APN
```
<Warning>
Використовуйте `trusted` лише тоді, коли вбудований документ справді потребує same-origin поведінки. Для більшості згенерованих агентом ігор та інтерактивних полотен `scripts` є безпечнішим вибором.
Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна поведінка same-origin. Для більшості створених агентом ігор та інтерактивних полотен `scripts` є безпечнішим вибором.
</Warning>
Абсолютні зовнішні URL embed `http(s)` залишаються заблокованими за замовчуванням. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, установіть `gateway.controlUi.allowExternalEmbedUrls: true`.
Абсолютні зовнішні URL вбудовування `http(s)` залишаються заблокованими за замовчуванням. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, установіть `gateway.controlUi.allowExternalEmbedUrls: true`.
## Ширина повідомлення чату
Згруповані повідомлення чату використовують читабельну стандартну максимальну ширину. Розгортання на широких моніторах можуть перевизначити її без патчення bundled CSS, установивши `gateway.controlUi.chatMessageMaxWidth`:
Згруповані повідомлення чату використовують читабельну стандартну максимальну ширину. Розгортання на широких моніторах можуть перевизначити її без виправлення вбудованого CSS, установивши `gateway.controlUi.chatMessageMaxWidth`:
```json5
{
@ -271,11 +271,11 @@ Web Push незалежний від шляху ретрансляції iOS APN
Значення перевіряється до того, як потрапить у браузер. Підтримувані значення включають прості довжини та відсотки, як-от `960px` або `82%`, а також обмежені вирази ширини `min(...)`, `max(...)`, `clamp(...)`, `calc(...)` і `fit-content(...)`.
## Доступ tailnet (рекомендовано)
## Доступ до tailnet (рекомендовано)
<Tabs>
<Tab title="Інтегрований Tailscale Serve (бажано)">
Тримайте Gateway на loopback і дозвольте Tailscale Serve проксіювати його через HTTPS:
Тримайте Gateway на local loopback і дозвольте Tailscale Serve проксувати його через HTTPS:
```bash
openclaw gateway --tailscale serve
@ -285,16 +285,16 @@ Web Push незалежний від шляху ретрансляції iOS APN
- `https://<magicdns>/` (або ваш налаштований `gateway.controlUi.basePath`)
За замовчуванням запити Control UI/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw перевіряє ідентичність, розвязуючи адресу `x-forwarded-for` через `tailscale whois` і зіставляючи її із заголовком, та приймає їх лише тоді, коли запит приходить на loopback із заголовками Tailscale `x-forwarded-*`. Для операторських сесій Control UI з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає цикл device-pairing; браузери без пристрою та з’єднання з роллю node все ще проходять звичайні перевірки пристрою. Установіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані shared-secret навіть для трафіку Serve. Потім використовуйте `gateway.auth.mode: "token"` або `"password"`.
За замовчуванням запити інтерфейсу керування/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw перевіряє ідентичність, розв'язуючи адресу `x-forwarded-for` через `tailscale whois` і зіставляючи її із заголовком, та приймає такі запити лише коли вони надходять на loopback із заголовками `x-forwarded-*` від Tailscale. Для операторських сеансів інтерфейсу керування з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає повторний цикл сполучення пристрою; браузери без пристрою та з'єднання з роллю вузла все ще проходять звичайні перевірки пристрою. Установіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані зі спільним секретом навіть для трафіку Serve. Тоді використовуйте `gateway.auth.mode: "token"` або `"password"`.
Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта й auth scope серіалізуються перед записами rate-limit. Тому паралельні неправильні повторні спроби з того самого браузера можуть показати `retry later` на другому запиті замість двох простих невідповідностей, що змагаються паралельно.
Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта та області автентифікації серіалізуються перед записами обмеження частоти. Тому одночасні невдалі повторні спроби з того самого браузера можуть показувати `retry later` у другому запиті замість двох звичайних невідповідностей, що виконуються паралельно.
<Warning>
Автентифікація Serve без токена припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте автентифікацію token/password.
Автентифікація Serve без токена припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте автентифікацію токеном/паролем.
</Warning>
</Tab>
<Tab title="Прив’язка до tailnet + token">
<Tab title="Прив'язати до tailnet + token">
```bash
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```
@ -303,28 +303,28 @@ Web Push незалежний від шляху ретрансляції iOS APN
- `http://<tailscale-ip>:18789/` (або ваш налаштований `gateway.controlUi.basePath`)
Вставте відповідний shared secret у налаштування UI (надсилається як `connect.params.auth.token` або `connect.params.auth.password`).
Вставте відповідний спільний секрет у налаштування UI (надсилається як `connect.params.auth.token` або `connect.params.auth.password`).
</Tab>
</Tabs>
## Небезпечний HTTP
Якщо ви відкриваєте панель через звичайний HTTP (`http://<lan-ip>` або `http://<tailscale-ip>`), браузер працює в **небезпечному контексті** й блокує WebCrypto. За замовчуванням OpenClaw **блокує** з’єднання Control UI без ідентичності пристрою.
Якщо ви відкриваєте панель через звичайний HTTP (`http://<lan-ip>` або `http://<tailscale-ip>`), браузер працює в **небезпечному контексті** та блокує WebCrypto. За замовчуванням OpenClaw **блокує** підключення інтерфейсу керування без ідентичності пристрою.
Задокументовані винятки:
- сумісність небезпечного HTTP лише для localhost з `gateway.controlUi.allowInsecureAuth=true`
- успішна автентифікація операторського Control UI через `gateway.auth.mode: "trusted-proxy"`
- сумісність небезпечного HTTP лише для localhost із `gateway.controlUi.allowInsecureAuth=true`
- успішна автентифікація операторського інтерфейсу керування через `gateway.auth.mode: "trusted-proxy"`
- аварійний `gateway.controlUi.dangerouslyDisableDeviceAuth=true`
**Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкрийте UI локально:
- `https://<magicdns>/` (Serve)
- `http://127.0.0.1:18789/` (на хості Gateway)
- `http://127.0.0.1:18789/` (на хості gateway)
<AccordionGroup>
<Accordion title="Поведінка перемикача небезпечної автентифікації">
<Accordion title="Insecure-auth toggle behavior">
```json5
{
gateway: {
@ -337,12 +337,12 @@ Web Push незалежний від шляху ретрансляції iOS APN
`allowInsecureAuth` — це лише локальний перемикач сумісності:
- Він дозволяє сеансам локального Control UI продовжувати роботу без ідентифікації пристрою в незахищених HTTP-контекстах.
- Він дозволяє сеансам localhost Control UI продовжувати роботу без ідентичності пристрою в незахищених HTTP-контекстах.
- Він не обходить перевірки сполучення.
- Він не послаблює вимоги до ідентифікації віддалених (не localhost) пристроїв.
- Він не послаблює вимоги до ідентичності віддалених (не localhost) пристроїв.
</Accordion>
<Accordion title="Лише аварійний режим">
<Accordion title="Break-glass only">
```json5
{
gateway: {
@ -354,14 +354,14 @@ Web Push незалежний від шляху ретрансляції iOS APN
```
<Warning>
`dangerouslyDisableDeviceAuth` вимикає перевірки ідентифікації пристрою в Control UI і є серйозним зниженням рівня безпеки. Швидко скасуйте це налаштування після аварійного використання.
`dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI і є суттєвим зниженням безпеки. Швидко скасуйте це після екстреного використання.
</Warning>
</Accordion>
<Accordion title="Примітка щодо довіреного проксі">
- Успішна автентифікація через довірений проксі може допускати сеанси Control UI **оператора** без ідентифікації пристрою.
<Accordion title="Trusted-proxy note">
- Успішна автентифікація trusted-proxy може дозволити сеанси Control UI **оператора** без ідентичності пристрою.
- Це **не** поширюється на сеанси Control UI з роллю вузла.
- Зворотні проксі same-host loopback усе одно не задовольняють автентифікацію через довірений проксі; див. [Автентифікація через довірений проксі](/uk/gateway/trusted-proxy-auth).
- Зворотні проксі same-host loopback все одно не задовольняють автентифікацію trusted-proxy; див. [Автентифікація trusted proxy](/uk/gateway/trusted-proxy-auth).
</Accordion>
</AccordionGroup>
@ -374,22 +374,22 @@ Control UI постачається зі строгою політикою `img-
Що це означає на практиці:
- Аватари й зображення, що обслуговуються за відносними шляхами (наприклад `/avatars/<id>`), усе одно відображаються, включно з автентифікованими маршрутами аватарів, які UI отримує та перетворює на локальні URL-адреси `blob:`.
- Вбудовані URL-адреси `data:image/...` усе одно відображаються (корисно для payload у протоколі).
- Локальні URL-адреси `blob:`, створені Control UI, усе одно відображаються.
- Віддалені URL-адреси аватарів, які видають метадані каналу, видаляються в помічниках аватарів Control UI і замінюються вбудованим логотипом/бейджем, тому скомпрометований або зловмисний канал не може примусити браузер оператора виконувати довільні віддалені запити зображень.
- Аватари й зображення, що обслуговуються за відносними шляхами (наприклад, `/avatars/<id>`), і далі відображаються, включно з автентифікованими маршрутами аватарів, які UI отримує та перетворює на локальні URL-адреси `blob:`.
- Вбудовані URL-адреси `data:image/...` і далі відображаються (корисно для корисних навантажень у протоколі).
- Локальні URL-адреси `blob:`, створені Control UI, і далі відображаються.
- Віддалені URL-адреси аватарів, емітовані метаданими каналу, видаляються в допоміжних функціях аватарів Control UI і замінюються вбудованим логотипом/значком, тож скомпрометований або зловмисний канал не може змусити браузер оператора виконувати довільні віддалені запити зображень.
Вам не потрібно нічого змінювати, щоб отримати таку поведінку — вона завжди ввімкнена й не налаштовується.
## Автентифікація маршруту аватара
Коли автентифікацію Gateway налаштовано, кінцева точка аватарів Control UI вимагає той самий токен Gateway, що й решта API:
Коли автентифікацію gateway налаштовано, кінцева точка аватара Control UI вимагає той самий токен gateway, що й решта API:
- `GET /avatar/<agentId>` повертає зображення аватара лише автентифікованим викликам. `GET /avatar/<agentId>?meta=1` повертає метадані аватара за тим самим правилом.
- `GET /avatar/<agentId>` повертає зображення аватара лише автентифікованим викликачам. `GET /avatar/<agentId>?meta=1` повертає метадані аватара за тим самим правилом.
- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (відповідно до сусіднього маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені.
- Сам Control UI пересилає токен Gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення все одно відображалося на dashboard.
- Сам Control UI пересилає токен gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення й далі відображалося на інформаційних панелях.
Якщо вимкнути автентифікацію Gateway (не рекомендовано на спільних хостах), маршрут аватара також стає неавтентифікованим, відповідно до решти Gateway.
Якщо ви вимкнете автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стане неавтентифікованим, відповідно до решти gateway.
## Збирання UI
@ -399,36 +399,36 @@ Gateway обслуговує статичні файли з `dist/control-ui`.
pnpm ui:build
```
Необовязкова абсолютна база (коли потрібні фіксовані URL-адреси ресурсів):
Необов'язкова абсолютна база (коли потрібні фіксовані URL-адреси ресурсів):
```bash
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
```
Для локальної розробки (окремий dev-сервер):
Для локальної розробки (окремий сервер розробки):
```bash
pnpm ui:dev
```
Потім спрямуйте UI на WS URL вашого Gateway (наприклад `ws://127.0.0.1:18789`).
Потім спрямуйте UI на URL Gateway WS (наприклад, `ws://127.0.0.1:18789`).
## Налагодження/тестування: dev-сервер + віддалений Gateway
## Налагодження/тестування: сервер розробки + віддалений Gateway
Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP origin. Це зручно, коли ви хочете мати dev-сервер Vite локально, а Gateway працює в іншому місці.
Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP-джерела. Це зручно, коли ви хочете запускати сервер розробки Vite локально, а Gateway — деінде.
<Steps>
<Step title="Запустіть dev-сервер UI">
<Step title="Start the UI dev server">
```bash
pnpm ui:dev
```
</Step>
<Step title="Відкрийте з gatewayUrl">
<Step title="Open with gatewayUrl">
```text
http://localhost:5173/?gatewayUrl=ws%3A%2F%2F<gateway-host>%3A18789
```
Необовязкова одноразова автентифікація (за потреби):
Необов'язкова одноразова автентифікація (за потреби):
```text
http://localhost:5173/?gatewayUrl=wss%3A%2F%2F<gateway-host>%3A18789#token=<gateway-token>
@ -438,18 +438,18 @@ Control UI — це статичні файли; ціль WebSocket налашт
</Steps>
<AccordionGroup>
<Accordion title="Примітки">
<Accordion title="Notes">
- `gatewayUrl` зберігається в localStorage після завантаження та видаляється з URL.
- Якщо ви передаєте повну кінцеву точку `ws://` або `wss://` через `gatewayUrl`, URL-кодуйте значення `gatewayUrl`, щоб браузер правильно розібрав рядок запиту.
- `token` за можливості слід передавати через фрагмент URL (`#token=...`). Фрагменти не надсилаються на сервер, що запобігає витоку в журналах запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як резервний варіант, і негайно видаляються після bootstrap.
- `password` зберігається лише в памяті.
- Коли встановлено `gatewayUrl`, UI не повертається до config або облікових даних середовища. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою.
- Використовуйте `wss://`, коли Gateway розміщено за TLS (Tailscale Serve, HTTPS-проксі тощо).
- `gatewayUrl` приймається лише у вікні верхнього рівня (не у вбудованому), щоб запобігти clickjacking.
- Розгортання Control UI не через loopback повинні явно задавати `gateway.controlUi.allowedOrigins` (повні origins). Це стосується й віддалених dev-налаштувань.
- Запуск Gateway може додавати локальні origins, як-от `http://localhost:<port>` і `http://127.0.0.1:<port>`, з фактичного runtime bind і порту, але віддалені origins браузера все одно потребують явних записів.
- Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім ретельно контрольованого локального тестування. Це означає дозволити будь-який origin браузера, а не "зіставляти будь-який хост, який я використовую".
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим резервного origin на основі Host-заголовка, але це небезпечний режим безпеки.
- `token` за можливості слід передавати через фрагмент URL (`#token=...`). Фрагменти не надсилаються на сервер, що запобігає витоку через журнали запитів і Referer. Застарілі параметри запиту `?token=` і далі імпортуються один раз для сумісності, але лише як резервний варіант, і видаляються одразу після bootstrap.
- `password` зберігається лише в пам'яті.
- Коли `gatewayUrl` задано, UI не повертається до облікових даних із конфігурації або середовища. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою.
- Використовуйте `wss://`, коли Gateway знаходиться за TLS (Tailscale Serve, HTTPS-проксі тощо).
- `gatewayUrl` приймається лише у вікні верхнього рівня (не вбудованому), щоб запобігти clickjacking.
- Нелокальні розгортання Control UI мають явно задавати `gateway.controlUi.allowedOrigins` (повні origins). Це включає віддалені середовища розробки.
- Запуск Gateway може додавати локальні origins, як-от `http://localhost:<port>` і `http://127.0.0.1:<port>`, з ефективних runtime bind і порту, але origins віддалених браузерів усе одно потребують явних записів.
- Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім жорстко контрольованого локального тестування. Це означає дозволити будь-який browser origin, а не "зіставляти будь-який хост, який я використовую."
- `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим fallback для Host-header origin, але це небезпечний режим безпеки.
</Accordion>
</AccordionGroup>
@ -466,11 +466,11 @@ Control UI — це статичні файли; ціль WebSocket налашт
}
```
Подробиці налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote).
Докладніше про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote).
## Повязане
## Пов'язане
- [Панель керування](/uk/web/dashboard) — dashboard Gateway
- [Перевірки працездатності](/uk/gateway/health) — моніторинг працездатності Gateway
- [TUI](/uk/web/tui) — термінальний користувацький інтерфейс
- [WebChat](/uk/web/webchat) — чат-інтерфейс у браузері
- [Панель керування](/uk/web/dashboard) — панель керування gateway
- [Перевірки справності](/uk/gateway/health) — моніторинг справності gateway
- [TUI](/uk/web/tui) — термінальний інтерфейс користувача
- [WebChat](/uk/web/webchat) — браузерний інтерфейс чату