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

Терминал

Агент 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 автоматически запускает сжатие контекста перед возвратом результата.

Для долгих процессов — dev-серверов, watch-режимов, стриминга логов — используйте параметр block_until_ms: 0. Он запускает команду в фоне и немедленно возвращает terminal_id, не блокируя работу агента.

# Запуск в фоне
terminal_id = shell("npm run dev", block_until_ms=0)
# Опрос вывода
command_status(terminal_id=terminal_id)
# Остановка по завершении (или для перезапуска)
kill_terminal(terminal_id=terminal_id)

Вызывайте command_status с полученным terminal_id, чтобы получать инкрементальный вывод по мере его появления. Таким образом агент может самостоятельно мониторить логи сервера, не требуя от вас вставлять вывод вручную.

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

Фоновая команда занимает собственный терминал, поэтому она никогда не блокирует следующую команду агента — агент может запустить 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). Команда доступна через контекстное меню терминала и через палитру команд. Это удобно, когда нужно показать агенту вывод команды, которую вы запускали самостоятельно.