# Агент в терминале

> Агент, который читает, ищет и правит файлы в вашем проекте и выполняет команды на вашей машине с вашего одобрения.


Для этих команд нужен установленный CLI, в котором выполнен вход. См. [Установка CLI](/ru/cli/install).

Запустите `notholy` внутри проекта. Агент может использовать на вашей машине такие инструменты:

| Инструмент | Что делает |
|---|---|
| `read`, `grep`, `glob` | Чтение и поиск по файлам |
| `edit`, `write` | Изменение файлов |
| `bash` | Выполнение команды |
| `cve_lookup`, `kb_search`, `web_search` | Удалённые инструменты для исследований |

## Режимы

| Режим | Поведение |
|---|---|
| `plan` | Только чтение |
| `ask` | По умолчанию. Спрашивает перед каждой записью и каждой командой |
| `auto-edit` | Правит файлы без вопросов. Команды по-прежнему требуют подтверждения |
| `yolo` | Никогда не спрашивает. Требует `--yolo` при каждом запуске |

Команды выполняются на вашей машине под вашу ответственность. Серверы NotHoly никогда ничего не запускают против ваших целей.

Инструкции проекта положите в `NOTHOLY.md` в корне. Содержимое файлов и вывод команд считаются данными, а не инструкциями для агента.

Флаги: `--mode`, `--model`, `--yolo` и `-p`, чтобы выполнить один промпт и выйти.

Slash-команды: `/model`, `/effort` (off, low, high или max), `/mode` (plan, ask или auto-edit), `/cost`, `/compact`, `/autocompact`, `/mcp`, `/resume` (последняя сессия), `/exit`. Сессии сохраняются в `~/.notholy/sessions` с правами `600`.

```bash
notholy --mode plan -p "map the auth flow in this repo"
```

<a id="long-sessions"></a>

## Engagements

`notholy engage` фиксирует, чего может касаться тест, и сверяет с этим команды до запуска. Нужны имя, скоуп и ссылка на разрешение: договор, URL программы или тикет. Скоуп принимает хосты, маски `*.`, IP и CIDR. `--exclude` важнее скоупа, а `--from` и `--until` задают окно.

```bash
notholy engage init --name acme-q4 --scope "*.acme-staging.test,10.20.0.0/24" --exclude vpn.acme-staging.test --until 2026-12-20 --auth "contract 2026-117"
notholy engage status
notholy engage off
```

Правила и лог лежат в `~/.notholy/engagements/<id>/`, вне репозитория, поэтому репозиторий не может подсунуть свой скоуп. Ничего никуда не отправляется.

Пока engagement активен, агент извлекает цели из каждой команды `bash` до запуска. Команда в скоупе идёт через обычное подтверждение. Для цели вне скоупа нужно ввести хост, и исключение попадает в лог. `yolo` выключен. Для цели, известной только во время выполнения, например переменной shell, выводится предупреждение.

Каждое решение пишется в `log.jsonl` с командой, целями, кодом выхода и SHA-256 вывода, и каждая запись связана с хешем предыдущей.

`notholy connect claude` ставит ту же проверку как хук `PreToolUse` на вызовы Bash. Там команда вне скоупа запрещается.

Проверка читает текст shell и не резолвит DNS. Она ловит ошибки оператора и песочницей не является, поэтому команда может обратиться к хосту, которого в ней нет.

## Длинные сессии

У каждой модели есть размер контекста, он указан как `context_length` в `GET /v1/models`. Агент берёт его оттуда и сжимает переписку до того, как запрос превысит примерно 80% контекста. Когда это происходит, появляется тусклая строка.

При сжатии старая часть переписки заменяется одной сводкой, которую пишет модель сессии отдельным вызовом без инструментов. В сводке остаются цель, решения, затронутые файлы, находки, выполненные команды и открытые задачи. Системное сообщение, ваш последний запрос и самые новые сообщения, примерно до 30% контекста, не меняются, но очень длинный вывод инструмента в этой части может быть обрезан посередине. Вызов инструмента и его результаты никогда не разделяются. Вызов для сводки оплачивается как обычный запрос и учитывается в `/cost`.

| Команда | Что делает |
|---|---|
| `/compact` | Сжимает сейчас и выводит примерный размер до и после |
| `/compact keep the auth findings` | То же, и говорит сводке, на чём сосредоточиться |
| `/autocompact on\|off` | Включает или выключает автоматическое сжатие для этой сессии. В начале сессии включено |

Если вызов для сводки не удался, агент оставляет самые новые сообщения, отбрасывает более старые и сообщает об этом. Прерывание или ошибка аккаунта, кредитов или лимита запросов останавливает сжатие, и история остаётся целой. Если API отвечает [`context_length_exceeded`](/ru/guides/errors#context-length), агент сжимает переписку один раз и повторяет этот шаг. С `/autocompact off` вы получите ошибку.

## Что дальше

- [Подключение и запуск](/ru/cli/connect-and-run)
- [Инструменты harness](/ru/chat/harness)
