# Терминал

> Как агент Kodik выполняет команды: фоновые процессы, опрос вывода, заблокированные команды и добавление вывода в чат.

Источник: https://docs.kodik.ru/agent/terminal

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

## Выполнение команды

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

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

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

Если размер вывода превышает доступное контекстное окно, 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)`; процесс завершается, а его терминал освобождается. Вы также можете сами остановить любую фоновую команду из меню терминалов сессии на её вкладке чата.

:::tip
В режиме Debug агент автоматически использует `block_until_ms: 0` для запуска долгих процессов и `command_status` для сбора доказательств между попытками воспроизведения.
:::

## Заблокированные команды

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

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

- `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 *:* /`

Вы можете настроить список заблокированных команд в настройках авто-одобрения. Подробнее — в разделе [Авто-одобрение](https://docs.kodik.ru/agent/auto-approve).

## Авто-одобрение команд

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

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

## Добавление вывода терминала в чат

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