Как увидеть, что ваш ИИ-агент для кода выполняет на ваших серверах

Ваш агент работает на продакшен-сервере, а терминал сообщает лишь, что он вызывает инструмент. Какую команду он запустил и что ответила машина? Транскрипт расскажет об этом задним числом. Вот как мы сделали это видимым прямо во время работы, что попробовали сначала и как получить то же самое без нашего приложения.

Вы спрашиваете DevOps-агента, почему тормозит продакшен-API. Он принимается за работу. В его терминале появляется строка о том, что он вызывает инструмент, потом ещё одна, потом ещё. Через шесть вызовов он сообщает, что диск заполнен на 97 %, и предлагает почистить папку с логами.

Что он на самом деле запустил на этой машине? Какой du, какой find, успел ли он уже что-то удалить? Ответ существует, но он в транскрипте сессии, записан в JSON, и вы читаете его задним числом. На ноутбуке это нормально. На продакшен-сервере задним числом уже поздно говорить «стой, только не эту папку».

Мы делаем AgentsRoom, десктопное приложение, которое запускает агентов для кода и даёт им инструменты для доступа к вашим серверам, базам данных и кластерам. Это история о том, как мы сделали эти вызовы видимыми прямо во время выполнения: версия, которая не сработала, цифры той, что работает, и как получить то же самое, если вы не пользуетесь нашим приложением.

Короткий ответ

  • CLI показывает, что инструмент отработал, но не сессию на другой стороне. Полная команда и её вывод уходят в транскрипт на вашем диске.
  • Чтобы следить вживую, что-то должно записывать каждый вызов в момент его начала, а не по окончании сессии.
  • Один журнал на подключение работает. Одна вкладка терминала на команду нет. Мы насчитали 166 удалённых команд за одну сессию.
  • Храните этот журнал на своей машине. Командная строка на продакшен-хосте содержит секреты и данные клиентов.
  • Без нашего приложения: хук Claude Code, который дописывает каждую shell-команду в файл, даёт большую часть результата, а транскрипт дополняет остальное.

Почему транскрипта недостаточно на сервере

Claude Code, Codex и другие CLI действительно записывают всё. Claude Code пишет по одному файлу JSONL на сессию в ~/.claude/projects/, Codex в ~/.codex/sessions/. Каждый вызов инструмента там есть, с входными данными и результатом.

Проблема не в полноте, а во времени и форме. Транскрипт пишется для CLI, чтобы тот мог возобновить сессию. Вы читаете его, когда агент уже остановился, копаясь в строках JSON. Когда одновременно работают три агента, вы читаете три файла. А терминал агента, то место, куда вы действительно смотрите, показывает лишь свёрнутую сводку по каждому вызову.

Для кода на ноутбуке прочитать всё потом это обычный цикл проверки: вы смотрите diff перед коммитом. У сервера нет diff. systemctl restart или DELETE вступает в силу в ту же секунду, когда выполняется.

Что мы попробовали сначала, и 166 команд

Наш первый удалённый инструмент для агентов открывал подключение во вкладке терминала. Это выглядело правильно: пользователь видел сессию. Но провалилось это так, как мы не ожидали.

Инструмент не давал агенту никакой возможности прочитать, что произошло во вкладке, которую он только что открыл. И в проекте одного пользователя агент перестал им пользоваться. Счёт той сессии: 16 вызовов нашего инструмента подключения и 166 команд sshpass, выполненных через собственный shell-инструмент агента, причём агент спрашивал у пользователя пароль, а пользователь вставлял его в чат. Продакшен-учётные данные оказались открытым текстом в транскриптах, в ps aux во время выполнения каждой команды и в файле в /tmp.

Урок был не в том, что «агенты безрассудны». Агент сделал единственное, что работало. Безопасный инструмент, который не даёт агенту делать свою работу, обходят, и обходной путь хуже, чем отсутствие инструмента.

Поэтому мы написали ssh_exec: агент отправляет одну команду, AgentsRoom выполняет её на сохранённом подключении, храня пароль внутри приложения, и возвращает вывод и код выхода. Агент никогда не видит учётные данные, и у него нет причин собирать строку sshpass.

Это решило проблему безопасности и создало проблему видимости. Если бы каждый ssh_exec открывал вкладку, та сессия породила бы 166 вкладок. Поэтому ssh_exec не открывал ни одной, и два месяца единственным местом, где можно было увидеть эти команды, снова оставался диалог с агентом.

Один журнал на подключение

Версия, которую мы выпустили 29 октября 2026 года (AgentsRoom 1.242.0), держится одного правила: никаких вкладок на команду. Вместо этого каждый вызов попадает в журнал, по одному на подключение.

  • Вкладка «Активность» на правой панели, рядом с «Файлы», «Изменения» и «Тесты», показывает карточками подключения, которых касались агенты (последняя команда, агент, время, состояние), и 40 последних вызовов на ленте. Её можно фильтровать по агенту и искать по командам, именам подключений и выводу.
  • Журнал подключения читается как терминал: агент · время, затем $ команда, затем вывод, затем Готово · код выхода 0 · 1,2 с. Вывод SSH прокручивается вживую, и вид следует за концом, пока вы не прокрутите вверх. Одна кнопка копирует весь журнал текстом.
  • Плашки в заголовке агента, по одной на каждый сервер, базу данных или кластер, которых он касался, с зелёной точкой во время вызова. Один клик открывает этот журнал.
  • Значок «Агент работает» в строке подключения в окнах «Серверы», «Базы данных» и Kubernetes, только пока идёт вызов.

