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