268| [Skill](/docs/ru/skills) frontmatter | Остаток сеанса после вызова skill. См. [Hooks in skills and agents](#hooks-in-skills-and-agents) | Да, определено в файле skill |268| [Skill](/docs/ru/skills) frontmatter | Остаток сеанса после вызова skill. См. [Hooks in skills and agents](#hooks-in-skills-and-agents) | Да, определено в файле skill |
269| [Subagent](/docs/ru/sub-agents) frontmatter | Пока этот subagent работает | Да, определено в файле subagent |269| [Subagent](/docs/ru/sub-agents) frontmatter | Пока этот subagent работает | Да, определено в файле subagent |
270 270
271Облачные сеансы на [Claude Code в веб-версии](/docs/ru/claude-code-on-the-web) не читают ваш локальный `~/.claude/settings.json`; hooks там поступают из репозитория, что означает его `.claude/settings.json` в сеансе с одним репозиторием и плагины, которые он объявляет в любом сеансе, и из управляемых на сервере параметров вашей организации. В [самостоятельно размещённой среде](/docs/ru/self-hosted-environments-configuration#permissions-and-tool-approval), Claude Code также запускает hooks, которые оператор инициализировал из `~/.claude/` хоста runner, и запускает hooks в файле управляемых параметров образа runner, когда этот файл находится среди [управляемых источников, которые применяет Claude Code](/docs/ru/managed-settings#how-claude-code-combines-managed-sources), что по умолчанию означает только когда ни управляемые на сервере параметры, ни доставленная MDM политика Claude Code не предоставляют управляемый уровень. См. [что переносится из вашей установки](/docs/ru/cloud-environments#what-carries-over-from-your-setup) для того, какие файлы достигают облачного сеанса.271Облачные сеансы на [Claude Code в веб-версии](/docs/ru/claude-code-on-the-web) не читают ваш локальный `~/.claude/settings.json`; hooks там поступают из репозитория `.claude/settings.json` в сеансе с одним репозиторием, из плагинов [синхронизированных с вашего аккаунта claude.ai](/docs/ru/plugins-reference#synced-plugins) и из управляемых на сервере параметров вашей организации. В [самостоятельно размещённой среде](/docs/ru/self-hosted-environments-configuration#permissions-and-tool-approval), Claude Code также запускает hooks, которые оператор инициализировал из `~/.claude/` хоста runner, и запускает hooks в файле управляемых параметров образа runner, когда этот файл находится среди [управляемых источников, которые применяет Claude Code](/docs/ru/managed-settings#how-claude-code-combines-managed-sources), что по умолчанию означает только когда ни управляемые на сервере параметры, ни доставленная MDM политика Claude Code не предоставляют управляемый уровень. См. [что переносится из вашей установки](/docs/ru/cloud-environments#what-carries-over-from-your-setup) для того, какие файлы достигают облачного сеанса.
272 272
273Для получения подробной информации о разрешении файлов настроек см. [settings](/docs/ru/settings).273Для получения подробной информации о разрешении файлов настроек см. [settings](/docs/ru/settings).
274 274
1181 События hooks1181 События hooks
1182</h2>1182</h2>
1183 1183
1184Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл до завершения сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.1184Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл к завершению сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.
1185 1185
1186<h3 id="sessionstart">1186<h3 id="sessionstart">
1187 SessionStart1187 SessionStart
1188</h3>1188</h3>
1189 1189
1190Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте [CLAUDE.md](/docs/ru/memory) вместо этого.1190Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте вместо этого [CLAUDE.md](/docs/ru/memory).
1191 1191
1192SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.1192SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.
1193 1193
1203 1203
1204До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.1204До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.
1205 1205
1206Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоне. Вы можете сразу же печатать, и возобновленный разговор появляется без ожидания завершения hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.1206Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоновом режиме. Вы можете сразу же печатать, и возобновленный разговор появляется без ожидания hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.
1207 1207
1208Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.1208Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.
1209 1209
1210То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока SessionStart hooks все еще выполняются, не достигает Claude до их завершения.1210То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока hooks SessionStart все еще выполняются, не достигает Claude до их завершения.
1211 1211
1212Во время ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.1212Во время любого ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.
1213 1213
1214<h4 id="sessionstart-input">1214<h4 id="sessionstart-input">
1215 SessionStart input1215 Ввод SessionStart
1216</h4>1216</h4>
1217 1217
1218Помимо [common input fields](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:1218Помимо [общих полей ввода](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:
1219 1219
1220| Field | Description |1220| Поле | Описание |
1221| :-------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1221| :-------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1222| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |1222| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |
1223| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |1223| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |
1224| `agent_type` | Имя агента, присутствует при запуске Claude Code с `claude --agent <name>` |1224| `agent_type` | Имя агента, присутствует при запуске Claude Code с `claude --agent <name>` |
1225| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name` или `/rename`. Hook, который выдает `sessionTitle`, может сначала проверить `session_title`, чтобы избежать перезаписи названия, которое пользователь установил явно |1225| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name` или `/rename`. Hook, который выдает `sessionTitle`, может сначала проверить `session_title`, чтобы избежать перезаписи названия, установленного пользователем явно |
1226 1226
1227Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о стоимости возобновления устаревшего разговора перед первым запросом, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.1227Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о стоимости возобновления устаревшего разговора перед первым запросом, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.
1228 1228
1229| Field | Description |1229| Поле | Описание |
1230| :---------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------- |1230| :---------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1231| `seconds_since_last_response` | Настоящее время в секундах с момента последнего ответа в возобновленном транскрипте |1231| `seconds_since_last_response` | Настоящее время в секундах с момента последнего ответа в возобновленном транскрипте |
1232| `context_tokens` | Токены, которые первый запрос возобновленного сеанса повторно отправляет как его подсказка |1232| `context_tokens` | Токены, которые первый запрос возобновленного сеанса повторно отправляет как его подсказка |
1233| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [lifetime кэша подсказок](/docs/ru/prompt-caching#cache-lifetime) сеанса или более позднее сжатие заменило кэшированный разговор |1233| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [времени жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime) сеанса или более позднее сжатие заменило кэшированный разговор |
1234| `estimated_cache_write_usd` | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на модели сеанса, исключая ответ |1234| `estimated_cache_write_usd` | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на модели сеанса, исключая ответ |
1235 1235
1236Этот пример показывает ввод для сеанса, возобновленного через 90 минут после его последнего ответа:1236Этот пример показывает ввод для сеанса, возобновленного через 90 минут после его последнего ответа:
1251```1251```
1252 1252
1253<h4 id="sessionstart-decision-control">1253<h4 id="sessionstart-decision-control">
1254 SessionStart decision control1254 Управление решением SessionStart
1255</h4>1255</h4>
1256 1256
1257Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:1257Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:
1258 1258
1259| Field | Description |1259| Поле | Описание |
1260| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1260| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1261| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |1261| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |
1262| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [non-interactive mode](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |1262| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |
1263| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |1263| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |
1264| `watchPaths` | Массив абсолютных путей для наблюдения за событиями [FileChanged](#filechanged) во время этого сеанса |1264| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) во время этого сеанса |
1265| `reloadSkills` | Boolean. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и командные директории после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |1265| `reloadSkills` | Логическое значение. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и директории команд после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |
1266 1266
1267```json theme={null}1267```json theme={null}
1268{1268{
1290URL репозитория является заполнителем; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.1290URL репозитория является заполнителем; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.
1291 1291
1292<h4 id="persist-environment-variables">1292<h4 id="persist-environment-variables">
1293 Persist environment variables1293 Сохранение переменных окружения
1294</h4>1294</h4>
1295 1295
1296Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранить переменные окружения для последующих команд Bash.1296Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранить переменные окружения для последующих команд Bash.
1336 Setup1336 Setup
1337</h3>1337</h3>
1338 1338
1339Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [non-interactive mode](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте [SessionStart](#sessionstart) вместо этого.1339Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте вместо этого [SessionStart](#sessionstart).
1340 1340
1341Значение matcher соответствует флагу CLI, который запустил hook:1341Значение matcher соответствует флагу CLI, который запустил hook:
1342 1342
1347 1347
1348Когда вы запускаете `claude --init-only`, Claude Code запускает hooks Setup и hooks `SessionStart` с matcher `startup`, затем выходит без запуска разговора.1348Когда вы запускаете `claude --init-only`, Claude Code запускает hooks Setup и hooks `SessionStart` с matcher `startup`, затем выходит без запуска разговора.
1349 1349
1350Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [deferred tool call](#defer-a-tool-call-for-later).1350Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).
1351 1351
1352При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, запустите с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.1352При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, начните с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.
1353 1353
1354Поскольку Setup не срабатывает при каждом запуске, plugin, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins-reference#persistent-data-directory) для информации о том, где хранить установленные зависимости. Если вы распространяете свой plugin через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins-reference#node-js-package-dependencies) при кэшировании plugin.1354Поскольку Setup не срабатывает при каждом запуске, плагин, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins-reference#persistent-data-directory) для информации о том, где хранить установленные зависимости. Если вы распространяете свой плагин через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins-reference#node-js-package-dependencies) при кэшировании плагина.
1355 1355
1356<h4 id="setup-input">1356<h4 id="setup-input">
1357 Setup input1357 Ввод Setup
1358</h4>1358</h4>
1359 1359
1360Помимо [common input fields](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:1360Помимо [общих полей ввода](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:
1361 1361
1362```json theme={null}1362```json theme={null}
1363{1363{
1370```1370```
1371 1371
1372<h4 id="setup-decision-control">1372<h4 id="setup-decision-control">
1373 Setup decision control1373 Управление решением Setup
1374</h4>1374</h4>
1375 1375
1376Hooks Setup не могут блокировать; выполнение продолжается при любом коде выхода. При каждом коде выхода Claude Code отбрасывает [JSON output fields](#json-output) hook Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода hook Setup появляются в выводе запуска только как [`hook_response` events](/docs/ru/headless#read-session-metadata) при запуске с `--output-format stream-json --verbose`.1376Hooks Setup не могут блокировать; выполнение продолжается при любом коде выхода. При каждом коде выхода Claude Code отбрасывает [поля JSON-вывода](#json-output) hook Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода hook Setup появляются в выводе запуска только как [`hook_response` события](/docs/ru/headless#read-session-metadata) при запуске с `--output-format stream-json --verbose`.
1377 1377
1378Hooks Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются в последующих командах Bash для сеанса, как в [SessionStart hooks](#persist-environment-variables). Только hooks `type: "command"` выполняются на `Setup`. Hook `type: "mcp_tool"` на `Setup` всегда пропускается, как описано в [MCP tool hook fields](#mcp-tool-hook-fields).1378Hooks Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются в последующих командах Bash для сеанса, как и в [hooks SessionStart](#persist-environment-variables). На `Setup` выполняются только hooks `type: "command"`. Hook `type: "mcp_tool"` на `Setup` всегда пропускается, как описано в [MCP tool hook fields](#mcp-tool-hook-fields).
1379 1379
1380<h3 id="instructionsloaded">1380<h3 id="instructionsloaded">
1381 InstructionsLoaded1381 InstructionsLoaded
1382</h3>1382</h3>
1383 1383
1384Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для нетерпеливо загруженных файлов и снова позже, когда файлы загружаются лениво, например когда Claude получает доступ к подпапке, которая содержит вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокирование или управление решением. Он выполняется асинхронно в целях наблюдаемости.1384Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для файлов, загружаемых с нетерпением, и снова позже, когда файлы загружаются с нетерпением, например когда Claude получает доступ к подпапке, содержащей вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокировку или управление решением. Он выполняется асинхронно в целях наблюдаемости.
1385 1385
1386Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md`, с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является symlink на него, как обычная загрузка `CLAUDE.md`.1386Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является символической ссылкой на него, как нормальная загрузка `CLAUDE.md`.
1387 1387
1388Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.1388Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.
1389 1389
1390<h4 id="instructionsloaded-input">1390<h4 id="instructionsloaded-input">
1391 InstructionsLoaded input1391 Ввод InstructionsLoaded
1392</h4>1392</h4>
1393 1393
1394Помимо [common input fields](#common-input-fields), hooks InstructionsLoaded получают эти поля:1394Помимо [общих полей ввода](#common-input-fields), hooks InstructionsLoaded получают эти поля:
1395 1395
1396| Field | Description |1396| Поле | Описание |
1397| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1397| :------------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1398| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |1398| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |
1399| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |1399| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |
1400| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |1400| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |
1401| `globs` | Шаблоны glob пути из frontmatter `paths:` файла, если есть. Присутствует только для загрузок `path_glob_match` |1401| `globs` | Шаблоны глобов путей из frontmatter `paths:` файла, если они есть. Присутствует только для загрузок `path_glob_match` |
1402| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |1402| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |
1403| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |1403| `parent_file_path` | Путь к файлу инструкций родителя, который включил этот, для загрузок `include` |
1404 1404
1405```json theme={null}1405```json theme={null}
1406{1406{
1415```1415```
1416 1416
1417<h4 id="instructionsloaded-decision-control">1417<h4 id="instructionsloaded-decision-control">
1418 InstructionsLoaded decision control1418 Управление решением InstructionsLoaded
1419</h4>1419</h4>
1420 1420
1421Hooks InstructionsLoaded не имеют управления решением. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [JSON output fields](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита логирования, отслеживания соответствия или наблюдаемости.1421Hooks InstructionsLoaded не имеют управления решением. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита логирования, отслеживания соответствия или наблюдаемости.
1422 1422
1423<h3 id="userpromptsubmit">1423<h3 id="userpromptsubmit">
1424 UserPromptSubmit1424 UserPromptSubmit
1426 1426
1427Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определенные типы подсказок.1427Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определенные типы подсказок.
1428 1428
1429Hooks `UserPromptSubmit` имеют стандартный timeout 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем стандартный 600-секундный timeout для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, зависший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1429Hooks `UserPromptSubmit` имеют тайм-аут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем 600-секундный стандарт для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, застрявший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1430 1430
1431Помимо command hook, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` command, HTTP или MCP tool, который достигает своего timeout, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление, называющее hook, timeout, который сработал, и что вывод был отброшен.1431Помимо command hook, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` command, HTTP или MCP tool, который достигает своего тайм-аута, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление с названием hook, тайм-аутом, который сработал, и что вывод был отброшен.
1432 1432
1433[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего timeout, блокирует подсказку сообщением, называющим hook и timeout, потому что callback там может действовать как политический шлюз, который не должен отказывать открыто. Сеанс продолжается. До версии 2.1.208 callback timeout на этом событии заканчивал ход с ошибкой выполнения.1433[Callback hook Agent SDK](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего тайм-аута, блокирует подсказку сообщением с названием hook и тайм-аутом, потому что callback там может действовать как политический шлюз, который не должен открываться при отказе. Сеанс продолжается. До версии 2.1.208 тайм-аут callback на этом событии заканчивал ход с ошибкой выполнения.
1434 1434
1435<h4 id="userpromptsubmit-input">1435<h4 id="userpromptsubmit-input">
1436 UserPromptSubmit input1436 Ввод UserPromptSubmit
1437</h4>1437</h4>
1438 1438
1439Помимо [common input fields](#common-input-fields), hooks UserPromptSubmit получают поле `prompt`, содержащее текст, отправленный пользователем.1439Помимо [общих полей ввода](#common-input-fields), hooks UserPromptSubmit получают поле `prompt`, содержащее текст, отправленный пользователем. Вставленный контент, который свернулся в заполнитель `[Pasted text #N]`, прибывает развернутым на месте. В сеансах, где Claude Code [отмечает вставленный текст для Claude](/docs/ru/terminal-config#how-claude-treats-pasted-text), этот развернутый контент находится между строкой `<pasted_content id="…">` и строкой `</pasted_content id="…">`, поэтому учитывайте эти строки, если ваш hook анализирует подсказку.
1440 1440
1441```json theme={null}1441```json theme={null}
1442{1442{
1450```1450```
1451 1451
1452<h4 id="userpromptsubmit-decision-control">1452<h4 id="userpromptsubmit-decision-control">
1453 UserPromptSubmit decision control1453 Управление решением UserPromptSubmit
1454</h4>1454</h4>
1455 1455
1456Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [JSON output fields](#json-output) доступны.1456Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [поля JSON-вывода](#json-output) доступны.
1457 1457
1458Есть два способа добавить контекст к разговору при коде выхода 0:1458Есть два способа добавить контекст к разговору при коде выхода 0:
1459 1459
1460* **Plain text stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude1460* **Простой текст stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude
1461* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст1461* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Значение `additionalContext` добавляется как контекст
1462 1462
1463Ни один канал не создает видимую запись в транскрипте. Plain stdout и значение `additionalContext` каждое вводятся как системное напоминание, которое начинается с имени hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).1463Ни один канал не создает видимую запись в транскрипте. Простой stdout и значение `additionalContext` каждый вводятся как системное напоминание, которое начинается с названия hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).
1464 1464
1465Чтобы заблокировать подсказку, верните JSON объект с `decision`, установленным на `"block"`:1465Чтобы заблокировать подсказку, верните объект JSON с `decision`, установленным на `"block"`:
1466 1466
1467| Field | Description |1467| Поле | Описание |
1468| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |1468| :----------------------- | :------------------------------------------------------------------------------------------------------------------------------------------ |
1469| `decision` | `"block"` предотвращает обработку подсказки и стирает ее из контекста. Опустите, чтобы позволить подсказке продолжить |1469| `decision` | `"block"` предотвращает обработку подсказки и стирает ее из контекста. Опустите, чтобы позволить подсказке продолжить |
1470| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |1470| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |
1472| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |1472| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |
1473| `suppressOriginalPrompt` | Если `true`, когда `decision` имеет значение `"block"`, опускает исходный текст подсказки из сообщения блокировки, показанного пользователю |1473| `suppressOriginalPrompt` | Если `true`, когда `decision` имеет значение `"block"`, опускает исходный текст подсказки из сообщения блокировки, показанного пользователю |
1474 1474
1475Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю, и он не добавляется в контекст.1475Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю и не добавляется в контекст.
1476 1476
1477```json theme={null}1477```json theme={null}
1478{1478{
1490 UserPromptExpansion1490 UserPromptExpansion
1491</h3>1491</h3>
1492 1492
1493Запускается, когда команда, введенная пользователем, расширяется в подсказку перед достижением Claude. Используйте это для блокирования определенных команд от прямого вызова, внедрения контекста для определенного skill или логирования того, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если файл одобрения отсутствует, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.1493Запускается, когда команда, введенная пользователем, расширяется в подсказку перед достижением Claude. Используйте это для блокировки определенных команд от прямого вызова, внедрения контекста для определенного skill или логирования того, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если отсутствует файл одобрения, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.
1494 1494
1495Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1495Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1496 1496
1497Совпадает с `command_name`. Оставьте matcher пустым для срабатывания на каждой команде типа подсказки.1497Совпадает с `command_name`. Оставьте matcher пустым для срабатывания на каждой команде типа подсказки.
1498 1498
1499<h4 id="userpromptexpansion-input">1499<h4 id="userpromptexpansion-input">
1500 UserPromptExpansion input1500 Ввод UserPromptExpansion
1501</h4>1501</h4>
1502 1502
1503Помимо [common input fields](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` имеет значение `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.1503Помимо [общих полей ввода](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` имеет значение `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок сервера MCP.
1504 1504
1505```json theme={null}1505```json theme={null}
1506{1506{
1518```1518```
1519 1519
1520<h4 id="userpromptexpansion-decision-control">1520<h4 id="userpromptexpansion-decision-control">
1521 UserPromptExpansion decision control1521 Управление решением UserPromptExpansion
1522</h4>1522</h4>
1523 1523
1524Hooks `UserPromptExpansion` могут заблокировать расширение или добавить контекст. Все [JSON output fields](#json-output) доступны.1524Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Все [поля JSON-вывода](#json-output) доступны.
1525 1525
1526| Field | Description |1526| Поле | Описание |
1527| :------------------ | :-------------------------------------------------------------------------------------------------------------------------- |1527| :------------------ | :-------------------------------------------------------------------------------------------------------------------------- |
1528| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |1528| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |
1529| `reason` | Показано пользователю, когда `decision` имеет значение `"block"` |1529| `reason` | Показано пользователю, когда `decision` имеет значение `"block"` |
1530| `additionalContext` | Строка, добавленная в контекст Claude рядом с расширенной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1530| `additionalContext` | Строка, добавленная в контекст Claude рядом с развернутой подсказкой. См. [Add context for Claude](#add-context-for-claude) |
1531 1531
1532Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.1532Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.
1533 1533
1546 MessageDisplay1546 MessageDisplay
1547</h3>1547</h3>
1548 1548
1549Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отображению, hook выполняется один раз с этими строками, и Claude Code отображает текст замены hook вместо них. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.1549Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отрисовке, hook выполняется один раз с этими строками, и Claude Code отображает текст замены hook на их месте. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.
1550 1550
1551Используйте MessageDisplay для:1551Используйте MessageDisplay для:
1552 1552
1553* удаления markdown для минимального отображения1553* удаления markdown для минимального отображения
1554* преобразования текста, который приложение Agent SDK показывает своим пользователям1554* преобразования текста, который приложение Agent SDK показывает своим пользователям
1555* редактирования API ключей или внутренних имен хостов из ответов Claude1555* редактирования ключей API или внутренних имен хостов из ответов Claude
1556 1556
1557Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает timeout, Claude Code отображает исходный текст. Стандартный timeout для этого события составляет 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1557Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает время ожидания, Claude Code отображает исходный текст. Тайм-аут по умолчанию для этого события составляет 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1558 1558
1559MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.1559MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.
1560 1560
1561MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое транслирует текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.1561MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое транслирует текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.
1562 1562
1563В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение помощника вместо один раз на партию строк. Один вызов приходит после завершения сообщения и несет полный текст сообщения: `index` имеет значение `0`, `final` имеет значение `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.1563В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз для каждого сообщения помощника вместо один раз для каждой партии строк. Один вызов прибывает после завершения сообщения и несет полный текст сообщения: `index` имеет значение `0`, `final` имеет значение `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.
1564 1564
1565<h4 id="messagedisplay-input">1565<h4 id="messagedisplay-input">
1566 MessageDisplay input1566 Ввод MessageDisplay
1567</h4>1567</h4>
1568 1568
1569Помимо [common input fields](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как транслируется текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.1569Помимо [общих полей ввода](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как транслируется текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.
1570 1570
1571| Field | Description |1571| Поле | Описание |
1572| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1572| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1573| `turn_id` | UUID текущего хода |1573| `turn_id` | UUID текущего хода |
1574| `message_id` | UUID сообщения помощника, которое отображается. Стабилен во всех партиях одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |1574| `message_id` | UUID сообщения помощника, которое отображается. Стабилен для каждой партии одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |
1575| `index` | Индекс этой партии в сообщении, начиная с нуля |1575| `index` | Индекс этой партии в сообщении, начиная с нуля |
1576| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |1576| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |
1577| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуста, когда сообщение заканчивается новой строкой, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |1577| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуст, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |
1578 1578
1579```json theme={null}1579```json theme={null}
1580{1580{
1591```1591```
1592 1592
1593<h4 id="messagedisplay-output">1593<h4 id="messagedisplay-output">
1594 MessageDisplay output1594 Вывод MessageDisplay
1595</h4>1595</h4>
1596 1596
1597Помимо [JSON output fields](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:1597Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:
1598 1598
1599| Field | Description |1599| Поле | Описание |
1600| :--------------- | :------------------------------------------------------------------- |1600| :--------------- | :------------------------------------------------------------------- |
1601| `displayContent` | Текст, отображаемый вместо delta. Опустите для отображения исходного |1601| `displayContent` | Текст, отображаемый вместо delta. Опустите для отображения исходного |
1602 1602
1603Hooks MessageDisplay не имеют управления решением. Они не могут заблокировать сообщение или изменить то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их JSON вывода и отбрасывает `systemMessage` и `continue`.1603Hooks MessageDisplay не имеют управления решением. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их JSON-вывода и отбрасывает `systemMessage` и `continue`.
1604 1604
1605Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.1605Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.
1606 1606
1607<Tabs>1607<Tabs>
1608 <Tab title="macOS/Linux">1608 <Tab title="macOS/Linux">
1609 Зарегистрируйте command hook для события в файле настроек:1609 Зарегистрируйте command hook для события в файле параметров:
1610 1610
1611 ```json theme={null}1611 ```json theme={null}
1612 {1612 {
1661 }1661 }
1662 ```1662 ```
1663 1663
1664 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, поэтому hook запускается быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.1664 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы hook запустился быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.
1665 1665
1666 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:1666 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:
1667 1667
1684 PreToolUse1684 PreToolUse
1685</h3>1685</h3>
1686 1686
1687Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым именем инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [MCP tool names](#match-mcp-tools).1687Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым названием инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [имена инструментов MCP](#match-mcp-tools).
1688 1688
1689Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged) вместо соответствия инструментам редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения, и они не имеют управления решением, поэтому они не могут заблокировать запись.1689Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте вместо этого [FileChanged](#filechanged). В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения, и они не имеют управления решением, поэтому они не могут блокировать запись.
1690 1690
1691<Warning>1691<Warning>
1692 PreToolUse запускается только, когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому никакой hook PreToolUse не срабатывает для них, включая hooks, соответствующие `Read`. Чтобы заблокировать определенные пути от ссылок `@`, используйте [правило отказа `Read`](/docs/ru/permissions#read-and-edit) вместо этого.1692 PreToolUse запускается только, когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому для них не срабатывает hook PreToolUse, включая hooks, соответствующие `Read`. Чтобы заблокировать определенные пути от ссылок `@`, используйте вместо этого [`Read` deny rule](/docs/ru/permissions#read-and-edit).
1693 1693
1694 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).1694 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1695</Warning>1695</Warning>
1696 1696
1697Используйте [PreToolUse decision control](#pretooluse-decision-control) для разрешения, отказа, запроса или отсрочки вызова инструмента.1697Используйте [управление решением PreToolUse](#pretooluse-decision-control) для разрешения, отказа, запроса или отложения вызова инструмента.
1698 1698
1699[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой timeout, блокирует вызов инструмента, и Claude получает результат ошибки, называющий timeout. Явный отказ, возвращенный другим hook, все еще имеет приоритет.1699[Callback hook Agent SDK](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой тайм-аут, блокирует вызов инструмента, и Claude получает результат ошибки с названием тайм-аута. Явный отказ, возвращенный другим hook, все еще имеет приоритет.
1700 1700
1701<h4 id="pretooluse-input">1701<h4 id="pretooluse-input">
1702 PreToolUse input1702 Ввод PreToolUse
1703</h4>1703</h4>
1704 1704
1705Помимо [common input fields](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.1705Помимо [общих полей ввода](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1706 1706
1707Для [MCP tool](#match-mcp-tools), ввод также несет `mcp_server`, объект с `name` сервера и `source`, который говорит, откуда пришло определение сервера. Значения `source` включают `plugin`, `sdk` и области конфигурации, такие как `user` и `project`. [`McpServerProvenance`](/docs/ru/agent-sdk/typescript#mcpserverprovenance) в справочнике Agent SDK перечисляет их все и говорит, как рассматривать тот, который вы не узнаете. Основывайте решения о доверии на `source`, а не на `name` или префиксе инструмента `mcp__<server>__`. Поле `mcp_server` требует Claude Code v2.1.274 или позже.1707Для [инструмента MCP](#match-mcp-tools) ввод также несет `mcp_server`, объект с `name` сервера и `source`, который говорит, откуда пришло определение сервера. Значения `source` включают `plugin`, `sdk` и области конфигурации, такие как `user` и `project`. [`McpServerProvenance`](/docs/ru/agent-sdk/typescript#mcpserverprovenance) в справочнике Agent SDK перечисляет их все и говорит, как рассматривать тот, который вы не узнаете. Основывайте решения о доверии на `source`, а не на `name` или префиксе инструмента `mcp__<server>__`. Поле `mcp_server` требует Claude Code v2.1.274 или позже.
1708 1708
1709Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:1709Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:
1710 1710
1711* Claude Code расширяет `~` и относительные пути перед выполнением hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание того же пути1711* Claude Code расширяет `~` и относительные пути перед выполнением hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание одного пути
1712* На Windows путь приходит с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`1712* На Windows путь прибывает с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`
1713* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки1713* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки
1714* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен1714* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен
1715 1715
1735 Bash1735 Bash
1736</h5>1736</h5>
1737 1737
1738Выполняет команды shell.1738Выполняет команды оболочки.
1739 1739
1740| Field | Type | Example | Description |1740| Поле | Тип | Пример | Описание |
1741| :------------------ | :------ | :----------------- | :------------------------------------------------------------------------------------------------------------------------------------------------- |1741| :------------------ | :------ | :----------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------- |
1742| `command` | string | `"npm test"` | Команда shell для выполнения |1742| `command` | string | `"npm test"` | Команда оболочки для выполнения |
1743| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |1743| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |
1744| `timeout` | number | `120000` | Опциональный timeout в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1744| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1745| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1745| `run_in_background` | boolean | `false` | Выполнять ли команду в фоновом режиме |
1746 1746
1747Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude редактировать файлы через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.1747Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude на редактирование файлов через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.
1748 1748
1749Ваш [PostToolUse hook](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.1749Ваш [hook PostToolUse](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.
1750 1750
1751<Note>1751<Note>
1752 Список лучше всего усилен и находится в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для применения политики.1752 Список лучше всего усилен и находится в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для применения политики.
1753</Note>1753</Note>
1754 1754
1755`changedFiles` и `files` указывают, что изменила команда; остальные поля говорят, насколько полон и надежен этот список.1755`changedFiles` и `files` перечисляют то, что команда изменила; остальные поля говорят, насколько полон и надежен этот список.
1756 1756
1757| Field | Type | Example | Description |1757| Поле | Тип | Пример | Описание |
1758| :------------- | :------ | :------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1758| :------------- | :------ | :------------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1759| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые команда изменила, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |1759| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые команда изменила, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |
1760| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` имеет значение `true` для файла, который команда добавила или удалила |1760| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` имеет значение `true` для файла, который команда добавила или удалила |
1769 PowerShell1769 PowerShell
1770</h5>1770</h5>
1771 1771
1772Выполняет команды PowerShell. См. [PowerShell tool](/docs/ru/tools-reference#powershell-tool) для доступности по платформе.1772Выполняет команды PowerShell. См. [инструмент PowerShell](/docs/ru/tools-reference#powershell-tool) для доступности по платформе.
1773 1773
1774Поля совпадают с инструментом Bash, со строкой команды в `command`:1774Поля совпадают с инструментом Bash, со строкой команды в `command`:
1775 1775
1776| Field | Type | Example | Description |1776| Поле | Тип | Пример | Описание |
1777| :------------------ | :------ | :------------------------- | :--------------------------------------------- |1777| :------------------ | :------ | :------------------------- | :--------------------------------------------- |
1778| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |1778| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |
1779| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |1779| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |
1780| `timeout` | number | `120000` | Опциональный timeout в миллисекундах |1780| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах |
1781| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1781| `run_in_background` | boolean | `false` | Выполнять ли команду в фоновом режиме |
1782 1782
1783Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды shell, поэтому они охватывают оба инструмента:1783Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды оболочки, чтобы они охватывали оба инструмента:
1784 1784
1785* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основной shell и маршрутизирует команды shell через него.1785* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основную оболочку и маршрутизирует команды оболочки через него.
1786* На Windows без Git Bash инструмент включен автоматически, и Claude Code вообще не регистрирует инструмент Bash.1786* На Windows без Git Bash инструмент включен автоматически и Claude Code не регистрирует инструмент Bash вообще.
1787* Hook, который совпадает только с `Bash`, никогда не срабатывает там.1787* Hook, который совпадает только с `Bash`, никогда не срабатывает там.
1788 1788
1789<h5 id="write">1789<h5 id="write">
1792 1792
1793Создает или перезаписывает файл.1793Создает или перезаписывает файл.
1794 1794
1795| Field | Type | Example | Description |1795| Поле | Тип | Пример | Описание |
1796| :---------- | :----- | :-------------------- | :--------------------------------- |1796| :---------- | :----- | :-------------------- | :--------------------------------- |
1797| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для записи |1797| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для записи |
1798| `content` | string | `"file content"` | Содержимое для записи в файл |1798| `content` | string | `"file content"` | Содержимое для записи в файл |
1803 1803
1804Заменяет строку в существующем файле.1804Заменяет строку в существующем файле.
1805 1805
1806| Field | Type | Example | Description |1806| Поле | Тип | Пример | Описание |
1807| :------------ | :------ | :-------------------- | :----------------------------------------- |1807| :------------ | :------ | :-------------------- | :----------------------------------------- |
1808| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для редактирования |1808| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для редактирования |
1809| `old_string` | string | `"original text"` | Текст для поиска и замены |1809| `old_string` | string | `"original text"` | Текст для поиска и замены |
1816 1816
1817Читает содержимое файла.1817Читает содержимое файла.
1818 1818
1819| Field | Type | Example | Description |1819| Поле | Тип | Пример | Описание |
1820| :---------- | :----- | :-------------------- | :------------------------------------------ |1820| :---------- | :----- | :-------------------- | :------------------------------------------ |
1821| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |1821| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |
1822| `offset` | number | `10` | Опциональный номер строки для начала чтения |1822| `offset` | number | `10` | Опциональный номер строки для начала чтения |
1828 1828
1829Находит файлы, соответствующие шаблону glob.1829Находит файлы, соответствующие шаблону glob.
1830 1830
1831| Field | Type | Example | Description |1831| Поле | Тип | Пример | Описание |
1832| :-------- | :----- | :--------------- | :-------------------------------------------------------------------------- |1832| :-------- | :----- | :--------------- | :-------------------------------------------------------------------------- |
1833| `pattern` | string | `"**/*.ts"` | Шаблон glob для соответствия файлам |1833| `pattern` | string | `"**/*.ts"` | Шаблон glob для совпадения файлов |
1834| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |1834| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |
1835 1835
1836<h5 id="grep">1836<h5 id="grep">
1837 Grep1837 Grep
1838</h5>1838</h5>
1839 1839
1840Ищет содержимое файлов с помощью регулярных выражений.1840Ищет содержимое файлов с регулярными выражениями.
1841 1841
1842| Field | Type | Example | Description |1842| Поле | Тип | Пример | Описание |
1843| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------- |1843| :------------ | :------ | :--------------- | :------------------------------------------------------------------------------------- |
1844| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |1844| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |
1845| `path` | string | `"/path/to/dir"` | Опциональный файл или директория для поиска |1845| `path` | string | `"/path/to/dir"` | Опциональный файл или директория для поиска |
1846| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |1846| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |
1847| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |1847| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |
1848| `-i` | boolean | `true` | Поиск без учета регистра |1848| `-i` | boolean | `true` | Поиск без учета регистра |
1849| `multiline` | boolean | `false` | Включить многострочное соответствие |1849| `multiline` | boolean | `false` | Включить многострочное совпадение |
1850 1850
1851<h5 id="webfetch">1851<h5 id="webfetch">
1852 WebFetch1852 WebFetch
1853</h5>1853</h5>
1854 1854
1855Получает и обрабатывает веб-содержимое.1855Получает и обрабатывает веб-контент.
1856 1856
1857| Field | Type | Example | Description |1857| Поле | Тип | Пример | Описание |
1858| :------- | :----- | :---------------------------- | :--------------------------------------------- |1858| :------- | :----- | :---------------------------- | :------------------------------------------- |
1859| `url` | string | `"https://example.com/api"` | URL для получения содержимого |1859| `url` | string | `"https://example.com/api"` | URL для получения контента |
1860| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном содержимом |1860| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном контенте |
1861 1861
1862<h5 id="websearch">1862<h5 id="websearch">
1863 WebSearch1863 WebSearch
1865 1865
1866Ищет в веб.1866Ищет в веб.
1867 1867
1868| Field | Type | Example | Description |1868| Поле | Тип | Пример | Описание |
1869| :---------------- | :----- | :----------------------------- | :------------------------------------------------------ |1869| :---------------- | :----- | :----------------------------- | :------------------------------------------------------ |
1870| `query` | string | `"react hooks best practices"` | Поисковый запрос |1870| `query` | string | `"react hooks best practices"` | Поисковый запрос |
1871| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включить результаты только с этих доменов |1871| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включить результаты только с этих доменов |
1875 Agent1875 Agent
1876</h5>1876</h5>
1877 1877
1878Порождает [subagent](/docs/ru/sub-agents).1878Порождает [подагента](/docs/ru/sub-agents).
1879 1879
1880| Field | Type | Example | Description |1880| Поле | Тип | Пример | Описание |
1881| :-------------- | :----- | :------------------------- | :--------------------------------------------------------- |1881| :-------------- | :----- | :------------------------- | :------------------------------------------------------------- |
1882| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |1882| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |
1883| `description` | string | `"Find API endpoints"` | Краткое описание задачи |1883| `description` | string | `"Find API endpoints"` | Краткое описание задачи |
1884| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |1884| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |
1885| `model` | string | `"sonnet"` | Опциональный alias модели для переопределения по умолчанию |1885| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения стандартного |
1886 1886
1887Когда вызов Agent переднего плана завершается, ваш [PostToolUse hook](#posttooluse) получает финальный текст подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [token and cost counters](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:1887Когда вызов Agent переднего плана завершается, ваш [hook PostToolUse](#posttooluse) получает результат подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [счетчики токенов и затрат](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:
1888 1888
1889| Field | Type | Example | Description |1889| Поле | Тип | Пример | Описание |
1890| :------------------ | :----- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1890| :------------------ | :----- | :---------------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1891| `status` | string | `"completed"` | `"completed"` для подагентов переднего плана, `"async_launched"` для подагентов фонового плана. Начиная с v2.1.198, подагенты выполняются в фоне по умолчанию, поэтому опущенный `run_in_background` также создает `"async_launched"` |1891| `status` | string | `"completed"` | `"completed"` для подагентов переднего плана, `"async_launched"` для подагентов фонового плана. Начиная с версии 2.1.198, подагенты выполняются в фоновом режиме по умолчанию, поэтому опущенный `run_in_background` также создает `"async_launched"` |
1892| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |1892| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |
1893| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента, или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этой передаче вместо них |1893| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этой передаче на их месте |
1894| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |1894| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |
1895| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |1895| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |
1896| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |1896| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |
1898| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |1898| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |
1899| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1899| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1900 1900
1901На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), доставляет свой отчет через этот инструмент, а не возвращает его как текст. Поле `content` его результата `completed` затем несет краткую заметку об этой передаче, а не сам отчет. Чтобы прочитать отчет, совпадайте с hook `PreToolUse` или `PostToolUse` на `SubagentHandback` и прочитайте `tool_input.message`.1901На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), доставляет свой отчет через этот инструмент, а не возвращает его как текст. Поле `content` его результата `completed` затем несет краткую заметку об этой передаче, а не сам отчет. Чтобы прочитать отчет, совпадайте с hook `PreToolUse` или `PostToolUse` на `SubagentHandback` и прочитайте `tool_input.message`.
1902 1902
1903Для подагентов фонового плана инструмент возвращается, когда задача переходит в фон, поэтому `tool_response` не несет полей использования: фоновый запуск возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фон во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.1903Для подагентов фонового плана инструмент возвращается, когда задача переходит в фоновый режим, поэтому `tool_response` не несет полей использования: фоновый запуск возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фоновый режим во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1904 1904
1905На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, что может отличаться от значения `model` в `tool_input`, такого как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент переходит в фон, поэтому переключение, которое произошло перед переходом в фон, отражается там. `modelsUsed` и поведение `resolvedModel` во время перехода в фон требуют Claude Code v2.1.212 или позже.1905На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, которая может отличаться от значения `model` в `tool_input`, такой как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент перешел в фоновый режим, поэтому переключение, которое произошло перед переходом в фоновый режим, отражается там. `modelsUsed` и поведение `resolvedModel` во время перехода в фоновый режим требуют Claude Code v2.1.212 или позже.
1906 1906
1907<a id="askuserquestion" />1907<a id="askuserquestion" />
1908 1908
1912 1912
1913Задает пользователю один-четыре вопроса с множественным выбором.1913Задает пользователю один-четыре вопроса с множественным выбором.
1914 1914
1915| Field | Type | Example | Description |1915| Поле | Тип | Пример | Описание |
1916| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1916| :---------- | :----- | :----------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1917| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с строкой `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |1917| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с строкой `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |
1918| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Отображает текст вопроса на выбранный label опции. Ответы с множественным выбором объединяют labels запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |1918| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Отображает текст вопроса на выбранный ярлык опции. Ответы с множественным выбором объединяют ярлыки запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |
1919 1919
1920<h5 id="exitplanmode">1920<h5 id="exitplanmode">
1921 ExitPlanMode1921 ExitPlanMode
1922</h5>1922</h5>
1923 1923
1924Представляет план и просит пользователя одобрить его перед тем, как Claude покидает [plan mode](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.1924Представляет план и просит пользователя одобрить его перед тем, как Claude покинет [режим плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.
1925 1925
1926| Field | Type | Example | Description |1926| Поле | Тип | Пример | Описание |
1927| :--------------- | :----- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------- |1927| :--------------- | :----- | :------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1928| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |1928| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |
1929| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |1929| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |
1930| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |1930| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До версии 2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |
1931 1931
1932В `PostToolUse`, `tool_response` — это объект с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.1932В `PostToolUse`, `tool_response` — это объект с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.
1933 1933
1934<h4 id="pretooluse-decision-control">1934<h4 id="pretooluse-decision-control">
1935 PreToolUse decision control1935 Управление решением PreToolUse
1936</h4>1936</h4>
1937 1937
1938Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отсрочить) плюс возможность изменить ввод инструмента перед выполнением.1938Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отложить) плюс возможность изменить ввод инструмента перед выполнением.
1939 1939
1940| Field | Description |1940| Поле | Описание |
1941| :------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |1941| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
1942| `permissionDecision` | `"allow"` пропускает подсказку разрешения, кроме [actions no mode auto-approves](/docs/ru/permission-modes#actions-no-mode-auto-approves) и для `AskUserQuestion` и `ExitPlanMode`, которым нужен [`updatedInput` в паре с ним](#allow-with-updatedinput). `"deny"` предотвращает вызов инструмента. `"ask"` подсказывает пользователю подтвердить. `"defer"` выходит корректно, чтобы инструмент можно было возобновить позже. [Deny and ask rules](/docs/ru/permissions#manage-permissions) все еще оцениваются независимо от того, что возвращает hook |1942| `permissionDecision` | `"allow"` пропускает подсказку разрешения, кроме [действий, которые ни один режим не одобряет автоматически](/docs/ru/permission-modes#actions-no-mode-auto-approves) и для `AskUserQuestion` и `ExitPlanMode`, которым нужна [`updatedInput`, связанная с ней](#allow-with-updatedinput). `"deny"` предотвращает вызов инструмента. `"ask"` подсказывает пользователю подтвердить. `"defer"` выходит корректно, чтобы инструмент можно было возобновить позже. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются независимо от того, что возвращает hook |
1943| `permissionDecisionReason` | Для `"allow"` и `"ask"`, показано пользователю, но не Claude. Для `"deny"`, показано Claude. Для `"defer"`, игнорируется |1943| `permissionDecisionReason` | Для `"allow"` и `"ask"`, показано пользователю, но не Claude. Для `"deny"`, показано Claude. Для `"defer"`, игнорируется |
1944| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Claude Code оценивает правила разрешений и [auto-background eligibility](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |1944| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Claude Code оценивает правила разрешения и [автоматическую фоновую приемлемость](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или с `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |
1945| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |1945| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |
1946 1946
1947Когда несколько hooks PreToolUse возвращают разные решения, приоритет — `deny` > `defer` > `ask` > `allow`.1947Когда несколько hooks PreToolUse возвращают разные решения, приоритет — `deny` > `defer` > `ask` > `allow`.
1948 1948
1949Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.1949Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.
1950 1950
1951Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает метку, определяющую, откуда пришел hook: `[settings]` для hook из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для hook plugin или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1951Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает ярлык, определяющий, откуда пришел hook: `[settings]` для hook из любого файла параметров или из frontmatter агента, `[plugin:<name>]` для hook плагина или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1952 1952
1953`"ask"` hook также принуждает подсказку разрешения в [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызов инструмента, но он не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и hook `"deny"` всегда соблюдался.1953`"ask"` hook также принуждает подсказку разрешения в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызову инструмента, но не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и hook `"deny"` всегда соблюдался.
1954 1954
1955```json theme={null}1955```json theme={null}
1956{1956{
1968 1968
1969<span id="allow-with-updatedinput" />1969<span id="allow-with-updatedinput" />
1970 1970
1971В [non-interactive mode](/docs/ru/headless) с флагом `-p`, Claude Code предлагает `AskUserQuestion` и `ExitPlanMode` только, когда запуск имеет [permission host](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) для получения подсказки, такой как callback Agent SDK `canUseTool`. Эти инструменты требуют взаимодействия с пользователем. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет это требование: hook читает ввод инструмента из stdin, собирает ответ через ваш собственный UI и возвращает его в `updatedInput`, чтобы инструмент выполнялся без подсказки. Возврат только `"allow"` недостаточен для этих инструментов. Для `AskUserQuestion`, повторите исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), отображающий текст каждого вопроса на выбранный ответ.1971В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code предлагает `AskUserQuestion` и `ExitPlanMode` только, когда запуск имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) для получения подсказки, такой как callback `canUseTool` Agent SDK. Эти инструменты требуют взаимодействия с пользователем. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет это требование: hook читает ввод инструмента из stdin, собирает ответ через ваш собственный UI и возвращает его в `updatedInput`, чтобы инструмент выполнялся без подсказки. Возврат только `"allow"` недостаточен для этих инструментов. Для `AskUserQuestion` повторите исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), отображающий текст каждого вопроса на выбранный ответ.
1972 1972
1973Начиная с версии 2.1.199, инструмент MCP, чей сервер отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с `updatedInput` или без него, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое требует инструмент.1973Начиная с версии 2.1.199, инструмент MCP, сервер которого отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с `updatedInput` или без него, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое требует инструмент.
1974 1974
1975<Note>1975<Note>
1976 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.1976 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте вместо этого `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.
1977</Note>1977</Note>
1978 1978
1979<h4 id="defer-a-tool-call-for-later">1979<h4 id="defer-a-tool-call-for-later">
1980 Defer a tool call for later1980 Отложить вызов инструмента на потом
1981</h4>1981</h4>
1982 1982
1983`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его JSON вывод, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить с того же места. Claude Code соблюдает это значение только в [non-interactive mode](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он логирует предупреждение и игнорирует результат hook.1983`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его JSON-вывод, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить, где он остановился. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он логирует предупреждение и игнорирует результат hook.
1984 1984
1985Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [permission host](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому запустите запуск с одним. Круговой путь работает так:1985Инструмент `AskUserQuestion` — типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому начните запуск с одного. Круговой путь работает так:
1986 1986
19871. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.19871. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.
19882. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и сохраненным вызовом инструмента в транскрипте.19882. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и отложенный вызов инструмента сохраняется в транскрипте.
19893. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.19893. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.
19904. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же permission host. Тот же вызов инструмента срабатывает `PreToolUse` снова.19904. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента срабатывает `PreToolUse` снова.
19915. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.19915. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.
1992 1992
1993Поле `deferred_tool_use` несет `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:1993Поле `deferred_tool_use` несет `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:
2006}2006}
2007```2007```
2008 2008
2009Нет timeout или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [retention sweep rules](/docs/ru/claude-directory#cleaned-up-automatically) [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.2009Нет тайм-аута или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [правилам очистки](/docs/ru/claude-directory#cleaned-up-automatically) [retention sweep](/docs/ru/settings-reference#cleanupperioddays), которая удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.
2010 2010
2011`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отсрочить один вызов из партии без оставления других неразрешенными.2011`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отложить один вызов из партии без оставления других неразрешенными.
2012 2012
2013Если отсроченный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, чтобы вы могли определить, какой инструмент исчез.2013Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, чтобы вы могли определить, какой инструмент исчез.
2014 2014
2015<Note>2015<Note>
2016 Чтобы возобновить отсроченный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Без него Claude Code не восстанавливает режим плана. Требует Claude Code v2.1.246 или позже.2016 Чтобы возобновить отложенный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Без него Claude Code не восстанавливает режим плана. Требует Claude Code v2.1.246 или позже.
2017 2017
2018 Когда вы возобновляете с `-p`, Claude Code не восстанавливает никакой другой сохраненный режим разрешений. Он запускает запуск в режиме разрешений, который новый запуск `claude -p` запустил бы, поэтому передайте `--permission-mode` или `--dangerously-skip-permissions` снова, если отсроченный сеанс использовал один. Когда вы возобновляете с `claude --resume <session-id>` без `-p`, Claude Code восстанавливает сохраненный режим разрешений, с исключениями, перечисленными в [permission mode on resume](/docs/ru/sessions#permission-mode-on-resume).2018 Когда вы возобновляете с `-p`, Claude Code не восстанавливает никакой другой сохраненный режим разрешений. Он запускает запуск в режиме разрешений, который новый запуск `claude -p` запустил бы, поэтому передайте `--permission-mode` или `--dangerously-skip-permissions` снова, если отложенный сеанс использовал один. Когда вы возобновляете с `claude --resume <session-id>` без `-p`, Claude Code восстанавливает сохраненный режим разрешений, с исключениями, перечисленными в [режим разрешений при возобновлении](/docs/ru/sessions#permission-mode-on-resume).
2019</Note>2019</Note>
2020 2020
2021<h3 id="permissionrequest">2021<h3 id="permissionrequest">
2022 PermissionRequest2022 PermissionRequest
2023</h3>2023</h3>
2024 2024
2025Запускается, когда Claude Code собирается попросить у вас разрешение на использование инструмента. В сеансах, которые не могут показать подсказку, такие как фоновые подагенты в [non-interactive mode](/docs/ru/headless), Claude Code все еще запускает эти hooks, и если ни один hook не возвращает решение, он отказывает вызову инструмента.2025Запускается, когда Claude Code собирается попросить вас разрешение на использование инструмента. В сеансах, которые не могут показать подсказку, такие как фоновые подагенты в [неинтерактивном режиме](/docs/ru/headless), Claude Code все еще запускает эти hooks, и если ни один hook не возвращает решение, он отказывает вызову инструмента.
2026Используйте [PermissionRequest decision control](#permissionrequest-decision-control) для разрешения или отказа от имени пользователя.2026Используйте [управление решением PermissionRequest](#permissionrequest-decision-control) для разрешения или отказа от имени пользователя.
2027 2027
2028Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает [Notification](#notification) hook с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.2028Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает hook [Notification](#notification) с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.
2029 2029
2030Claude Code не запускает hooks PermissionRequest для [network request](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.2030Claude Code не запускает hooks PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.
2031 2031
2032Совпадает с именем инструмента, те же значения, что и PreToolUse.2032Совпадает с названием инструмента, те же значения, что и PreToolUse.
2033 2033
2034<h4 id="permissionrequest-input">2034<h4 id="permissionrequest-input">
2035 PermissionRequest input2035 Ввод PermissionRequest
2036</h4>2036</h4>
2037 2037
2038Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [permission updates](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.2038Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.
2039 2039
2040Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может удержать опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.2040Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как диалог для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может скрыть опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.
2041 2041
2042Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить у вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).2042Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
2043 2043
2044```json theme={null}2044```json theme={null}
2045{2045{
2065```2065```
2066 2066
2067<h4 id="permissionrequest-decision-control">2067<h4 id="permissionrequest-decision-control">
2068 PermissionRequest decision control2068 Управление решением PermissionRequest
2069</h4>2069</h4>
2070 2070
2071Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:2071Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:
2072 2072
2073| Field | Description |2073| Поле | Описание |
2074| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2074| :------------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2075| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает в нем. [Deny and ask rules](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |2075| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает его. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |
2076| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |2076| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |
2077| `updatedPermissions` | Для `"allow"` только: массив [permission update entries](#permission-update-entries) для применения, такой как добавление правила разрешения или изменение режима разрешений сеанса |2077| `updatedPermissions` | Для `"allow"` только: массив [записей обновления разрешений](#permission-update-entries) для применения, такие как добавление правила разрешения или изменение режима разрешений сеанса |
2078| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |2078| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |
2079| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |2079| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |
2080 2080
2095```2095```
2096 2096
2097<h4 id="permission-update-entries">2097<h4 id="permission-update-entries">
2098 Permission update entries2098 Записи обновления разрешений
2099</h4>2099</h4>
2100 2100
2101Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.2101Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.
2102 2102
2103| `type` | Fields | Effect |2103| `type` | Поля | Эффект |
2104| :------------------ | :--------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2104| :------------------ | :--------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2105| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для соответствия всему инструменту. `behavior` — это `"allow"`, `"deny"` или `"ask"` |2105| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |
2106| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |2106| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |
2107| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |2107| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |
2108| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как alias для `default`. Alias `manual` требует Claude Code v2.1.200 или позже |2108| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |
2109| `addDirectories` | `directories`, `destination` | Добавляет рабочие директории. `directories` — это массив строк пути |2109| `addDirectories` | `directories`, `destination` | Добавляет рабочие директории. `directories` — это массив строк путей |
2110| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |2110| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |
2111 2111
2112<Note>2112<Note>
2113 `setMode` с `bypassPermissions` вступает в силу только, если вы запустили сеанс с режимом bypass, уже доступным: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [user, `--settings` или managed settings](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление — это no-op. Обновление также является no-op, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает режим или когда сеанс запускается в [restricted mode](/docs/ru/cli-reference#cli-flags).2113 `setMode` с `bypassPermissions` вступает в силу только, если вы запустили сеанс с режимом обхода, уже доступным: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [пользовательских, `--settings` или управляемых параметрах](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление — это no-op. Обновление также является no-op, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает режим или когда сеанс запускается в [restricted mode](/docs/ru/cli-reference#cli-flags).
2114 2114
2115 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2115 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.
2116</Note>2116</Note>
2117 2117
2118Поле `destination` на каждой записи определяет, остается ли изменение в памяти или сохраняется в файл настроек.2118Поле `destination` на каждой записи определяет, остается ли изменение в памяти или сохраняется в файл параметров.
2119 2119
2120| `destination` | Writes to |2120| `destination` | Записывает в |
2121| :---------------- | :--------------------------------------------------- |2121| :---------------- | :--------------------------------------------------- |
2122| `session` | только в памяти, отбрасывается при завершении сеанса |2122| `session` | только в памяти, отбрасывается при завершении сеанса |
2123| `localSettings` | `.claude/settings.local.json` |2123| `localSettings` | `.claude/settings.local.json` |
2124| `projectSettings` | `.claude/settings.json` |2124| `projectSettings` | `.claude/settings.json` |
2125| `userSettings` | `~/.claude/settings.json` |2125| `userSettings` | `~/.claude/settings.json` |
2126 2126
2127Hook может повторить один из `permission_suggestions`, которые он получил, как свой собственный вывод `updatedPermissions`.2127Hook может повторить одно из `permission_suggestions`, которые он получил, как свой собственный вывод `updatedPermissions`.
2128 2128
2129<h3 id="posttooluse">2129<h3 id="posttooluse">
2130 PostToolUse2130 PostToolUse
2132 2132
2133Запускается сразу после успешного завершения инструмента.2133Запускается сразу после успешного завершения инструмента.
2134 2134
2135Совпадает с именем инструмента, те же значения, что и PreToolUse.2135Совпадает с названием инструмента, те же значения, что и PreToolUse.
2136 2136
2137Совпадайте более широко, когда имя инструмента не является правильным фильтром:2137Совпадайте более широко, когда название инструмента не является правильным фильтром:
2138 2138
2139* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook может затем обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также указывает неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).2139* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook может затем обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).
2140* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.2140* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.
2141 2141
2142<h4 id="posttooluse-input">2142<h4 id="posttooluse-input">
2143 PostToolUse input2143 Ввод PostToolUse
2144</h4>2144</h4>
2145 2145
2146Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути инструментов файлов `tool_input` приходят в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).2146Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути `tool_input` инструментов файлов прибывают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).
2147 2147
2148```json theme={null}2148```json theme={null}
2149{2149{
2166}2166}
2167```2167```
2168 2168
2169| Field | Description |2169| Поле | Описание |
2170| :------------ | :---------------------------------------------------------------------------------------------------------------------------------- |2170| :------------ | :---------------------------------------------------------------------------------------------------------------------------------- |
2171| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2171| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
2172 2172
2173<h4 id="posttooluse-decision-control">2173<h4 id="posttooluse-decision-control">
2174 PostToolUse decision control2174 Управление решением PostToolUse
2175</h4>2175</h4>
2176 2176
2177Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2177Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2178 2178
2179| Field | Description |2179| Поле | Описание |
2180| :--------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2180| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2181| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |2181| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |
2182| `reason` | Объяснение, показанное Claude, когда `decision` имеет значение `"block"` |2182| `reason` | Объяснение, показанное Claude, когда `decision` имеет значение `"block"` |
2183| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |2183| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |
2184| `classifierContext` | Краткая заметка об этом результате вызова для [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) классификатора, а не для Claude. См. [Annotate a result for the auto mode classifier](#annotate-a-result-for-the-auto-mode-classifier). Требует Claude Code v2.1.236 или позже |2184| `classifierContext` | Краткая заметка об этом результате вызова для [классификатора режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не для Claude. См. [Annotate a result for the auto mode classifier](#annotate-a-result-for-the-auto-mode-classifier). Требует Claude Code v2.1.236 или позже |
2185| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |2185| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |
2186| `updatedMCPToolOutput` | Заменяет вывод для [MCP tools](#match-mcp-tools) только. Предпочитайте `updatedToolOutput`, который работает для всех инструментов |2186| `updatedMCPToolOutput` | Заменяет вывод для [инструментов MCP](#match-mcp-tools) только. Предпочитайте `updatedToolOutput`, который работает для всех инструментов |
2187 2187
2188Пример ниже заменяет вывод вызова `Bash`. Значение замены совпадает с формой вывода инструмента `Bash`:2188Пример ниже заменяет вывод вызова `Bash`. Значение замены совпадает с формой вывода инструмента `Bash`:
2189 2189
2203```2203```
2204 2204
2205<Warning>2205<Warning>
2206 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте hook [PreToolUse](#pretooluse) вместо этого.2206 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте вместо этого hook [PreToolUse](#pretooluse).
2207 2207
2208 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.2208 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.
2209</Warning>2209</Warning>
2210 2210
2211<h4 id="annotate-a-result-for-the-auto-mode-classifier">2211<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2212 Annotate a result for the auto mode classifier2212 Аннотирование результата для классификатора режима auto
2213</h4>2213</h4>
2214 2214
2215Верните `classifierContext` для отправки краткой заметки об этом результате вызова инструмента [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) классификатору, а не Claude. Классификатор [никогда не получает результаты инструментов сами](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ сказать ему что-то о том, что вернул вызов, перед тем как он проверит более поздние действия. Поле требует Claude Code v2.1.236 или позже.2215Верните `classifierContext` для отправки краткой заметки об этом результате вызова инструмента [классификатору режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не Claude. Классификатор [никогда не получает сами результаты инструментов](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ рассказать ему что-то о том, что вернул вызов, перед тем как он проверит более поздние действия. Поле требует Claude Code v2.1.236 или позже.
2216 2216
2217Пример ниже говорит классификатору, откуда пришел вывод запроса:2217Пример ниже говорит классификатору, откуда пришел вывод запроса:
2218 2218
2227 2227
2228Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:2228Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:
2229 2229
2230* **Hooks, настроенные в Claude Code**: для hooks из файлов настроек, plugins, skills и frontmatter агента, классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре2230* **Hooks, настроенные в Claude Code**: для hooks из файлов параметров, плагинов, skills и frontmatter агента классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре
2231* **In-process Agent SDK callbacks**: когда приложение, встраивающее Claude Code, регистрирует hook как [TypeScript SDK callback](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединенную заметку как непроверенный контекст2231* **In-process callbacks Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует hook как [callback TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединенную заметку как непроверенный контекст
2232 2232
2233Claude Code применяет эти ограничения при доставке заметки:2233Claude Code применяет эти ограничения при доставке заметки:
2234 2234
2235* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента на 2000 символов и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов2235* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов
2236* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоне](#run-hooks-in-the-background), потому что этот ответ приходит после того, как Claude Code записывает результат инструмента2236* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоновом режиме](#run-hooks-in-the-background), потому что этот ответ прибывает после того, как Claude Code записывает результат инструмента
2237* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов2237* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов
2238* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод2238* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод
2239 2239
2240<Warning>2240<Warning>
2241 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте ненадежный вывод инструмента или текст третьих сторон в него. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя о нем; не используйте поле для доставки несвязанных сообщений или потока событий.2241 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте в него ненадежный вывод инструмента или текст третьих сторон. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя о нем; не используйте поле для доставки несвязанных сообщений или потока событий.
2242</Warning>2242</Warning>
2243 2243
2244<h3 id="posttoolusefailure">2244<h3 id="posttoolusefailure">
2247 2247
2248Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.2248Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.
2249 2249
2250Совпадает с именем инструмента, те же значения, что и PreToolUse.2250Совпадает с названием инструмента, те же значения, что и PreToolUse.
2251 2251
2252<Note>2252<Note>
2253 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное имя инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы проверки возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).2253 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное название инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы в проверке возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
2254</Note>2254</Note>
2255 2255
2256<h4 id="posttoolusefailure-input">2256<h4 id="posttoolusefailure-input">
2257 PostToolUseFailure input2257 Ввод PostToolUseFailure
2258</h4>2258</h4>
2259 2259
2260Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:2260Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:
2278}2278}
2279```2279```
2280 2280
2281| Field | Description |2281| Поле | Описание |
2282| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2282| :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2283| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |2283| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |
2284| `is_interrupt` | Опциональный boolean. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этот hook; результат инструмента несет сообщение прерывания вместо этого |2284| `is_interrupt` | Опциональное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этот hook; результат инструмента несет сообщение прерывания вместо этого |
2285| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2285| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
2286 2286
2287Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется по инструменту и сбою. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.2287Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется в зависимости от инструмента и сбоя. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.
2288 2288
2289* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными2289* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными
2290* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс shell2290* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс оболочки
2291* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`2291* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`
2292 2292
2293<h4 id="posttoolusefailure-decision-control">2293<h4 id="posttoolusefailure-decision-control">
2294 PostToolUseFailure decision control2294 Управление решением PostToolUseFailure
2295</h4>2295</h4>
2296 2296
2297Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2297Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2298 2298
2299| Field | Description |2299| Поле | Описание |
2300| :------------------ | :----------------------------------------------------------------------------------------------------------- |2300| :------------------ | :----------------------------------------------------------------------------------------------------------- |
2301| `additionalContext` | Строка, добавленная в контекст Claude рядом с ошибкой. См. [Add context for Claude](#add-context-for-claude) |2301| `additionalContext` | Строка, добавленная в контекст Claude рядом с ошибкой. См. [Add context for Claude](#add-context-for-claude) |
2302 2302
2313 PostToolBatch2313 PostToolBatch
2314</h3>2314</h3>
2315 2315
2316Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз на инструмент, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.2316Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед тем как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.
2317 2317
2318<h4 id="posttoolbatch-input">2318<h4 id="posttoolbatch-input">
2319 PostToolBatch input2319 Ввод PostToolBatch
2320</h4>2320</h4>
2321 2321
2322Помимо [common input fields](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:2322Помимо [общих полей ввода](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:
2323 2323
2324```json theme={null}2324```json theme={null}
2325{2325{
2345}2345}
2346```2346```
2347 2347
2348`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков содержимого, ровно как инструмент выдал его. Для `Read` это означает текст с префиксом номера строки, а не исходное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.2348`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков контента, ровно как инструмент выдал его. Для `Read` это означает текст с префиксом номера строки, а не необработанное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.
2349 2349
2350<Note>2350<Note>
2351 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передает структурированный объект `Output` инструмента, такой как `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передает сериализованное содержимое `tool_result`, которое видит модель.2351 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передает структурированный объект `Output` инструмента, такой как `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передает сериализованное содержимое `tool_result`, которое видит модель.
2352</Note>2352</Note>
2353 2353
2354<h4 id="posttoolbatch-decision-control">2354<h4 id="posttoolbatch-decision-control">
2355 PostToolBatch decision control2355 Управление решением PostToolBatch
2356</h4>2356</h4>
2357 2357
2358Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2358Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2359 2359
2360| Field | Description |2360| Поле | Описание |
2361| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2361| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
2362| `additionalContext` | Строка контекста, внедренная один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в нее поместить и как возобновленные сеансы обрабатывают прошлые значения |2362| `additionalContext` | Строка контекста, внедренная один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в нее поместить и как возобновленные сеансы обрабатывают прошлые значения |
2363 2363
2376 PermissionDenied2376 PermissionDenied
2377</h3>2377</h3>
2378 2378
2379Запускается, когда [auto mode](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отказывает в вызове инструмента, включая когда он отказывает без вердикта классификатора, потому что [проверка безопасности, отдельная от auto mode, отказала в запросе классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не был проанализирован. Этот hook срабатывает только в режиме auto: он не запускается, когда вы вручную отказываете диалогу разрешений, когда hook `PreToolUse` блокирует вызов или когда совпадает правило `deny`. Используйте его для логирования отказов, корректировки конфигурации или сообщения модели, что она может повторить вызов инструмента.2379Запускается, когда [режим auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отказывает вызову инструмента, включая когда он отказывает без вердикта классификатора, потому что [проверка безопасности, отдельная от режима auto, отказала в запросе классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не был проанализирован. Этот hook срабатывает только в режиме auto: он не запускается, когда вы вручную отказываете диалогу разрешений, когда hook `PreToolUse` блокирует вызов или когда совпадает правило `deny`. Используйте его для логирования отказов, настройки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.
2380 2380
2381Совпадает с именем инструмента, те же значения, что и PreToolUse.2381Совпадает с названием инструмента, те же значения, что и PreToolUse.
2382 2382
2383<h4 id="permissiondenied-input">2383<h4 id="permissiondenied-input">
2384 PermissionDenied input2384 Ввод PermissionDenied
2385</h4>2385</h4>
2386 2386
2387Помимо [common input fields](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).2387Помимо [общих полей ввода](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).
2388 2388
2389```json theme={null}2389```json theme={null}
2390{2390{
2403}2403}
2404```2404```
2405 2405
2406| Field | Description |2406| Поле | Описание |
2407| :------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2407| :------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2408| `reason` | Причина отказа. Для вердикта классификатора в большинстве сеансов он называет совпадающее правило в квадратных скобках, такое как `[Data Exfiltration]`; см. [Review denials](/docs/ru/auto-mode-config#review-denials) для других форм. Для [no-verdict denial](#permissiondenied-decision-control) он начинается с `Auto mode could not evaluate this action and is blocking it for safety`. Для отказа, потому что модель классификатора была недоступна, это фиксированный текст `Classifier unavailable` |2408| `reason` | Причина отказа. Для вердикта классификатора в большинстве сеансов он называет совпадающее правило в квадратных скобках, такое как `[Data Exfiltration]`; см. [Review denials](/docs/ru/auto-mode-config#review-denials) для других форм. Для [отказа без вердикта](#permissiondenied-decision-control) он начинается с `Auto mode could not evaluate this action and is blocking it for safety`. Для отказа, потому что модель классификатора была недоступна, это фиксированный текст `Classifier unavailable` |
2409 2409
2410<h4 id="permissiondenied-decision-control">2410<h4 id="permissiondenied-decision-control">
2411 PermissionDenied decision control2411 Управление решением PermissionDenied
2412</h4>2412</h4>
2413 2413
2414Hooks PermissionDenied могут сказать модели, что она может повторить отклоненный вызов инструмента. Верните JSON объект с `hookSpecificOutput.retry`, установленным на `true`:2414Hooks PermissionDenied могут сказать модели, что она может повторить попытку отклоненного вызова инструмента. Верните объект JSON с `hookSpecificOutput.retry`, установленным на `true`:
2415 2415
2416```json theme={null}2416```json theme={null}
2417{2417{
2422}2422}
2423```2423```
2424 2424
2425Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить вызов инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.2425Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить попытку вызова инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.
2426 2426
2427Claude Code игнорирует `retry: true`, когда классификатор создал [no verdict on the action](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от auto mode, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли позже или продолжить.2427Claude Code игнорирует `retry: true`, когда классификатор создал [отсутствие вердикта на действие](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от режима auto, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли попытку позже или продолжить.
2428 2428
2429<h3 id="notification">2429<h3 id="notification">
2430 Notification2430 Notification
2432 2432
2433Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.2433Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.
2434 2434
2435Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вы получаете оповещение, а не срабатывает ли ваш hook.2435Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вас оповещают, а не запускается ли ваш hook.
2436 2436
2437| Matcher | Когда срабатывает |2437| Matcher | Когда срабатывает |
2438| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2438| :--------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2439| `permission_prompt` | Claude нуждается в вашем разрешении на использование инструмента или [network request](/docs/ru/sandboxing#network-isolation) изолированной команды, и подсказка ждала около шести секунд |2439| `permission_prompt` | Claude нуждается в вашем разрешении на использование инструмента или [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды, и подсказка ждала около шести секунд |
2440| `idle_prompt` | Claude закончил отвечать около 60 секунд назад и вы не печатали с тех пор |2440| `idle_prompt` | Claude закончил отвечать около 60 секунд назад и вы не печатали с тех пор |
2441| `auth_success` | Аутентификация завершена |2441| `auth_success` | Аутентификация завершена |
2442| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |2442| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |
2443| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |2443| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |
2444| `elicitation_complete` | Сервер MCP сообщает, что [URL-mode elicitation](#elicitation-input) завершена |2444| `elicitation_complete` | Сервер MCP сообщает, что [URL-режим запроса](#elicitation-input) завершен |
2445| `elicitation_response` | Ответ на запрос MCP отправляется обратно на сервер |2445| `elicitation_response` | Ответ запроса MCP отправляется обратно на сервер |
2446| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале, или текущий сеанс просит вас вопрос [agent team](/docs/ru/agent-teams) товарища по команде и вы не печатали около шести секунд |2446| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале, или текущий сеанс задает вам вопрос [настройки терминала товарища команды агентов](/docs/ru/agent-teams#choose-a-display-mode) и вы не печатали около шести секунд |
2447| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |2447| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |
2448| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление вашего плана или переключение моделей, снова делает использование доступным |2448| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление вашего плана или переключение моделей, снова делает использование доступным, с [исключением параметра модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |
2449| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter` вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |2449| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter`, вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |
2450| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил самостоятельно, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |2450| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил самостоятельно, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |
2451 2451
2452Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.2452Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.
2453 2453
2454Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или позже.2454Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или позже.
2455 2455
2456В сеансах терминала, `permission_prompt` для [network request](/docs/ru/sandboxing#network-isolation) изолированной команды требует Claude Code v2.1.246 или позже.2456В сеансах терминала `permission_prompt` для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды требует Claude Code v2.1.246 или позже.
2457 2457
2458`agent_needs_input` для вопроса настройки терминала товарища по команде требует Claude Code v2.1.248 или позже.2458`agent_needs_input` для вопроса настройки терминала товарища требует Claude Code v2.1.248 или позже.
2459 2459
2460<Note>2460<Note>
2461 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:2461 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:
2462 2462
2463 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте [PermissionRequest](#permissionrequest) вместо этого.2463 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).
2464 * Ожидайте `idle_prompt` около 60 секунд после того, как Claude закончит отвечать, и только если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается самостоятельно, один из типов `quota_auto_resume_*` срабатывает вместо этого.2464 * Ожидайте `idle_prompt` около 60 секунд после того, как Claude закончит отвечать, и только если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается самостоятельно, один из типов `quota_auto_resume_*` срабатывает вместо этого.
2465 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один и тот же шестисекундный шлюз как `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.2465 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один и тот же шестисекундный шлюз как `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.
2466 2466
2467 Запрос разрешения или запрос, который приходит, пока другой диалог находится на экране, сохраняет один и тот же шестисекундный шлюз, рассчитанный с момента прихода запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.2467 Запрос разрешения или запрос, который прибывает, пока другой диалог находится на экране, сохраняет один и тот же шестисекундный шлюз, рассчитанный с момента прибытия запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.
2468</Note>2468</Note>
2469 2469
2470Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback Agent SDK [`canUseTool`](/docs/ru/agent-sdk/user-input), что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:2470Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback [`canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK, что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:
2471 2471
2472* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.2472* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.
2473* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.2473* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2474* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) на `1` для отключения `permission_prompt` в этих сеансах.2474* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) на `1`, чтобы отключить `permission_prompt` в этих сеансах.
2475 2475
2476До версии 2.1.233, `permission_prompt` не срабатывал в этих сеансах.2476До версии 2.1.233 `permission_prompt` не срабатывал в этих сеансах.
2477 2477
2478Используйте отдельные matchers для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:2478Используйте отдельные matchers для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:
2479 2479
2505```2505```
2506 2506
2507<h4 id="notification-input">2507<h4 id="notification-input">
2508 Notification input2508 Ввод Notification
2509</h4>2509</h4>
2510 2510
2511Помимо [common input fields](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.2511Помимо [общих полей ввода](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.
2512 2512
2513```json theme={null}2513```json theme={null}
2514{2514{
2522}2522}
2523```2523```
2524 2524
2525Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которое полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис.2525Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которую полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления на внешний сервис.
2526 2526
2527<h3 id="subagentstart">2527<h3 id="subagentstart">
2528 SubagentStart2528 SubagentStart
2529</h3>2529</h3>
2530 2530
2531Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ по команде [agent team](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по имени типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [custom subagents](/docs/ru/sub-agents), это поле `name` из frontmatter агента, а не имя файла.2531Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ [команды агентов](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по названию типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [пользовательских подагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.
2532 2532
2533Для подагентов, поставляемых [plugin](/docs/ru/plugins), тип агента — это идентификатор с областью действия plugin, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью действия plugin на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.2533Для подагентов, поставляемых [плагином](/docs/ru/plugins), тип агента — это идентификатор с областью плагина, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двое точка помещает имя с областью плагина на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.
2534 2534
2535<h4 id="subagentstart-input">2535<h4 id="subagentstart-input">
2536 SubagentStart input2536 Ввод SubagentStart
2537</h4>2537</h4>
2538 2538
2539Помимо [common input fields](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором для подагента и `agent_type` с именем агента, который matcher фильтрует.2539Помимо [общих полей ввода](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором подагента и `agent_type` с названием агента, который matcher фильтрует.
2540 2540
2541```json theme={null}2541```json theme={null}
2542{2542{
2549}2549}
2550```2550```
2551 2551
2552Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть:2552Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть:
2553 2553
2554| Field | Description |2554| Поле | Описание |
2555| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------- |2555| :------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------- |
2556| `additionalContext` | Строка, добавленная в контекст подагента в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |2556| `additionalContext` | Строка, добавленная в контекст подагента в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |
2557 2557
2564}2564}
2565```2565```
2566 2566
2567Когда hook запускается снова для того же подагента, Claude Code внедряет возвращенный контекст только, когда контекст подагента уже не содержит копию из более раннего запуска. Копия, внедренная при запуске, остается на месте, оставляя [prompt cache](/docs/ru/prompt-caching#subagents-and-the-cache) подагента нетронутым. После [auto-compaction](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code внедряет контекст следующего запуска снова.2567Когда hook запускается снова для того же подагента, Claude Code внедряет возвращенный контекст только, когда контекст подагента уже не содержит копию из более раннего запуска. Копия, внедренная при запуске, остается на месте, оставляя [кэш подсказок](/docs/ru/prompt-caching#subagents-and-the-cache) подагента нетронутым. После [автоматического сжатия](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code внедряет контекст следующего запуска снова.
2568 2568
2569<h3 id="subagentstop">2569<h3 id="subagentstop">
2570 SubagentStop2570 SubagentStop
2573Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.2573Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.
2574 2574
2575<h4 id="subagentstop-input">2575<h4 id="subagentstop-input">
2576 SubagentStop input2576 Ввод SubagentStop
2577</h4>2577</h4>
2578 2578
2579Помимо [common input fields](#common-input-fields), hooks SubagentStop получают `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` и `last_assistant_message`. Поле `agent_type` — это значение, используемое для фильтрации matcher. `transcript_path` — это транскрипт основного сеанса, в то время как `agent_transcript_path` — это собственный транскрипт подагента, хранящийся в вложенной папке `subagents/`. Поле `last_assistant_message` содержит текстовое содержимое финального ответа подагента, поэтому hooks могут получить доступ к нему без анализа файла транскрипта.2579Помимо [общих полей ввода](#common-input-fields), hooks SubagentStop получают `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` и `last_assistant_message`. Поле `agent_type` — это значение, используемое для фильтрации matcher. `transcript_path` — это транскрипт основного сеанса, пока `agent_transcript_path` — это собственный транскрипт подагента, хранящийся в вложенной папке `subagents/`. Поле `last_assistant_message` содержит текстовое содержимое финального ответа подагента, поэтому hooks могут получить доступ к нему без анализа файла транскрипта.
2580 2580
2581На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, совпадающий на `SubagentHandback`, получает как `tool_input.message`.2581Не каждое событие SubagentStop поступает от подагента, который Claude порождает. Claude Code также запускает внутренних агентов для некоторых своих собственных функций, таких как [предложения подсказок](/docs/ru/interactive-mode#prompt-suggestions) и [`/btw` побочные вопросы](/docs/ru/interactive-mode#side-questions-with-%2Fbtw), и SubagentStop срабатывает, когда один из них завершается. Для этих событий `agent_type` — это имя агента, который запускает сам сеанс, такой как один, установленный с [`--agent`](/docs/ru/cli-reference#cli-flags) или параметром [`agent`](/docs/ru/settings-reference#agent), и пустая строка, когда сеанс запускается без одного.
2582
2583`matcher`, который называет типы агентов, не совпадает с пустым `agent_type`. Hook, чей matcher опущен, `""` или `"*"`, или является регулярным выражением, которое совпадает с пустой строкой, запускается для событий с пустым `agent_type` тоже.
2584
2585На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если он есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, соответствующий `SubagentHandback`, получает как `tool_input.message`.
2582 2586
2583Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.2587Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.
2584 2588
2599}2603}
2600```2604```
2601 2605
2602Hooks SubagentStop используют тот же формат управления решением, что и [Stop hooks](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.2606Hooks SubagentStop используют тот же формат управления решением, что и [hooks Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте вместо этого hook [`PostToolUse`](#posttooluse) на инструменте `Agent`.
2603 2607
2604<h3 id="taskcreated">2608<h3 id="taskcreated">
2605 TaskCreated2609 TaskCreated
2606</h3>2610</h3>
2607 2611
2608Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для применения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability), это событие не срабатывает.2612Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для применения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.
2609 2613
2610Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.2614Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.
2611 2615
2612<h4 id="taskcreated-input">2616<h4 id="taskcreated-input">
2613 TaskCreated input2617 Ввод TaskCreated
2614</h4>2618</h4>
2615 2619
2616Помимо [common input fields](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2620Помимо [общих полей ввода](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2617 2621
2618```json theme={null}2622```json theme={null}
2619{2623{
2629}2633}
2630```2634```
2631 2635
2632| Field | Description |2636| Поле | Описание |
2633| :----------------- | :--------------------------------------------------------------------------- |2637| :----------------- | :--------------------------------------------------------------------------- |
2634| `task_id` | Идентификатор создаваемой задачи |2638| `task_id` | Идентификатор создаваемой задачи |
2635| `task_subject` | Название задачи |2639| `task_subject` | Название задачи |
2636| `task_description` | Подробное описание задачи. Может быть отсутствующим |2640| `task_description` | Подробное описание задачи. Может отсутствовать |
2637| `teammate_name` | Имя товарища по команде, создающего задачу. Может быть отсутствующим |2641| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |
2638| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2642| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2639 2643
2640<h4 id="taskcreated-decision-control">2644<h4 id="taskcreated-decision-control">
2641 TaskCreated decision control2645 Управление решением TaskCreated
2642</h4>2646</h4>
2643 2647
2644Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.2648Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.
2645 2649
2646* **Exit code 2**: Claude Code возвращает текст stderr как сообщение.2650* **Код выхода 2**: Claude Code возвращает текст stderr как сообщение.
2647* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` как сообщение.2651* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` как сообщение.
2648 2652
2649Этот пример блокирует задачи, чьи названия не следуют требуемому формату:2653Этот пример блокирует задачи, чьи названия не следуют требуемому формату:
2665 TaskCompleted2669 TaskCompleted
2666</h3>2670</h3>
2667 2671
2668Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ по команде [agent team](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для применения критериев завершения, таких как прохождение тестов или проверок lint, перед закрытием задачи.2672Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ [команды агентов](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для применения критериев завершения, таких как прохождение тестов или проверок lint, перед закрытием задачи.
2669 2673
2670Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.2674Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.
2671 2675
2672<h4 id="taskcompleted-input">2676<h4 id="taskcompleted-input">
2673 TaskCompleted input2677 Ввод TaskCompleted
2674</h4>2678</h4>
2675 2679
2676Помимо [common input fields](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2680Помимо [общих полей ввода](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2677 2681
2678```json theme={null}2682```json theme={null}
2679{2683{
2690}2694}
2691```2695```
2692 2696
2693| Field | Description |2697| Поле | Описание |
2694| :----------------- | :--------------------------------------------------------------------------- |2698| :----------------- | :--------------------------------------------------------------------------- |
2695| `task_id` | Идентификатор завершаемой задачи |2699| `task_id` | Идентификатор завершаемой задачи |
2696| `task_subject` | Название задачи |2700| `task_subject` | Название задачи |
2697| `task_description` | Подробное описание задачи. Может быть отсутствующим |2701| `task_description` | Подробное описание задачи. Может отсутствовать |
2698| `teammate_name` | Имя товарища по команде, завершающего задачу. Может быть отсутствующим |2702| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |
2699| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2703| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2700 2704
2701<h4 id="taskcompleted-decision-control">2705<h4 id="taskcompleted-decision-control">
2702 TaskCompleted decision control2706 Управление решением TaskCompleted
2703</h4>2707</h4>
2704 2708
2705Hooks TaskCompleted поддерживают два способа управления завершением задачи:2709Hooks TaskCompleted поддерживают два способа управления завершением задачи:
2706 2710
2707* **Exit code 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.2711* **Код выхода 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.
2708* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие запустил товарищ по команде, завершающий свой ход, полностью останавливает товарища по команде, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда событие запустил инструмент `TaskUpdate`, Claude Code игнорирует `continue: false`; выход 2 все еще блокирует завершение.2712* **JSON `{"continue": false, "stopReason": "..."}`**: когда товарищ, завершающий свой ход, запустил событие, полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда инструмент `TaskUpdate` запустил событие, Claude Code игнорирует `continue: false`; код выхода 2 все еще блокирует завершение.
2709 2713
2710Этот пример запускает тесты и блокирует завершение задачи, если они не проходят:2714Этот пример запускает тесты и блокирует завершение задачи, если они не пройдут:
2711 2715
2712```bash theme={null}2716```bash theme={null}
2713#!/bin/bash2717#!/bin/bash
2727 Stop2731 Stop
2728</h3>2732</h3>
2729 2733
2730Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API срабатывают [StopFailure](#stopfailure) вместо этого.2734Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API срабатывают вместо этого [StopFailure](#stopfailure).
2731 2735
2732<Tip>2736<Tip>
2733 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью действия сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.2737 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.
2734</Tip>2738</Tip>
2735 2739
2736<h4 id="stop-input">2740<h4 id="stop-input">
2737 Stop input2741 Ввод Stop
2738</h4>2742</h4>
2739 2743
2740Помимо [common input fields](#common-input-fields), hooks Stop получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` имеет значение `true`, когда Claude Code уже продолжает в результате hook stop. Проверьте это значение или обработайте транскрипт, чтобы избежать блокирования на условии, которое никогда не разрешится. Claude Code переопределяет hook и заканчивает ход после 8 последовательных блокировок.2744Помимо [общих полей ввода](#common-input-fields), hooks Stop получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` имеет значение `true`, когда Claude Code уже продолжает в результате hook stop. Проверьте это значение или обработайте транскрипт, чтобы избежать блокировки на условии, которое никогда не разрешится. Claude Code переопределяет hook и заканчивает ход после 8 последовательных блокировок.
2741 2745
2742Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантируется включать финальное сообщение в момент Stop на всех версиях.2746Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантируется включать финальное сообщение во время Stop на всех версиях.
2743 2747
2744Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен в ожидании фоновой работы для пробуждения его обратно". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.2748Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен, ожидая фоновой работы для пробуждения его обратно". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.
2745 2749
2746Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:2750Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:
2747 2751
2748| Field | Description |2752| Поле | Описание |
2749| :------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2753| :------------ | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2750| `id` | Идентификатор задачи |2754| `id` | Идентификатор задачи |
2751| `type` | Дружественный label типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый label определяет, какая функция Claude Code создала задачу. Возвращается к сырому дискриминанту для неизвестных типов |2755| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |
2752| `status` | Текущий статус задачи |2756| `status` | Текущий статус задачи |
2753| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезании |2757| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезке |
2754| `command` | Командная строка shell, ограниченная 1000 символами. Присутствует только для задач `shell` |2758| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |
2755| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |2759| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |
2756| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |2760| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |
2757| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |2761| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |
2758| `name` | Имя workflow. Присутствует только для задач `workflow` |2762| `name` | Имя workflow. Присутствует только для задач `workflow` |
2759 2763
2760Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью действия сеанса, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:2764Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью сеанса, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:
2761 2765
2762| Field | Description |2766| Поле | Описание |
2763| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |2767| :---------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------- |
2764| `id` | Идентификатор задачи Cron |2768| `id` | Идентификатор задачи Cron |
2765| `schedule` | Выражение Cron, например `0 9 * * 1-5` |2769| `schedule` | Выражение Cron, например `0 9 * * 1-5` |
2798```2802```
2799 2803
2800<h4 id="stop-decision-control">2804<h4 id="stop-decision-control">
2801 Stop decision control2805 Управление решением Stop
2802</h4>2806</h4>
2803 2807
2804Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [JSON output fields](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2808Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2805 2809
2806| Field | Description |2810| Поле | Описание |
2807| :------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2811| :------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2808| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |2812| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |
2809| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |2813| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |
2810| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на нее, но в отличие от `decision: "block"`, она показана в транскрипте как обратная связь hook, а не ошибка hook |2814| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на ней, но в отличие от `decision: "block"` она показана в транскрипте как обратная связь hook, а не ошибка hook |
2811 2815
2812Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.2816Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.
2813 2817
2818}2822}
2819```2823```
2820 2824
2821Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и никакое уведомление об ошибке hook не показывается:2825Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение 8-последовательного продолжения, но транскрипт помечает его `Stop hook feedback` и уведомление об ошибке hook не показывается:
2822 2826
2823```json theme={null}2827```json theme={null}
2824{2828{
2836Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.2840Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.
2837 2841
2838<h4 id="stopfailure-input">2842<h4 id="stopfailure-input">
2839 StopFailure input2843 Ввод StopFailure
2840</h4>2844</h4>
2841 2845
2842Помимо [common input fields](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.2846Помимо [общих полей ввода](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.
2843 2847
2844| Field | Description |2848| Поле | Описание |
2845| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2849| :----------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2846| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |2850| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |
2847| `error_details` | Дополнительные детали об ошибке, когда доступны |2851| `error_details` | Дополнительные детали об ошибке, когда доступны |
2865 TeammateIdle2869 TeammateIdle
2866</h3>2870</h3>
2867 2871
2868Запускается, когда товарищ по команде [agent team](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для применения шлюзов качества перед остановкой товарища по команде, такие как требование прохождения проверок lint или проверка существования выходных файлов.2872Запускается, когда товарищ [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для применения шлюзов качества перед остановкой товарища, такие как требование прохождения проверок lint или проверка существования выходных файлов.
2869 2873
2870Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.2874Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.
2871 2875
2872<h4 id="teammateidle-input">2876<h4 id="teammateidle-input">
2873 TeammateIdle input2877 Ввод TeammateIdle
2874</h4>2878</h4>
2875 2879
2876Помимо [common input fields](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.2880Помимо [общих полей ввода](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.
2877 2881
2878```json theme={null}2882```json theme={null}
2879{2883{
2887}2891}
2888```2892```
2889 2893
2890| Field | Description |2894| Поле | Описание |
2891| :-------------- | :--------------------------------------------------------------------------- |2895| :-------------- | :--------------------------------------------------------------------------- |
2892| `teammate_name` | Имя товарища по команде, который собирается перейти в режим ожидания |2896| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |
2893| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2897| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |
2894 2898
2895<h4 id="teammateidle-decision-control">2899<h4 id="teammateidle-decision-control">
2896 TeammateIdle decision control2900 Управление решением TeammateIdle
2897</h4>2901</h4>
2898 2902
2899Hooks TeammateIdle поддерживают два способа управления поведением товарища по команде:2903Hooks TeammateIdle поддерживают два способа управления поведением товарища:
2900 2904
2901* **Exit code 2**: товарищ по команде получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.2905* **Код выхода 2**: товарищ получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.
2902* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища по команде, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю.2906* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю.
2903 2907
2904Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу по команде перейти в режим ожидания:2908Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу перейти в режим ожидания:
2905 2909
2906```bash theme={null}2910```bash theme={null}
2907#!/bin/bash2911#!/bin/bash
2918 ConfigChange2922 ConfigChange
2919</h3>2923</h3>
2920 2924
2921Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений настроек, применения политик безопасности или блокирования несанкционированных изменений файлов конфигурации.2925Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений параметров, применения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.
2922 2926
2923Claude Code запускает hooks ConfigChange, когда файл настроек, файл управляемой политики или файл skill изменяется. Для управляемой политики он запускает их только, когда `managed-settings.json` или файл в `managed-settings.d/` изменяется. Он применяет [server-managed settings](/docs/ru/server-managed-settings) и изменения в macOS управляемых предпочтениях или политике реестра Windows без запуска их. На WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings), он также применяет измененный файл управляемых настроек Windows на его опросе политики без запуска их.2927Claude Code запускает hooks ConfigChange, когда файл параметров, файл управляемой политики или файл skill изменяется. Для управляемой политики он запускает их только, когда `managed-settings.json` или файл в `managed-settings.d/` изменяется. Он применяет [параметры, управляемые сервером](/docs/ru/server-managed-settings) и изменения в macOS управляемых предпочтениях или политике реестра Windows без их запуска. На WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет измененный файл управляемых параметров Windows на его опросе политики без их запуска.
2924 2928
2925Matcher фильтрует по источнику конфигурации:2929Matcher фильтрует по источнику конфигурации:
2926 2930
2953```2957```
2954 2958
2955<h4 id="configchange-input">2959<h4 id="configchange-input">
2956 ConfigChange input2960 Ввод ConfigChange
2957</h4>2961</h4>
2958 2962
2959Помимо [common input fields](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.2963Помимо [общих полей ввода](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.
2960 2964
2961```json theme={null}2965```json theme={null}
2962{2966{
2970```2974```
2971 2975
2972<h4 id="configchange-decision-control">2976<h4 id="configchange-decision-control">
2973 ConfigChange decision control2977 Управление решением ConfigChange
2974</h4>2978</h4>
2975 2979
2976Hooks ConfigChange могут заблокировать изменения конфигурации от вступления в силу. Используйте выход 2 или JSON `decision` для предотвращения изменения. При блокировании новые настройки не применяются к работающему сеансу.2980Hooks ConfigChange могут блокировать изменения конфигурации от вступления в силу. Используйте код выхода 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к работающему сеансу.
2977 2981
2978| Field | Description |2982| Поле | Описание |
2979| :--------- | :--------------------------------------------------------------------------------------------- |2983| :--------- | :--------------------------------------------------------------------------------------------- |
2980| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы позволить изменению |2984| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы позволить изменению |
2981| `reason` | Принято, но никогда не показано |2985| `reason` | Принято, но никогда не показано |
2987}2991}
2988```2992```
2989 2993
2990Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых настроек на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда [server-managed settings](/docs/ru/server-managed-settings) приходят или обновляются.2994Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых параметров на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда прибывают или обновляются [параметры, управляемые сервером](/docs/ru/server-managed-settings).
2991 2995
2992Claude Code действует на решение блокировки из JSON вывода hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, независимо от того, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только пишет строку в debug log.2996Claude Code действует на решение блокировки из JSON-вывода hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, независимо от того, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только записывает строку в debug log.
2993 2997
2994<h3 id="cwdchanged">2998<h3 id="cwdchanged">
2995 CwdChanged2999 CwdChanged
2996</h3>3000</h3>
2997 3001
2998Запускается, когда команда shell в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов, специфичных для проекта, или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.3002Запускается, когда команда оболочки в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов для конкретного проекта или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.
2999 3003
3000Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code очищает их.3004Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code их очищает.
3001 3005
3002CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.3006CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.
3003 3007
3004<h4 id="cwdchanged-input">3008<h4 id="cwdchanged-input">
3005 CwdChanged input3009 Ввод CwdChanged
3006</h4>3010</h4>
3007 3011
3008Помимо [common input fields](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.3012Помимо [общих полей ввода](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.
3009 3013
3010```json theme={null}3014```json theme={null}
3011{3015{
3019```3023```
3020 3024
3021<h4 id="cwdchanged-output">3025<h4 id="cwdchanged-output">
3022 CwdChanged output3026 Вывод CwdChanged
3023</h4>3027</h4>
3024 3028
3025Помимо [JSON output fields](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) наблюдает:3029Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) отслеживает:
3026 3030
3027| Field | Description |3031| Поле | Описание |
3028| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3032| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
3029| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |3033| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список отслеживания. Пути из конфигурации вашего `matcher` всегда отслеживаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |
3030 3034
3031Hooks CwdChanged не имеют управления решением. Они не могут заблокировать изменение директории.3035Hooks CwdChanged не имеют управления решением. Они не могут блокировать изменение директории.
3032 3036
3033Claude Code читает `watchPaths` и `systemMessage` из их JSON вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3037Claude Code читает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
3034 3038
3035<h3 id="directoryadded">3039<h3 id="directoryadded">
3036 DirectoryAdded3040 DirectoryAdded
3037</h3>3041</h3>
3038 3042
3039Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления SDK клиентом с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например установкой его зависимостей.3043Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления клиентом SDK с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например установки его зависимостей.
3040 3044
3041Claude Code не срабатывает это событие, когда:3045Claude Code не срабатывает это событие, когда:
3042 3046
3044* Вы добавляете директорию на вкладку `/permissions` Workspace3048* Вы добавляете директорию на вкладку `/permissions` Workspace
3045* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной3049* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной
3046 3050
3047Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда выполняется ваш hook. Команды hook сами выполняются неизолированными.3051Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда выполняется ваш hook. Команды hook сами выполняются без изоляции.
3048 3052
3049Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоне с стандартным timeout 600 секунд.3053Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоновом режиме с тайм-аутом по умолчанию 600 секунд.
3050 3054
3051Matcher фильтрует по тому, как была добавлена директория:3055Matcher фильтрует по тому, как была добавлена директория:
3052 3056
3053| Matcher | Когда срабатывает |3057| Matcher | Когда срабатывает |
3054| :------------------- | :------------------------------------------------------------------------- |3058| :------------------- | :------------------------------------------------------------------------- |
3055| `slash_command` | Вы добавляете директорию с `/add-dir` |3059| `slash_command` | Вы добавляете директорию с `/add-dir` |
3056| `register_repo_root` | SDK клиент добавляет директорию с запросом управления `register_repo_root` |3060| `register_repo_root` | Клиент SDK добавляет директорию с запросом управления `register_repo_root` |
3057 3061
3058<h4 id="directoryadded-input">3062<h4 id="directoryadded-input">
3059 DirectoryAdded input3063 Ввод DirectoryAdded
3060</h4>3064</h4>
3061 3065
3062Помимо [common input fields](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.3066Помимо [общих полей ввода](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.
3063 3067
3064| Field | Description |3068| Поле | Описание |
3065| :---------- | :-------------------------------------------------------------------------------------------------------------------- |3069| :---------- | :-------------------------------------------------------------------------------------------------------------------- |
3066| `directory` | Абсолютный путь директории, которая была добавлена |3070| `directory` | Абсолютный путь директории, которая была добавлена |
3067| `source` | Как была добавлена директория, `"slash_command"` для `/add-dir` или `"register_repo_root"` для запроса управления SDK |3071| `source` | Как была добавлена директория, `"slash_command"` для `/add-dir` или `"register_repo_root"` для запроса управления SDK |
3077}3081}
3078```3082```
3079 3083
3080Hooks DirectoryAdded не имеют управления решением. Они не могут заблокировать добавление, которое уже завершилось, когда выполняется hook. Claude Code отбрасывает поле `continue` из их JSON вывода и выводит остальное по-другому в зависимости от источника:3084Hooks DirectoryAdded не имеют управления решением. Они не могут блокировать добавление, которое уже завершилось. Claude Code отбрасывает поле `continue` из их JSON-вывода и выводит остальное по-разному в зависимости от источника:
3081 3085
3082* `slash_command`: Claude Code доставляет вывод `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log3086* `slash_command`: Claude Code доставляет `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log
3083* `register_repo_root`: Claude Code пишет вывод `systemMessage` и вывод сбоя в debug log только3087* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоя только в debug log
3084 3088
3085<h3 id="filechanged">3089<h3 id="filechanged">
3086 FileChanged3090 FileChanged
3087</h3>3091</h3>
3088 3092
3089Запускается, когда наблюдаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code. Обычное использование — перезагрузка переменных окружения, когда изменяются файлы конфигурации проекта.3093Запускается, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code полностью. Обычное использование — перезагрузка переменных окружения при изменении файлов конфигурации проекта.
3090 3094
3091`matcher` для этого события служит двум целям:3095`matcher` для этого события служит двум целям:
3092 3096
3093* **Build the watch list**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` наблюдает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, наблюдало бы файл буквально названный `^\.env`.3097* **Построить список отслеживания**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, отслеживало бы файл буквально названный `^\.env`.
3094* **Filter which hooks run**: когда наблюдаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [matcher rules](#matcher-patterns) против базового имени измененного файла.3098* **Фильтровать, какие hooks запускаются**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила matcher](#matcher-patterns) против базового имени измененного файла.
3095 3099
3096Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая вызов инструмента `Bash` или внешний скрипт, переписывающий файл:3100Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая команду `Bash` или внешний скрипт, переписывающий файл:
3097 3101
3098```json theme={null}3102```json theme={null}
3099{3103{
3113}3117}
3114```3118```
3115 3119
3116Hook читает абсолютный путь измененного файла из поля `file_path` [JSON input](#filechanged-input) на stdin. Его guard `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабый guard зацикливается навсегда, потому что `perl -i` переписывает файл даже когда он ничего не подставляет и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:3120Hook читает абсолютный путь измененного файла из поля `file_path` JSON-ввода на stdin. Его охрана `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабая охрана зацикливается навсегда, потому что `perl -i` переписывает файл, даже когда он ничего не заменяет, и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3117 3121
3118```bash theme={null}3122```bash theme={null}
3119#!/bin/bash3123#!/bin/bash
3125 3129
3126Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.3130Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.
3127 3131
3128Чтобы наблюдать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка наблюдения. Claude Code запускает наблюдатель только, когда что-то называет файл для наблюдения, поэтому посейте список с группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда наблюдаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым наблюдаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения, как любое другое значение, как буквальный файл названный `*`.3132Чтобы отслеживать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка отслеживания. Claude Code запускает наблюдатель только, когда что-то называет файл для отслеживания, поэтому заполните список группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда отслеживаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым отслеживаемым файлом и ничего не добавляет в список отслеживания. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке отслеживания, как любое другое значение, как буквальный файл названный `*`.
3129 3133
3130Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code очищает их.3134Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.
3131 3135
3132<h4 id="filechanged-input">3136<h4 id="filechanged-input">
3133 FileChanged input3137 Ввод FileChanged
3134</h4>3138</h4>
3135 3139
3136Помимо [common input fields](#common-input-fields), hooks FileChanged получают `file_path` и `event`.3140Помимо [общих полей ввода](#common-input-fields), hooks FileChanged получают `file_path` и `event`.
3137 3141
3138| Field | Description |3142| Поле | Описание |
3139| :---------- | :---------------------------------------------------------------------------------------------------------------- |3143| :---------- | :---------------------------------------------------------------------------------------------------------------- |
3140| `file_path` | Абсолютный путь к файлу, который изменился |3144| `file_path` | Абсолютный путь к файлу, который изменился |
3141| `event` | Что произошло: `"change"` для измененного файла, `"add"` для созданного файла или `"unlink"` для удаленного файла |3145| `event` | Что произошло: `"change"` для измененного файла, `"add"` для созданного файла или `"unlink"` для удаленного файла |
3152```3156```
3153 3157
3154<h4 id="filechanged-output">3158<h4 id="filechanged-output">
3155 FileChanged output3159 Вывод FileChanged
3156</h4>3160</h4>
3157 3161
3158Помимо [JSON output fields](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов наблюдаются:3162Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов отслеживаются:
3159 3163
3160| Field | Description |3164| Поле | Описание |
3161| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3165| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
3162| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для наблюдения на основе измененного файла |3166| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список отслеживания. Пути из конфигурации вашего `matcher` всегда отслеживаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для отслеживания на основе измененного файла |
3163 3167
3164Hooks FileChanged не имеют управления решением. Они не могут заблокировать изменение файла от возникновения.3168Hooks FileChanged не имеют управления решением. Они не могут блокировать изменение файла от возникновения.
3165 3169
3166Claude Code читает `watchPaths` и `systemMessage` из их JSON вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3170Claude Code читает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
3167 3171
3168<h3 id="worktreecreate">3172<h3 id="worktreecreate">
3169 WorktreeCreate3173 WorktreeCreate
3170</h3>3174</h3>
3171 3175
3172Запускается, когда создается worktree, будь то из `claude --worktree`, из [subagent using `isolation: "worktree"`](/docs/ru/sub-agents#choose-the-subagent-scope) или для [background session](/docs/ru/agent-view#how-file-edits-are-isolated), которую Claude Code изолирует в своем собственном worktree. По умолчанию Claude Code создает изолированную рабочую копию с `git worktree`. Настройка hook WorktreeCreate заменяет это поведение git по умолчанию, позволяя вам использовать другую систему контроля версий, такую как SVN, Perforce или Mercurial.3176Запускается, когда создается worktree, будь то из `claude --worktree`, из [подагента, использующего `isolation: "worktree"`](/docs/ru/sub-agents#choose-the-subagent-scope), или для [фонового сеанса](/docs/ru/agent-view#how-file-edits-are-isolated), который Claude Code изолирует в своем собственном worktree. По умолчанию Claude Code создает изолированную рабочую копию с `git worktree`. Настройка hook WorktreeCreate заменяет это поведение git по умолчанию, позволяя вам использовать другую систему контроля версий, такую как SVN, Perforce или Mercurial.
3173 3177
3174Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.3178Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.
3175 3179
3196}3200}
3197```3201```
3198 3202
3199Hook читает имя worktree `name` из JSON ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.3203Hook читает `name` worktree из JSON-ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.
3200 3204
3201<h4 id="worktreecreate-input">3205<h4 id="worktreecreate-input">
3202 WorktreeCreate input3206 Ввод WorktreeCreate
3203</h4>3207</h4>
3204 3208
3205Помимо [common input fields](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.3209Помимо [общих полей ввода](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.
3206 3210
3207```json theme={null}3211```json theme={null}
3208{3212{
3215```3219```
3216 3220
3217<h4 id="worktreecreate-output">3221<h4 id="worktreecreate-output">
3218 WorktreeCreate output3222 Вывод WorktreeCreate
3219</h4>3223</h4>
3220 3224
3221Hooks WorktreeCreate не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:3225Hooks WorktreeCreate не используют стандартную модель решения разрешить/блокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:
3222 3226
3223* **Command hooks** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска shell, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.3227* **Command hooks** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.
3224* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3228* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
3225 3229
3226Если hook не удается или не создает путь, создание worktree не удается с ошибкой.3230Если hook не удается или не создает путь, создание worktree не удается с ошибкой.
3227 3231
3228Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1.3232Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку с названием пути и выходит с кодом 1.
3229 3233
3230Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через symlink ниже корня репозитория, потому что symlink, зафиксированный в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через symlink внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.3234Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через символическую ссылку ниже корня репозитория, потому что символическая ссылка, зафиксированная в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.
3231 3235
3232<h3 id="worktreeremove">3236<h3 id="worktreeremove">
3233 WorktreeRemove3237 WorktreeRemove
3237 3241
3238* вы выходите из сеанса `--worktree` и выбираете его удаление3242* вы выходите из сеанса `--worktree` и выбираете его удаление
3239* подагент с `isolation: "worktree"` завершается3243* подагент с `isolation: "worktree"` завершается
3240* вы удаляете [background session](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook3244* вы удаляете [фоновый сеанс](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook
3241 3245
3242Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate для системы контроля версий, не основанной на git, соедините его с hook WorktreeRemove для обработки очистки. Без него директория worktree остается на диске.3246Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate для системы контроля версий, не основанной на git, свяжите его с hook WorktreeRemove для обработки очистки. Без него директория worktree остается на диске.
3243 3247
3244Claude Code отбрасывает [JSON output fields](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.3248Claude Code отбрасывает [поля JSON-вывода](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.
3245 3249
3246Для удаления сеанса фонового плана Claude Code проверяет сохраненный путь worktree перед запуском hook и отказывает пути, который является symlink или проходит через один ниже корня репозитория. Hook запускается для worktree, который все еще содержит файлы только, когда вы подтверждаете удаление в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes); для такого worktree, [`claude rm`](/docs/ru/agent-view#manage-sessions-from-the-shell) сохраняет сеанс и worktree вместо этого. До версии 2.1.216 hook запускался на сохраненном пути без этих проверок.3250Для удаления фонового сеанса Claude Code проверяет сохраненный путь worktree перед запуском hook и отказывает пути, который является символической ссылкой или проходит через одну ниже корня репозитория. Hook запускается для worktree, который все еще содержит файлы только, когда вы подтверждаете удаление в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes); для такого worktree [`claude rm`](/docs/ru/agent-view#manage-sessions-from-the-shell) сохраняет сеанс и worktree вместо этого. До версии 2.1.216 hook запускался на сохраненном пути без этих проверок.
3247 3251
3248Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:3252Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:
3249 3253
3265```3269```
3266 3270
3267<h4 id="worktreeremove-input">3271<h4 id="worktreeremove-input">
3268 WorktreeRemove input3272 Ввод WorktreeRemove
3269</h4>3273</h4>
3270 3274
3271Помимо [common input fields](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.3275Помимо [общих полей ввода](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.
3272 3276
3273```json theme={null}3277```json theme={null}
3274{3278{
3283Код выхода hook WorktreeRemove определяет результат. Когда hook выходит с ненулевым кодом и директория в `worktree_path` все еще существует после этого, удаление не удается:3287Код выхода hook WorktreeRemove определяет результат. Когда hook выходит с ненулевым кодом и директория в `worktree_path` все еще существует после этого, удаление не удается:
3284 3288
3285* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).3289* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).
3286* Если вы удаляли фоновый сеанс, сеанс также остается. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удаляет ли удаление сеанса снова директорию в любом случае.3290* Если вы удаляли фоновый сеанс, сеанс остается тоже. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удаляет ли удаление сеанса снова директорию в любом случае.
3287 3291
3288<h3 id="precompact">3292<h3 id="precompact">
3289 PreCompact3293 PreCompact
3294Значение matcher указывает, было ли сжатие запущено вручную или автоматически:3298Значение matcher указывает, было ли сжатие запущено вручную или автоматически:
3295 3299
3296| Matcher | Когда срабатывает |3300| Matcher | Когда срабатывает |
3297| :------- | :--------------------------------------------------------------------------------------------------------- |3301| :------- | :------------------------------------------------------------------------------------------------------- |
3298| `manual` | `/compact` |3302| `manual` | `/compact` |
3299| `auto` | Auto-compact, когда разговор достигает [auto-compact window](/docs/ru/model-config#set-the-auto-compact-window) |3303| `auto` | Auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |
3300 3304
3301Выход с кодом 2 для блокирования сжатия. Для ручного `/compact`, сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.3305Выйдите с кодом 2 для блокировки сжатия. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете блокировать, возвращая JSON с `"decision": "block"`.
3302 3306
3303Блокирование автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено упреждающе перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.3307Блокировка автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено упреждающе перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.
3304 3308
3305Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.3309Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.
3306 3310
3307<h4 id="precompact-input">3311<h4 id="precompact-input">
3308 PreCompact input3312 Ввод PreCompact
3309</h4>3313</h4>
3310 3314
3311Помимо [common input fields](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и имеет значение `null`, когда они ничего не передают. Для `auto`, `custom_instructions` имеет значение `null`.3315Помимо [общих полей ввода](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и имеет значение `null`, когда они ничего не передают. Для `auto`, `custom_instructions` имеет значение `null`.
3312 3316
3313```json theme={null}3317```json theme={null}
3314{3318{
3325 PostCompact3329 PostCompact
3326</h3>3330</h3>
3327 3331
3328Запускается после завершения операции compact Claude Code. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированной сводки или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.3332Запускается после завершения операции compact Claude Code. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированного резюме или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.
3329 3333
3330Те же значения matcher применяются, как для `PreCompact`:3334Те же значения matcher применяются, как для `PreCompact`:
3331 3335
3332| Matcher | Когда срабатывает |3336| Matcher | Когда срабатывает |
3333| :------- | :--------------------------------------------------------------------------------------------------------------- |3337| :------- | :------------------------------------------------------------------------------------------------------------- |
3334| `manual` | После `/compact` |3338| `manual` | После `/compact` |
3335| `auto` | После auto-compact, когда разговор достигает [auto-compact window](/docs/ru/model-config#set-the-auto-compact-window) |3339| `auto` | После auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |
3336 3340
3337<h4 id="postcompact-input">3341<h4 id="postcompact-input">
3338 PostCompact input3342 Ввод PostCompact
3339</h4>3343</h4>
3340 3344
3341Помимо [common input fields](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку разговора, сгенерированную операцией compact.3345Помимо [общих полей ввода](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией compact.
3342 3346
3343```json theme={null}3347```json theme={null}
3344{3348{
3357 PreModelSwitch3361 PreModelSwitch
3358</h3>3362</h3>
3359 3363
3360Запускается перед применением переключения модели, которое вы или клиент запросили. Используйте это для блокирования переключения, требования подтверждения или показа стоимости переключения перед его выполнением.3364Запускается перед применением переключения модели, которое вы или клиент запросили. Используйте это для блокировки переключения, требования подтверждения или показа стоимости переключения перед его выполнением.
3361 3365
3362PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:3366PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:
3363 3367
3367* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса3371* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса
3368* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)3372* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3369 3373
3370Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает самостоятельно, такие как [automatic model fallback](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.3374Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает самостоятельно, такие как [автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.
3371 3375
3372Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Alias, такой как `opus`, датированный ID модели и ID, специфичный для поставщика, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.3376Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Псевдоним, такой как `opus`, датированный ID модели и ID, специфичный для поставщика, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.
3373 3377
3374Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из своего ввода, а не полагаться только на matcher.3378Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из своего ввода, а не полагаться только на matcher.
3375 3379
3442Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, работающего на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.3446Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, работающего на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.
3443 3447
3444<h4 id="premodelswitch-input">3448<h4 id="premodelswitch-input">
3445 PreModelSwitch input3449 Ввод PreModelSwitch
3446</h4>3450</h4>
3447 3451
3448Помимо [common input fields](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что стоит повторная отправка разговора на новую модель, поэтому hook может показать эту цифру перед переключением.3452Помимо [общих полей ввода](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что стоит повторная отправка разговора на новую модель, поэтому hook может показать эту цифру перед переключением.
3449 3453
3450| Field | Type | Description |3454| Поле | Тип | Описание |
3451| :-------------------------- | :--------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |3455| :-------------------------- | :---------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3452| `from_model` | string | ID модели, на которую переключается |3456| `from_model` | string | ID модели, на которую переключается |
3453| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |3457| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |
3454| `requested_model` | string or `null` | Модель, которую назвал запрос: alias, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |3458| `requested_model` | string или `null` | Модель, которую назвал запрос: псевдоним, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |
3455| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |3459| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3456| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш чтения, кэш создания и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |3460| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш-чтение, кэш-создание и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |
3457| `prompt_cache_warm` | boolean | Вероятно ли, что кэш подсказок текущей модели все еще теплый, означая, что переключение его теряет |3461| `prompt_cache_warm` | boolean | Теплый ли кэш подсказок текущей модели, означая, что переключение его теряет |
3458| `cache_ttl` | string | [Prompt cache lifetime](/docs/ru/prompt-caching#cache-lifetime), который Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |3462| `cache_ttl` | string | [Время жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |
3459| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` при скорости `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |3463| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` при ставке `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |
3460| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по вашим собственным ставкам организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил стандартную ставку |3464| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по вашим собственным ставкам организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил ставку по умолчанию |
3461 3465
3462Этот пример показывает ввод для `/model opus` в сеансе, работающем на Sonnet 5:3466Этот пример показывает ввод для `/model opus` в сеансе, работающем на Sonnet 5:
3463 3467
3480```3484```
3481 3485
3482<h4 id="premodelswitch-decision-control">3486<h4 id="premodelswitch-decision-control">
3483 PreModelSwitch decision control3487 Управление решением PreModelSwitch
3484</h4>3488</h4>
3485 3489
3486Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Выход 2 или `decision: "block"` верхнего уровня отменяет переключение.3490Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.
3487 3491
3488Для более тонкого контроля, верните `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как на [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. Таблица ниже описывает оба поля:3492Для более тонкого управления, верните `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как на [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. Таблица ниже описывает оба поля:
3489 3493
3490| Field | Description |3494| Поле | Описание |
3491| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |3495| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
3492| `permissionDecision` | `"allow"` продолжает и пропускает [confirmation Claude Code shows while the prompt cache is warm](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` подсказывает пользователю подтвердить его |3496| `permissionDecision` | `"allow"` продолжает и пропускает [подтверждение, которое Claude Code показывает, пока кэш подсказок теплый](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` подсказывает пользователю подтвердить его |
3493| `permissionDecisionReason` | Для `"deny"`, показано пользователю как причина блокирования переключения или возвращено как ошибка для запроса `set_model`. Для `"ask"`, показано в подсказке подтверждения. Игнорируется для `"allow"` |3497| `permissionDecisionReason` | Для `"deny"`, показано пользователю как причина блокировки переключения или возвращено как ошибка для запроса `set_model`. Для `"ask"`, показано в подсказке подтверждения. Игнорируется для `"allow"` |
3494 3498
3495Только `/model` в интерактивном сеансе может показать подсказку `"ask"`. На каждой другой поверхности, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.3499Только `/model` в интерактивном сеансе может показать подсказку `"ask"`. На каждой другой поверхности, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.
3496 3500
3508 3512
3509Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет — `deny` > `ask` > `allow`.3513Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет — `deny` > `ask` > `allow`.
3510 3514
3511Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета стоимости может вернуть `{"systemMessage": "..."}` и выход 0.3515Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета стоимости может вернуть `{"systemMessage": "..."}` и выйти 0.
3512 3516
3513Hook PreModelSwitch, который не отвечает перед своим timeout, блокирует переключение. На [PreToolUse](#timeouts), напротив, hook command, который истекает timeout, позволяет вызову инструмента продолжить. Стандартный timeout для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандартные значения `prompt` и `agent` не применяются.3517Hook PreModelSwitch, который не отвечает перед своим тайм-аутом, блокирует переключение. На [PreToolUse](#timeouts), в отличие от этого, тайм-аут command hook позволяет вызову инструмента продолжить. Тайм-аут по умолчанию для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандарты `prompt` и `agent` не применяются.
3514 3518
3515Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).3519Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).
3516 3520
3518 PostModelSwitch3522 PostModelSwitch
3519</h3>3523</h3>
3520 3524
3521Запускается после изменения модели сеанса. Используйте это для предоставления руководства, специфичного для модели, без редактирования каждого CLAUDE.md, например инструкции на уровне организации, которая применяется на определенных моделях.3525Запускается после изменения модели сеанса. Используйте это для предоставления руководства, специфичного для модели, без редактирования каждого CLAUDE.md, например организационной инструкции, которая применяется на определенных моделях.
3522 3526
3523PostModelSwitch требует Claude Code v2.1.251 или позже. Он не может блокировать, потому что модель уже изменилась. Claude Code запускает hooks PostModelSwitch после любого из этих изменений:3527PostModelSwitch требует Claude Code v2.1.251 или позже. Он не может блокировать, потому что модель уже изменилась. Claude Code запускает hooks PostModelSwitch после любого из этих изменений:
3524 3528
3525* Переключение, которое вы или клиент запросили3529* Переключение, которое вы или клиент запросили
3526* [Automatic model fallback](/docs/ru/model-config#automatic-model-fallback), которое изменяет модель сеанса3530* [Автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback), который изменяет модель сеанса
3527* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана3531* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана
3528* Claude Code восстанавливает модель при возобновлении сеанса3532* Claude Code восстанавливает модель при возобновлении сеанса
3529 3533
3530Claude Code не запускает hooks PostModelSwitch, когда модель из [fallback model chain](/docs/ru/model-config#fallback-model-chains) служит ходу, потому что это замещение длится один ход и оставляет модель сеанса неизменной.3534Claude Code не запускает hooks PostModelSwitch, когда модель из [цепочки fallback модели](/docs/ru/model-config#fallback-model-chains) обслуживает ход, потому что эта замена длится один ход и оставляет модель сеанса неизменной.
3531 3535
3532Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.3536Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.
3533 3537
3551}3555}
3552```3556```
3553 3557
3554Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, работающего на другой модели, например запустите `/model opus` из сеанса Sonnet, затем попросите Claude, какое руководство оно имеет о текущей модели.3558Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, работающего на другой модели, например запустите `/model opus` из сеанса Sonnet, затем спросите Claude, какое руководство оно имеет о текущей модели.
3555 3559
3556<h4 id="postmodelswitch-input">3560<h4 id="postmodelswitch-input">
3557 PostModelSwitch input3561 Ввод PostModelSwitch
3558</h4>3562</h4>
3559 3563
3560Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сеанса.3564Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сеанса.
3562`requested_model` имеет значение `null`, когда `source` имеет значение `"auto"`. Когда `source` имеет значение `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.3566`requested_model` имеет значение `null`, когда `source` имеет значение `"auto"`. Когда `source` имеет значение `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.
3563 3567
3564<h4 id="postmodelswitch-decision-control">3568<h4 id="postmodelswitch-decision-control">
3565 PostModelSwitch decision control3569 Управление решением PostModelSwitch
3566</h4>3570</h4>
3567 3571
3568Claude Code берет ваш вывод hook [plain-text stdout](#exit-code-0) при выходе 0 или `additionalContext` из JSON вывода и доставляет его Claude со следующим запросом после переключения. Помимо [JSON output fields](#json-output), доступных всем hooks, вы можете вернуть:3572Claude Code берет ваш [простой текст stdout](#exit-code-0) hook при выходе 0 или `additionalContext` из JSON-вывода и доставляет его Claude со следующим запросом после переключения. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть:
3569 3573
3570| Field | Description |3574| Поле | Описание |
3571| :------------------ | :----------------------------------------------------------------------------------------------------------------- |3575| :------------------ | :----------------------------------------------------------------------------------------------------------------- |
3572| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |3576| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |
3573 3577
3574Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для последнего переключения целевой модели.3578Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для переключения целевой модели последнего.
3575 3579
3576<h3 id="sessionend">3580<h3 id="sessionend">
3577 SessionEnd3581 SessionEnd
3581 3585
3582Поле `reason` в ввод hook указывает, почему сеанс закончился:3586Поле `reason` в ввод hook указывает, почему сеанс закончился:
3583 3587
3584| Reason | Description |3588| Причина | Описание |
3585| :---------------------------- | :-------------------------------------------------------------------------------------------- |3589| :---------------------------- | :-------------------------------------------------------------------------------------------------- |
3586| `clear` | Сеанс очищен с помощью команды `/clear` |3590| `clear` | Сеанс очищен с командой `/clear` |
3587| `resume` | Сеанс переключен через интерактивный `/resume` |3591| `resume` | Сеанс переключен через интерактивный `/resume` |
3588| `logout` | Пользователь вышел |3592| `logout` | Пользователь вышел |
3589| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |3593| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |
3590| `other` | Другие причины выхода |3594| `other` | Другие причины выхода |
3591| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |3595| `bypass_permissions_disabled` | Удалено в версии 2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |
3592 3596
3593<h4 id="sessionend-input">3597<h4 id="sessionend-input">
3594 SessionEnd input3598 Ввод SessionEnd
3595</h4>3599</h4>
3596 3600
3597Помимо [common input fields](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. таблицу [reason](#sessionend) выше для всех значений.3601Помимо [общих полей ввода](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. [таблицу причин](#sessionend) выше для всех значений.
3598 3602
3599```json theme={null}3603```json theme={null}
3600{3604{
3606}3610}
3607```3611```
3608 3612
3609Hooks SessionEnd не имеют управления решением. Они не могут заблокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [JSON output fields](#json-output), такие как `systemMessage`.3613Hooks SessionEnd не имеют управления решением. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage`.
3610 3614
3611Hooks SessionEnd имеют стандартный timeout 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:3615Hooks SessionEnd имеют тайм-аут по умолчанию 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:
3612 3616
3613* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` для каждого hook в ваших файлах настроек, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандартный. Timeouts, установленные на hooks, предоставленные plugin, не повышают бюджет.3617* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` per-hook в ваших файлах параметров, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандарт. Тайм-ауты, установленные на hooks, предоставленные плагином, не повышают бюджет.
3614* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится timeout для каждого hook без своего собственного `timeout`.3618* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится тайм-аутом для каждого hook без своего собственного `timeout`.
3615 3619
3616Этот пример устанавливает бюджет на 5 секунд:3620Этот пример устанавливает бюджет на 5 секунд:
3617 3621
3619CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3623CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3620```3624```
3621 3625
3622До версии 2.1.268, `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышал только общий бюджет, и hook без своего собственного `timeout` все еще отменялся после 1.5 секунды.3626До версии 2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышал только общий бюджет, и hook без своего собственного `timeout` все еще отменялся через 1.5 секунды.
3623 3627
3624<h3 id="elicitation">3628<h3 id="elicitation">
3625 Elicitation3629 Elicitation
3627 3631
3628Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.3632Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.
3629 3633
3630Поле matcher совпадает с именем сервера MCP.3634Поле matcher совпадает с названием сервера MCP.
3631 3635
3632<h4 id="elicitation-input">3636<h4 id="elicitation-input">
3633 Elicitation input3637 Ввод Elicitation
3634</h4>3638</h4>
3635 3639
3636Помимо [common input fields](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные поля `mode`, `url`, `elicitation_id` и `requested_schema`.3640Помимо [общих полей ввода](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные `mode`, `url`, `elicitation_id` и `requested_schema` поля.
3637 3641
3638Для запроса в режиме формы, наиболее распространенный случай:3642Для запроса в режиме формы, наиболее распространенный случай:
3639 3643
3671```3675```
3672 3676
3673<h4 id="elicitation-output">3677<h4 id="elicitation-output">
3674 Elicitation output3678 Вывод Elicitation
3675</h4>3679</h4>
3676 3680
3677Чтобы ответить программно без показа диалога, верните JSON объект с `hookSpecificOutput`:3681Чтобы ответить программно без показа диалога, верните объект JSON с `hookSpecificOutput`:
3678 3682
3679```json theme={null}3683```json theme={null}
3680{3684{
3688}3692}
3689```3693```
3690 3694
3691| Field | Values | Description |3695| Поле | Значения | Описание |
3692| :-------- | :---------------------------- | :--------------------------------------------------------------------------------------------- |3696| :-------- | :---------------------------- | :--------------------------------------------------------------------------------------------- |
3693| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |3697| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |
3694| `content` | object | Значения полей формы для отправки. Используется только, когда `action` имеет значение `accept` |3698| `content` | object | Значения полей формы для отправки. Используется только, когда `action` имеет значение `accept` |
3695 3699
3696Выход 2 отклоняет запрос. Claude Code не показывает ваше сообщение stderr нигде.3700Код выхода 2 отклоняет запрос. Claude Code не показывает ваше сообщение stderr нигде.
3697 3701
3698Claude Code действует на `hookSpecificOutput` из JSON вывода hook Elicitation и отбрасывает `systemMessage` и `continue`.3702Claude Code действует на `hookSpecificOutput` из JSON-вывода hook Elicitation и отбрасывает `systemMessage` и `continue`.
3699 3703
3700<h3 id="elicitationresult">3704<h3 id="elicitationresult">
3701 ElicitationResult3705 ElicitationResult
3702</h3>3706</h3>
3703 3707
3704Запускается после ответа пользователя на запрос MCP. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.3708Запускается после того, как пользователь ответит на запрос MCP. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.
3705 3709
3706Поле matcher совпадает с именем сервера MCP.3710Поле matcher совпадает с названием сервера MCP.
3707 3711
3708<h4 id="elicitationresult-input">3712<h4 id="elicitationresult-input">
3709 ElicitationResult input3713 Ввод ElicitationResult
3710</h4>3714</h4>
3711 3715
3712Помимо [common input fields](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные поля `mode`, `elicitation_id` и `content`.3716Помимо [общих полей ввода](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные `mode`, `elicitation_id` и `content` поля.
3713 3717
3714```json theme={null}3718```json theme={null}
3715{3719{
3726```3730```
3727 3731
3728<h4 id="elicitationresult-output">3732<h4 id="elicitationresult-output">
3729 ElicitationResult output3733 Вывод ElicitationResult
3730</h4>3734</h4>
3731 3735
3732Чтобы переопределить ответ пользователя, верните JSON объект с `hookSpecificOutput`:3736Чтобы переопределить ответ пользователя, верните объект JSON с `hookSpecificOutput`:
3733 3737
3734```json theme={null}3738```json theme={null}
3735{3739{
3741}3745}
3742```3746```
3743 3747
3744| Field | Values | Description |3748| Поле | Значения | Описание |
3745| :-------- | :---------------------------- | :---------------------------------------------------------------------------------------------- |3749| :-------- | :---------------------------- | :---------------------------------------------------------------------------------------------- |
3746| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3750| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |
3747| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` имеет значение `accept` |3751| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` имеет значение `accept` |
3748 3752
3749Выход 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.3753Код выхода 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.
3750 3754
3751Claude Code действует на `hookSpecificOutput` из JSON вывода hook ElicitationResult и отбрасывает `systemMessage` и `continue`.3755Claude Code действует на `hookSpecificOutput` из JSON-вывода hook ElicitationResult и отбрасывает `systemMessage` и `continue`.
3752 3756
3753<h2 id="prompt-based-hooks">3757<h2 id="prompt-based-hooks">
3754 Prompt-based hooks3758 Prompt-based hooks
3759События, которые поддерживают все пять типов hook (`command`, `http`, `mcp_tool`, `prompt` и `agent`):3763События, которые поддерживают все пять типов hook (`command`, `http`, `mcp_tool`, `prompt` и `agent`):
3760 3764
3761* `PermissionDenied`3765* `PermissionDenied`
3762* `PermissionRequest`
3763* `PostToolBatch`3766* `PostToolBatch`
3764* `PostToolUse`3767* `PostToolUse`
3765* `PostToolUseFailure`3768* `PostToolUseFailure`
3772* `UserPromptExpansion`3775* `UserPromptExpansion`
3773* `UserPromptSubmit`3776* `UserPromptSubmit`
3774 3777
3778`PermissionRequest` поддерживает `command`, `http`, `mcp_tool` и `prompt` hooks, но не `agent` hooks. Если вы настроите agent hook на этом событии, Claude Code пропустит его и поток разрешений продолжится без изменений. Чтобы разрешить или отклонить из hook, верните [объект решения](#permissionrequest-decision-control) из command или HTTP hook.
3779
3775События, которые поддерживают `command`, `http` и `mcp_tool` hooks, но не `prompt` или `agent`:3780События, которые поддерживают `command`, `http` и `mcp_tool` hooks, но не `prompt` или `agent`:
3776 3781
3777* `ConfigChange`3782* `ConfigChange`
3904 Agent hooks являются экспериментальными. Поведение и конфигурация могут измениться в будущих выпусках. Для рабочих процессов в производстве предпочитайте [command hooks](#command-hook-fields).3909 Agent hooks являются экспериментальными. Поведение и конфигурация могут измениться в будущих выпусках. Для рабочих процессов в производстве предпочитайте [command hooks](#command-hook-fields).
3905</Warning>3910</Warning>
3906 3911
3907Agent-based hooks (`type: "agent"`) похожи на prompt-based hooks, но с многооборотным доступом к инструментам. Вместо одного вызова LLM, agent hook порождает subagent, который может читать файлы, искать код и проверять кодовую базу для проверки условий. Agent hooks поддерживают те же события, что и prompt-based hooks.3912Agent-based hooks (`type: "agent"`) похожи на prompt-based hooks, но с многооборотным доступом к инструментам. Вместо одного вызова LLM, agent hook порождает subagent, который может читать файлы, искать код и проверять кодовую базу для проверки условий. Agent hooks поддерживают те же события, что и [prompt-based hooks](#prompt-based-hooks), за исключением `PermissionRequest`.
3908 3913
3909<h3 id="how-agent-hooks-work">3914<h3 id="how-agent-hooks-work">
3910 How agent hooks work3915 How agent hooks work