Журнал только для чтения. Чтобы самому вводить команды на машине, по-прежнему используется вкладка SSH окна «Серверы». Полная страница функции: SSH-подключения для ИИ-агентов, а часть про базы данных описана на странице подключений к базам данных.

Что записывается, а что нет

ВызовВ журналеПочему
ssh_exec (SSH, AWS SSM, WinRM)ДаОсновной случай: команда на удалённой машине без собственной вкладки
ssh_transferДаФайл, скопированный на сервер или с него, это действие на этом сервере
db_query, db_schemaДаSQL в том виде, в каком его написал агент, и первые строки результата
kube_kubectlДаПоказывается как строка kubectl с аргументами
commands_run, ssh_connectНетОни и так открывают вкладку терминала, за которой можно следить
Собственный shell-инструмент агента (ssh, psql, kubectl, набранные напрямую)НетОн не проходит через AgentsRoom: это есть в терминале и транскрипте агента

Последняя строка и есть честное ограничение. Журнал видит то, что проходит через наши инструменты. Если вы хотите, чтобы там отображалось каждое удалённое действие, инструменты должны быть для агента самым простым путём. В этом и урок 166 команд.

Ещё одна деталь: вывод в процессе выполнения команды транслирует только SSH, потому что он идёт через настоящий терминал на вашей машине. Результаты WinRM, SQL и kubectl появляются, когда вызов завершается.

Во что обходится ведение журнала

Наши пользователи запускают много агентов одновременно: 45 агентов в 18 проектах на одной машине, 48 консолей на другой. Всё, что считается на агента или на фрагмент вывода, умножается на эти числа, поэтому у журнала жёсткие пределы:

  • 120 вызовов на проект, самые старые удаляются первыми.
  • 32 000 символов вывода на вызов, сохраняется конец, где находятся ошибки и коды выхода.
  • 2 000 символов команды или SQL на вызов.
  • Одно сообщение об обновлении на вызов каждые 120 мс для вывода в реальном времени, никогда не по одному на каждый фрагмент вывода терминала.
  • Никаких таймеров в простое. Пока ни один агент не вызывает удалённый инструмент, журнал ничего не стоит.

Запись происходит в одной точке: в мосте, через который проходят вызовы инструментов всех CLI. Поэтому всё работает одинаково для Claude Code, Codex, Antigravity CLI или любого другого CLI, который запускает приложение, без отдельного кода для каждого провайдера.

Ограничение, которое мы выбрали: ничего не покидает машину

Журнал хранится в памяти десктопного приложения и исчезает, когда вы его закрываете. Он не синхронизируется с нашими серверами, что для нас необычно: почти всё остальное в AgentsRoom следует за вашим аккаунтом с компьютера на компьютер.

Журнал нет, и это намеренно. Вывод env на сервере содержит секреты. SELECT по таблице клиентов содержит данные клиентов. Инструмент, созданный, чтобы сделать это видимым, не должен ещё и копировать это куда-то в новое место.

Телефон может следить за тем же журналом из профиля агента (мобильное приложение 2.47 и новее). Поток идёт с вашего компьютера на телефон по сквозному зашифрованному каналу, секреты маскируются до отправки (API-ключи, пары KEY=value, пароли в URL, токены), и на сервере ничего не хранится. Тот же вызов, как и раньше, остаётся читаемым в диалоге с агентом.

Аудит-логи Claude Code это другое

Если вы искали «Claude Code audit log», вы, вероятно, нашли Compliance API от Anthropic для Claude Enterprise: ленту активности, события аудит-лога и, для локальных сессий с входом в аккаунт Enterprise, транскрипты сессий. Он создан для администраторов и команд по комплаенсу, охватывает организацию, и читают его задним числом.

Он отвечает на вопрос «кто в компании что сделал с Claude». Он не отвечает на вопрос «какую команду мой агент выполняет на сервере базы данных прямо сейчас». Одно не мешает другому, и если вы работаете в компании с требованиями комплаенса, первое вам, скорее всего, нужно в любом случае, чем бы вы ни пользовались для второго.

Если вы не пользуетесь AgentsRoom

Значительную часть этого можно получить тем, что уже дают CLI.

Логируйте каждую shell-команду в момент её запуска. Хуки Claude Code могут выполнять команду перед каждым вызовом инструмента. В руководстве по хукам показан этот шаблон: хук PreToolUse на инструменте Bash, который передаёт jq -r .tool_input.command в лог-файл. Запустите tail -f на этом файле во втором терминале, и вы будете видеть каждую команду в момент, когда агент её отправляет, включая строки ssh.

