diff --git a/docs/uk/web/control-ui.md b/docs/uk/web/control-ui.md index 11821378a..dc2703972 100644 --- a/docs/uk/web/control-ui.md +++ b/docs/uk/web/control-ui.md @@ -1,25 +1,25 @@ --- read_when: - - Ви хочете керувати Gateway із браузера + - Ви хочете керувати Gateway з браузера - Вам потрібен доступ до Tailnet без SSH-тунелів sidebarTitle: Control UI -summary: Браузерний інтерфейс керування для Gateway (чат, вузли, конфігурація) +summary: Вебінтерфейс керування для Gateway (чат, вузли, конфігурація) title: Інтерфейс керування x-i18n: - generated_at: "2026-04-29T17:09:41Z" + generated_at: "2026-04-29T20:46:04Z" model: gpt-5.5 provider: openai - source_hash: d7846eaf1b1e00ab05a3ed22ec021b5dbc33b24c26b76a72823c9b61bfcb64b4 + source_hash: d440cb80ae194f1994fde90e58b65e6194d2f4f87534696818e3f92b2969265d source_path: web/control-ui.md workflow: 16 --- -Control UI — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговується Gateway: +Інтерфейс керування — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговує Gateway: - типово: `http://:18789/` - необов’язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`) -Він взаємодіє **безпосередньо з Gateway WebSocket** на тому самому порту. +Він взаємодіє **безпосередньо з WebSocket Gateway** на тому самому порту. ## Швидке відкриття (локально) @@ -27,7 +27,7 @@ Control UI — це невеликий односторінковий засто - [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (або [http://localhost:18789/](http://localhost:18789/)) -Якщо сторінка не завантажується, спершу запустіть Gateway: `openclaw gateway`. +Якщо сторінка не завантажується, спочатку запустіть Gateway: `openclaw gateway`. Автентифікація передається під час WebSocket-рукостискання через: @@ -36,114 +36,114 @@ Control UI — це невеликий односторінковий засто - заголовки ідентичності Tailscale Serve, коли `gateway.auth.allowTailscale: true` - заголовки ідентичності довіреного проксі, коли `gateway.auth.mode: "trusted-proxy"` -Панель налаштувань дашборда зберігає токен для поточної сесії вкладки браузера та вибраної URL-адреси Gateway; паролі не зберігаються. Зазвичай під час онбордингу для автентифікації зі спільним секретом під час першого підключення генерується токен Gateway, але автентифікація паролем також працює, коли `gateway.auth.mode` має значення `"password"`. +Панель налаштувань дашборда зберігає токен для поточної сесії вкладки браузера й вибраної URL-адреси Gateway; паролі не зберігаються. Під час онбордингу зазвичай генерується токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` дорівнює `"password"`. ## Сполучення пристрою (перше підключення) -Коли ви підключаєтеся до Control UI з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового схвалення сполучення**. Це захід безпеки для запобігання несанкціонованому доступу. +Коли ви підключаєтеся до інтерфейсу керування з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового підтвердження сполучення**. Це захід безпеки для запобігання несанкціонованому доступу. **Що ви побачите:** "disconnected (1008): pairing required" - + ```bash openclaw devices list ``` - + ```bash openclaw devices approve ``` -Якщо браузер повторює сполучення зі зміненими даними автентифікації (роль/області дії/публічний ключ), попередній очікуваний запит замінюється і створюється новий `requestId`. Перед схваленням знову виконайте `openclaw devices list`. +Якщо браузер повторює спробу сполучення зі зміненими даними автентифікації (роль/області доступу/публічний ключ), попередній запит у стані очікування замінюється, і створюється новий `requestId`. Перед підтвердженням повторно виконайте `openclaw devices list`. -Якщо браузер уже сполучено, і ви змінюєте доступ із читання на запис/адміністратора, це вважається підвищенням схвалення, а не тихим повторним підключенням. OpenClaw залишає старе схвалення активним, блокує ширше повторне підключення та просить явно схвалити новий набір областей дії. +Якщо браузер уже сполучено і ви змінюєте доступ із читання на запис/адміністрування, це вважається підвищенням рівня підтвердження, а не тихим перепідключенням. OpenClaw залишає старе підтвердження активним, блокує перепідключення з ширшими правами й просить явно підтвердити новий набір областей доступу. -Після схвалення пристрій запам’ятовується і не потребуватиме повторного схвалення, доки ви не відкличете його за допомогою `openclaw devices revoke --device --role `. Див. [CLI пристроїв](/uk/cli/devices) щодо ротації та відкликання токенів. +Після підтвердження пристрій запам’ятовується і не потребуватиме повторного підтвердження, якщо ви не відкличете його за допомогою `openclaw devices revoke --device --role `. Див. [CLI пристроїв](/uk/cli/devices) щодо ротації токенів і відкликання. -- Прямі підключення браузера через local loopback (`127.0.0.1` / `localhost`) схвалюються автоматично. -- Tailscale Serve може пропустити цикл сполучення для операторських сесій Control UI, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale підтверджено, а браузер подає ідентичність свого пристрою. -- Прямі прив’язки Tailnet, підключення браузера через LAN і профілі браузера без ідентичності пристрою все одно потребують явного схвалення. -- Кожен профіль браузера генерує унікальний ID пристрою, тому зміна браузера або очищення даних браузера потребуватиме повторного сполучення. +- Прямі браузерні підключення через local loopback (`127.0.0.1` / `localhost`) підтверджуються автоматично. +- Tailscale Serve може пропускати цикл сполучення для операторських сесій інтерфейсу керування, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale перевірено, а браузер надає ідентичність свого пристрою. +- Прямі прив’язки Tailnet, підключення браузера з LAN і профілі браузера без ідентичності пристрою все одно потребують явного підтвердження. +- Кожен профіль браузера генерує унікальний ID пристрою, тому перемикання браузерів або очищення даних браузера вимагатиме повторного сполучення. -## Персональна ідентичність (локальна для браузера) +## Особиста ідентичність (локальна для браузера) -Control UI підтримує персональну ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сесіях. Вона зберігається у сховищі браузера, обмежена поточним профілем браузера, не синхронізується з іншими пристроями й не зберігається на сервері, окрім звичайних метаданих авторства стенограми в повідомленнях, які ви фактично надсилаєте. Очищення даних сайту або зміна браузера скидає її до порожнього стану. +Інтерфейс керування підтримує особисту ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сесіях. Вона зберігається в сховищі браузера, обмежена поточним профілем браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства стенограми для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або перемикання браузерів скидає її до порожнього стану. -Той самий локальний для браузера шаблон застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не проходять зворотно через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для клієнтів без UI, які записують поле напряму (наприклад, скриптові Gateway або кастомні дашборди). +Той самий локальний для браузера шаблон застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену 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`, `tr`, `uk`, `id`, `pl`, `th` -- Неанглійські переклади ліниво завантажуються в браузері. -- Вибрана локаль зберігається у сховищі браузера й повторно використовується під час майбутніх відвідувань. +- Підтримувані локалі: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa` +- Переклади неанглійськими мовами ліниво завантажуються в браузері. +- Вибрана локаль зберігається в сховищі браузера й повторно використовується під час наступних відвідувань. - Відсутні ключі перекладу повертаються до англійської. ## Теми вигляду -Панель Вигляд зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [теми tweakcn](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Поділитися** і вставте скопійоване посилання на тему у Вигляд. Імпортер також приймає URL-адреси реєстру `https://tweakcn.com/r/themes/`, URL-адреси редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/`, сирі ID тем і назви типових тем, як-от `amethyst-haze`. +Панель вигляду зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [теми tweakcn](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Поділитися** й вставте скопійоване посилання на тему у вигляд. Імпортер також приймає URL-адреси реєстру `https://tweakcn.com/r/themes/`, URL-адреси редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/`, сирі ID тем і типові назви тем, як-от `amethyst-haze`. -Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються до конфігурації Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; її очищення перемикає активну тему назад на Claw, якщо було вибрано імпортовану тему. +Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються до конфігурації Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо було вибрано імпортовану тему. ## Що він може робити (сьогодні) - - - Спілкуватися з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`). - - Розмовляти через браузерні realtime-сесії. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а realtime-голосові plugins лише для бекенда використовують ретрансляційний транспорт Gateway. Ретранслятор зберігає облікові дані провайдера на Gateway, тоді як браузер транслює PCM мікрофона через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw. - - Стримити виклики інструментів і картки живого виводу інструментів у Chat (події агента). + + - Спілкуйтеся з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`). + - Розмовляйте через браузерні сесії реального часу. OpenAI використовує прямий WebRTC, Google Live використовує обмежений одноразовий браузерний токен через WebSocket, а voice plugins реального часу лише для бекенду використовують ретрансляційний транспорт Gateway. Ретранслятор зберігає облікові дані провайдера на Gateway, поки браузер транслює PCM з мікрофона через RPC `talk.realtime.relay*` і надсилає виклики інструмента `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw. + - Потоково передавайте виклики інструментів + живі картки виводу інструментів у чаті (події агента). - - - Канали: статус вбудованих і комплектних/зовнішніх каналів plugin, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`). - - Екземпляри: список присутності + оновлення (`system-presence`). - - Сесії: список + перевизначення моделі/мислення/швидкого режиму/докладності/трасування/міркування для кожної сесії (`sessions.list`, `sessions.patch`). + + - Канали: вбудовані, а також статус bundled/external plugin-каналів, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`). + - Інстанси: список присутності + оновлення (`system-presence`). + - Сесії: список + перевизначення моделі/мислення/швидкого режиму/деталізації/трасування/обґрунтування для кожної сесії (`sessions.list`, `sessions.patch`). - Сни: статус Dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`). - + - Завдання Cron: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`). - Skills: статус, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`). - Вузли: список + можливості (`node.list`). - - Схвалення exec: редагування списків дозволів Gateway або вузла + політика запитів для `exec host=gateway/node` (`exec.approvals.*`). + - Підтвердження exec: редагування allowlist Gateway або вузла + політика запиту для `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.schema` / `config.schema.lookup`, включно з полями `title` / `description`, відповідними підказками UI, підсумками безпосередніх дочірніх елементів, метаданими документації на вкладених вузлах object/wildcard/array/composition, а також схемами plugin + каналів, коли вони доступні); редактор Raw JSON доступний лише тоді, коли snapshot має безпечний raw round-trip. - - Якщо snapshot не може безпечно виконати round-trip сирого тексту, Control UI примусово вмикає режим форми й вимикає режим Raw для цього snapshot. - - У редакторі Raw JSON "Скинути до збереженого" зберігає форму, створену в raw-режимі (форматування, коментарі, розміщення `$include`), замість повторного рендерингу сплощеного snapshot, тому зовнішні редагування переживають скидання, коли snapshot може безпечно виконати round-trip. - - Структуровані значення об’єктів SecretRef відображаються в текстових полях форми лише для читання, щоб запобігти випадковому пошкодженню об’єкта в рядок. + - Схема + рендеринг форми (`config.schema` / `config.schema.lookup`, включно з `title` / `description` поля, відповідними підказками UI, короткими описами безпосередніх дочірніх елементів, метаданими документації на вкладених object/wildcard/array/composition-вузлах, а також схемами Plugin + каналів, коли вони доступні); редактор Raw JSON доступний лише тоді, коли знімок має безпечний сирий круговий прохід. + - Якщо знімок не може безпечно пройти круговий прохід сирого тексту, інтерфейс керування примусово вмикає режим форми й вимикає сирий режим для цього знімка. + - У редакторі Raw JSON "Reset to saved" зберігає сиро створену форму (форматування, коментарі, структуру `$include`) замість повторного рендерингу сплющеного знімка, тому зовнішні редагування переживають скидання, коли знімок може безпечно пройти круговий прохід. + - Структуровані об’єктні значення SecretRef відображаються лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню object-to-string. - - - Налагодження: snapshot статусу/здоров’я/моделей + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`). - - Журнали: live tail файлових журналів Gateway із фільтром/експортом (`logs.tail`). - - Оновлення: запуск оновлення package/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після повторного підключення для перевірки версії запущеного Gateway. + + - Налагодження: знімки статусу/стану/моделей + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`). + - Журнали: живий tail файлових журналів Gateway із фільтром/експортом (`logs.tail`). + - Оновлення: запуск оновлення пакета/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після перепідключення для перевірки версії запущеного Gateway. - - - Для ізольованих завдань доставка типово оголошує підсумок. Ви можете перемкнути на none, якщо потрібні лише внутрішні запуски. + + - Для ізольованих завдань доставка типово оголошує підсумок. Ви можете перемкнути на none, якщо потрібні внутрішні-only запуски. - Поля каналу/цілі з’являються, коли вибрано оголошення. - - Режим Webhook використовує `delivery.mode = "webhook"` з `delivery.to`, встановленим на чинну URL-адресу HTTP(S) webhook. - - Для завдань головної сесії доступні режими доставки webhook і none. - - Розширені елементи редагування включають delete-after-run, очищення перевизначення агента, опції cron exact/stagger, перевизначення моделі/мислення агента та перемикачі доставки best-effort. - - Валідація форми вбудована з помилками на рівні полів; некоректні значення вимикають кнопку збереження, доки їх не буде виправлено. - - Установіть `cron.webhookToken`, щоб надсилати окремий bearer-токен; якщо пропущено, webhook надсилається без заголовка автентифікації. + - Режим Webhook використовує `delivery.mode = "webhook"` з `delivery.to`, заданим як чинна HTTP(S) URL-адреса webhook. + - Для завдань main-session доступні режими доставки webhook і none. + - Розширені елементи керування редагуванням включають видалення після запуску, очищення перевизначення агента, точні/рознесені параметри Cron, перевизначення моделі/мислення агента та перемикачі best-effort delivery. + - Валідація форми вбудована з помилками на рівні полів; недійсні значення вимикають кнопку збереження, доки їх не буде виправлено. + - Задайте `cron.webhookToken`, щоб надсилати окремий bearer-токен; якщо його пропущено, webhook надсилається без заголовка автентифікації. - Застарілий fallback: збережені legacy-завдання з `notify: true` усе ще можуть використовувати `cron.webhook` до міграції. @@ -153,60 +153,60 @@ Control UI може локалізуватися під час першого з - - `chat.send` є **неблокувальним**: він одразу підтверджує отримання через `{ runId, status: "started" }`, а відповідь транслюється через події `chat`. - - Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають нативний шлях зображення; інші файли зберігаються як керовані медіа й показуються в історії як посилання на вкладення. - - Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }` під час виконання і `{ status: "ok" }` після завершення. + - `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-пейлоади викликів інструментів (зокрема `...`, `...`, `...`, `...` і обрізані блоки викликів інструментів), а також витеклі ASCII/повноширинні токени керування моделлю, і пропускає записи асистента, увесь видимий текст яких є лише точним тихим токеном `NO_REPLY` / `no_reply`. - - Під час активного надсилання та фінального оновлення історії подання чату зберігає локальні оптимістичні повідомлення користувача/асистента видимими, якщо `chat.history` короткочасно повертає старіший знімок; канонічний транскрипт замінює ці локальні повідомлення, щойно історія Gateway наздожене. - - `chat.inject` додає нотатку асистента до транскрипту сеансу та транслює подію `chat` для оновлень лише в UI (без запуску агента, без доставки в канал). - - Перемикачі моделі та мислення в заголовку чату негайно патчать активний сеанс через `sessions.patch`; це постійні перевизначення сеансу, а не одноразові параметри надсилання. - - Вибір моделі чату запитує налаштоване подання моделей у Gateway. Якщо `agents.defaults.models` присутній, цей allowlist керує вибором. Інакше вибір показує явні записи `models.providers.*.models` плюс провайдерів із придатною автентифікацією. Повний каталог лишається доступним через налагоджувальний RPC `models.list` із `view: "all"`. - - Коли свіжі звіти Gateway про використання сеансу показують високий тиск контексту, область композитора чату показує сповіщення про контекст і, на рекомендованих рівнях compaction, компактну кнопку, що запускає звичайний шлях compaction сеансу. Застарілі знімки токенів приховуються, доки Gateway знову не повідомить свіже використання. + - Зображення assistant/згенеровані зображення зберігаються як керовані посилання на медіа й повертаються через автентифіковані медіа-URL Gateway, тож перезавантаження не залежать від того, чи сирі base64-навантаження зображень залишаються у відповіді історії чату. + - `chat.history` також вилучає з видимого тексту assistant inline-теги директив, призначені лише для відображення (наприклад `[[reply_to_*]]` і `[[audio_as_voice]]`), plain-text XML-навантаження викликів інструментів (зокрема `...`, `...`, `...`, `...` і обрізані блоки викликів інструментів), а також витеклі ASCII/повноширинні контрольні токени моделі, і пропускає записи assistant, увесь видимий текст яких є лише точним silent token `NO_REPLY` / `no_reply`. + - Під час активного надсилання й фінального оновлення історії вигляд чату зберігає видимими локальні оптимістичні повідомлення користувача/assistant, якщо `chat.history` короткочасно повертає старіший знімок; канонічний транскрипт замінює ці локальні повідомлення, щойно історія Gateway наздоганяє стан. + - `chat.inject` додає нотатку assistant до транскрипту сесії та транслює подію `chat` для оновлень лише UI (без запуску агента, без доставки каналом). + - Вибірники моделі й thinking у заголовку чату одразу патчать активну сесію через `sessions.patch`; це сталі перевизначення сесії, а не параметри надсилання лише для одного ходу. + - Вибірник моделі чату запитує налаштований у Gateway вигляд моделей. Якщо присутній `agents.defaults.models`, цей allowlist керує вибірником. Інакше вибірник показує явні записи `models.providers.*.models` плюс провайдери з придатною автентифікацією. Повний каталог залишається доступним через debug RPC `models.list` з `view: "all"`. + - Коли свіжі звіти Gateway про використання сесії показують високий тиск контексту, область composer чату показує сповіщення про контекст і, на рекомендованих рівнях Compaction, кнопку compact, яка запускає звичайний шлях Compaction сесії. Застарілі знімки токенів приховуються, доки Gateway знову не повідомить свіже використання. - Режим розмови використовує зареєстрованого провайдера realtime-голосу. Налаштуйте OpenAI з `talk.provider: "openai"` плюс `talk.providers.openai.apiKey` або налаштуйте Google з `talk.provider: "google"` плюс `talk.providers.google.apiKey`; конфігурацію realtime-провайдера Voice Call усе ще можна повторно використати як fallback. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний клієнтський секрет Realtime для WebRTC. Google Live отримує одноразовий обмежений токен автентифікації Live API для браузерного WebSocket-сеансу, з інструкціями та деклараціями інструментів, зафіксованими в токені Gateway. Провайдери, які надають лише backend realtime bridge, працюють через relay-транспорт Gateway, тож облікові дані та vendor sockets залишаються на сервері, а браузерне аудіо передається через автентифіковані RPC Gateway. Підказка сеансу 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 усе ще можна повторно використати як fallback. Браузер ніколи не отримує стандартний API-ключ провайдера. OpenAI отримує ефемерний Realtime client secret для WebRTC. Google Live отримує одноразовий обмежений auth token Live API для браузерної WebSocket-сесії, з інструкціями й деклараціями інструментів, зафіксованими в токені через Gateway. Провайдери, які надають лише backend realtime bridge, працюють через relay transport Gateway, тож облікові дані й vendor sockets залишаються на боці сервера, тоді як браузерне аудіо передається через автентифіковані Gateway RPC. Підказку Realtime-сесії збирає Gateway; `talk.realtime.session` не приймає надані викликачем перевизначення інструкцій. - У композиторі Chat елемент керування Talk — це кнопка з хвилями поруч із кнопкою диктування через мікрофон. Коли Talk запускається, рядок стану композитора показує `Connecting Talk...`, потім `Talk live`, доки аудіо підключено, або `Asking OpenClaw...`, доки realtime-виклик інструмента звертається до налаштованої більшої моделі через `chat.send`. + У composer чату елемент керування Talk — це кнопка з хвилями поруч із кнопкою мікрофона для диктування. Коли Talk запускається, рядок стану composer показує `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` перевіряє обмін SDP для OpenAI browser WebRTC, налаштування браузерного WebSocket Google Live з обмеженим токеном і браузерний адаптер Gateway relay з фіктивним медіа мікрофона. Команда друкує лише статус провайдера й не журналює секрети. + Живий smoke для мейнтейнерів: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє обмін SDP OpenAI browser WebRTC, налаштування браузерного WebSocket Google Live constrained-token і браузерний адаптер Gateway relay із фейковими медіа мікрофона. Команда друкує лише статус провайдера й не записує секрети в журнал. - Натисніть **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`), щоб перервати всі активні запуски для цієї сесії. - - - Коли запуск перервано, частковий текст асистента все ще може показуватися в UI. - - Gateway зберігає перерваний частковий текст асистента в історії транскрипту, коли існує буферизований вивід. - - Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізнити часткові результати переривання від звичайного виводу завершення. + + - Коли запуск перервано, частковий текст assistant усе ще може показуватися в UI. + - Gateway зберігає перерваний частковий текст assistant в історії транскрипту, коли існує буферизований вивід. + - Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізнити часткові результати переривання від нормального завершеного виводу. -## Встановлення PWA та Web Push +## Встановлення PWA та web push -Control UI постачається з `manifest.webmanifest` і service worker, тож сучасні браузери можуть встановити його як автономну PWA. Web Push дає Gateway змогу пробуджувати встановлену PWA сповіщеннями, навіть коли вкладка або вікно браузера не відкриті. +Control UI постачається з `manifest.webmanifest` і service worker, тож сучасні браузери можуть встановлювати його як standalone PWA. Web Push дає Gateway змогу пробуджувати встановлену PWA сповіщеннями, навіть коли вкладка або вікно браузера не відкриті. -| Поверхня | Що робить | -| ----------------------------------------------------- | ----------------------------------------------------------------- | -| `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-и браузерних підписок. | +| Поверхня | Що вона робить | +| ----------------------------------------------------- | ------------------------------------------------------------------ | +| `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` | Збережені endpoints підписок браузера. | -Перевизначте пару ключів VAPID через env vars у процесі Gateway, коли потрібно зафіксувати ключі (для multi-host розгортань, ротації секретів або тестів): +Перевизначте пару ключів VAPID через env vars у процесі Gateway, коли хочете зафіксувати ключі (для multi-host розгортань, ротації секретів або тестів): - `OPENCLAW_VAPID_PUBLIC_KEY` - `OPENCLAW_VAPID_PRIVATE_KEY` -- `OPENCLAW_VAPID_SUBJECT` (типово `mailto:openclaw@localhost`) +- `OPENCLAW_VAPID_SUBJECT` (за замовчуванням `mailto:openclaw@localhost`) -Control UI використовує ці обмежені scope методи Gateway для реєстрації та тестування браузерних підписок: +Control UI використовує ці обмежені scope методи Gateway, щоб реєструвати й тестувати браузерні підписки: - `push.web.vapidPublicKey` — отримує активний публічний ключ VAPID. - `push.web.subscribe` — реєструє `endpoint` плюс `keys.p256dh`/`keys.auth`. @@ -214,22 +214,22 @@ Control UI використовує ці обмежені scope методи Gat - `push.web.test` — надсилає тестове сповіщення до підписки викликача. -Web Push не залежить від шляху iOS APNS relay (див. [Конфігурація](/uk/gateway/configuration) для relay-backed push) і наявного методу `push.test`, які цільово працюють із нативним мобільним pairing. +Web Push незалежний від relay-шляху iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із relay-підтримкою) і наявного методу `push.test`, які націлені на нативне мобільне pairing. -## Розміщені embeds +## Hosted embeds -Повідомлення асистента можуть рендерити розміщений вебвміст inline через shortcode `[embed ...]`. Політику sandbox для iframe контролює `gateway.controlUi.embedSandbox`: +Повідомлення assistant можуть відображати hosted web content inline за допомогою shortcode `[embed ...]`. Політика iframe sandbox контролюється `gateway.controlUi.embedSandbox`: - Вимикає виконання скриптів усередині розміщених embeds. + Вимикає виконання скриптів усередині hosted embeds. Дозволяє інтерактивні embeds, зберігаючи ізоляцію origin; це значення за замовчуванням і зазвичай його достатньо для самодостатніх браузерних ігор/віджетів. - Додає `allow-same-origin` поверх `allow-scripts` для same-site документів, яким навмисно потрібні сильніші привілеї. + Додає `allow-same-origin` поверх `allow-scripts` для документів same-site, яким навмисно потрібні сильніші привілеї. @@ -246,16 +246,16 @@ Web Push не залежить від шляху iOS APNS relay (див. [Кон ``` -Використовуйте `trusted` лише тоді, коли вбудований документ справді потребує same-origin поведінки. Для більшості згенерованих агентом ігор та інтерактивних canvas `scripts` є безпечнішим вибором. +Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна поведінка same-origin. Для більшості згенерованих агентом ігор та інтерактивних canvas `scripts` є безпечнішим вибором. -Абсолютні зовнішні URL embeds `http(s)` типово залишаються заблокованими. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, встановіть `gateway.controlUi.allowExternalEmbedUrls: true`. +Абсолютні зовнішні `http(s)` URL для embed за замовчуванням залишаються заблокованими. Якщо ви свідомо хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, встановіть `gateway.controlUi.allowExternalEmbedUrls: true`. -## Доступ через tailnet (рекомендовано) +## Доступ до tailnet (рекомендовано) - - Тримайте Gateway на loopback і дозвольте Tailscale Serve проксувати його через HTTPS: + + Тримайте Gateway на loopback і дайте Tailscale Serve проксіювати його через HTTPS: ```bash openclaw gateway --tailscale serve @@ -263,39 +263,39 @@ Web Push не залежить від шляху iOS APNS relay (див. [Кон Відкрийте: - - `https:///` (або налаштований вами `gateway.controlUi.basePath`) + - `https:///` (або ваш налаштований `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 також пропускає round trip device-pairing; браузери без пристрою та з'єднання з роллю node все ще проходять звичайні перевірки пристрою. Встановіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані shared-secret навіть для трафіку Serve. Потім використайте `gateway.auth.mode: "token"` або `"password"`. + За замовчуванням запити Control UI/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` дорівнює `true`. OpenClaw перевіряє ідентичність, розвʼязуючи адресу `x-forwarded-for` через `tailscale whois` і зіставляючи її із заголовком, і приймає їх лише тоді, коли запит потрапляє на loopback із заголовками `x-forwarded-*` від Tailscale. Для операторських сесій Control UI з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає цикл device-pairing; браузери без пристрою та зʼєднання з роллю node усе ще проходять звичайні перевірки пристрою. Встановіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані shared-secret навіть для Serve-трафіку. Тоді використовуйте `gateway.auth.mode: "token"` або `"password"`. - Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта та scope автентифікації серіалізуються перед записами rate-limit. Тому паралельні невдалі повтори з того самого браузера можуть показати `retry later` на другому запиті замість двох простих невідповідностей, що виконуються паралельно. + Для цього асинхронного шляху ідентичності Serve невдалі спроби auth для тієї самої клієнтської IP-адреси й auth scope серіалізуються перед записами rate-limit. Тому паралельні невдалі повтори з того самого браузера можуть показувати `retry later` на другому запиті замість двох простих невідповідностей, що змагаються паралельно. - Tokenless Serve auth припускає, що хост gateway є довіреним. Якщо на цьому хості може запускатися недовірений локальний код, вимагайте автентифікацію token/password. + Tokenless Serve auth припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте token/password auth. - + ```bash openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)" ``` Потім відкрийте: - - `http://:18789/` (або налаштований вами `gateway.controlUi.basePath`) + - `http://:18789/` (або ваш налаштований `gateway.controlUi.basePath`) - Вставте відповідний спільний секрет у налаштування UI (надсилається як `connect.params.auth.token` або `connect.params.auth.password`). + Вставте відповідний shared secret у налаштування UI (надсилається як `connect.params.auth.token` або `connect.params.auth.password`). ## Небезпечний HTTP -Якщо ви відкриваєте dashboard через звичайний HTTP (`http://` або `http://`), браузер працює в **non-secure context** і блокує WebCrypto. Типово OpenClaw **блокує** підключення Control UI без ідентичності пристрою. +Якщо ви відкриваєте dashboard через звичайний HTTP (`http://` або `http://`), браузер працює в **небезпечному контексті** та блокує WebCrypto. За замовчуванням OpenClaw **блокує** підключення Control UI без ідентичності пристрою. Задокументовані винятки: -- сумісність небезпечного HTTP лише для localhost з `gateway.controlUi.allowInsecureAuth=true` -- успішна операторська автентифікація Control UI через `gateway.auth.mode: "trusted-proxy"` +- сумісність insecure HTTP лише для localhost із `gateway.controlUi.allowInsecureAuth=true` +- успішна автентифікація операторського Control UI через `gateway.auth.mode: "trusted-proxy"` - break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true` **Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкрийте UI локально: @@ -317,9 +317,9 @@ Web Push не залежить від шляху iOS APNS relay (див. [Кон `allowInsecureAuth` є лише локальним перемикачем сумісності: - - Він дозволяє сеансам Control UI на localhost продовжуватися без ідентичності пристрою в non-secure HTTP contexts. + - Він дозволяє сесіям Control UI на localhost продовжуватися без ідентичності пристрою в небезпечних HTTP-контекстах. - Він не обходить перевірки pairing. - - Він не послаблює вимоги до ідентичності пристрою для віддалених (не localhost) підключень. + - Він не послаблює вимоги до ідентичності пристрою для віддалених (не-localhost) підключень. @@ -334,46 +334,46 @@ Web Push не залежить від шляху iOS APNS relay (див. [Кон ``` - `dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI і є серйозним послабленням безпеки. Швидко скасуйте це після аварійного використання. + `dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI та є серйозним погіршенням безпеки. Швидко скасуйте це після аварійного використання. - - - Успішна автентифікація довіреного проксі може допускати сеанси Control UI **оператора** без ідентичності пристрою. + + - Успішна автентифікація довіреного проксі може допускати **операторські** сеанси Control UI без ідентичності пристрою. - Це **не** поширюється на сеанси Control UI з роллю вузла. - - Зворотні проксі local loopback на тому самому хості все одно не задовольняють автентифікацію довіреного проксі; див. [Автентифікація довіреного проксі](/uk/gateway/trusted-proxy-auth). + - Зворотні проксі same-host loopback усе ще не задовольняють автентифікацію довіреного проксі; див. [Автентифікація довіреного проксі](/uk/gateway/trusted-proxy-auth). -Див. [Tailscale](/uk/gateway/tailscale), щоб отримати настанови з налаштування HTTPS. +Див. [Tailscale](/uk/gateway/tailscale) для настанов із налаштування HTTPS. ## Політика безпеки вмісту -Control UI постачається зі строгою політикою `img-src`: дозволено лише ресурси **того самого джерела**, URL-адреси `data:` та локально згенеровані URL-адреси `blob:`. Віддалені URL-адреси зображень `http(s)` і відносні щодо протоколу відхиляються браузером і не спричиняють мережевих запитів. +Control UI постачається зі строгою політикою `img-src`: дозволені лише ресурси **того самого походження**, URL-адреси `data:` та локально згенеровані URL-адреси `blob:`. Віддалені URL-адреси зображень `http(s)` і URL-адреси відносно протоколу відхиляються браузером і не спричиняють мережевих запитів. Що це означає на практиці: -- Аватари й зображення, що обслуговуються за відносними шляхами (наприклад `/avatars/`), усе одно відображаються, зокрема автентифіковані маршрути аватарів, які UI отримує і перетворює на локальні URL-адреси `blob:`. -- Вбудовані URL-адреси `data:image/...` усе одно відображаються (корисно для корисних навантажень у межах протоколу). -- Локальні URL-адреси `blob:`, створені Control UI, усе одно відображаються. -- Віддалені URL-адреси аватарів, передані метаданими каналу, видаляються допоміжними засобами аватарів Control UI і замінюються вбудованим логотипом/бейджем, тому скомпрометований або зловмисний канал не може змусити браузер оператора виконувати довільні віддалені запити зображень. +- Аватари та зображення, що обслуговуються за відносними шляхами (наприклад `/avatars/`), і далі відображаються, зокрема автентифіковані маршрути аватарів, які 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/` повертає зображення аватара лише автентифікованим викликам. `GET /avatar/?meta=1` повертає метадані аватара за тим самим правилом. -- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (відповідно до суміжного маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені. -- Сам Control UI пересилає токен gateway як заголовок bearer під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення й далі відображалося в панелях. +- `GET /avatar/` повертає зображення аватара лише автентифікованим викликачам. `GET /avatar/?meta=1` повертає метадані аватара за тим самим правилом. +- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (відповідно до сусіднього маршруту assistant-media). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені. +- Сам Control UI пересилає токен gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення все одно відображалося на dashboards. -Якщо ви вимкнете автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стане неавтентифікованим, відповідно до решти gateway. +Якщо вимкнути автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стає неавтентифікованим, відповідно до решти gateway. ## Збирання UI -Gateway обслуговує статичні файли з `dist/control-ui`. Зберіть їх так: +Gateway обслуговує статичні файли з `dist/control-ui`. Зберіть їх за допомогою: ```bash pnpm ui:build @@ -385,20 +385,20 @@ pnpm ui:build OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build ``` -Для локальної розробки (окремий сервер розробки): +Для локальної розробки (окремий dev server): ```bash pnpm ui:dev ``` -Потім спрямуйте UI на URL Gateway WS (наприклад, `ws://127.0.0.1:18789`). +Потім спрямуйте UI на URL-адресу WS вашого Gateway (наприклад `ws://127.0.0.1:18789`). -## Налагодження/тестування: сервер розробки + віддалений Gateway +## Налагодження/тестування: dev server + віддалений Gateway -Control UI — це статичні файли; ціль WebSocket налаштовується і може відрізнятися від HTTP-джерела. Це зручно, коли ви хочете локально використовувати сервер розробки Vite, але Gateway працює деінде. +Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP origin. Це зручно, коли потрібно мати Vite dev server локально, але Gateway працює деінде. - + ```bash pnpm ui:dev ``` @@ -418,18 +418,18 @@ Control UI — це статичні файли; ціль WebSocket налашт - - - `gatewayUrl` зберігається в localStorage після завантаження й видаляється з URL. + + - `gatewayUrl` зберігається в localStorage після завантаження та видаляється з URL. - Якщо ви передаєте повну кінцеву точку `ws://` або `wss://` через `gatewayUrl`, URL-кодуйте значення `gatewayUrl`, щоб браузер правильно розібрав рядок запиту. - - `token` за можливості слід передавати через фрагмент URL (`#token=...`). Фрагменти не надсилаються на сервер, що запобігає витоку в журналах запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як запасний варіант, і видаляються одразу після bootstrap. + - `token` за можливості слід передавати через фрагмент URL (`#token=...`). Фрагменти не надсилаються на сервер, що запобігає витоку через журнали запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як запасний варіант, і видаляються одразу після bootstrap. - `password` зберігається лише в пам’яті. - - Коли встановлено `gatewayUrl`, UI не повертається до конфігураційних або середовищних облікових даних. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою. - - Використовуйте `wss://`, коли Gateway розміщено за TLS (Tailscale Serve, HTTPS-проксі тощо). + - Коли `gatewayUrl` задано, UI не повертається до облікових даних із конфігурації або середовища. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою. + - Використовуйте `wss://`, коли Gateway розташований за TLS (Tailscale Serve, HTTPS-проксі тощо). - `gatewayUrl` приймається лише у вікні верхнього рівня (не вбудованому), щоб запобігти clickjacking. - - Розгортання Control UI поза loopback мають явно встановити `gateway.controlUi.allowedOrigins` (повні джерела). Це включає віддалені налаштування розробки. - - Запуск Gateway може засівати локальні джерела, як-от `http://localhost:` і `http://127.0.0.1:`, з ефективної runtime-прив’язки та порту, але віддалені джерела браузера все одно потребують явних записів. - - Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім суворо контрольованого локального тестування. Це означає дозволити будь-яке джерело браузера, а не "зіставити будь-який хост, який я використовую." - - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим резервного джерела з заголовка Host, але це небезпечний режим безпеки. + - Розгортання Control UI не через loopback мають явно задавати `gateway.controlUi.allowedOrigins` (повні origins). Це також стосується віддалених dev-налаштувань. + - Під час запуску Gateway може засівати локальні origins, як-от `http://localhost:` і `http://127.0.0.1:`, з ефективних runtime bind і порту, але віддалені browser origins все одно потребують явних записів. + - Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, окрім жорстко контрольованого локального тестування. Це означає дозволити будь-який browser origin, а не «відповідати будь-якому хосту, який я використовую». + - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим резервного визначення origin за Host-заголовком, але це небезпечний режим безпеки. @@ -446,11 +446,11 @@ Control UI — це статичні файли; ціль WebSocket налашт } ``` -Докладніше про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote). +Докладні відомості про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote). ## Пов’язане -- [Панель](/uk/web/dashboard) — панель gateway -- [Перевірки справності](/uk/gateway/health) — моніторинг справності gateway +- [Dashboard](/uk/web/dashboard) — dashboard gateway +- [Health Checks](/uk/gateway/health) — моніторинг стану gateway - [TUI](/uk/web/tui) — термінальний інтерфейс користувача - [WebChat](/uk/web/webchat) — браузерний інтерфейс чату