У командной строки есть режим протокольного сервера для сторонних клиентов. Он работает поверх стандартных потоков и обменивается сообщениями по одному на строку: инициализация, аутентификация, создание или загрузка сессии, отправка запроса, поток обновлений, запрос разрешения и при необходимости отмена. Это тот случай, когда порядок сообщений - часть контракта, а не деталь реализации: пропущенная инициализация или запрос до создания сессии не дают деградации, они дают отказ, и разбирать его придётся по протоколу, а не по логу приложения.
Самая частая ошибка при написании такого клиента - проигнорировать запрос разрешения. Клиент обязан ответить одним из вариантов: разрешить один раз, разрешить всегда или отклонить. Если ответа нет, выполнение инструмента просто повисает, и со стороны это выглядит как зависший агент. Ошибка тем коварнее, что на простых сценариях без инструментов клиент работает нормально: первые запросы отвечают текстом, ничего не запрашивая, и проблема всплывает позже, когда агент впервые решает прочитать файл или запустить команду.
Рядом живут более приземлённые вещи: настройка интеграции с терминалом, режим оболочки и конфигурация для облачного провайдера моделей. Их объединяет то, что все они про окружение, а не про агента. И именно окружение чаще всего оказывается причиной непонятных сбоев - особенно в корпоративной сети, где между процессом и сервисом стоит чужая инфраструктура, о существовании которой разработчик обычно узнаёт из сообщения об ошибке.
Прокси и сертификаты стоит разобрать отдельно, потому что здесь чаще всего идут кривым путём. Корпоративный прокси задаётся привычными переменными окружения, а собственный корневой сертификат подключается отдельной переменной. Соблазн вместо этого отключить проверку сертификатов велик и понятен: помогает сразу и на всех машинах. Но это не исправление, а снятие защиты - вместе с ней уходит и способность заметить подмену, а сама настройка имеет свойство переезжать из локальной отладки в образ сборки и оставаться там годами.
Полезно один раз собрать команды первичной диагностики. Ниже - версия, статус входа, общая информация и запуск протокольного сервера. С этих команд начинают любой разбор: они отвечают, что именно запущено, кто вошёл и в каком состоянии находится агент. Дальше диагностика идёт от симптома, а не от догадки, и первое, что она обычно показывает, - что запущена не та версия, которую вы имели в виду.
Полезно и свести симптомы с первым шагом проверки в таблицу. Ниже такая карта: команда не найдена, вход зацикливается, сетевая ошибка, бесконечные запросы разрешений, отсутствующий инструмент, сломанное сочетание клавиш в терминале. Ценность её в том, что она разворачивает диагностику: вместо вопроса что сломалось вы отвечаете на вопрос какой слой проверить первым.
| Симптом | Что проверить первым |
|---|---|
| Команда не найдена | Переменная путей и место установки |
| Вход зацикливается | Доступность браузера, хранилище учётных данных, запрет открывать браузер |
| Сетевая ошибка | Переменные прокси, корневой сертификат, домены сервиса |
| Бесконечные запросы разрешений | Конфигурация, списки разрешённого и запрещённого, политика администратора |
| Инструмент отсутствует | Список инструментов сервера, область видимости плагина или навыка |
| Сломано сочетание клавиш | Настройка интеграции с терминалом и справочник терминала |
Разберём одну строку до конца, потому что она показывает метод. Сетевая ошибка в корпоративной сети почти всегда сводится к двум разным причинам, и различить их можно по тому, где обрывается соединение. Если запрос вообще не уходит или упирается в отказ по адресу, дело в переменных прокси: процесс не знает, через кого ходить наружу. Если соединение устанавливается, но падает на проверке подлинности, дело в сертификате: наружный шлюз подписывает трафик своим корнем, а процессу этот корень неизвестен. Разные причины лечатся разными настройками, и подбор наугад тут особенно расточителен, потому что каждая проверка стоит полного цикла запуска.
У такой таблицы есть граница применимости, и её стоит назвать. Она хороша, пока сломан один слой; при двух одновременных отказах первый шаг проверки выводит на верную причину, но не устраняет симптом, и разбор буксует. Практический признак этого случая - исправление, которое меняет сообщение об ошибке, но не убирает его. Тогда работает не таблица, а сравнение сред: тот же запуск в чистой оболочке, на другой машине или под другой учётной записью показывает, что именно вносит ваша среда, и разбор сужается до различия между двумя окружениями, а не до перебора настроек.
Инженерный вывод простой: большинство загадочных проблем командной строки - это окружение. Путь, браузер, хранилище учётных данных, прокси, сертификат, права, область видимости плагинов. Продукт при этом ведёт себя ровно так, как задумано, и поиск бага в нём отнимает время, которое стоило потратить на проверку среды. Первый шаг любого разбора - зафиксировать версию и статус, второй - воспроизвести в чистой среде, и только третий - подозревать инструмент.
Типичные провалы предсказуемы. Написать клиента протокола без обработки запроса разрешений и получить зависание на первом же вызове инструмента. Отключить проверку сертификатов вместо подключения корпоративного. Искать баг продукта там, где дело в переменной путей. Чинить два одновременных отказа как один. И начинать разбор не с фиксации версии и статуса, а с догадок.
agent --version
agent status
agent about
# Протокольный сервер для собственного клиента
agent acp