Перейти к содержимому

Терминал

Агент Kodik выполняет команды в терминале через инструмент shell. Каждый вызов привязан к рабочему каталогу текущей задачи, виден в чате и требует подтверждения — если только оно не настроено автоматически.

Когда агент вызывает shell, команда появляется в чате со статусом pending. Вы можете одобрить или отклонить её. После выполнения агент получает ограниченный результат команды и реагирует на него.

Команды выполняются в оболочке вашего терминального профиля по умолчанию (Terminal: Select Default Profile), и агент пишет команды в синтаксисе именно этой оболочки — например Git Bash, Command Prompt, Cygwin или PowerShell на Windows, либо zsh на macOS. Если выбранный профиль добавлен расширением, Kodik просит VS Code создать именно этот профиль, а не подставляет другую оболочку.

Если активная интеграция с оболочкой сообщает о готовности приглашения, Kodik ждёт этого сигнала перед вводом команды. Это не позволяет медленному запуску оболочки — особенно инициализации PowerShell в Windows — поглотить первый символ команды.

Kodik использует интеграцию с оболочкой, чтобы получить код завершения и вывод именно текущей команды. Перед завершением команды Kodik дожидается последней порции вывода из очереди терминала, поэтому даже очень быстрые команды не отображаются как не выведшие ничего. Если выбранная оболочка не может передать код завершения, команда получает нейтральный статус «Завершение не подтверждено», а не ошибку. Агент всё равно получает собранный вывод и не перезапускает команду только ради проверки статуса.

Вывод команды остаётся свёрнутым в карточке чата. Большой вывод хранится в нативной сессии и не копируется в каждое обновление чата; при открытии раздела Command Output Kodik загружает и показывает сохранённый вывод. Если чтение временно завершается ошибкой, карточка показывает её и действие Повторить. Ограниченный результат, передаваемый агенту, при этом не сокращается.

Сбор большого вывода ограничен по байтам. При превышении лимита Kodik сохраняет начало и последние данные на корректных границах Unicode и вставляет уведомление OUTPUT TRUNCATED с числом байтов, пропущенных из середины. Одна очень длинная строка остаётся целой, если укладывается в лимит для модели, а усечение не меняет идентификатор, статус, код завершения или отмену команды.

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

Артефакты полного вывода изолированы по командам и сессиям, доступны только владельцу в POSIX-системах, ограничены 512 МиБ на файл и удаляются через семь дней либо при превышении 100 файлов или 2 ГиБ общего кэша. При удалении чата удаляются и его артефакты. Если файл уже очищен, превысил лимит или не смог записаться, карточка показывает Полный вывод недоступен, а не устаревшие или выдуманные данные.

Если размер вывода превышает доступное контекстное окно, Kodik автоматически запускает сжатие контекста перед возвратом результата.

Обычные одноразовые команды агент запускает в режиме foreground: он ждёт код завершения и финальный собранный вывод, прежде чем продолжить. Если foreground_timeout_ms не задан, общего ограничения по длительности ожидания нет; после пяти минут без вывода тот же процесс переводится в фон. Агент может явно задать foreground_timeout_ms как более раннюю страховку. При срабатывании любого из этих ограничений Kodik возвращает управление, но не завершает и не перезапускает команду. Для заведомо постоянных процессов — dev-серверов, watch-режимов и стриминга логов — агент сразу выбирает режим background. Все фоновые пути возвращают terminal_id, пока процесс работает.

# Запуск в фоне
terminal_id = shell("npm run dev", mode="background")
# Проверка прогресса при необходимости
get_terminal_output(terminal_id=terminal_id)
# Остановка по завершении (или для перезапуска)
kill_terminal(terminal_id=terminal_id)

Когда фоновый процесс завершается, Kodik автоматически обновляет исходную карточку shell его финальным статусом и выводом и уведомляет агента во время активного хода. Агент вызывает get_terminal_output только для проверки текущего прогресса или новых логов до завершения; блокирующий параметр wait_ms позволяет обойтись без частого опроса. Так агент может самостоятельно мониторить логи сервера, не требуя от вас вставлять вывод вручную.

Каждый результат get_terminal_output содержит вывод только соответствующей фоновой команды, без вывода предыдущих команд из переиспользуемого терминала. Возвращённый terminal_id остаётся доступным для проверки, даже если быстрая фоновая команда завершилась до следующего запроса статуса. Если процесс завершился без определяемого кода, get_terminal_output сообщает «Завершение не подтверждено», а не внутреннее значение вроде undefined. Когда Kodik подтверждает, что в сессии нет фоновых терминалов, повторные попытки с другими идентификаторами останавливаются, а агент получает указание изменить подход.

Фоновая команда занимает собственный терминал, поэтому она никогда не блокирует следующую команду агента — агент может запустить dev-сервер и сразу же выполнять команды против него (каждая команда выполняется в отдельном терминале, по возможности переиспользуя свободный). Когда фоновый процесс больше не нужен или его требуется перезапустить после изменения, агент останавливает его вызовом kill_terminal(terminal_id); процесс завершается, а его терминал освобождается. Вы также можете сами остановить любую фоновую команду из меню терминалов сессии на её вкладке чата.

Некоторые команды никогда не одобряются автоматически — даже в режиме автопилота. Это защита от случайного удаления данных или деструктивных системных операций. По умолчанию заблокированы:

Удаление файлов:

  • rm *, sudo rm *
  • del *, rd *, rmdir *, Remove-Item *, ri *

Деструктивные команды Git:

  • git clean*

Поиск с удалением:

  • find * -delete*, find * -exec rm*

Работа с дисками:

  • mkfs*, dd if=*, format *

Системные операции:

  • shutdown*, reboot*

Прочие опасные:

  • > /dev/*, :(){:|:&};:, chmod -R 777 /, chown -R *:* /

Вы можете настроить список заблокированных команд в настройках авто-одобрения. Подробнее — в разделе Авто-одобрение.

Если авто-одобрение включено, агент проверяет команду по настроенным шаблонам (например, npm run * или git *). Если команда совпадает с шаблоном и не входит в список заблокированных, она выполняется без запроса.

В режиме автопилота одобряются все команды, кроме заблокированных. Уведомление отображается, если команда выполняется в фоне более 30 секунд.

Вы можете вручную добавить вывод из встроенного терминала VS Code в контекст чата с помощью команды Add Terminal Output to Chat (kodik.addTerminalOutputToChat). Команда доступна через контекстное меню терминала и через палитру команд. Это удобно, когда нужно показать агенту вывод команды, которую вы запускали самостоятельно.