diff --git a/docs/uk/web/control-ui.md b/docs/uk/web/control-ui.md index dc2703972..3f7f9cd0a 100644 --- a/docs/uk/web/control-ui.md +++ b/docs/uk/web/control-ui.md @@ -3,23 +3,23 @@ read_when: - Ви хочете керувати Gateway з браузера - Вам потрібен доступ до Tailnet без SSH-тунелів sidebarTitle: Control UI -summary: Вебінтерфейс керування для Gateway (чат, вузли, конфігурація) +summary: Браузерний інтерфейс керування для Gateway (чат, вузли, конфігурація) title: Інтерфейс керування x-i18n: - generated_at: "2026-04-29T20:46:04Z" + generated_at: "2026-04-30T00:05:08Z" model: gpt-5.5 provider: openai - source_hash: d440cb80ae194f1994fde90e58b65e6194d2f4f87534696818e3f92b2969265d + source_hash: 982d25d48770b753faa4e57d9a284e9bff10c15cda21dd9c00848d2a6b912d41 source_path: web/control-ui.md workflow: 16 --- -Інтерфейс керування — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговує Gateway: +Control UI — це невеликий односторінковий застосунок **Vite + Lit**, який обслуговує Gateway: - типово: `http://:18789/` - необов’язковий префікс: задайте `gateway.controlUi.basePath` (наприклад, `/openclaw`) -Він взаємодіє **безпосередньо з WebSocket Gateway** на тому самому порту. +Він працює **напряму з Gateway WebSocket** на тому самому порту. ## Швидке відкриття (локально) @@ -29,122 +29,124 @@ x-i18n: Якщо сторінка не завантажується, спочатку запустіть Gateway: `openclaw gateway`. -Автентифікація передається під час WebSocket-рукостискання через: +Автентифікація передається під час WebSocket handshake через: - `connect.params.auth.token` - `connect.params.auth.password` - заголовки ідентичності Tailscale Serve, коли `gateway.auth.allowTailscale: true` -- заголовки ідентичності довіреного проксі, коли `gateway.auth.mode: "trusted-proxy"` +- заголовки ідентичності trusted-proxy, коли `gateway.auth.mode: "trusted-proxy"` -Панель налаштувань дашборда зберігає токен для поточної сесії вкладки браузера й вибраної URL-адреси Gateway; паролі не зберігаються. Під час онбордингу зазвичай генерується токен Gateway для автентифікації зі спільним секретом під час першого підключення, але автентифікація паролем також працює, коли `gateway.auth.mode` дорівнює `"password"`. +Панель налаштувань dashboard зберігає токен для поточної сесії вкладки браузера та вибраної URL-адреси gateway; паролі не зберігаються. Onboarding зазвичай генерує gateway token для автентифікації зі спільним секретом під час першого підключення, але password auth також працює, коли `gateway.auth.mode` має значення `"password"`. -## Сполучення пристрою (перше підключення) +## Спарювання пристрою (перше підключення) -Коли ви підключаєтеся до інтерфейсу керування з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового підтвердження сполучення**. Це захід безпеки для запобігання несанкціонованому доступу. +Коли ви підключаєтеся до Control UI з нового браузера або пристрою, Gateway зазвичай вимагає **одноразового схвалення спарювання**. Це захід безпеки для запобігання несанкціонованому доступу. **Що ви побачите:** "disconnected (1008): pairing required" - + ```bash openclaw devices list ``` - + ```bash openclaw devices approve ``` -Якщо браузер повторює спробу сполучення зі зміненими даними автентифікації (роль/області доступу/публічний ключ), попередній запит у стані очікування замінюється, і створюється новий `requestId`. Перед підтвердженням повторно виконайте `openclaw devices list`. +Якщо браузер повторює спарювання зі зміненими даними автентифікації (role/scopes/public key), попередній запит в очікуванні замінюється, і створюється новий `requestId`. Перед схваленням повторно запустіть `openclaw devices list`. -Якщо браузер уже сполучено і ви змінюєте доступ із читання на запис/адміністрування, це вважається підвищенням рівня підтвердження, а не тихим перепідключенням. OpenClaw залишає старе підтвердження активним, блокує перепідключення з ширшими правами й просить явно підтвердити новий набір областей доступу. +Якщо браузер уже спарено, і ви змінюєте його з доступу для читання на доступ для запису/admin, це обробляється як підвищення схвалення, а не як тихе повторне підключення. OpenClaw залишає старе схвалення активним, блокує ширше повторне підключення та просить вас явно схвалити новий набір scope. -Після підтвердження пристрій запам’ятовується і не потребуватиме повторного підтвердження, якщо ви не відкличете його за допомогою `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 може пропускати цикл сполучення для операторських сесій інтерфейсу керування, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale перевірено, а браузер надає ідентичність свого пристрою. -- Прямі прив’язки Tailnet, підключення браузера з LAN і профілі браузера без ідентичності пристрою все одно потребують явного підтвердження. -- Кожен профіль браузера генерує унікальний ID пристрою, тому перемикання браузерів або очищення даних браузера вимагатиме повторного сполучення. +- Прямі браузерні підключення через local loopback (`127.0.0.1` / `localhost`) схвалюються автоматично. +- Tailscale Serve може пропустити цикл спарювання для operator sessions у Control UI, коли `gateway.auth.allowTailscale: true`, ідентичність Tailscale підтверджується, а браузер надає свою ідентичність пристрою. +- Прямі прив’язки Tailnet, браузерні підключення з LAN і профілі браузера без ідентичності пристрою все ще потребують явного схвалення. +- Кожен профіль браузера генерує унікальний ID пристрою, тому перехід між браузерами або очищення даних браузера потребуватиме повторного спарювання. ## Особиста ідентичність (локальна для браузера) -Інтерфейс керування підтримує особисту ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сесіях. Вона зберігається в сховищі браузера, обмежена поточним профілем браузера й не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства стенограми для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або перемикання браузерів скидає її до порожнього стану. +Control UI підтримує персональну ідентичність для кожного браузера (відображуване ім’я та аватар), яка додається до вихідних повідомлень для атрибуції у спільних сесіях. Вона зберігається у сховищі браузера, обмежена поточним профілем браузера і не синхронізується з іншими пристроями та не зберігається на сервері, окрім звичайних метаданих авторства transcript для повідомлень, які ви фактично надсилаєте. Очищення даних сайту або зміна браузера скидає її до порожнього стану. -Той самий локальний для браузера шаблон застосовується до перевизначення аватара асистента. Завантажені аватари асистента накладаються на ідентичність, визначену Gateway, лише в локальному браузері й ніколи не проходять туди й назад через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для клієнтів без UI, які записують поле безпосередньо (наприклад, скриптові Gateway або користувацькі дашборди). +Та сама локальна для браузера модель застосовується до перевизначення аватара assistant. Завантажені аватари assistant накладаються на ідентичність, визначену gateway, лише в локальному браузері та ніколи не проходять зворотний обмін через `config.patch`. Спільне поле конфігурації `ui.assistant.avatar` усе ще доступне для клієнтів не з UI, які записують поле напряму (наприклад, scripted gateways або custom dashboards). -## Ендпоінт конфігурації часу виконання +## Endpoint runtime-конфігурації -Інтерфейс керування отримує свої налаштування часу виконання з `/__openclaw/control-ui-config.json`. Цей ендпоінт захищено тією самою автентифікацією Gateway, що й решту HTTP-поверхні: неавтентифіковані браузери не можуть його отримати, а успішне отримання вимагає або вже чинного токена/пароля Gateway, ідентичності Tailscale Serve, або ідентичності довіреного проксі. +Control UI отримує свої runtime-налаштування з `/__openclaw/control-ui-config.json`. Цей endpoint захищений тією самою gateway auth, що й решта HTTP-поверхні: неавтентифіковані браузери не можуть його отримати, а успішне отримання потребує вже дійсного gateway token/password, ідентичності Tailscale Serve або ідентичності trusted-proxy. ## Підтримка мов -Інтерфейс керування може локалізуватися під час першого завантаження на основі локалі вашого браузера. Щоб перевизначити її пізніше, відкрийте **Огляд -> Доступ до Gateway -> Мова**. Вибір локалі розміщено в картці доступу до Gateway, а не в розділі вигляду. +Control UI може локалізуватися під час першого завантаження на основі locale вашого браузера. Щоб змінити це пізніше, відкрийте **Overview -> Gateway Access -> Language**. Вибір locale міститься в картці Gateway Access, а не в Appearance. -- Підтримувані локалі: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa` -- Переклади неанглійськими мовами ліниво завантажуються в браузері. -- Вибрана локаль зберігається в сховищі браузера й повторно використовується під час наступних відвідувань. +- Підтримувані locale: `en`, `zh-CN`, `zh-TW`, `pt-BR`, `de`, `es`, `ja-JP`, `ko`, `fr`, `ar`, `it`, `tr`, `uk`, `id`, `pl`, `th`, `vi`, `nl`, `fa` +- Неанглійські переклади lazy-loaded у браузері. +- Вибраний locale зберігається у сховищі браузера та повторно використовується під час майбутніх відвідувань. - Відсутні ключі перекладу повертаються до англійської. +Переклади документації генеруються для того самого набору неанглійських locale, але вбудований у сайт документації перемикач мов Mintlify обмежений кодами locale, які приймає Mintlify. Документація тайською (`th`) і перською (`fa`) все ще генерується в publish repo; вона може не з’являтися в цьому перемикачі, доки Mintlify не підтримуватиме ці коди. + ## Теми вигляду -Панель вигляду зберігає вбудовані теми 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`. +Панель Appearance зберігає вбудовані теми Claw, Knot і Dash, а також один локальний для браузера слот імпорту tweakcn. Щоб імпортувати тему, відкрийте [tweakcn themes](https://tweakcn.com/themes), виберіть або створіть тему, натисніть **Share** і вставте скопійоване посилання на тему в Appearance. Імпортер також приймає registry URL `https://tweakcn.com/r/themes/`, URL редактора на кшталт `https://tweakcn.com/editor/theme?theme=amethyst-haze`, відносні шляхи `/themes/`, сирі ID тем і назви типових тем, як-от `amethyst-haze`. -Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються до конфігурації Gateway і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо було вибрано імпортовану тему. +Імпортовані теми зберігаються лише в поточному профілі браузера. Вони не записуються в gateway config і не синхронізуються між пристроями. Заміна імпортованої теми оновлює один локальний слот; очищення перемикає активну тему назад на Claw, якщо імпортовану тему було вибрано. ## Що він може робити (сьогодні) - - - Спілкуйтеся з моделлю через 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. - - Потоково передавайте виклики інструментів + живі картки виводу інструментів у чаті (події агента). + + - Спілкуватися з моделлю через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`). + - Розмовляти через browser realtime sessions. OpenAI використовує direct WebRTC, Google Live використовує constrained одноразовий browser token через WebSocket, а backend-only realtime voice plugins використовують relay transport Gateway. Relay зберігає provider credentials на Gateway, тоді як браузер stream-ить microphone PCM через RPC `talk.realtime.relay*` і надсилає tool calls `openclaw_agent_consult` назад через `chat.send` для більшої налаштованої моделі OpenClaw. + - Stream tool calls + картки live tool output у Chat (agent events). - - - Канали: вбудовані, а також статус bundled/external plugin-каналів, QR-вхід і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`). + + - Канали: вбудовані плюс стан bundled/external plugin channels, QR login і конфігурація для кожного каналу (`channels.status`, `web.login.*`, `config.patch`). - Інстанси: список присутності + оновлення (`system-presence`). - - Сесії: список + перевизначення моделі/мислення/швидкого режиму/деталізації/трасування/обґрунтування для кожної сесії (`sessions.list`, `sessions.patch`). - - Сни: статус Dreaming, перемикач увімкнення/вимкнення та читач Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`). + - Сесії: список + перевизначення model/thinking/fast/verbose/trace/reasoning для кожної сесії (`sessions.list`, `sessions.patch`). + - Сни: стан dreaming, перемикач увімкнення/вимкнення та reader Dream Diary (`doctor.memory.status`, `doctor.memory.dreamDiary`, `config.patch`). - - Завдання Cron: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`). - - Skills: статус, увімкнення/вимкнення, встановлення, оновлення API-ключів (`skills.*`). - - Вузли: список + можливості (`node.list`). - - Підтвердження exec: редагування allowlist Gateway або вузла + політика запиту для `exec host=gateway/node` (`exec.approvals.*`). + - Cron jobs: список/додавання/редагування/запуск/увімкнення/вимкнення + історія запусків (`cron.*`). + - Skills: стан, увімкнення/вимкнення, встановлення, оновлення API key (`skills.*`). + - Nodes: список + caps (`node.list`). + - Exec approvals: редагування gateway або node allowlists + ask policy для `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 доступний лише тоді, коли знімок має безпечний сирий круговий прохід. - - Якщо знімок не може безпечно пройти круговий прохід сирого тексту, інтерфейс керування примусово вмикає режим форми й вимикає сирий режим для цього знімка. - - У редакторі Raw JSON "Reset to saved" зберігає сиро створену форму (форматування, коментарі, структуру `$include`) замість повторного рендерингу сплющеного знімка, тому зовнішні редагування переживають скидання, коли знімок може безпечно пройти круговий прохід. - - Структуровані об’єктні значення SecretRef відображаються лише для читання в текстових полях форми, щоб запобігти випадковому пошкодженню object-to-string. + - Записи містять base-hash guard, щоб запобігти перезапису паралельних редагувань. + - Записи (`config.set`/`config.apply`/`config.patch`) виконують preflight resolution активних SecretRef для refs у надісланому config payload; unresolved active submitted refs відхиляються до запису. + - Schema + rendering форми (`config.schema` / `config.schema.lookup`, включно з полями `title` / `description`, matched UI hints, immediate child summaries, docs metadata на вкладених object/wildcard/array/composition nodes, а також plugin + channel schemas, коли доступні); Raw JSON editor доступний лише тоді, коли snapshot має безпечний raw round-trip. + - Якщо snapshot не може безпечно виконати round-trip сирого тексту, Control UI примусово вмикає Form mode і вимикає Raw mode для цього snapshot. + - У Raw JSON editor "Reset to saved" зберігає raw-authored shape (форматування, коментарі, layout `$include`) замість повторного rendering плаского snapshot, тому зовнішні редагування переживають reset, коли snapshot може безпечно виконати round-trip. + - Структуровані значення об’єктів SecretRef відображаються read-only у текстових input форми, щоб запобігти випадковому пошкодженню object-to-string. - - - Налагодження: знімки статусу/стану/моделей + журнал подій + ручні RPC-виклики (`status`, `health`, `models.list`). - - Журнали: живий tail файлових журналів Gateway із фільтром/експортом (`logs.tail`). - - Оновлення: запуск оновлення пакета/git + перезапуск (`update.run`) зі звітом про перезапуск, потім опитування `update.status` після перепідключення для перевірки версії запущеного Gateway. + + - Налагодження: snapshots status/health/models + event log + ручні RPC calls (`status`, `health`, `models.list`). + - Логи: live tail gateway file logs із фільтром/експортом (`logs.tail`). + - Оновлення: запуск package/git update + перезапуск (`update.run`) зі звітом про перезапуск, потім polling `update.status` після повторного підключення для перевірки версії запущеного gateway. - - - Для ізольованих завдань доставка типово оголошує підсумок. Ви можете перемкнути на none, якщо потрібні внутрішні-only запуски. - - Поля каналу/цілі з’являються, коли вибрано оголошення. - - Режим 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` до міграції. + + - Для ізольованих jobs delivery типово налаштовано на announce summary. Ви можете перемкнути на none, якщо потрібні internal-only runs. + - Поля channel/target з’являються, коли вибрано announce. + - Webhook mode використовує `delivery.mode = "webhook"` з `delivery.to`, встановленим на дійсну HTTP(S) webhook URL. + - Для main-session jobs доступні webhook і none delivery modes. + - Advanced edit controls містять delete-after-run, clear agent override, cron exact/stagger options, agent model/thinking overrides і best-effort delivery toggles. + - Валідація форми inline з помилками на рівні полів; недійсні значення вимикають кнопку save, доки їх не буде виправлено. + - Задайте `cron.webhookToken`, щоб надсилати dedicated bearer token; якщо пропущено, webhook надсилається без auth header. + - Deprecated fallback: збережені legacy jobs із `notify: true` все ще можуть використовувати `cron.webhook` до міграції. @@ -153,83 +155,83 @@ x-i18n: - - `chat.send` є **неблокувальним**: він одразу підтверджує з `{ runId, status: "started" }`, а відповідь транслюється через події `chat`. - - Завантаження в чат приймають зображення та невідеофайли. Зображення зберігають нативний шлях до зображення; інші файли зберігаються як керовані медіа та показуються в історії як посилання на вкладення. - - Повторне надсилання з тим самим `idempotencyKey` повертає `{ status: "in_flight" }` під час виконання та `{ status: "ok" }` після завершення. - - Відповіді `chat.history` обмежені за розміром для безпеки UI. Коли записи транскрипту завеликі, Gateway може обрізати довгі текстові поля, пропускати важкі блоки метаданих і замінювати надмірно великі повідомлення заповнювачем (`[chat.history omitted: message too large]`). - - Зображення 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 знову не повідомить свіже використання. + - `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` також прибирає з видимого тексту асистента службові inline-теги директив лише для відображення (наприклад `[[reply_to_*]]` і `[[audio_as_voice]]`), plain-text XML-навантаження викликів інструментів (зокрема `...`, `...`, `...`, `...` і обрізані блоки викликів інструментів), а також витоки ASCII/повноширинних контрольних токенів моделі, і опускає записи асистента, весь видимий текст яких є лише точним silent-токеном `NO_REPLY` / `no_reply`. + - Під час активного надсилання та фінального оновлення історії подання чату зберігає видимими локальні оптимістичні повідомлення користувача/асистента, якщо `chat.history` на короткий час повертає старіший знімок; канонічний транскрипт замінює ці локальні повідомлення, щойно історія Gateway наздоганяє стан. + - `chat.inject` додає нотатку асистента до транскрипту сесії та транслює подію `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 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` не приймає надані викликачем перевизначення інструкцій. + Режим розмови використовує зареєстрованого провайдера голосу 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 отримує одноразовий обмежений auth-токен Live API для браузерної WebSocket-сесії, з інструкціями та деклараціями інструментів, зафіксованими в токені Gateway. Провайдери, які надають лише backend realtime bridge, працюють через relay-транспорт Gateway, тож облікові дані й vendor-сокети лишаються на сервері, а браузерний аудіопотік проходить через автентифіковані RPC Gateway. Prompt realtime-сесії збирає Gateway; `talk.realtime.session` не приймає надані викликачем перевизначення інструкцій. - У composer чату елемент керування Talk — це кнопка з хвилями поруч із кнопкою мікрофона для диктування. Коли Talk запускається, рядок стану composer показує `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 constrained-token і браузерний адаптер Gateway relay із фейковими медіа мікрофона. Команда друкує лише статус провайдера й не записує секрети в журнал. + Maintainer live smoke: `OPENAI_API_KEY=... GEMINI_API_KEY=... node --import tsx scripts/dev/realtime-talk-live-smoke.ts` перевіряє OpenAI браузерний WebRTC SDP exchange, Google Live constrained-token browser WebSocket setup і Gateway relay browser adapter з фейковими медіа мікрофона. Команда друкує лише статус провайдера й не журналює секрети. - Натисніть **Stop** (викликає `chat.abort`). - - Поки запуск активний, звичайні подальші повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб інʼєктувати це подальше повідомлення в поточний хід. + - Поки запуск активний, звичайні подальші повідомлення стають у чергу. Натисніть **Steer** на повідомленні в черзі, щоб вставити це подальше повідомлення в поточний хід. - Введіть `/stop` (або окремі фрази переривання, як-от `stop`, `stop action`, `stop run`, `stop openclaw`, `please stop`), щоб перервати поза основним каналом. - `chat.abort` підтримує `{ sessionKey }` (без `runId`), щоб перервати всі активні запуски для цієї сесії. - - Коли запуск перервано, частковий текст assistant усе ще може показуватися в UI. - - Gateway зберігає перерваний частковий текст assistant в історії транскрипту, коли існує буферизований вивід. - - Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізнити часткові результати переривання від нормального завершеного виводу. + - Коли запуск перервано, частковий текст асистента все ще може показуватися в UI. + - Gateway зберігає перерваний частковий текст асистента в історії транскрипту, коли існує буферизований вивід. + - Збережені записи містять метадані переривання, щоб споживачі транскрипту могли відрізнити часткові результати переривання від звичайного виводу завершення. -## Встановлення PWA та web push +## Установлення PWA та web push -Control UI постачається з `manifest.webmanifest` і service worker, тож сучасні браузери можуть встановлювати його як standalone PWA. Web Push дає Gateway змогу пробуджувати встановлену PWA сповіщеннями, навіть коли вкладка або вікно браузера не відкриті. +Control UI постачається з `manifest.webmanifest` і service worker, тому сучасні браузери можуть установити його як автономну 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` | Збережені endpoints підписок браузера. | +| `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-и браузерних підписок. | -Перевизначте пару ключів VAPID через env vars у процесі Gateway, коли хочете зафіксувати ключі (для multi-host розгортань, ротації секретів або тестів): +Перевизначте пару ключів VAPID через змінні середовища в процесі 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-gated методи Gateway, щоб реєструвати й тестувати браузерні підписки: - `push.web.vapidPublicKey` — отримує активний публічний ключ VAPID. -- `push.web.subscribe` — реєструє `endpoint` плюс `keys.p256dh`/`keys.auth`. +- `push.web.subscribe` — реєструє `endpoint` разом із `keys.p256dh`/`keys.auth`. - `push.web.unsubscribe` — видаляє зареєстрований endpoint. - `push.web.test` — надсилає тестове сповіщення до підписки викликача. -Web Push незалежний від relay-шляху iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із relay-підтримкою) і наявного методу `push.test`, які націлені на нативне мобільне pairing. +Web Push незалежний від шляху relay iOS APNS (див. [Конфігурація](/uk/gateway/configuration) для push із підтримкою relay) і наявного методу `push.test`, націленого на нативне мобільне спарювання. -## Hosted embeds +## Розміщені embeds -Повідомлення assistant можуть відображати hosted web content inline за допомогою shortcode `[embed ...]`. Політика iframe sandbox контролюється `gateway.controlUi.embedSandbox`: +Повідомлення асистента можуть рендерити розміщений вебвміст inline через shortcode `[embed ...]`. Політикою iframe sandbox керує `gateway.controlUi.embedSandbox`: - Вимикає виконання скриптів усередині hosted embeds. + Вимикає виконання скриптів усередині розміщених embeds. - Дозволяє інтерактивні embeds, зберігаючи ізоляцію origin; це значення за замовчуванням і зазвичай його достатньо для самодостатніх браузерних ігор/віджетів. + Дозволяє інтерактивні embeds, зберігаючи ізоляцію origin; це типовий режим, і зазвичай його достатньо для самодостатніх браузерних ігор/віджетів. - Додає `allow-same-origin` поверх `allow-scripts` для документів same-site, яким навмисно потрібні сильніші привілеї. + Додає `allow-same-origin` поверх `allow-scripts` для same-site документів, яким навмисно потрібні сильніші привілеї. @@ -246,16 +248,16 @@ Web Push незалежний від relay-шляху iOS APNS (див. [Кон ``` -Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна поведінка same-origin. Для більшості згенерованих агентом ігор та інтерактивних canvas `scripts` є безпечнішим вибором. +Використовуйте `trusted` лише тоді, коли вбудованому документу справді потрібна same-origin поведінка. Для більшості згенерованих агентом ігор та інтерактивних canvas `scripts` є безпечнішим вибором. -Абсолютні зовнішні `http(s)` URL для embed за замовчуванням залишаються заблокованими. Якщо ви свідомо хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, встановіть `gateway.controlUi.allowExternalEmbedUrls: true`. +Абсолютні зовнішні URL embeds `http(s)` типово лишаються заблокованими. Якщо ви навмисно хочете, щоб `[embed url="https://..."]` завантажував сторонні сторінки, встановіть `gateway.controlUi.allowExternalEmbedUrls: true`. -## Доступ до tailnet (рекомендовано) +## Доступ tailnet (рекомендовано) - Тримайте Gateway на loopback і дайте Tailscale Serve проксіювати його через HTTPS: + Тримайте Gateway на loopback і дозвольте Tailscale Serve проксувати його через HTTPS: ```bash openclaw gateway --tailscale serve @@ -265,16 +267,16 @@ Web Push незалежний від relay-шляху iOS APNS (див. [Кон - `https:///` (або ваш налаштований `gateway.controlUi.basePath`) - За замовчуванням запити 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"`. + Типово запити Control UI/WebSocket Serve можуть автентифікуватися через заголовки ідентичності Tailscale (`tailscale-user-login`), коли `gateway.auth.allowTailscale` має значення `true`. OpenClaw перевіряє ідентичність, розв'язуючи адресу `x-forwarded-for` через `tailscale whois` і зіставляючи її із заголовком, і приймає їх лише тоді, коли запит потрапляє на loopback із заголовками `x-forwarded-*` від Tailscale. Для operator-сесій Control UI з ідентичністю браузерного пристрою цей перевірений шлях Serve також пропускає round trip спарювання пристрою; браузери без пристрою та з'єднання node-role усе ще проходять звичайні перевірки пристрою. Встановіть `gateway.auth.allowTailscale: false`, якщо хочете вимагати явні облікові дані shared-secret навіть для трафіку Serve. Потім використовуйте `gateway.auth.mode: "token"` або `"password"`. - Для цього асинхронного шляху ідентичності Serve невдалі спроби auth для тієї самої клієнтської IP-адреси й auth scope серіалізуються перед записами rate-limit. Тому паралельні невдалі повтори з того самого браузера можуть показувати `retry later` на другому запиті замість двох простих невідповідностей, що змагаються паралельно. + Для цього асинхронного шляху ідентичності Serve невдалі спроби автентифікації для тієї самої IP-адреси клієнта та auth scope серіалізуються перед записами rate-limit. Тому одночасні невдалі повтори з того самого браузера можуть показати `retry later` на другому запиті замість двох звичайних невідповідностей, що змагаються паралельно. - Tokenless Serve auth припускає, що хост gateway є довіреним. Якщо на цьому хості може виконуватися недовірений локальний код, вимагайте token/password auth. + Auth Serve без токена припускає, що host gateway є довіреним. Якщо на цьому host може виконуватися недовірений локальний код, вимагайте token/password auth. - + ```bash openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)" ``` @@ -290,18 +292,18 @@ Web Push незалежний від relay-шляху iOS APNS (див. [Кон ## Небезпечний HTTP -Якщо ви відкриваєте dashboard через звичайний HTTP (`http://` або `http://`), браузер працює в **небезпечному контексті** та блокує WebCrypto. За замовчуванням OpenClaw **блокує** підключення Control UI без ідентичності пристрою. +Якщо ви відкриваєте dashboard через plain HTTP (`http://` або `http://`), браузер працює в **non-secure context** і блокує WebCrypto. Типово OpenClaw **блокує** з'єднання Control UI без ідентичності пристрою. Задокументовані винятки: - сумісність insecure HTTP лише для localhost із `gateway.controlUi.allowInsecureAuth=true` -- успішна автентифікація операторського Control UI через `gateway.auth.mode: "trusted-proxy"` +- успішна auth operator Control UI через `gateway.auth.mode: "trusted-proxy"` - break-glass `gateway.controlUi.dangerouslyDisableDeviceAuth=true` **Рекомендоване виправлення:** використовуйте HTTPS (Tailscale Serve) або відкрийте UI локально: - `https:///` (Serve) -- `http://127.0.0.1:18789/` (на хості gateway) +- `http://127.0.0.1:18789/` (на gateway host) @@ -317,9 +319,9 @@ Web Push незалежний від relay-шляху iOS APNS (див. [Кон `allowInsecureAuth` є лише локальним перемикачем сумісності: - - Він дозволяє сесіям Control UI на localhost продовжуватися без ідентичності пристрою в небезпечних HTTP-контекстах. - - Він не обходить перевірки pairing. - - Він не послаблює вимоги до ідентичності пристрою для віддалених (не-localhost) підключень. + - Він дозволяє localhost-сесіям Control UI продовжуватися без ідентичності пристрою в non-secure HTTP contexts. + - Він не обходить перевірки спарювання. + - Він не послаблює вимоги до ідентичності віддаленого (не localhost) пристрою. @@ -334,42 +336,42 @@ Web Push незалежний від relay-шляху iOS APNS (див. [Кон ``` - `dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI та є серйозним погіршенням безпеки. Швидко скасуйте це після аварійного використання. + `dangerouslyDisableDeviceAuth` вимикає перевірки ідентичності пристрою Control UI та є серйозним зниженням рівня безпеки. Швидко поверніть налаштування після екстреного використання. - - - Успішна автентифікація довіреного проксі може допускати **операторські** сеанси Control UI без ідентичності пристрою. + + - Успішна автентифікація через довірений proxy може дозволити сеанси Control UI рівня **оператор** без ідентичності пристрою. - Це **не** поширюється на сеанси Control UI з роллю вузла. - - Зворотні проксі same-host loopback усе ще не задовольняють автентифікацію довіреного проксі; див. [Автентифікація довіреного проксі](/uk/gateway/trusted-proxy-auth). + - Зворотні proxy того самого хоста через loopback усе ще не задовольняють автентифікацію через довірений proxy; див. [Автентифікація через довірений proxy](/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)` і URL-адреси відносно протоколу відхиляються браузером і не спричиняють мережевих запитів. +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, щоб зображення все одно відображалося на dashboards. +- Неавтентифіковані запити до будь-якого з цих маршрутів відхиляються (відповідно до спорідненого маршруту медіа асистента). Це запобігає витоку ідентичності агента через маршрут аватара на хостах, які інакше захищені. +- Сам Control UI пересилає токен gateway як bearer-заголовок під час отримання аватарів і використовує автентифіковані URL-адреси blob, щоб зображення все одно відображалося на панелях. -Якщо вимкнути автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стає неавтентифікованим, відповідно до решти gateway. +Якщо ви вимкнете автентифікацію gateway (не рекомендовано на спільних хостах), маршрут аватара також стане неавтентифікованим, відповідно до решти gateway. ## Збирання UI @@ -385,20 +387,20 @@ pnpm ui:build OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build ``` -Для локальної розробки (окремий dev server): +Для локальної розробки (окремий dev-сервер): ```bash pnpm ui:dev ``` -Потім спрямуйте UI на URL-адресу WS вашого Gateway (наприклад `ws://127.0.0.1:18789`). +Потім спрямуйте UI на URL Gateway WS (наприклад, `ws://127.0.0.1:18789`). -## Налагодження/тестування: dev server + віддалений Gateway +## Налагодження/тестування: dev-сервер + віддалений Gateway -Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP origin. Це зручно, коли потрібно мати Vite dev server локально, але Gateway працює деінде. +Control UI — це статичні файли; ціль WebSocket налаштовується й може відрізнятися від HTTP-джерела. Це зручно, коли ви хочете використовувати локальний dev-сервер Vite, але Gateway працює деінде. - + ```bash pnpm ui:dev ``` @@ -419,17 +421,17 @@ Control UI — це статичні файли; ціль WebSocket налашт - - `gatewayUrl` зберігається в localStorage після завантаження та видаляється з URL. - - Якщо ви передаєте повну кінцеву точку `ws://` або `wss://` через `gatewayUrl`, URL-кодуйте значення `gatewayUrl`, щоб браузер правильно розібрав рядок запиту. - - `token` за можливості слід передавати через фрагмент URL (`#token=...`). Фрагменти не надсилаються на сервер, що запобігає витоку через журнали запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як запасний варіант, і видаляються одразу після bootstrap. + - `gatewayUrl` зберігається в localStorage після завантаження й видаляється з URL. + - Якщо ви передаєте повну кінцеву точку `ws://` або `wss://` через `gatewayUrl`, закодуйте значення `gatewayUrl` для URL, щоб браузер правильно розібрав рядок запиту. + - `token` слід передавати через фрагмент URL (`#token=...`), коли це можливо. Фрагменти не надсилаються на сервер, що запобігає витоку в журналах запитів і Referer. Застарілі параметри запиту `?token=` усе ще імпортуються один раз для сумісності, але лише як запасний варіант, і негайно видаляються після bootstrap. - `password` зберігається лише в пам’яті. - Коли `gatewayUrl` задано, UI не повертається до облікових даних із конфігурації або середовища. Надайте `token` (або `password`) явно. Відсутність явних облікових даних є помилкою. - - Використовуйте `wss://`, коли Gateway розташований за TLS (Tailscale Serve, HTTPS-проксі тощо). + - Використовуйте `wss://`, коли Gateway розташований за TLS (Tailscale Serve, HTTPS proxy тощо). - `gatewayUrl` приймається лише у вікні верхнього рівня (не вбудованому), щоб запобігти clickjacking. - - Розгортання 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-заголовком, але це небезпечний режим безпеки. + - Розгортання Control UI не через loopback мають явно задати `gateway.controlUi.allowedOrigins` (повні джерела). Це включає віддалені dev-налаштування. + - Під час запуску Gateway може додати локальні джерела, як-от `http://localhost:` і `http://127.0.0.1:`, з ефективної прив’язки та порту середовища виконання, але віддалені джерела браузера все одно потребують явних записів. + - Не використовуйте `gateway.controlUi.allowedOrigins: ["*"]`, крім випадків суворо контрольованого локального тестування. Це означає дозволити будь-яке джерело браузера, а не «зіставити будь-який хост, який я використовую». + - `gateway.controlUi.dangerouslyAllowHostHeaderOriginFallback=true` вмикає режим fallback для джерела з Host-заголовка, але це небезпечний режим безпеки. @@ -446,11 +448,11 @@ Control UI — це статичні файли; ціль WebSocket налашт } ``` -Докладні відомості про налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote). +Деталі налаштування віддаленого доступу: [Віддалений доступ](/uk/gateway/remote). ## Пов’язане -- [Dashboard](/uk/web/dashboard) — dashboard gateway -- [Health Checks](/uk/gateway/health) — моніторинг стану gateway +- [Панель](/uk/web/dashboard) — панель gateway +- [Перевірки стану](/uk/gateway/health) — моніторинг стану gateway - [TUI](/uk/web/tui) — термінальний інтерфейс користувача - [WebChat](/uk/web/webchat) — браузерний інтерфейс чату