Мост для управления Windows
Мост, через который LLM-агент на Linux управляет настоящим рабочим столом Windows: читает дерево интерфейса, кликает и печатает в живой сессии. Работает и с Linux-десктопом через AT-SPI.
На macOS у агентов computer use есть из коробки: Claude на маке умеет сам смотреть экран, кликать и печатать в окнах. На Windows и Linux нативного computer use нет — агент там умеет только терминал и код. Я стал разбираться, как дать агенту на Linux управление живым рабочим столом Windows, и в итоге собрал этот мост.
Зачем
Агенты вроде Claude Code и Codex отлично работают с кодом и терминалом, но многие задачи живут только в GUI: десктопные приложения, системные диалоги, программы без API. Готовые решения computer use обычно смотрят на экран «глазами»: скриншот → координаты → клик. Это медленно, дорого по токенам и ломается от любого сдвига. Мост даёт агенту текстовый доступ к интерфейсу.
Что умеет
- Окна, элементы и их значения читаются из дерева доступности (UI Automation на Windows, AT-SPI на Linux), а не со скриншота.
- Клик и ввод — по селектору (
automation_id,name,role), координаты не нужны. - Ожидание «пока появится / станет активной / исчезнет» выполняет сервер; несколько шагов с ожиданиями уходят одним HTTP-запросом — до 64 шагов в пакете.
- Скриншот активного окна или всего стола — только когда без него не обойтись.
- Запуск программ с аргументами; права администратора — только явным
elevated: true. - Безопасность: токен, прослушивание только
127.0.0.1, аренда стола для одного агента, проверка «под курсором именно то окно» перед каждым кликом.
Как устроено
Агент подключается по MCP или HTTP через SSH-туннель к server.py на целевой машине. Платформа выбирается автоматически: на Windows — Win32 + UI Automation, на Linux — X11/XTest + AT-SPI2. Для агента API одинаковый, ему всё равно, какая ОС на той стороне. В комплекте MCP-сервер — мост подключается к Claude Code и Codex как обычный набор инструментов.
Цифры
Один и тот же сценарий — 8 блоков, шесть приложений: Блокнот, буфер обмена, веб-приложение в WebView2, редактор реестра, Docker Desktop, перетаскивание окон. Его проходил агент по мере доработки моста:
| Первая версия | Ожидания на сервере | Ожидания в пакетах | |
|---|---|---|---|
| Время | 12:04 | 8:30 | 5:54 |
| Баллы из 100 | 99 | 100 | 100 |
| Шагов модели | 91 | 51 | 30 |
| Вызовов inspect | 98 | ~17 | 7 |
Главный выигрыш дал перенос ожиданий на сервер: блок «создать раздел реестра и строковый параметр» стал одним запросом из 19 шагов вместо десятка опросов.
Как проект делался
Мост собран примерно за сутки в паре LLM-агентов. Codex на Windows-машине писал и чинил Windows-часть, а Claude Code на Linux прогонял сценарии через туннель, замерял время и токены, находил баги и заводил issue с шагами воспроизведения. Codex исправлял, Claude проверял исправление на живой сборке — так прошло около десяти циклов «issue → исправление → проверка». Агенты при этом общались через тот же мост: Claude на Linux печатал задачи в окно Codex на Windows. Linux-версию Claude Code написал и проверил на изолированном столе Xvfb.
Ограничения
- Окно UAC и экран блокировки мост не видит и не нажимает: это защищённый рабочий стол Windows, такие места оставлены человеку.
- Мышь и клавиатура общие с человеком: аренда защищает от второго агента, но не от человека за компьютером.
- На Linux — только X11; на Wayland XTest достаёт лишь до окон XWayland.