Агент жмёт элемент по ref, а не по пикселю
Скриншот рабочего стола долго казался коротким путём: локальный ИИ-агент видит то же, что человек, и нажимает кнопку. На практике картинка тяжёлая, координата плывёт из-за масштаба и сдвига окна, а в кадр попадает соседняя переписка. 3 ноября в репозиторий agent-desktop от Vercel Labs вошёл MCP. Самодельный разбор строк больше не обязателен. Утилита читает дерево доступности уже открытой программы на macOS, Windows и Linux и отдаёт JSON с ref у элемента. Модели внутри нет: клик и ввод делает ваш агент по этой ссылке, шаг "сначала сфотографируй весь экран" выпадает. В описании 60 имён команд, рабочие из них 56. key-down, key-up, mouse-down и mouse-up не выполняются без фонового процесса, который отпустит клавишу: иначе агент легко нажмёт модификатор и не отпустит. По умолчанию курсор не едет и фокус не меняется, живой ввод - флаг --headed. Платформы: macOS 13 и новее, Windows 10 1809 и новее, Ubuntu 24.04 и новее, X11 или Wayland. Лицензия Apache-2.0, вместе с MCP подготовили версию 1.1.0. Свой разбор строк мы уже ловили: стоит полю переехать на другую строку - агент теряет кнопку и начинает "чинить" промпт. Готовый MCP забирает этот класс поломок. Проверка короткая, это ещё не контур заказчика. - npm install -g agent-desktop, затем agent-desktop status. На Mac: agent-desktop permissions --guide. Без разрешения на доступность дерево пустое, модель это не компенсирует. - Снимок одного приложения: agent-desktop snapshot --app Finder -i. Ref берёте вместе с id снимка. Голый @e8 без id - ошибка: ссылка без снимка не привязана к окну. - В MCP: команда agent-desktop, аргумент mcp. Модель выбирает один ref, инструмент действует, новый снимок показывает, изменилось ли окно. Модель подставляете вы. Утилита отдаст дерево и локальной модели, и облачной. Локальный ИИ-агент здесь значит локальные руки. Устаревший ref приходит как STALE_REF или AMBIGUOUS_TARGET: список прокрутили, диалог закрылся или кнопка перерисовалась. Дерева нет у самописного окна на голых пикселях, части терминалов и старых оболочек. Подкрутка промпта не создаст ref из ничего. Скриншот - другой канал: другие права, другая утечка, другая ошибка координаты. Не тот же режим, только с картинкой. В JSON имена файлов, темы писем, цифры в полях. Снимки, буфер обмена и скриншоты могут содержать личные данные стола. Если текст уходит в чужой контур, клик ничего не прячет. Четыре команды удержания клавиши без фонового процесса лучше не закладывать: зависший Shift хуже честного отказа. До первого боевого окна: - Снимок только одного приложения, как с Finder. Весь стол слишком широк: агент видит то, что человеку показывать не собирались. - Id снимка храните с ref, ссылку не переиспользуйте после действия. - Сначала смотреть, потом менять. Сначала снимки и журнал выбранного ref. Запись, отправку и удаление - когда человек узнал свои кнопки в JSON и согласен, что агент попадёт именно в них. - Куда уезжает дерево, решите раньше модели. Локальная модель или российский контур уместны не потому, что утилита безопасна сама по себе, а потому что содержимое окна не должно гулять с запросом. В Интеллект Технологии начинаем с вопроса, что инструмент видит, и только потом выбираем, кто читает JSON. --headed включайте, если сотрудник должен увидеть действие и успеть остановить процесс. Без курсора оставляйте флаг там, где за машиной никого нет. Нет разрешений системы - фраза "агент установлен" пустая: дерева нет, клика нет. agent-desktop не делает модель внимательнее. Он убирает гадание по пикселям там, где дерево доступности есть, и оставляет короткую петлю: снимок, один ref, действие, новый снимок. Проверьте на одном живом приложении и сразу договоритесь, куда девается JSON. Нет дерева или в нём чужие данные - включать агента "посмотрим" дороже, чем отложить. Полностью - в блоге: https://inteltek.ru/blog/182