> ## Documentation Index
> Fetch the complete documentation index at: https://openclaw.veiseule.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# UI управления

# UI управления (браузер)

UI управления — это небольшое одностраничное приложение **Vite + Lit**, которое обслуживается Gateway:

* по умолчанию: `http://<host>:18789/`
* необязательный префикс: задайте `gateway.controlUi.basePath` (например, `/openclaw`)

Он **напрямую общается с WebSocket Gateway** на том же порту.

## Быстрое открытие (локально)

Если Gateway запущен на том же компьютере, откройте:

* [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (или [http://localhost:18789/](http://localhost:18789/))

Если страница не загружается, сначала запустите Gateway: `openclaw gateway`.

Аутентификация передаётся во время рукопожатия WebSocket через:

* `connect.params.auth.token`
* `connect.params.auth.password`
  Панель настроек дашборда позволяет сохранить токен; пароли не сохраняются.
  Мастер онбординга по умолчанию генерирует токен Gateway, поэтому при первом подключении вставьте его сюда.

## Сопряжение устройства (первое подключение)

Когда вы подключаетесь к UI управления из нового браузера или с нового устройства, Gateway
требует **одноразового подтверждения сопряжения** — даже если вы находитесь в том же Tailnet
с `gateway.auth.allowTailscale: true`. Это мера безопасности для предотвращения
несанкционированного доступа.

**Что вы увидите:** «disconnected (1008): pairing required»

**Как одобрить устройство:**

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
# List pending requests
openclaw devices list

# Approve by request ID
openclaw devices approve <requestId>
```

После одобрения устройство запоминается и не потребует повторного подтверждения, пока
вы не отзовёте его с помощью `openclaw devices revoke --device <id> --role <role>`. [Devices CLI](/cli/devices) для ротации токенов и отзыва.

**Примечания:**

* Локальные подключения (`127.0.0.1`) одобряются автоматически.
* Удалённые подключения (LAN, Tailnet и т. п.) требуют явного одобрения.
* Каждый профиль браузера генерирует уникальный идентификатор устройства, поэтому
  смена браузера или очистка данных браузера потребует повторного сопряжения.

## Что он умеет (на сегодня)

* Чат с моделью через Gateway WS (`chat.history`, `chat.send`, `chat.abort`, `chat.inject`)
* Потоковая передача вызовов инструментов и живые карточки вывода инструментов в чате (события агента)
* Каналы: WhatsApp/Telegram/Discord/Slack + каналы плагинов (Mattermost и т. п.) — статус + QR‑вход + конфиг на канал (`channels.status`, `web.login.*`, `config.patch`)
* Инстансы: список присутствия + обновление (`system-presence`)
* Сеансы: список + переопределения «thinking/verbose» для каждого сеанса (`sessions.list`, `sessions.patch`)
* Cron‑задачи: список/добавить/запустить/включить/выключить + история запусков (`cron.*`)
* Skills: статус, включение/выключение, установка, обновление ключей API (`skills.*`)
* Узлы: список + возможности (`node.list`)
* Подтверждения выполнения команд: редактирование списков разрешённых для Gateway или узла + запрос политики для `exec host=gateway/node` (`exec.approvals.*`)
* Конфиг: просмотр/редактирование `~/.openclaw/openclaw.json` (`config.get`, `config.set`)
* Конфиг: применить + перезапустить с валидацией (`config.apply`) и пробудить последний активный сеанс
* Записи конфига включают защиту по базовому хэшу, чтобы предотвратить перезапись параллельных правок
* Схема конфига + рендеринг форм (`config.schema`, включая схемы плагинов и каналов); редактор Raw JSON остаётся доступным
* Отладка: снимки статуса/здоровья/моделей + журнал событий + ручные RPC‑вызовы (`status`, `health`, `models.list`)
* Логи: живой tail файловых логов Gateway с фильтрацией/экспортом (`logs.tail`)
* Обновление: запуск обновления пакета/git + перезапуск (`update.run`) с отчётом о перезапуске

Примечания к панели Cron‑задач:

* Для изолированных задач доставка по умолчанию — объявление краткого резюме. Можно переключить на «нет», если нужны только внутренние запуски.
* Поля канал/цель появляются, когда выбрано «announce».

## Поведение чата

* `chat.send` **неблокирующий**: сразу подтверждается с `{ runId, status: "started" }`, а ответ поступает потоково через события `chat`.
* Повторная отправка с тем же `idempotencyKey` возвращает `{ status: "in_flight" }` во время выполнения и `{ status: "ok" }` после завершения.
* `chat.inject` добавляет заметку ассистента в транскрипт сеанса и рассылает событие `chat` только для UI‑обновлений (без запуска агента и без доставки в канал).
* Остановка:
  * Нажмите **Stop** (вызывает `chat.abort`)
  * Введите `/stop` (или `stop|esc|abort|wait|exit|interrupt`) для внеполосной отмены
  * `chat.abort` поддерживает `{ sessionKey }` (без `runId`) для отмены всех активных запусков для этого сеанса

## Доступ через Tailnet (рекомендуется)

### Интегрированный Tailscale Serve (предпочтительно)

Оставьте Gateway на loopback и проксируйте его через Tailscale Serve с HTTPS:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw gateway --tailscale serve
```

Откройте:

* `https://<magicdns>/` (или ваш настроенный `gateway.controlUi.basePath`)

По умолчанию запросы Serve могут аутентифицироваться через заголовки идентичности Tailscale
(`tailscale-user-login`), когда `gateway.auth.allowTailscale` — `true`. OpenClaw
проверяет идентичность, разрешая адрес `x-forwarded-for` с помощью
`tailscale whois` и сопоставляя его с заголовком, и принимает такие запросы только когда
они приходят на loopback с заголовками Tailscale `x-forwarded-*`. Установите
`gateway.auth.allowTailscale: false` (или принудительно `gateway.auth.mode: "password"`),
если хотите требовать токен/пароль даже для трафика Serve.

### Привязка к tailnet + токен

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
```

Затем откройте:

* `http://<tailscale-ip>:18789/` (или ваш настроенный `gateway.controlUi.basePath`)

Вставьте токен в настройках UI (передаётся как `connect.params.auth.token`).

## Небезопасный HTTP

Если вы открываете дашборд по обычному HTTP (`http://<lan-ip>` или `http://<tailscale-ip>`),
браузер работает в **незащищённом контексте** и блокирует WebCrypto. По умолчанию
OpenClaw **блокирует** подключения UI управления без идентичности устройства.

**Рекомендуемое исправление:** используйте HTTPS (Tailscale Serve) или открывайте UI локально:

* `https://<magicdns>/` (Serve)
* `http://127.0.0.1:18789/` (на хосте шлюза Gateway)

**Пример понижения (только токен по HTTP):**

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  gateway: {
    controlUi: { allowInsecureAuth: true },
    bind: "tailnet",
    auth: { mode: "token", token: "replace-me" },
  },
}
```

Это отключает идентичность устройства и сопряжение для UI управления (даже по HTTPS). Используйте
только если вы доверяете сети.

См. [Tailscale](/gateway/tailscale) для рекомендаций по настройке HTTPS.

## Сборка UI

Gateway раздаёт статические файлы из `dist/control-ui`. Соберите их с помощью:

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
pnpm ui:build # auto-installs UI deps on first run
```

Необязательная абсолютная база (когда нужны фиксированные URL ресурсов):

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
```

Для локальной разработки (отдельный dev‑сервер):

```bash theme={"theme":{"light":"min-light","dark":"min-dark"}}
pnpm ui:dev # auto-installs UI deps on first run
```

Затем укажите UI URL WebSocket вашего Gateway (например, `ws://127.0.0.1:18789`).

## Отладка/тестирование: dev‑сервер + удалённый Gateway

UI управления — это статические файлы; цель WebSocket настраивается и может
отличаться от HTTP‑источника. Это удобно, когда вы хотите запускать Vite dev‑сервер локально,
а Gateway — в другом месте.

1. Запустите dev‑сервер UI: `pnpm ui:dev`
2. Откройте URL вида:

```text theme={"theme":{"light":"min-light","dark":"min-dark"}}
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
```

Необязательная одноразовая аутентификация (если требуется):

```text theme={"theme":{"light":"min-light","dark":"min-dark"}}
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
```

Примечания:

* `gatewayUrl` сохраняется в localStorage после загрузки и удаляется из URL.
* `token` сохраняется в localStorage; `password` хранится только в памяти.
* Когда задан `gatewayUrl`, UI не использует запасные учётные данные из конфига или переменных окружения.
  Явно укажите `token` (или `password`). Отсутствие явных учётных данных — ошибка.
* Используйте `wss://`, когда Gateway находится за TLS (Tailscale Serve, HTTPS‑прокси и т. п.).
* `gatewayUrl` принимается только в окне верхнего уровня (не во встраиваемом), чтобы предотвратить кликджекинг.
* Для кросс‑доменной разработки (например, `pnpm ui:dev` к удалённому Gateway) добавьте
  origin UI в `gateway.controlUi.allowedOrigins`.

Пример:

```json5 theme={"theme":{"light":"min-light","dark":"min-dark"}}
{
  gateway: {
    controlUi: {
      allowedOrigins: ["http://localhost:5173"],
    },
  },
}
```

Подробности настройки удалённого доступа: [Remote access](/gateway/remote).
