{"meta":{"title":"Ссылка на крючки GitHub Copilot","intro":"Найдите события крючков, форматы конфигурации и входные полезные нагрузки для хуков в Copilot CLI и Copilot cloud agent.","product":"GitHub Copilot","breadcrumbs":[{"href":"/ru/copilot","title":"GitHub Copilot"},{"href":"/ru/copilot/reference","title":"Справочные материалы"},{"href":"/ru/copilot/reference/hooks-reference","title":"Ссылка на Hooks"}],"documentType":"article"},"body":"# Ссылка на крючки GitHub Copilot\n\nНайдите события крючков, форматы конфигурации и входные полезные нагрузки для хуков в Copilot CLI и Copilot cloud agent.\n\n## Introduction\n\nХуки — это внешние команды, которые выполняются в определённых жизненных точках сессии, обеспечивая индивидуальную автоматизацию, управление безопасностью и интеграции.\n\nКрючки поддерживаются двумя Copilot поверхностями: Copilot CLI и Copilot cloud agent. Большинство конфигурационных форматов и событий одинаковы, но окружение выполнения и набор событий, которые могут запускаться, различаются.\n\nНа протяжении всей статьи поведение, отличающееся между двумя поверхностями, отмечается в заметках «только для CLI» и «только для облачных агентов». Всё, что не отмечено, относится к обеим.\n\n## Местоположение крючков\n\nМеста, где запускаются крючки и где можно хранить конфигурационные файлы крючков, зависят от поверхности:\n\n* **Copilot CLI** — крючки запускаются на локальной машине разработчика в той же оболоке, что и CLI. Все события с крючками, описанные в этой статье, поддерживаются CLI.\n\n  Крючки загружаются из следующих источников в порядке (policy, затем user, project и плагины) и объединяются. Когда одно и то же событие появляется в нескольких источниках, выполняются все записи хуков из всех источников.\n\n  * **Файлы крючков на уровне политики** — JSON-файлы в платформенном каталоге политик, загруженных в алфавитном порядке. Крючки полисов работают по всей машине и загружаются раньше всех остальных крючков. Их нельзя отключить и `disableAllHooks` они доступны независимо от состояния доверия папок. См. [раздел «Крючки по политике](#policy-hooks) » ниже.\n  * **Hook на уровне репозитория —**`.github/hooks/*.json` в корне репозитория.\n  * **Файлы хуков на уровне** пользователя — `*.json` файлы в каталоге hooks на уровне пользователя. По умолчанию это `~/.copilot/hooks/` на macOS и Linux или `%USERPROFILE%\\.copilot\\hooks\\` на Windows. Если `COPILOT_HOME` установлено, то это .`$COPILOT_HOME/hooks/`\n  * **Встроенный `hooks` блок в настройках репозитория** — `hooks` поле на верхнем уровне ( `.github/copilot/settings.json` Git committed) или `.github/copilot/settings.local.json` (обычно gitignore и пользователю) в репозитории. Также читаются кросс-инструменты `.claude/settings.json` и `.claude/settings.local.json` файлы в репозитории.\n  * **Встроенный `hooks` блок в пользовательской конфигурации** — `hooks` поле на верхнем уровне `~/.copilot/settings.json`.\n  * **Крючки, добавленные установленными плагинами** — объявленные каждым плагином в отдельном `hooks.json` (или ниже `hooks/hooks.json`) в каталоге установки плагина.\n\n* **Copilot cloud agent** — крючки работают внутри эфемерной песочницы Linux, которая предоставляет облачные агенты для каждой задачи. Песочница неинтерактивна, имеет ограниченную сеть и уничтожается после завершения работы. Подмножество событий срабатывает, и признаются только `bash` (или `command`) записи.\n\n  Конфигурация крючка загружается из `.github/hooks/*.json` файлов в клонированном репозитории.\n\n### Политические крючки\n\n> \\[!NOTE]\n> **Copilot CLI Только.** Политические крючки не поддерживаются в разделе Copilot cloud agent.\n\nКрючки политики — это хуки для всей машины, загружаемые администраторами. Они загружаются раньше всех остальных хуков и не могут быть отключены .`disableAllHooks`\n\nПолитические зацепки можно найти из двух источников:\n\n* **Файловая система**: JSON-файлы в платформенном каталоге политик, загруженных в алфавитном порядке:\n  * Linux или macOS: `/etc/github-copilot/policy.d/*.json`\n  * Виндовс: `C:\\ProgramData\\GitHub\\Copilot\\policy.d\\*.json`\n* **Windows Реестр**: Значения под `HKLM\\Software\\Policies\\GitHub\\Copilot` (каждый подключ содержит значение `Policy` REG\\_SZ с JSON-политикой).\n\nФайлы крючков политики используют тот же формат конфигурации хуков, что и пользовательские и проектные хуки (`{ \"version\": 1, \"hooks\": { ... } }`). В системах POSIX файлы политики должны принадлежать root и не подлежать групповому или мировому записыванию.\n\nКрючки политики предназначены для использования корпоративными ИТ-администраторами и требуют повышенных прав для установки. Конечные пользователи не могут их изменять.\n\n## Среда выполнения облачных агентов\n\nЭтот раздел **применяется только кCopilot cloud agent** В нём описываются ограничения, влияющие на то, как вы пишете скрипты hook и настраиваете записи hook для заданий облачных агентов.\n\n| Недвижимость                                                                                                                                         | Ценность                                                                                                                                                                                                                                                                                    |\n| ---------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Операционная система                                                                                                                                 | Linux. Учитывается только поле `bash` командных крюков; `powershell` записи игнорируются. Кросс-платформенное `command` поле считается запасным вариантом.                                                                                                                                  |\n| Рабочий каталог                                                                                                                                      |                                                                                                                                                                                                                                                                                             |\n| `/workspace` когда репозиторий клонируется, иначе `/root`. Используйте этот путь при установке `cwd` записи hook или при ссылке на файлы из скрипта. |                                                                                                                                                                                                                                                                                             |\n| Filesystem                                                                                                                                           | Эфемерно. Файлы, написанные с помощью hooks (логи, CSV, транскрипты), выбрасываются после окончания работы. Чтобы сохранить выход крючка, отправьте его через `http` вход с крючком.                                                                                                        |\n| Исходящая сеть                                                                                                                                       | Ограничен файрволом облачных агентов. По умолчанию доступны только имена хостов GitHub и Copilot; чтобы получить доступ к любому другому хосту (например, `https://hooks.example.com`), требуется правило разрешения межсетевого экрана, настроенное администратором.                       |\n| Доступные переменные среды                                                                                                                           |                                                                                                                                                                                                                                                                                             |\n| `GITHUB_COPILOT_API_TOKEN` и `GITHUB_COPILOT_GIT_TOKEN` происходят в песочнице.                                                                      |                                                                                                                                                                                                                                                                                             |\n| `COPILOT_AGENT_PROMPT` удерживает подсказку, с которой была вызвана работа.                                                                          |                                                                                                                                                                                                                                                                                             |\n| `HOME` установлена на `/root`, поэтому любой скрипт крюка, разрешающий `~/...` пути, записывает в эфемерную песочницу.                               |                                                                                                                                                                                                                                                                                             |\n| `GITHUB_TOKEN` не задан.                                                                                                                             |                                                                                                                                                                                                                                                                                             |\n| Интерактивность                                                                                                                                      | Полностью неинтерактивный. Агент работает с заранее предоставленными всеми разрешениями инструментов, поэтому не отображаются диалоги разрешений и уведомления не появляются пользователю.                                                                                                  |\n| Обнаружение конфигурации                                                                                                                             | В задании облачного агента по умолчанию существует единственная конфигурация крючка, которая `.github/hooks/*.json` существует внутри клонированного репозитория. Песочница не поставляется с пользовательскими hook-файлами, `settings.json`, `config.json`, или установленными плагинами. |\n\n## Формат конфигурации крючка\n\nКонфигурационные файлы крючка используют формат JSON с версией `1`.\n\n> \\[!NOTE]\n> Если файл конфигурации перехватчика, загруженный из каталога (например, `.github/hooks/`), содержит неправильный элемент перехватчика, то только этот элемент удаляется и регистрируется— допустимые крючки с братом в том же файле по-прежнему загружаются. Структурные ошибки (недопустимые json, плохие `version`или не массивные списки событий) по-прежнему отклоняют весь файл. Перехватчики, определенные встроенными, `settings.json` остаются строгими: любая ошибка проверки на уровне элемента отклоняет все `hooks` поле. Другие файлы конфигурации всегда загружают независимо.\n\n### Командные крючки\n\nКомандные хуки запускают shell-скрипты и поддерживаются на всех типах хуков.\n\n> \\[!NOTE]\n> **Только облачный агент.** Облачный агент запускает крючки в песочнице Linux. Признаётся только поле `bash` ; `powershell` заявки игнорируются. Кросс-платформенное `command` поле считается запасным вариантом.\n\n```json\n{\n  \"version\": 1,\n  \"hooks\": {\n    \"preToolUse\": [\n      {\n        \"type\": \"command\",\n        \"bash\": \"YOUR_BASH_COMMAND\",\n        \"powershell\": \"YOUR_POWERSHELL_COMMAND\",\n        \"cwd\": \"OPTIONAL/WORKING/DIRECTORY\",\n        \"env\": { \"VAR\": \"VALUE\" },\n        \"timeoutSec\": 30\n      }\n    ]\n  }\n}\n```\n\n| Поле         | Type        | Обязательный                                         | Description                                                                                                                                                                                        |\n| ------------ | ----------- | ---------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `bash`       | string      | Одно из значений `bash`, `powershell` или `command`. | Команда shell для Unix.                                                                                                                                                                            |\n| `command`    | string      | Одно из значений `bash`, `powershell` или `command`. | Кроссплатформенный запасной вариант. Скопировано в обе `bash` сферы и `powershell` когда эти поля отсутствуют; явные `bash` или `powershell` записи имеют приоритет на соответствующих платформах. |\n| `cwd`        | string      | Нет                                                  | Рабочая папка для команды (относительно корня репозитория или абсолюта).                                                                                                                           |\n| `env`        | object      | Нет                                                  | Переменные среды для установки (поддерживает расширение переменных).                                                                                                                               |\n| `powershell` | string      | Одно из значений `bash`, `powershell` или `command`. | Команда shell для Windows.                                                                                                                                                                         |\n| `timeout`    | Номер       | Нет                                                  | Псевдоним для `timeoutSec`, за секунды. Используется только при `timeoutSec` отсутствии; `timeoutSec` имеет приоритет, когда присутствуют оба варианта.                                            |\n| `timeoutSec` | Номер       | Нет                                                  | Время ожидания в секундах. По умолчанию: `30`.                                                                                                                                                     |\n| `type`       | `\"command\"` | Нет                                                  | Тип крюка. По умолчанию `\"command\"` — когда его опускают.                                                                                                                                          |\n\n#### Сообщения о прогрессе\n\nКомандные крючки могут отправлять строки статуса прогресса на временную шкалу CLI во время выполнения. Запишите `{\"type\": \"progress\", \"message\": \"...\"}` JSON-объект в stdout перед записью итогового результата:\n\n```bash\necho '{\"type\": \"progress\", \"message\": \"Checking policy...\"}'\n# ... perform work ...\necho '{\"permissionDecision\": \"allow\"}'\n```\n\nУстановите `\"temporary\": true` на выпуск временной статусной линии. Переходная линия заменяет предыдущую и очищается при ответе помощника, вместо того чтобы накапливаться в таймлайне:\n\n```bash\necho '{\"type\": \"progress\", \"message\": \"Routing...\", \"temporary\": true}'\necho '{\"type\": \"progress\", \"message\": \"Thinking...\", \"temporary\": true}'\n# ... perform work ...\necho '{\"permissionDecision\": \"allow\"}'\n```\n\nСообщения о прогрессе отображаются только и не влияют на вывод хука или логику принятия решений.\n\n**Как stdout разбирается, когда в них смешиваются сообщения о прогрессе.** — CLI сканирует строка за строчкой, пока крюк идёт. Любая строка, которая после обрезания представляет собой один целый JSON-объект, `\"type\": \"progress\"` потребляется как событие прогресса и **удаляется из выходного потока хука**. Все остальные строки — пустые строки, обычный текст и JSON-объекты, не являющиеся сообщениями прогресса — сохраняются дословно. Когда крюк выходит, сохраненные линии соединяются, обрезаются и анализируются одним `JSON.parse` вызовом: этим результатом является выход хука (тот самый «hook output JSON», упомянутый в другой части статьи). Это означает следующее:\n\n* Отправка строк прогресса вместе с объектом окончательного решения (как в приведённых выше примерах) безопасна и является задуманной закономерностью — строки прогресса никогда не достигают парсера JSON.\n* Каждое сообщение о прогрессе должно быть на отдельной строке и быть действительным JSON на этой единственной строке. Многолинейные / красиво напечатанные объекты прогресса не распознаются как прогресс и остаются в выходном потоке, где, скорее `JSON.parse` всего, финальный процесс провалится.\n* Объект окончательного решения, напротив, может охватывать несколько строк — только *распознавание* прогресса ориентировано на линии; то, что остаётся после прогресс-стриппинга, рассматривается как один JSON-документ, а не как строчно-разграничённый JSON.\n* Если оставшийся выход пуст или не парсирует как JSON, крючок считается не дающим вывода и не возвращается к стандартному режиму. Два или более не прогрессирующих JSON-объекта на stdout (например, два `echo '{\"permissionDecision\": ...}'` вызова) таким образом конкатенируются в недействительный JSON и игнорируются — издают ровно один объект окончательного решения.\n\n### HTTP-крючки\n\nHTTP-хуки отправляют входную полезность в виде JSON `POST` на URL.\n\n> \\[!NOTE]\n>\n> * По умолчанию разрешены только `https://` URL. Запросы, не входящие в TLS `http://` , отклоняются, за `http://localhost`исключением , `http://127.*`, и `http://[::1]` когда `COPILOT_HOOK_ALLOW_LOCALHOST=1` установлен.\n> *\n\n**Только облачный агент.** Исходящая сеть из песочницы ограничена межсетевым экраном облачного агента, поэтому `url` должна нацелиться на хост, указанный в списке разрешений.\n\n```json\n{\n  \"version\": 1,\n  \"hooks\": {\n    \"postToolUse\": [\n      {\n        \"type\": \"http\",\n        \"url\": \"https://hooks.example.com/copilot\",\n        \"headers\": { \"X-Source\": \"copilot-cli\" },\n        \"allowedEnvVars\": [\"GITHUB_TOKEN\"],\n        \"timeoutSec\": 30\n      }\n    ]\n  }\n}\n```\n\n| Поле             | Type      | Обязательный | Description                                                                                                                                                                                                   |\n| ---------------- | --------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `allowedEnvVars` | string\\[] | Нет          | Имена переменных среды, которые могут быть расширены внутри `headers` значений. Когда установлен, `url` нужно использовать `https://`.                                                                        |\n| `headers`        | object    | Нет          | Запросите заголовки для включения.                                                                                                                                                                            |\n| `timeout`        | Номер     | Нет          | Псевдоним для `timeoutSec`, за секунды. Используется только при `timeoutSec` отсутствии; `timeoutSec` имеет приоритет, когда присутствуют оба варианта.                                                       |\n| `timeoutSec`     | Номер     | Нет          | Время ожидания в секундах. По умолчанию: `30`.                                                                                                                                                                |\n| `type`           | `\"http\"`  | Да           | Этот параметр должен содержать значение `\"http\"`.                                                                                                                                                             |\n| `url`            | string    | Да           | Целевой URL-адрес. Обязательно использовать `http:` или `https:`. Для `preToolUse` и `permissionRequest`, обязательно использовать `https://` , потому что ответ может предоставлять разрешения инструментам. |\n\n### Подсказочные зацепки\n\nПодсказочные крючки автоматически отправляют текст так, будто его написал сам пользователь. Они поддерживаются только на `sessionStart`. Текст может быть подсказкой на естественном языке или командой слэша.\n\n> \\[!NOTE]\n> **Copilot CLI Только.** Подсказки **запускают только для новых интерактивных сессий**. Они не срабатывают при возобновлении и не срабатывают в неинтерактивном режиме запросов (`-p`).\n\n> \\[!NOTE]\n> **Облачный агент.** Задания облачных агентов выполняются неинтерактивно (аналогично `-p`), поэтому `prompt` записи с крючками могут не срабатывать. Проверьте поведение в своей среде, прежде чем полагаться на них.\n\n```json\n{\n  \"version\": 1,\n  \"hooks\": {\n    \"sessionStart\": [\n      {\n        \"type\": \"prompt\",\n        \"prompt\": \"YOUR_PROMPT_TEXT_OR_SLASH_COMMAND\"\n      }\n    ]\n  }\n}\n```\n\n| Поле     | Type       | Обязательный | Description                                                                            |\n| -------- | ---------- | ------------ | -------------------------------------------------------------------------------------- |\n| `type`   | `\"prompt\"` | Да           | Этот параметр должен содержать значение `\"prompt\"`.                                    |\n| `prompt` | string     | Да           | Текст для отправки — это может быть сообщение на естественном языке или команда слэша. |\n\n## События с крючками\n\nВ таблице ниже перечислены все поддерживаемые события.\n**Столбец «Облачный агент**» показывает, срабатывает ли событие под облачным агентом, и отмечает различия в поведении.\n\n| Событие                                                                                                                                                   | Срабатывает, когда                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Обработка выхода                                                                                                    | Облачный агент                                                                                                                                                      |\n| --------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `agentStop`                                                                                                                                               | Главный агент завершает ход.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               | Да — может блокировать и заставлять продолжение.                                                                    | Пожары.                                                                                                                                                             |\n| `decision: \"block\"` заставляет делать ещё один ход, который всё равно учитывается в тайм-ауте работы.                                                     |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |                                                                                                                     |                                                                                                                                                                     |\n| `errorOccurred`                                                                                                                                           | Ошибка возникает во время выполнения.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Нет                                                                                                                 | Пожары.                                                                                                                                                             |\n| `notification`                                                                                                                                            | Срабатывает асинхронно, когда CLI отправляет системное уведомление (завершение оболочки, завершение работы агента или простоя, запросы разрешения, диалоги вызова). Удар и забыть: никогда не блокирует сессию. Поддерживает `matcher` регулярный паттерн (значение `matcher` поля) на `notification_type`.                                                                                                                                                                                                                                                                                                                                | Опционально — можно вводить `additionalContext` в сессию.                                                           |                                                                                                                                                                     |\n| **Не стреляет.** Облачный агент не отображает уведомления пользователю (см. строку **интерактивности** в таблице среды выполнения облачных агентов выше). |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |                                                                                                                     |                                                                                                                                                                     |\n| `permissionRequest`                                                                                                                                       | Срабатывает до запуска сервиса разрешений (движок правил, утверждение сессии, авторазрешение/автозапрет и подсказка пользователя). Если объединенные выходные данные крюка возвращают `behavior: \"allow\"` или `\"deny\"`, это решение короткое замыкает обычный поток разрешений, за исключением запроса на обход песочницы (`requestSandboxBypass: true`), где `allow` не утверждает escape-запрос и распространяется только `deny` (см[`permissionRequest`](#permissionrequest-decision-control). исключение обхода песочницы для управления решением). Поддерживает `matcher` регулярный паттерн (значение `matcher` поля) на `toolName`. | Да — можно разрешить или отклонить программно.                                                                      | Вызовы инструментов предварительно одобрены, поэтому этот крюк либо не срабатывает, либо не действует. Используйте `preToolUse` для принятия решений по разрешению. |\n| `postToolUse`                                                                                                                                             | После успешного завершения каждого инструмента.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | Да — можно изменить результат инструмента или добавить дополнительный контекст для модели.                          | Пожары.                                                                                                                                                             |\n| `postToolUseFailure`                                                                                                                                      | После того, как инструмент завершается с неудачей.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | Да — может предоставить навигацию по восстановлению через `additionalContext` (код `2` выхода для командных хуков). | Пожары.                                                                                                                                                             |\n| `preCompact`                                                                                                                                              | Вот-вот начнётся уплотнение контекста (ручное или автоматическое). Поддерживает `matcher` шаблон regex (значение `matcher` поля) для фильтрации по триггеру (`\"manual\"` или `\"auto\"`).                                                                                                                                                                                                                                                                                                                                                                                                                                                     | Нет — только уведомление.                                                                                           | Огонь только с `trigger: \"auto\"`. Нет пользователя, который бы запросил ручное уплотнение.                                                                          |\n| `preToolUse`                                                                                                                                              | Перед тем, как каждый инструмент сработает.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | Да — можно разрешать, отрицать или изменять.                                                                        | Пожары. Решение считается `\"ask\"` так `\"deny\"` , что нет доступного пользователя для ответа.                                                                        |\n| `sessionEnd`                                                                                                                                              | Сессия заканчивается.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Нет                                                                                                                 | Пожары — один раз за работу.                                                                                                                                        |\n| `reason` обычно `\"complete\"`, `\"error\"`, или `\"timeout\"`; `\"abort\"` и `\"user_exit\"` не ожидаются, потому что пользователя нет.                            |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |                                                                                                                     |                                                                                                                                                                     |\n| `sessionStart`                                                                                                                                            | Начинается новая или возобновлённая сессия.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | Опционально — можно вводить `additionalContext` в сессию.                                                           | Уволяется один раз за каждую работу, как новая сессия (не резюме). См. примечание Prompt hooks выше для поведения `prompt` записей в облачном агенте.               |\n| `subagentStart`                                                                                                                                           | Появляется субагент (до его запуска). Поддерживает `matcher` шаблон regex (значение `matcher` поля) для фильтрации по имени агента.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | Опционально — не может блокировать создание, но `additionalContext` предшествует подсказке субагента.               | Пожары.                                                                                                                                                             |\n| `subagentStop`                                                                                                                                            | Субагент завершает.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | Да — может блокировать и заставлять продолжение.                                                                    | Пожары.                                                                                                                                                             |\n| `userPromptSubmitted`                                                                                                                                     | Пользователь отправляет запрос.                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | Необязательный—`modifiedPrompt` учитывается только программными перехватчиками пакета SDK.                          | Срабатывает максимум один раз — по запросу, который подают на работу. Нет никакого дополнительного ввода пользователя.                                              |\n| `userPromptTransformed`                                                                                                                                   | Запускается после преобразования отправленного запроса в содержимое, доступное для модели, непосредственно перед отправкой и сохранением содержимого в журнале сеансов. Выполняется для основного сообщения и для каждого предыдущего сообщения в пакетной отправке. Только мутация — она может переписать содержимое, получаемое моделью, но не блокировать или обрабатывать поворот. Системные уведомления никогда не запускают его.                                                                                                                                                                                                     | Да— может переписать содержимое, с которым сталкивается модель.                                                     | Пожары.                                                                                                                                                             |\n\n## Полезные нагрузки для ввода событий hook\n\nКаждое событие с крючком доставляет JSON-полезную нагрузку обработчику крючков. Поддерживаются два формата полезной нагрузки, выбираемых по имени события, используемому в конфигурации крючка:\n\n* **camelCase format** — Настройте имя события в camelCase (например, `sessionStart`). Поля используют CamelCase.\n* **VS Code совместимый формат** — Настройте имя события в PascalCase (например, `SessionStart`). Поля используют snake\\_case для соответствия VS CodeCopilot формату расширения.\n\n### `sessionStart` / `SessionStart`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;      // Unix timestamp in milliseconds\n    cwd: string;\n    source: \"startup\" | \"resume\" | \"new\";\n    initialPrompt?: string;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"SessionStart\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    source: \"startup\" | \"resume\" | \"new\";\n    initial_prompt?: string;\n}\n```\n\n### `sessionEnd` / `SessionEnd`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    reason: \"complete\" | \"error\" | \"abort\" | \"timeout\" | \"user_exit\";\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"SessionEnd\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    reason: \"complete\" | \"error\" | \"abort\" | \"timeout\" | \"user_exit\";\n}\n```\n\n### `userPromptSubmitted` / `UserPromptSubmit`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    prompt: string;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"UserPromptSubmit\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    prompt: string;\n}\n```\n\n**Output:**\n\n```typescript\n{\n    modifiedPrompt?: string; // Replaces the prompt for the rest of the turn (SDK programmatic hooks only)\n}\n```\n\nВозврат `{}` или пустое значение, чтобы оставить запрос без изменений.\n\n> \\[!NOTE]\n> \\*\n> `modifiedPrompt` учитывается только программными перехватчиками пакета SDK. Команды и перехватчики файлов `userPromptSubmitted` конфигурации HTTP удаляют выходные данные, в том числе `modifiedPrompt`. Среда выполнения обработки легких крючков, используемая размещенными или руководящими Copilot cloud agent сеансами, также игнорирует ее. Это то же разделение среды выполнения, что `preToolUse`и .\n>\n> * Значение, отличное от строки `modifiedPrompt`, `modifiedTransformedPrompt`или обработанное `responseContent` значение игнорируется, а не повреждено сеанса, а предупреждение типа, именующее поле, регистрируется и создается как `session.warning` событие. Переопределение пустой строки отклоняется вместо того, чтобы пустить содержимое, доступное для модели. Значение `null``additionalContext` считается отсутствующим вместо внедрения в виде литерального текста `null`. Выходные данные перехватчика (stdout для перехватчиков команд, текст отклика для перехватчиков HTTP) привязан к 10 МиБ на вызов, а более крупный ответ усечен, а не исчерпание памяти.\n\n### `userPromptTransformed`\n\nЗапускается после преобразования отправленного запроса в содержимое, доступное для модели, непосредственно перед отправкой и сохранением содержимого в журнале сеансов. Выполняется для основного сообщения и для каждого предыдущего сообщения в пакетной отправке. Только мутация — она может переписать содержимое, получаемое моделью, но не блокировать или обрабатывать поворот. Системные уведомления никогда не запускают его.\n\n**Входные данные:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;         // epoch-ms integer\n    cwd: string;\n    prompt: string;            // user prompt after userPromptSubmitted hooks have run\n    transformedPrompt: string; // runtime-transformed content the model will receive\n}\n```\n\n**Output:**\n\n```typescript\n{\n    modifiedTransformedPrompt?: string; // Replaces the model-facing content\n}\n```\n\nВозвращает `{}` или пустая, чтобы оставить преобразованное содержимое без изменений.\n`modifiedTransformedPrompt` заменяет только содержимое, отправленное в модель и хранящееся в журнале сеансов — запрос, отображаемый на временной шкале, не затрагивается, и замена воспроизводится без изменений, если сеанс возобновляется.\n\n### `preToolUse` / `PreToolUse`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    toolName: string;\n    toolArgs: unknown;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\nПри настройке с именем `PreToolUse`события PascalCase полезная нагрузка использует snake\\_case имена полей, чтобы соответствовать формату VS CodeCopilot расширения:\n\n```typescript\n{\n    hook_event_name: \"PreToolUse\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    tool_name: string;\n    tool_input: unknown;    // Tool arguments (parsed from JSON string when possible)\n}\n```\n\n**Matchers в формате Claude (PascalCase `PreToolUse`):** Крюки, настроенные с именем `PreToolUse`события PascalCase — используемым в плагинах Claude Code и формате Open Plugins — применяют семантику matcher Claude вместо родного правила regex:\n\n* `*`, `**`, или пустое `matcher` значение срабатывает для каждого инструмента.\n* Буквальное имя или `|`-separated alternation (например `Bash` , или `Edit|Write`) срабатывает, когда какой-либо токен совпадает с именем инструмента во время выполнения или имя его Claude из таблицы ниже.\n* Любое другое значение рассматривается как регистр-зависимый регекс, привязанный к тесту `^(?:PATTERN)$` с именем инструмента Claude (или имя во время выполнения для инструментов без эквивалента Claude).\n\nПолезные нагрузки для PascalCase `PreToolUse` сообщают `tool_name` как имя инструмента Claude (например, `Bash`, не `bash`).\n\n| Инструмент выполнения                        | Название инструмента Claude |\n| -------------------------------------------- | --------------------------- |\n| `bash`, `powershell`                         | `Bash`                      |\n| `view`                                       | `Read`                      |\n| `create`                                     | `Write`                     |\n| `edit`, , `str_replace_editor``apply_patch`  | `Edit`                      |\n| `grep`, `rg`                                 | `Grep`                      |\n| `glob`                                       | `Glob`                      |\n| `web_fetch`                                  | `WebFetch`                  |\n| `web_search`                                 | `WebSearch`                 |\n| `ask_user`                                   | `AskUserQuestion`           |\n| `update_todo`                                | `TodoWrite`                 |\n| `task`                                       |                             |\n| `Agent` (буквальное `Task` тоже принимается) |                             |\n\nИнструменты без эквивалента Claude сохраняют свои названия во время выполнения.\n\n> \\[!IMPORTANT]\n> **Поведение `preToolUse`команды и** http `preToolUse`: перехватчики команд \\*\\*\\*\\* закрываются при ошибках— сбой или ненулевая выход (включая выход`2`) запрещает вызов средства, даже если отчеты `permissionDecision: \"allow\"`JSON крюка. Время ожидания перехвата команд **всегда открыты сбоем, даже для `preToolUse` перехватчиков политики, развернутых администратором**, — перехватчик времени ожидания создает предупреждение и позволяет вызову средства проходить через обычный поток разрешений, а не запрещать его. HTTP-хуки `preToolUse` — это **fail-open** — сетевая ошибка, тайм-аут или ответ, не входящий в 2xx, попадают в стандартный поток разрешений. Выберите вариант, который соответствует вашим требованиям безопасности.\n\n### `postToolUse` / `PostToolUse`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    toolName: string;\n    toolArgs: unknown;\n    toolResult: {\n        resultType: \"success\";\n        textResultForLlm: string;\n    }\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"PostToolUse\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    tool_name: string;\n    tool_input: unknown;\n    tool_result: {\n        result_type: \"success\";\n        text_result_for_llm: string;\n    }\n}\n```\n\n### `postToolUseFailure` / `PostToolUseFailure`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    toolName: string;\n    toolArgs: unknown;\n    error: string;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"PostToolUseFailure\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    tool_name: string;\n    tool_input: unknown;\n    error: string;\n}\n```\n\n### `agentStop` / `Stop`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    transcriptPath: string;\n    stopReason: \"end_turn\";\n    stop_hook_active: boolean; // true when this turn was already forced to continue by a prior \"block\" decision from this hook\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"Stop\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    transcript_path: string;\n    stop_reason: \"end_turn\";\n    stop_hook_active: boolean;\n}\n```\n\n### `subagentStart`\n\n> \\[!NOTE]\n> Встроенный `general-purpose` агент не излучает `subagentStart` события `subagentStop` или эмит. Все остальные встроенные агенты на базе YAML — включая `explore`, `task`, `code-review``rubber-duck``research`и `security-review`—, а также пользовательские пользовательские агенты излучают эти события.\n\n**Входные данные:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    transcriptPath: string;\n    agentName: string;\n    agentDisplayName?: string;\n    agentDescription?: string;\n}\n```\n\n### `subagentStop` / `SubagentStop`\n\nЗапускается, когда субагент завершается нормально, прежде чем возвращать результаты родительскому элементу.\n`stopReason` в настоящее время всегда `\"end_turn\"`. Этот крючок запускается до обработки разлива большого отклика, поэтому `response` (или `last_assistant_message` в совместимом VS Code формате) содержит полный текст ответа подагента.\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    transcriptPath: string;\n    agentId: string;\n    agentType: string;\n    agentName: string;\n    agentDisplayName?: string;\n    response: string;       // Full final subagent response text\n    stopReason: \"end_turn\";\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"SubagentStop\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    transcript_path: string;\n    agent_id: string;\n    agent_type: string;\n    agent_name: string;\n    agent_display_name?: string;\n    last_assistant_message: string; // The `response` text\n    stop_reason: \"end_turn\";\n}\n```\n\n### `errorOccurred` / `ErrorOccurred`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    error: {\n        message: string;\n        name: string;\n        stack?: string;\n    };\n    errorContext: \"model_call\" | \"tool_execution\" | \"system\" | \"user_input\";\n    recoverable: boolean;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"ErrorOccurred\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    error: {\n        message: string;\n        name: string;\n        stack?: string;\n    };\n    error_context: \"model_call\" | \"tool_execution\" | \"system\" | \"user_input\";\n    recoverable: boolean;\n}\n```\n\n### `preCompact` / `PreCompact`\n\n**Ввод CamelCase:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    transcriptPath: string;\n    trigger: \"manual\" | \"auto\";\n    customInstructions: string;\n}\n```\n\n\\*\\*\nVS Code Совместимый вход:\\*\\*\n\n```typescript\n{\n    hook_event_name: \"PreCompact\";\n    session_id: string;\n    timestamp: string;      // ISO 8601 timestamp\n    cwd: string;\n    transcript_path: string;\n    trigger: \"manual\" | \"auto\";\n    custom_instructions: string;\n}\n```\n\n## `preToolUse` Контроль принятия решений\n\nКрюк `preToolUse` может управлять выполнением инструмента, записывая JSON-объект в stdout.\n\n| Поле                         | Ценности                                                                                                                                                                     | Description                                                     |\n| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------- |\n| `permissionDecision`         |                                                                                                                                                                              |                                                                 |\n| `\"allow\"`, , `\"deny\"``\"ask\"` | Работает ли инструмент. Пустой выход использует стандартное поведение. В облачном агенте `\"ask\"` рассматривается как `\"deny\"` отсутствие доступного пользователя для ответа. |                                                                 |\n| `permissionDecisionReason`   | string                                                                                                                                                                       | Агенту показали разум. Требуется при принятии решения `\"deny\"`. |\n| `modifiedArgs`               | object                                                                                                                                                                       | Замените аргументы инструментов вместо оригиналов.              |\n\nКогда Copilot CLI может отображаться запрос на разрешение на перехватчик, пользователь может ввести необязательный отзыв вместе с отказом. Эта обратная связь добавляется к сообщению, которое получает агент: `Denied by user via preToolUse hook prompt: <permissionDecisionReason>. The user provided the following feedback: <feedback>`\n\n## `agentStop`/ `subagentStop` Контроль принятия решений\n\n| Поле                                                                                                                                                                                                                                       | Ценности | Description                                                |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ---------------------------------------------------------- |\n| `decision`                                                                                                                                                                                                                                 |          |                                                            |\n| `\"block\"`, `\"allow\"`                                                                                                                                                                                                                       |          |                                                            |\n| `\"block\"` заставляет другого агента поступить, используя `reason` это как подсказку.                                                                                                                                                       |          |                                                            |\n| `reason`                                                                                                                                                                                                                                   | string   | Подсказка для следующего хода, когда `decision` .`\"block\"` |\n| `modifiedResponse`                                                                                                                                                                                                                         | string   |                                                            |\n| \\*\\*                                                                                                                                                                                                                                       |          |                                                            |\n| `subagentStop` Только.\\*\\* Заменяет ответ, возвращенный родительскому элементу, когда подзаключение разрешено выполнять, полезно для редактирования или переформатирования выходных данных вложенных элементов. Неприменимо к `agentStop`. |          |                                                            |\n\n`decision` и `reason` ведет себя одинаково для обоих `agentStop` и `subagentStop`.\n`modifiedResponse` Применяется только к `subagentStop`:\n\n* Допустимое `block` решение победит `modifiedResponse`: если крючок возвращает оба, субагент продолжается и перезапись удаляется.\n* Перезаписи не составляются в нескольких соответствующих крючках. Каждый крючок получает тот же исходный код `response`, и последний крючок для возврата `modifiedResponse` побед — цепочка редактора и средство форматирования не передает редактированного текста в средство форматирования.\n* Имена полей выходных данных (`decision`, `reason`, `modifiedResponse`) совпадают как для верблюдьего Регистра, так и VS Code для совместимых конфигураций.\n\n> \\[!NOTE]\n> **Беглый охранник.** После 8 последовательных `block` продолжений CLI переопределяет перехватчик и заканчивает поворот в любом случае, чтобы предотвратить несвязанный цикл. `stop_hook_active` Используйте поле `agentStop` ввода для обнаружения того, что эта очередь уже была вынуждена продолжаться, и самостоятельное ограничение перед нажатием крышки.\n\n## `postToolUse` Выход\n\nКрючок `postToolUse` может изменять результат инструмента или добавить дополнительный контекст для модели, записывая JSON-объект в stdout.\n\n```typescript\n{\n    modifiedResult?: {\n        resultType: \"success\";\n        textResultForLlm: string;\n    };\n    additionalContext?: string;\n}\n```\n\n| Поле                | Type   | Description                                                                                                                                                                                                                                            |\n| ------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `modifiedResult`    | object | Результат замены инструмента. Должно быть.`resultType: \"success\"` Если вернуть с `resultType: \"failure\"`, отказ идёт вниз по течению и `postToolUseFailure` стреляет следующим.                                                                        |\n| `additionalContext` | string | Добавлено дополнительное руководство `textResultForLlm` , чтобы модель видела его после вывода инструмента на том же ходе. Когда несколько хуков возвращаются `additionalContext`, результат соединяется двойной новой строкой и ограничивается 10 КБ. |\n\nВозврат `{}` или очистка выхода, чтобы сохранить исходный успешный результат.\n\n> \\[!NOTE]\n> `modifiedResult` отмечается как программными хуками SDK, так и командными/HTTP-конфигурационными `postToolUse` хуками.\n\n**Матчер:** Необязательный регулярный выражение, тестируемое против `toolName`. Шаблон regex — это значение `matcher` поля, скомпилированное как `^(?:PATTERN)$`, и должно совпадать с именем всего инструмента. Если шаблон не является действительным регулярным выражением, крючок пропускается. Опустите `matcher` для получения результатов со всех инструментов.\n\n```json\n{\n    \"type\": \"command\",\n    \"matcher\": \"bash|edit\",\n    \"bash\": \"./scripts/log-tool.sh\"\n}\n```\n\n## `permissionRequest` Контроль принятия решений\n\n> \\[!NOTE]\n> **Copilot CLI Только.** Крючок `permissionRequest` не применяется в Copilot cloud agent— вызовы инструментов там предварительно одобрены (см. строку **интерактивности** в таблице среды исполнения облачных агентов). Используйте `preToolUse` для принятия решений по разрешению в облачном агенте.\n\n`permissionRequest` Крюк срабатывает до запуска сервиса разрешений — до проверки правил, одобрения сессии, авторазрешения/автозапрета и подсказки пользователя. Если крючки возвращаются `behavior: \"allow\"` или `\"deny\"`, это решение приводит к короткому замыканию нормального потока разрешений. Возврат ничего не выходит на обычную обработку разрешений. Используйте его для программного одобрения или отклонения вызовов инструментов — особенно полезно в режиме CLI pipe (`-p`) и других CLI CI, где нет интерактивного запроса. Это не относится к облачному агенту.\n\nВсе настроенные `permissionRequest` крючки работают для каждого запроса (кроме `read` типов `hook` с разрешениями, которые срабатывают перед хуками). Выходы крючка объединяются с более поздними выходами хука, переопределяя более ранние.\n\n**Исключение для обхода песочницы:** для любого запроса, который запрашивает экранировать песочницу (`requestSandboxBypass: true` в `toolInput`), крючок `allow` не утверждает запрос или короткое замыкание запроса пользователя. Выход из песочницы является эскалацией привилегий, которую пользователь всегда должен подтвердить в интерактивном режиме. Эта команда охватывает команду оболочки, которая запрашивает выполнение за пределами песочницы и `web_fetch` URL-адрес политики песочницы. Распространяется только `deny` (так что перехватчик политики может блокировать экранирование); `allow` (или нет решения) переходит к обычному запросу.\n\n**Матчер:** Необязательный регулярный выражение, тестируемое против `toolName`. Шаблон regex — это значение `matcher` поля, закреплённое как `^(?:PATTERN)$`, и должно совпадать с полным именем инструмента. При установке крюк срабатывает только при совпадающих названиях инструментов.\n\n> \\[!NOTE]\n> **Матчеры в формате Клода (PascalCase `PermissionRequest`):** Крюки, настроенные с именем `PermissionRequest` события PascalCase, используют ту же семантику матчера Claude, что `PreToolUse`и . См. [матчеры формата Claude (PascalCase PreToolUse](#claude-format-matchers-pascalcase-pretooluse) ) для правил матчера и таблицы названий инструментов.\n\nВыводите JSON в stdout, чтобы контролировать решение о разрешении:\n\n| Поле                | Ценности                                | Description                                                     |\n| ------------------- | --------------------------------------- | --------------------------------------------------------------- |\n| `behavior`          |                                         |                                                                 |\n| `\"allow\"`, `\"deny\"` | Одобрить или отклонить этот инструмент. |                                                                 |\n| `message`           | string                                  | Причина возвращалась к LLM при отказе.                          |\n| `interrupt`         | boolean                                 | В `true` сочетании с `\"deny\"`, агент полностью останавливается. |\n\nВернуть пустой выход или `{}` провалиться в нормальный поток разрешений. Для командных хуков выходной код `2` рассматривается как отказ; stdout JSON (если он есть) объединяется с `{\"behavior\":\"deny\"}`, а stderr игнорируется.\n\n## `notification` Крюк\n\n> \\[!NOTE]\n> **Copilot CLI Только.** `notification` Крюк не стреляет под Copilot cloud agent.\n\n`notification` Крюк срабатывает асинхронно, когда CLI издаёт системное уведомление. Эти хуки — это система «убери и забудь»: они никогда не блокируют сессию, а любые ошибки фиксируются и пропускаются.\n\n**Входные данные:**\n\n```typescript\n{\n    sessionId: string;\n    timestamp: number;\n    cwd: string;\n    hook_event_name: \"Notification\";\n    message: string;           // Human-readable notification text\n    title?: string;            // Short title (e.g., \"Permission needed\", \"Shell completed\")\n    notification_type: string; // One of the types listed below\n}\n```\n\n**Типы уведомлений:**\n\n| Type                       | Когда он срабатывает                                                                |\n| -------------------------- | ----------------------------------------------------------------------------------- |\n| `shell_completed`          | Заканчивается фоновая (асинхронная) команда shell                                   |\n| `shell_detached_completed` | Завершается отделённая оболочная сессия                                             |\n| `agent_completed`          | Фоновый субагент заканчивает (выполнен или неудачно)                                |\n| `agent_idle`               | Агент фона заканчивает ход и переходит в состояние простоя (ожидание `write_agent`) |\n| `permission_prompt`        | Агент запрашивает разрешение на запуск инструмента                                  |\n| `elicitation_dialog`       | Агент запрашивает дополнительную информацию у пользователя                          |\n\n**Output:**\n\n```typescript\n{\n    additionalContext?: string; // Injected into the session as a user message\n}\n```\n\nЕсли `additionalContext` он возвращается, текст вводится в сессию в виде предварительного пользовательского сообщения. Это может запустить дальнейшую обработку агентов, если сессия находится в простое. Возврат `{}` или опустошение выхода, чтобы не предпринимать действия.\n\n**Матчер:** Опциональный регуляр на `notification_type`. Шаблон regex — это значение `matcher` поля, закреплённое как `^(?:PATTERN)$`. Опустите `matcher` все типы уведомлений.\n\n## Фильтрация матчеров\n\nНесколько событий принимают необязательный `matcher` регулярный выражений на каждом записи крюка, который фильтрует и вызывает срабатывание хука. Он компилируется как `^(?:PATTERN)$` и должен совпадать с полным значением. Некорректные регексы приводят к пропуску записи с крюком.\n\n\\| Событие |\n`matcher` против него встречается |\n\\|-------|------------------------------|\n\\| `notification` | `notification_type` |\n\\| `permissionRequest` | `toolName` |\n\\| `postToolUse` | `toolName` |\n\\| `preCompact` |\n`trigger` (`\"manual\"` или `\"auto\"`) |\n\\| `preToolUse` | `toolName` |\n\\| `subagentStart` | `agentName` |\n\n## Имена инструментов для подбора крючков\n\n| Имя инструмента | Description                                                                                                                  |\n| --------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| `ask_user`      | Задайте пользователю уточняющий вопрос. В облачном агенте нет пользователя, поэтому `ask_user` не даёт полезного результата. |\n| `bash`          | Выполнять команды оболочки (Unix).                                                                                           |\n| `create`        | Создавайте новые файлы.                                                                                                      |\n| `edit`          | Изменять содержимое файла.                                                                                                   |\n| `glob`          | Ищите файлы по шаблону.                                                                                                      |\n| `grep`          | Поиск по содержимому файла.                                                                                                  |\n| `powershell`    | Выполнять команды shell (Windows). Не отображается в облачном агенте (песочница Linux).                                      |\n| `task`          | Запускайте задачи субагентов.                                                                                                |\n| `view`          | Чтение содержимого файла.                                                                                                    |\n| `web_fetch`     | Загружайте веб-страницы.                                                                                                     |\n\nЕсли настраивать несколько хуков одного типа, они выполняются по порядку. Для `preToolUse`, если какой-либо крюк возвращается `\"deny\"`, инструмент блокируется. Для большинства событий сбои крючка (ненулевые коды выхода, кроме `2`, или тайм-ауты) фиксируются и пропускаются.\n**Исключение: `preToolUse` перехватчики команд завершаются сбоем при выходе `2` и при ошибках вне времени ожидания**— выход `2`, сбой или любой другой ненулевый выход (кроме времени ожидания) запрещает вызов средства, даже если отчеты `permissionDecision: \"allow\"`JSON крюка stdout.\n**Время ожидания всегда открыто сбоем, в том числе для `preToolUse` перехватчиков политики, развернутых администратором:** предупреждение отображается, а вызов средства выполняется через обычный поток разрешений, а не отрицается.\n\n## Коды выхода для командных крючков\n\n| Код выхода                                                                                                                                                                                                                                                                                                                                                                                                                           | Значение                                                             |\n| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- |\n| `0`                                                                                                                                                                                                                                                                                                                                                                                                                                  | Успех.                                                               |\n| `stdout` парсируется как выходной JSON для хука, если он присутствует.                                                                                                                                                                                                                                                                                                                                                               |                                                                      |\n| `2`                                                                                                                                                                                                                                                                                                                                                                                                                                  | По умолчанию это воспринимается как предупреждение.                  |\n| `stderr` показывают пользователю, но забег продолжается. Для `permissionRequest` и `preToolUse`, выход `2` рассматривается как запрет: любой `stdout` JSON объединяется с решением запрета, и вызов инструмента запрещен даже в том случае, если отчеты `permissionDecision: \"allow\"`JSON. Для , выход `postToolUseFailure` рассматривается как `2` и `additionalContext` добавляется к неудаче, `stdout`показанному агенту.         |                                                                      |\n| Другие ненулевые значения                                                                                                                                                                                                                                                                                                                                                                                                            | Зарегистрировано как сбой с крюком. Запуск продолжается (fail-open). |\n| **Исключение: `preToolUse` является fail-closed** — ненулевой выход (кроме выхода 2) отклоняет вызов инструмента с `\"Denied by preToolUse hook (hook errored)\"`.                                                                                                                                                                                                                                                                     |                                                                      |\n| Timeout                                                                                                                                                                                                                                                                                                                                                                                                                              | Убит после `timeoutSec`. Ошибка в журнале, выполнение продолжается.  |\n| **Тайм-ауты открываются сбоем для каждого события, включая `preToolUse` и перехватчики политики, развернутые администратором, — предупреждение отображается и** обрабатывается, как если бы перехватчик не выполнялся. Для `preToolUse`этого вызов средства выполняется через обычный поток разрешений, а не запрещается. Сбой или явным образом отрицающий перехватчик по-прежнему завершается ошибкой; исключены только тайм-ауты. |                                                                      |\n\nДля большинства событий ненулевые выходы и тайм-ауты фиксируются и пропускаются — работа агента продолжается. Для `preToolUse` перехватчиков команд, выход 2, сбои и другие ненулевых выходов из всех неудачных закрытий и запрет вызова средства — выход 2 всегда отрицает, даже если `stdout` отчеты `permissionDecision: \"allow\"`JSON перехватчика (но **время ожидания всегда завершаются ошибкой**), медленный или неустранимый перехватчик не должен автоматически блокировать вызовы или работу средства, даже если перехватчик был развернут администратором в качестве политики.\n\n## Отключить все крючки\n\nИспользуйте `disableAllHooks` его, когда хотите сохранить конфигурацию крючка на диске, но остановить её работу — например:\n\n* Отладка проблемы — и вы хотите убедиться, что причиной является крючок, не удаляя конфигурацию.\n* Приостановка автоматизации во время чувствительной задачи (обзор кода, ветка выпуска, работа с секретами) без потери настройки. (**Copilot CLI только.**)\n* Отправка файла hooks в системе контроля версий, от которого участники могут отказаться локально, установив эту опцию в своём репозитории `settings.json`. (**Copilot CLI только.**)\n* Временное отключение медленных или шумных хуков во время интерактивной сессии. (**Copilot CLI только.**)\n\nУстановите `disableAllHooks` верхний `true` уровень, чтобы пропускать все крючки в файле без удаления.\n\n```json\n{\n  \"version\": 1,\n  \"disableAllHooks\": false,\n  \"hooks\": {\n    \"preToolUse\": [ /* hook entries */ ]\n  }\n}\n```\n\nПоведение зависит от того, где вы устанавливаете флаг:\n\n* **Внутри одного `.github/hooks/*.json` файла** пропускаются только объявленные крючки. Удостоен уважения от обоих Copilot CLI и Copilot cloud agent.\n* **На верхнем уровне репозитория `settings.json`** — **Copilot CLI только.** Каждый хук из каждого источника (файлы репозитория, пользовательские файлы, плагины и встроенные блоки хуков) пропускается для сессий в этом репозитории. Политические крючки не затронуты и продолжают работать. Облачный агент не загружается `settings.json`.\n\n## Дополнительные материалы\n\n* [Использование крючков с GitHub Copilot CLI](/ru/copilot/how-tos/copilot-cli/customize-copilot/use-hooks)\n* [Ссылка на крючки GitHub Copilot](/ru/copilot/reference/hooks-reference)\n* [Справочник команды GitHub Copilot CLI](/ru/copilot/reference/copilot-cli-reference/cli-command-reference)\n* [Концепции облачного агента GitHub Copilot](/ru/copilot/concepts/agents/cloud-agent)"}