Опубликовано
Bot Screen: рабочий стол агента на VPS и перехват управления из Hermes Desktop
Автор: Гусев Николай [портфолио]
Обновлено
Темы: hermes, bot-screen, computer-use, vps

Классическая боль headless-агента: он работает на VPS, а ты смотришь в логи. Агент долбится в сайт с капчей - и застревает. Хочется не гадать, а посмотреть его глазами и помочь. Но сервер без монитора, SSH-сессия с midnight-магией, и вот ты уже переносишь задачу на локальную машину, где есть дисплей.
В Hermes Agent для этого есть Bot Screen: у каждого бота свой рабочий стол прямо на сервере, который стримится в десктоп-приложение. Разбираю, как это устроено, что оно даёт и где границы.
Что это
На headless Linux-хосте (VPS, облачная VM, Hermes Cloud) каждый бот - то есть каждый профиль Hermes - получает собственный десктоп: Xfce поверх TigerVNC Xvnc. Инструменты computer_use и headed-браузер бота действуют на этом экране. У каждого профиля свой экран, свой профиль браузера и свои куки.
Стрим идёт в Hermes Desktop по обычному авторизованному подключению - SSH, URL с токеном или облако, что у тебя уже настроено. Отдельный VPN не нужен, и вот почему: Xvnc не открывает TCP-порт вообще. Он слушает Unix-сокет с правами 0600, без VNC-пароля, и единственный путь снаружи - авторизованный WebSocket гейтвея, через который стрим и доставляется в приложение. Атаковать снаружи нечего: экран снаружи просто не существует.
Экран живёт на сервере. Закрыл ноут, ушёл - бот продолжает работать на своём десктопе. Вернулся - открыл панель и смотришь.
Как включить
Три требования. Хост гейтвея - Linux: на Windows и macOS панель не предлагается, там есть настоящий дисплей. Пакеты TigerVNC и Xfce - они сами не ставятся никогда. Тулсет Computer Use с драйвером cua-driver.
Установка пакетов: кнопка Install on host в панели (один клик, sudo-пароль спрашивается маскированной картой и уходит только на этот хост), либо руками на сервере:
hermes computer-use screen install
Для Docker-развёртывания пакеты запекают в образ:
docker build --build-arg HERMES_BOT_DESKTOP=1 -t hermes-agent:screen .
Это слой на 550 МБ, при старте ничего не запускает - платить памятью приходится только пока экран поднят.
Экран по умолчанию выключен: никто не поднимет его за твоей спиной. Старт - кнопкой Start screen в панели, командой или авто-стартом:
bot_desktop:
geometry: "1440x900" # размер, вьюер масштабируется под панель
auto_start: true # поднять на первом computer_use или headed-браузере
min_free_memory_mb: 1536 # ниже этого свободной памяти старт отклоняется
idle_stop_minutes: 30 # брошенный экран гасится
auto_start удобен именно на сервере: экран поднимется сам, когда агенту понадобится дисплей, и погаснет через полчаса простоя.
Где смотреть
Три входа в Hermes Desktop. Bots → бот → Scheduled Jobs: живое превью экрана в самом верху, обновляется каждые пару секунд, клик разворачивает полный доступ. Правый клик по боту → Open Screen. И сайдбар сессий: такой же блок Screen под шапкой каждого профиля. В шапке чип, кто сейчас держит контроль.
Интерактив: Take over и Hand back
Кнопка Take over - рамка краснеет, клавиатура и мышь твои. Прошёл логин, ввёл код из смс, разгадал капчу, подтвердил оплату. Кнопка Hand back - бот заново захватывает экран и продолжает с той сессии, которую ты только что авторизовал.
Порядок работы с агентом при этом такой. Бот упёрся в шаг, который не должен делать сам, пишет об этом в чат и заканчивает ход. Ничего не висит: агент никогда не держит открытый вызов инструмента в ожидании тебя. Берёшь управление, когда удобно, делаешь своё, отдаёшь, говоришь продолжать.
Два зрителя на одном экране: последний Take over выигрывает, предыдущий переходит в режим наблюдателя.
Нюанс связи: если ноут уснул или Wi-Fi отвалился, пока ты держал контроль, контроль остаётся у тебя - бот ждёт, и это правильно, ты можешь быть посреди ввода пароля. После переподключения появится Hand back (force). Пока ты держишь управление, все вызовы computer_use и браузерных тулзов бота отклоняются с ошибкой human_has_control - включая скриншоты.
Киллер-фича: браузер переживает handoff
Пока экран запущен, браузер тулзов бота и иконка Browser в доке - один и тот же Chromium с общим профилем на диске сервера. Залогинился в сервис во время перехвата - бот дальше работает уже авторизованным, в этой и во всех последующих сессиях, пока сайт сам не разлогинит. Куки живут на VPS, не на твоём ноуте.
Чтобы работа самого агента была видна на экране - browser.headed: true, его браузер откроется на десктопе.
Из этого следует главный сценарий: любой сервис с человеческим входом становится доступен агенту на сервере. Ты один раз проходишь 2FA руками, бот делает всё остальное.
Сценарии
Первый - очевидный: логины, 2FA, капчи, оплата. В связке с хранилищем паролей бот сам заполняет сохранённые логины, а человеку остаются только шаги, которые физически требуют человека: код из смс, подтверждение в приложении банка.
Второй - отладка браузерной автоматизации. Скрипт агента кликает мимо кнопки. Раньше: слепой перебор селекторов по логам. Теперь: открыл экран и смотришь, что реально происходит в окне.
Третий - GUI-инструменты на сервере. Десктоп - обычный Xfce, ставится любой софт, а computer_use по определению умеет водить окна на своём экране. Браузер в доках - главный кейс, но не единственный технически возможный.
Четвёртый - ночные задачи с живой сессией. Cron-задача с авторизацией в сервисе: сессия живёт на сервере и переживает твой выключенный ноут.
Пятый - просто наблюдение: превью в Scheduled Jobs показывает, чем занят бот, без единого лога.
Ресурсы
Десктоп дешёвый: Xvnc и Xfce - около 220 МБ памяти, сотые доли ядра в простое. Дорогой - браузер: headed Chromium добавляет 0.5-1 ГБ. Итого закладывай 1.1-1.5 ГБ на каждый открытый экран с браузером. На хосте с 4 ГБ десктоп живёт, с 8 ГБ комфортно вместе с браузером. Гейт минимальной свободной памяти не даст стартовать без запаса, а уже запущенный экран не убьёт. Брошенный экран гасится через 30 минут и поднимается снова по первому использованию.
Безопасность: что это и чем не является
Lease на контроль - ограда на уровне инструментов, не на уровне ОС. Сокет экрана, X-дисплей, профиль браузера и файл lease принадлежат юзеру гейтвея, и любой процесс от его имени достан их напрямую - включая терминальный тул самого бота. Боты одного хоста шарат юзера, файлы и сеть. DevTools-порт Chromium доступен любому локальному юзеру хоста - ограничить его пер-юзерно Chromium не умеет. Изоляция ботов друг от друга в Bot Screen не входит: нужна - разноси боты по разным хостам.
Практическое правило: не вводи в бота секреты, которые не готов ему доверить.
Приятная деталь в защиту смотрящих: Xvnc не передаёт буфер обмена зрителям, так что наблюдатель не увидит, что копирует тот, кто за управлением. Вставка в экран при этом работает.
Грабли
Во время перехвата экран живёт на US-раскладке. На русской физической клавиатуре Y и Z и часть символов прилетят как их US-аналоги. Пароли вводи с этим в уме или переключи раскладку через setxkbmap на нужном дисплее.
Бот пишет human_has_control после того, как ты ушёл, - жми Hand back в панели или Hand back (force) после перезагрузки страницы. Из шелла: hermes computer-use screen stop --force - снимает lease и глушит экран; без force команда откажется, чтобы скрипт не выхватил живой перехват.
WSL2 считается полноценным Linux-хостом, но WSLg монтирует /tmp/.X11-unix только на чтение, и Xvnc не может создать сокет. Лечится разовым umount и пересозданием каталога с правами 1777; после рестарта WSL монтаж вернётся - повторить.
Официальный Docker-образ идёт без sudo: панель покажет готовую apt-get-строку, выполнить один раз через docker exec -u 0. И в образе лежит только headless-shell от Playwright, который не умеет рисовать окно: пока не поставишь полноценный chromium, иконки Browser в доке не будет.
CLI
hermes computer-use screen status # установлен? запущен? кто держит контроль?
hermes computer-use screen start # поднять экран этого профиля
hermes computer-use screen stop # погасить; откажется, пока человек за управлением
hermes computer-use screen stop --force # снять lease и погасить
hermes computer-use screen install # пакеты
hermes -p research computer-use screen start # экран другого бота
Что запомнить
Bot Screen превращает VPS с агентом в машину с настоящим рабочим столом: стрим в Hermes Desktop по уже настроенному подключению, интерактивный перехват на человеческих шагах, браузер с общей сессией между тобой и ботом, авточистка простаивающих экранов. Это не многопользовательский терминальный сервер: у каждого бота свой стол, но без изоляции на уровне ОС между ними. Для связки "агент живёт на сервере, человек подключается по мере надобности" - то самое недостающее звено.
Источник: официальная документация Bot Screen (hermes-agent.nousresearch.com/docs/user-guide/features/bot-screen).