Читайте транскрипт, когда нужен вывод. Хук даёт вам команду, но не то, что ответил сервер. Для этого есть файл сессии в ~/.claude/projects/ (или ~/.codex/sessions/ для Codex) с полным результатом каждого вызова.

Дайте агенту собственную учётную запись на сервере. Отдельный пользователь делает каждое подключение атрибутируемым в журнале аутентификации сервера, а если на ваших серверах работает auditd, правило на execve для этого пользователя записывает каждый запущенный им процесс на стороне сервера, где агент не может это обойти.

Держите учётные данные вне досягаемости агента. Если единственный способ подключиться это пароль, который агент должен у вас спросить, вы увидите строки sshpass в чате. Используйте ключ, который агент никогда не читает, или инструмент, который хранит секрет за него. Мы написали отдельное руководство о том, как передать агенту секрет, не вставляя его в промпт.

Чего такая схема не даёт, так это связи между тремя вещами: какой агент, на каком подключении, с каким выводом в реальном времени, в одном месте. Именно эту часть мы и построили.

Вопросы, которые действительно задают

Можно ли видеть, что Claude Code делает на удалённом сервере, пока он работает?

В терминале вы видите вызов инструмента, а после его завершения короткий результат. Полная команда и её вывод записываются в транскрипт сессии на вашем диске, и читаете вы его потом. Чтобы следить за этим в реальном времени, нужно что-то, что записывает каждый вызов в момент его начала: хук в Claude Code, который пишет каждую команду Bash в лог-файл, или приложение, которое выполняет удалённые вызовы за агента и показывает их вживую. Именно это делает вкладка «Активность» в AgentsRoom.

Где Claude Code хранит запись о командах, которые он запускал?

В транскрипте сессии, файле JSONL в ~/.claude/projects/: одна папка на проект и один файл на сессию. Каждый вызов инструмента там отдельная строка с входными данными и результатом. Codex хранит похожий файл для каждой сессии в ~/.codex/sessions/. Оба файла полные, и оба написаны для того, чтобы CLI мог возобновить сессию, а не для того, чтобы их просматривал человек.

Это то же самое, что аудит-логи Claude Code?

Нет. Аудит-логи, которые ищут под этим названием, это записи на уровне организации, которые Anthropic предлагает в тарифе Enterprise через Compliance API: лента активности, события аудита и, для сессий с входом в аккаунт, транскрипты, которые позже читает администратор. Они отвечают на вопрос, кто что сделал в организации. Просмотр команд на одном сервере в реальном времени это другой инструмент для другого человека.

Почему бы не открывать по вкладке терминала на каждую команду агента?

Мы пошли этим путём и всё измерили: агент, разбиравший инцидент на продакшене, выполнил 166 удалённых команд за одну сессию. Вкладка на каждую команду делает панель вкладок бесполезной уже через десять минут. Работает другое: один журнал на подключение, где каждый вызов это запись с командой, выводом в реальном времени, кодом выхода и длительностью.

AgentsRoom отправляет команды и их вывод на сервер?

Нет. Журнал живёт в памяти десктопного приложения, ограничен 120 вызовами на проект и исчезает, когда вы закрываете приложение. Телефон может следить за ним из профиля агента (мобильное приложение 2.47 и новее): поток идёт с вашего компьютера на телефон по сквозному зашифрованному каналу, секреты замаскированы, и на сервере ничего не хранится.

Какие команды агента вкладка «Активность» не показывает?

Записываются только вызовы, которые проходят через инструменты AgentsRoom: ssh_exec, ssh_transfer, db_query, db_schema и kube_kubectl. Команда, которую агент выполняет своим собственным shell-инструментом, например голая строка ssh или psql, есть в его терминале и транскрипте, но не в журнале. commands_run и ssh_connect исключены намеренно: они и так открывают вкладку терминала, за которой можно следить.

Коротко

Агенту на сервере нужны от вас две вещи: способ работать, не связанный с вашим паролем, и способ для вас видеть, что он делает, пока он это делает. Первое без второго оставляет вас читать JSON задним числом. Второе без первого обходит агент, который вставляет строки sshpass.

В итоге у нас получился один журнал на подключение, ограниченный по размеру и хранящийся на вашей машине. Если хотите попробовать, AgentsRoom можно скачать бесплатно, а на странице SSH-подключений настройка показана шаг за шагом. Если предпочитаете остаться только со своим CLI, начните с хука PreToolUse и tail -f: это займёт пять минут, и вы больше никогда не будете гадать, какими были последние шесть вызовов инструментов.

Скачать AgentsRoom

Запускай всех своих ИИ-агентов во всех проектах из одного окна.

БесплатноСкачать AgentsRoom

Приложение-компаньон: следите за агентами на ходу

Используйте Claude, Codex, Antigravity CLI или другого поставщика AI.

Установить расширение
Chrome Web Store

Отправляйте баги и запросы прямо в ваш публичный бэклог.

Мульти-проекты
Мульти-провайдер
Мульти-агенты
Статус онлайн
Diff и коммиты
Мобильное приложение
Live-превью
Команды агентов
Тесты в браузере
Разработка от backlog
Библиотека промптов
Библиотека навыков
Все функции

Читать далее