70 70
71> [tab] macOS/Linux71> [tab] macOS/Linux
72>72>
73> Фильтр `matcher` сужает область до вызовов инструмента Bash, а условие `if` сужает её дальше до команд Bash, совпадающих с `rm *`, поэтому `block-rm.sh` запускается только когда оба фильтра совпадают:73> `matcher` сужает область до вызовов инструмента Bash и [команд Monitor](#match-monitor-commands), а условие `if` сужает её дальше до подкоманд Bash, совпадающих с `rm *`, поэтому `block-rm.sh` запускается, только когда оба фильтра совпадают:
74>74>
75> ```json theme={null}75> ```json theme={null}
76> {76> {
112> fi112> fi
113> ```113> ```
114>114>
115> Этот скрипт, как и другие примеры Bash на этой странице, которые анализируют JSON входные данные, использует `jq`, поэтому установите `jq` и убедитесь, что он находится в вашем `PATH` перед попыткой их использования.115> Этот скрипт, как и другие примеры Bash на этой странице, которые анализируют JSON входные данные, использует `jq`, поэтому установите `jq` и убедитесь, что он находится в вашем `PATH`, перед попыткой их использования.
116 116
117> [tab] Windows (PowerShell)117> [tab] Windows (PowerShell)
118>118>
119> Фильтр `Bash|PowerShell` охватывает [инструмент PowerShell](#powershell) а также Bash. Одно правило `if` совпадает только с вызовами одного инструмента, поэтому каждый инструмент получает свой обработчик: первый сужает область до команд Bash, совпадающих с `rm *`, второй — до команд PowerShell, совпадающих с `Remove-Item *`. Оба запускают один и тот же скрипт через `powershell.exe`:119> matcher `Bash|PowerShell` охватывает [инструмент PowerShell](#powershell), а также Bash. Одно правило `if` называет только один инструмент, поэтому каждый инструмент получает свой обработчик: первый сужает область до подкоманд Bash, совпадающих с `rm *`, второй — до команд PowerShell, совпадающих с `Remove-Item *`. Оба запускают один и тот же скрипт через `powershell.exe`:
120>120>
121> ```json theme={null}121> ```json theme={null}
122> {122> {
225Hooks определяются в JSON файлах настроек. Конфигурация имеет три уровня вложенности:225Hooks определяются в JSON файлах настроек. Конфигурация имеет три уровня вложенности:
226 226
2271. Выберите [hook event](#hook-events) для ответа, например `PreToolUse` или `Stop`2271. Выберите [hook event](#hook-events) для ответа, например `PreToolUse` или `Stop`
2282. Добавьте [matcher group](#matcher-patterns) для фильтрации срабатывания, например "только для инструмента Bash"2282. Добавьте [группу matcher](#matcher-patterns), чтобы фильтровать срабатывание, например «для инструмента Bash»
2293. Определите один или несколько [hook handlers](#hook-handler-fields) для запуска при совпадении2293. Определите один или несколько [hook handlers](#hook-handler-fields) для запуска при совпадении
230 230
231См. [Как разрешается hook](#how-a-hook-resolves) выше для полного пошагового руководства с аннотированным примером.231См. [Как разрешается hook](#how-a-hook-resolves) выше для полного пошагового руководства с аннотированным примером.
277| Значение фильтра | Оценивается как | Пример |277| Значение фильтра | Оценивается как | Пример |
278| :- | :- | :- |278| :- | :- | :- |
279| `"*"`, `""` или опущено | Совпадение со всеми | срабатывает при каждом возникновении события |279| `"*"`, `""` или опущено | Совпадение со всеми | срабатывает при каждом возникновении события |
280| Только буквы, цифры, `_`, `-`, пробелы, `,` и `\|` | Точная строка или список точных строк, разделённых `\|` или `,` с опциональным окружающим пробелом | `Bash` совпадает только с инструментом Bash; `Edit\|Write` и `Edit, Write` каждый совпадает с любым инструментом точно; `code-reviewer` совпадает только с этим типом агента |280| Только буквы, цифры, `_`, `-`, пробелы, `,` и `\|` | Точная строка или список точных строк, разделённых `\|` или `,` с необязательными пробелами вокруг | `Bash` совпадает с инструментом Bash, а для `PreToolUse` и `PermissionRequest` также с [командами Monitor](#match-monitor-commands); `Edit\|Write` и `Edit, Write` точно совпадают с любым из двух инструментов; `code-reviewer` совпадает только с этим типом агента |
281| Содержит любой другой символ | Регулярное выражение JavaScript без привязки | `^Notebook` совпадает с любым инструментом, имя которого начинается с `Notebook`; `mcp__memory__.*` совпадает с каждым инструментом сервера `memory` |281| Содержит любой другой символ | Регулярное выражение JavaScript без привязки | `^Notebook` совпадает с любым инструментом, имя которого начинается с `Notebook`; `mcp__memory__.*` совпадает с каждым инструментом сервера `memory` |
282 282
283Фильтр на пути регулярного выражения проверяется с помощью `RegExp.prototype.test` JavaScript, который успешно совпадает в любом месте значения. `Edit.*` совпадает как с `Edit`, так и с `NotebookEdit`; оберните шаблон в `^` и `$`, как в `^Edit$`, когда вам нужно совпадение всей строки.283Фильтр на пути регулярного выражения проверяется с помощью `RegExp.prototype.test` JavaScript, который успешно совпадает в любом месте значения. `Edit.*` совпадает как с `Edit`, так и с `NotebookEdit`; оберните шаблон в `^` и `$`, как в `^Edit$`, когда вам нужно совпадение всей строки.
294| `SessionStart` | как сеанс начался | `startup`, `resume`, `clear`, `compact`, `fork` |294| `SessionStart` | как сеанс начался | `startup`, `resume`, `clear`, `compact`, `fork` |
295| `Setup` | какой флаг CLI запустил setup | `init`, `maintenance` |295| `Setup` | какой флаг CLI запустил setup | `init`, `maintenance` |
296| `SessionEnd` | почему сеанс закончился | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |296| `SessionEnd` | почему сеанс закончился | `clear`, `resume`, `logout`, `prompt_input_exit`, `other` |
297| `Notification` | тип уведомления | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled`, `plugin_notification` |297| `Notification` | тип уведомления | `permission_prompt`, `idle_prompt`, `auth_success`, `auth_storage_failure`, `elicitation_dialog`, `elicitation_url_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed`, `quota_auto_resume_fired`, `quota_auto_resume_stale`, `quota_auto_resume_disabled`, `plugin_notification` |
298| `SubagentStart` | тип агента | `general-purpose`, `Explore`, `Plan`, пользовательские имена агентов или имена с областью плагина, такие как `^my-plugin:reviewer$` |298| `SubagentStart` | тип агента | `general-purpose`, `Explore`, `Plan`, пользовательские имена агентов или имена с областью плагина, такие как `^my-plugin:reviewer$` |
299| `PreCompact`, `PostCompact` | что вызвало компактирование | `manual`, `auto` |299| `PreCompact`, `PostCompact` | что вызвало компактирование | `manual`, `auto` |
300| `PreModelSwitch`, `PostModelSwitch` | каноническое имя модели, на которую переключается сеанс, как описано в [PreModelSwitch](#premodelswitch) | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |300| `PreModelSwitch`, `PostModelSwitch` | каноническое имя модели, на которую переключается сеанс, как описано в [PreModelSwitch](#premodelswitch) | `claude-opus-5`, `claude-opus-4-6\|claude-opus-5`, `.*opus.*` |
385}385}
386```386```
387 387
388#### Сопоставление команд Monitor
389
390Хук [`PreToolUse`](#pretooluse) или [`PermissionRequest`](#permissionrequest) с matcher `Bash` также запускается для shell-команд, которые Claude запускает с помощью [инструмента Monitor](https://code.claude.com/docs/ru/tools-reference.md#monitor-tool), но его `allow` и [`updatedInput`](#pretooluse-decision-control) на них не действуют. Требуется Claude Code v2.1.314 или новее. Matcher вроде `Bash|PowerShell`, `^Bash$` и `Bash.*` тоже являются matcher `Bash`. Хук с matcher `Bash` не запускается для [отслеживания WebSocket](https://code.claude.com/docs/ru/tools-reference.md#websocket-source), а хук `PostToolUse` с таким matcher не запускается для Monitor.
391
392Хук, запускаемый для команды Monitor, может отклонить её или заставить Claude Code спросить вас о ней. Чтобы разрешить или переписать команду, замените matcher `Bash` на matcher, включающий Monitor:
393
394* **Matcher, включающий Monitor**: с matcher вроде `Bash|Monitor` или `.*`, либо без matcher, хук получает собственные входные данные вызова Monitor, и `allow` и `updatedInput` применяются. В [`if`](#common-fields) указывайте Monitor, как в `Monitor(tail *)`, который сопоставляется по [тем же правилам, что и `Bash(tail *)`](#bash-if-matching). Если в его `if` указан Bash, хук всё равно получает входные данные вызова Monitor, но `allow` и `updatedInput` не действуют
395* **Matcher `Bash`**: хук получает вызов Bash. В `if` указывайте Bash, как в `Bash(tail *)`. Хук не запускается, если в его `if` указан Monitor
396
388### Hook handler fields397### Hook handler fields
389 398
390Каждый объект во внутреннем массиве `hooks` — это hook handler: команда оболочки, конечная точка HTTP, инструмент MCP, подсказка LLM или агент, который запускается при совпадении фильтра. Есть пять типов:399Каждый объект во внутреннем массиве `hooks` — это hook handler: команда оболочки, конечная точка HTTP, инструмент MCP, подсказка LLM или агент, который запускается при совпадении фильтра. Есть пять типов:
811* **Две или более строк, каждая из которых по отдельности разбирается как JSON, причём первая начинается с `{`, а последняя заканчивается `}`**: обычный текст, если ни одна строка не является объектом вывода JSON, задающим какое-либо поле. Если такая строка есть, вывод считается ошибкой разбора, поэтому выводите этот объект, не добавляя в stdout ничего другого.820* **Две или более строк, каждая из которых по отдельности разбирается как JSON, причём первая начинается с `{`, а последняя заканчивается `}`**: обычный текст, если ни одна строка не является объектом вывода JSON, задающим какое-либо поле. Если такая строка есть, вывод считается ошибкой разбора, поэтому выводите этот объект, не добавляя в stdout ничего другого.
812* **Всё остальное, что начинается с `{` и заканчивается `}`, но не является корректным JSON**: ошибка разбора.821* **Всё остальное, что начинается с `{` и заканчивается `}`, но не является корректным JSON**: ошибка разбора.
813 822
814Для большинства событий Claude Code записывает stdout в отладочный лог и не показывает его в транскрипте. Исключения — `UserPromptSubmit`, `UserPromptExpansion`, `SessionStart` и `PostModelSwitch`, для которых Claude Code добавляет обычный текст из stdout как контекст, который Claude может видеть и учитывать. Для этих событий Claude Code не добавляет stdout, который ему не удалось разобрать.823Для большинства событий Claude Code записывает stdout в отладочный лог и не показывает его в транскрипте. Для следующих событий ваш stdout доходит до Claude или до сводки сжатия контекста:
824
825* **`UserPromptSubmit`, `UserPromptExpansion`, `SessionStart` и `PostModelSwitch`**: Claude Code добавляет обычный текст из stdout как контекст, который Claude может видеть и учитывать. Stdout, который ему не удалось разобрать, Claude Code не добавляет.
826* **`PreCompact`**: ваш stdout становится [инструкциями для сводки сжатия контекста](#precompact-output)
815 827
816Claude никогда не видит stderr хука, завершившегося с кодом 0. Чтобы прочитать его самостоятельно для таких событий, как `PreToolUse`, включите [отладочное логирование](#debug-hooks). Чтобы передать предупреждение Claude из хука `PostToolUse` или `PostToolUseFailure`, вместо этого выйдите с кодом 2, чтобы [Claude увидел stderr](#exit-code-2-behavior-per-event), хотя инструмент уже выполнился.828Claude никогда не видит stderr хука, завершившегося с кодом 0. Чтобы прочитать его самостоятельно для таких событий, как `PreToolUse`, включите [отладочное логирование](#debug-hooks). Чтобы передать предупреждение Claude из хука `PostToolUse` или `PostToolUseFailure`, вместо этого выйдите с кодом 2, чтобы [Claude увидел stderr](#exit-code-2-behavior-per-event), хотя инструмент уже выполнился.
817 829
1050Строки `additionalContext`, `systemMessage` и `initialUserMessage` хука, а также его обычный stdout ограничены 10 000 символов:1062Строки `additionalContext`, `systemMessage` и `initialUserMessage` хука, а также его обычный stdout ограничены 10 000 символов:
1051 1063
1052* **Область действия**: Claude Code измеряет каждую строку отдельно, даже если для одного события выполняется несколько хуков. Для вывода JSON каждое поле измеряется отдельно; обычный stdout измеряется целиком.1064* **Область действия**: Claude Code измеряет каждую строку отдельно, даже если для одного события выполняется несколько хуков. Для вывода JSON каждое поле измеряется отдельно; обычный stdout измеряется целиком.
1053* **Превышение лимита**: Claude Code сохраняет вывод в файл в каталоге сессии и заменяет его путём к файлу и превью, содержащим до 2 000 первых символов. Большой корректный результат Bash обрабатывается так же, как описано в разделе [Ограничения вывода](https://code.claude.com/docs/ru/tools-reference.md#output-limits). В отличие от этого ограничения Bash, у данного лимита нет настройки или переменной окружения, позволяющей его увеличить.1065* **Превышение лимита**: за исключением [stdout хука PreCompact](#precompact-output), Claude Code сохраняет вывод в файл в каталоге сессии. Он заменяет вывод путём к файлу и превью, содержащим до 2 000 первых символов. Большой корректный результат Bash обрабатывается так же, как описано в разделе [Ограничения вывода](https://code.claude.com/docs/ru/tools-reference.md#output-limits). В отличие от этого ограничения Bash, у данного лимита нет настройки или переменной окружения, позволяющей его увеличить.
1054* **Чтение файла**: Claude Code не просит Claude прочитать файл, поэтому держите всё, что Claude должен видеть всегда, в пределах лимита.1066* **Чтение файла**: Claude Code не просит Claude прочитать файл, поэтому держите всё, что Claude должен видеть всегда, в пределах лимита.
1055 1067
1056Объект JSON поддерживает три вида полей:1068Объект JSON поддерживает три вида полей:
1954 1966
1955#### Управление решениями PreToolUse1967#### Управление решениями PreToolUse
1956 1968
1957Хуки `PreToolUse` могут управлять тем, будет ли выполнен вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт более богатые возможности управления: четыре исхода (allow, deny, ask или defer), а также возможность изменять входные данные инструмента перед выполнением.1969Хуки `PreToolUse` могут управлять тем, будет ли выполнен вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт более богатые возможности управления: четыре исхода (разрешить, запретить, запросить подтверждение или отложить), а также возможность изменить входные данные инструмента перед выполнением. О том, как разрешить или переписать команду Monitor, см. [Сопоставление команд Monitor](#match-monitor-commands).
1958 1970
1959| Поле | Описание |1971| Поле | Описание |
1960| :- | :- |1972| :- | :- |
2051 2063
2052#### Отложить вызов инструмента на потом2064#### Отложить вызов инструмента на потом
2053 2065
2054`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, например приложение на Agent SDK или пользовательский интерфейс, построенный поверх Claude Code. Он позволяет вызывающему процессу приостановить Claude на вызове инструмента, собрать входные данные через свой интерфейс и продолжить с того же места. Claude Code учитывает это значение только в [неинтерактивном режиме](https://code.claude.com/docs/ru/headless.md) с флагом `-p`. В интерактивных сессиях он записывает в лог предупреждение и игнорирует результат хука.2066`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод в формате JSON, например для приложения на Agent SDK или собственного интерфейса, построенного поверх Claude Code. Он позволяет вызывающему процессу приостановить Claude на вызове инструмента, собрать ввод через собственный интерфейс и продолжить с того места, где работа была прервана.
2067
2068Claude Code учитывает `"defer"` только в [неинтерактивном режиме](https://code.claude.com/docs/ru/headless.md) с флагом `-p` и только когда Claude делает единственный вызов инструмента за ход:
2069
2070* **В интерактивных сессиях**: записывается предупреждение, а результат хука игнорируется
2071* **Несколько вызовов инструментов одновременно**: `"defer"` игнорируется с предупреждением, и инструмент проходит обычный процесс проверки разрешений
2055 2072
2056Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но терминала для ответа нет. Запуск `-p` предлагает `AskUserQuestion` только при наличии [хоста разрешений](https://code.claude.com/docs/ru/headless.md#turn-off-permission-prompts-in-unattended-runs), например MCP-инструмента, который вы передаёте через `--permission-prompt-tool`, поэтому начинайте запуск с ним. Цикл работает так:2073Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но терминала для ответа нет. Запуск `-p` предлагает `AskUserQuestion` только при наличии [хоста разрешений](https://code.claude.com/docs/ru/headless.md#turn-off-permission-prompts-in-unattended-runs), например MCP-инструмента, который вы передаёте через `--permission-prompt-tool`, поэтому начинайте запуск с ним. Цикл работает так:
2057 2074
20614. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова вызывает `PreToolUse`.20784. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова вызывает `PreToolUse`.
20625. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.20795. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.
2063 2080
2064Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сформировал для вызова инструмента, зафиксированные до выполнения:2081Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента:
2065 2082
2066```json theme={null}2083```json theme={null}
2067{2084{
2077}2094}
2078```2095```
2079 2096
2080Таймаута или ограничения на повторные попытки нет. Сессия остаётся на диске, пока вы её не возобновите, с учётом очистки по сроку хранения [`cleanupPeriodDays`](https://code.claude.com/docs/ru/settings-reference#cleanupperioddays), которая по умолчанию удаляет файлы сессий через 30 дней согласно [правилам очистки по сроку хранения](https://code.claude.com/docs/ru/claude-directory.md#cleaned-up-automatically).2097Ни таймаута, ни ограничения на число повторных попыток нет. Сессия хранится на диске, пока её не удалит [плановая очистка](https://code.claude.com/docs/ru/claude-directory.md#cleaned-up-automatically) по [`cleanupPeriodDays`](https://code.claude.com/docs/ru/settings-reference#cleanupperioddays), по умолчанию через 30 дней.
2081
2082Если при возобновлении отложенный инструмент больше недоступен, первый результат возобновления содержит `stop_reason: "tool_deferred_unavailable"` и `is_error: true`, а хук не срабатывает. Это происходит, когда MCP-сервер, предоставлявший инструмент, не подключён в возобновлённой сессии. Данные `deferred_tool_use` всё равно включаются, чтобы вы могли определить, какой инструмент пропал.
2083
2084* **Если вы не отправили промпт ни при возобновлении, ни после него**, вызов по-прежнему ожидает. Возобновите снова, когда инструмент будет доступен, и он выполнится первым.
2085* **Если вы отправили промпт при возобновлении или после него**, Claude Code отвечает на него без результата инструмента и отбрасывает отложенный вызов. Если вызов всё ещё нужен, отправьте новый промпт, когда инструмент станет доступен.
2086 2098
2087Если ответ, которого вы ждёте, ещё не готов при возобновлении без промпта, хук может снова вернуть `"defer"`. Если вы отправили промпт и хук снова откладывает вызов, Claude Code обрабатывает промпт так же: отвечает без результата инструмента и отбрасывает вызов. Возобновляйте без промпта, пока хук не вернёт `"allow"` или `"deny"` — так вызывающий процесс выходит из цикла.2099Если ответ ещё не готов к моменту возобновления, хук может снова вернуть `"defer"`. Если при этом возобновлении вы отправили промпт, Claude ответит на него без результата инструмента и не выполнит вызов. Возобновляйте без промпта, пока хук не вернёт `"allow"` или `"deny"`.
2088
2089`"defer"` работает, только когда Claude делает один вызов инструмента за ход. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением, и инструмент проходит обычную процедуру проверки разрешений. Это ограничение существует потому, что при возобновлении можно повторно выполнить только один инструмент: нет способа отложить один вызов из пакета, не оставив остальные неразрешёнными.
2090 2100
2091> [!NOTE]2101> [!NOTE]
2092>2102>
2093> Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--permission-prompt-tool`](https://code.claude.com/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план на утверждение. Прочие условия см. в разделе [Возобновление в режиме планирования с `-p`](https://code.claude.com/docs/ru/sessions#resume-in-plan-mode-with-p). Требуется Claude Code v2.1.246 или новее.2103> Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--permission-prompt-tool`](https://code.claude.com/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план на утверждение. Прочие условия см. в разделе [Возобновление в режиме планирования с `-p`](https://code.claude.com/docs/ru/sessions#resume-in-plan-mode-with-p). Требуется Claude Code v2.1.246 или новее.
2094>2104>
2095> При возобновлении с `-p` Claude Code не восстанавливает никакой другой сохранённый режим разрешений. Он начинает запуск в том режиме разрешений, в котором начался бы новый запуск `claude -p`, поэтому снова передайте `--permission-mode` или `--dangerously-skip-permissions`, если отложенная сессия их использовала. При возобновлении с `claude --resume <session-id>` без `-p` Claude Code восстанавливает сохранённый режим разрешений, за исключениями, перечисленными в разделе [режим разрешений при возобновлении](https://code.claude.com/docs/ru/sessions.md#permission-mode-on-resume).2105> При возобновлении с `-p` Claude Code не восстанавливает никакой другой сохранённый режим разрешений. Запуск начинается в том режиме разрешений, в котором начался бы новый запуск `claude -p`, поэтому снова передайте `--permission-mode` или `--dangerously-skip-permissions`, если отложенная сессия их использовала.
2106
2107##### Возобновление, когда отложенный инструмент недоступен
2108
2109Результат с `stop_reason: "tool_deferred_unavailable"` означает, что инструмент отложенного вызова недоступен в возобновлённой сессии, например потому что его MCP-сервер не подключён. Ваш хук `PreToolUse` не срабатывает, а поле `deferred_tool_use` результата указывает инструмент.
2110
2111Пока вызов ожидает, любой отправленный вами промпт не доходит до Claude, а запуск завершается с кодом выхода 1. Поле `result` начинается с `<tool> isn't available, so its deferred call didn't run.` Выполните вызов или отбросьте его, чтобы он не выполнялся:
2112
2113* **Чтобы выполнить вызов**: сделайте инструмент доступным и возобновите сессию снова.
2114* **Чтобы отбросить вызов**: возобновите сессию с промптом, установив [`CLAUDE_CODE_DROP_UNAVAILABLE_DEFERRED_TOOL`](https://code.claude.com/docs/ru/env-vars#variables) в `1`. Claude получит ошибку в качестве результата вызова и ответит на ваш промпт. При следующем возобновлении ожидающих вызовов не будет.
2115
2116Когда вы отбрасываете вызов, запуск записывает результат `tool_deferred_unavailable` с пустым полем `result`, а затем ответ Claude во втором результате. Он завершается с кодом выхода 0, если только этот ответ не является ошибкой. Если вы установите переменную и не отправите промпт, запуск всё равно отбросит вызов и завершится с кодом выхода 1.
2117
2118До v2.1.319 Claude Code отвечал на промпт без результата инструмента и отбрасывал вызов. В этих версиях отправьте новый промпт, когда инструмент станет доступен.
2096 2119
2097### PermissionRequest2120### PermissionRequest
2098 2121
2148| `message` | Только для `"deny"`: сообщает Claude, почему разрешение было отклонено |2171| `message` | Только для `"deny"`: сообщает Claude, почему разрешение было отклонено |
2149| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |2172| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |
2150 2173
2174Чтобы разрешить или переписать команду Monitor, см. раздел [Сопоставление команд Monitor](#match-monitor-commands).
2175
2151Хук, завершающийся с кодом 2 без объекта `decision`, оставляет процесс обработки разрешения без изменений, а его stderr отбрасывается. Чтобы предоставить или отклонить запрос, верните объект `decision`.2176Хук, завершающийся с кодом 2 без объекта `decision`, оставляет процесс обработки разрешения без изменений, а его stderr отбрасывается. Чтобы предоставить или отклонить запрос, верните объект `decision`.
2152 2177
2153```json theme={null}2178```json theme={null}
2205* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или установите его в `"*"`. Тогда ваш хук может сам определить, что изменилось, например выполнив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, пропускаемые `git diff`. Для вызовов инструментов, завершившихся с ошибкой, добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).2230* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или установите его в `"*"`. Тогда ваш хук может сам определить, что изменилось, например выполнив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, пропускаемые `git diff`. Для вызовов инструментов, завершившихся с ошибкой, добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).
2206* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, кто его записал, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse` с matcher `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.2231* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, кто его записал, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse` с matcher `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.
2207 2232
2233#### PostToolUse после прерывания
2234
2235Если хук `PostToolUse` останавливается раньше времени после того, как вы отправили сообщение или прервали работу во время вызова инструмента, проверьте, нажали ли вы `Ctrl+Enter`, `Enter` или `Esc`:
2236
2237* **`Ctrl+Enter`**: если нажатие [завершает ход](https://code.claude.com/docs/ru/interactive-mode.md#when-claude-code-sends-what-you-queued) во время работы инструмента и инструмент завершается, ваши хуки `PostToolUse` выполняются на его результате, и у них есть 10 секунд на завершение. Клавиша действует как `Esc`, если вы поставили в очередь команду `!` перед своими сообщениями или фоновые задачи отключены, например с помощью [`CLAUDE_CODE_DISABLE_BACKGROUND_TASKS`](https://code.claude.com/docs/ru/env-vars#variables).
2238* **`Enter`**: сообщение, поставленное в очередь с помощью `Enter`, не прерывает ход, поэтому хуки сохраняют свой обычный `timeout`.
2239* **`Esc`**: вы сразу отменяете хуки, поэтому отправляйте сообщение с помощью `Enter` или `Ctrl+Enter`, когда хуки должны выполниться.
2240
2241Когда 10 секунд истекают, Claude Code завершает всё ещё работающий хук команды, независимо от его [`timeout`](#common-fields). Чтобы позволить более долгому хуку команды завершиться, запускайте его с [`async: true`](#run-hooks-in-the-background); это означает, что хук не сможет заблокировать или переписать результат.
2242
2243До v2.1.319 хуки не запускались после того, как вы прерывали ход сообщением, а работающий хук останавливался.
2244
2208#### Входные данные PostToolUse2245#### Входные данные PostToolUse
2209 2246
2210Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, так и `tool_response` — возвращённый им результат. Точная схема обоих полей зависит от инструмента. Пути в `tool_input` файловых инструментов приходят в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для инструмента MCP входные данные также содержат объект [`mcp_server`](#pretooluse-input).2247Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, так и `tool_response` — возвращённый им результат. Точная схема обоих полей зависит от инструмента. Пути в `tool_input` файловых инструментов приходят в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для инструмента MCP входные данные также содержат объект [`mcp_server`](#pretooluse-input).
2479| `permission_prompt` | Claude нужно ваше подтверждение для использования инструмента или [сетевого запроса](https://code.claude.com/docs/ru/sandboxing.md#network-isolation) команды в песочнице, и запрос ожидает около шести секунд |2516| `permission_prompt` | Claude нужно ваше подтверждение для использования инструмента или [сетевого запроса](https://code.claude.com/docs/ru/sandboxing.md#network-isolation) команды в песочнице, и запрос ожидает около шести секунд |
2480| `idle_prompt` | Claude закончил отвечать около 60 секунд назад, и с тех пор вы ничего не вводили |2517| `idle_prompt` | Claude закончил отвечать около 60 секунд назад, и с тех пор вы ничего не вводили |
2481| `auth_success` | Аутентификация завершена |2518| `auth_success` | Аутентификация завершена |
2519| `auth_storage_failure` | Вход выполнен, но Claude Code не может сохранить новые учётные данные в своё [хранилище учётных данных](https://code.claude.com/docs/ru/authentication.md#credential-management). Срабатывает вместо `auth_success` |
2482| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |2520| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |
2483| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |2521| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |
2484| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |2522| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |
2490| `quota_auto_resume_disabled` | Claude Code прекращает ожидание лимита использования claude.ai, не продолжая вашу задачу: [`autoContinueAtUsageLimit`](https://code.claude.com/docs/ru/settings-reference#autocontinueatusagelimit) был отключён или сброс сместился более чем на 24 часа вперёд во время ожидания, которое Claude Code начал самостоятельно, продолженная задача продолжала упираться в лимит, или продолжение было заблокировано до того, как дошло до модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |2528| `quota_auto_resume_disabled` | Claude Code прекращает ожидание лимита использования claude.ai, не продолжая вашу задачу: [`autoContinueAtUsageLimit`](https://code.claude.com/docs/ru/settings-reference#autocontinueatusagelimit) был отключён или сброс сместился более чем на 24 часа вперёд во время ожидания, которое Claude Code начал самостоятельно, продолженная задача продолжала упираться в лимит, или продолжение было заблокировано до того, как дошло до модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |
2491| `plugin_notification` | [Мод](https://code.claude.com/docs/ru/plugins/mods/api.md#show-something-without-starting-a-turn) выводит уведомление с помощью `$.ui.notify`. `title` хука — это имя мода, если мод не задал его сам |2529| `plugin_notification` | [Мод](https://code.claude.com/docs/ru/plugins/mods/api.md#show-something-without-starting-a-turn) выводит уведомление с помощью `$.ui.notify`. `title` хука — это имя мода, если мод не задал его сам |
2492 2530
2493Для типов `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуется Claude Code v2.1.234 или новее.2531Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или новее. Тип `auth_storage_failure` требует v2.1.288 или новее.
2494 2532
2495В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.2533В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.
2496 2534
3326}3364}
3327```3365```
3328 3366
3367#### Выходные данные PreCompact
3368
3369Когда хук PreCompact завершается с кодом 0 и не блокирует сжатие, Claude Code использует его stdout как инструкции для сводки сжатия. Ограничивайте этот stdout 10 000 символов на хук. Более длинный вывод Claude Code обрезает на этом пределе и добавляет маркер.
3370
3329### PostCompact3371### PostCompact
3330 3372
3331Запускается после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например чтобы записать в лог сгенерированную сводку или обновить внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.3373Запускается после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например чтобы записать в лог сгенерированную сводку или обновить внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.