274 274
275Hooks из файлов настроек, управляемых параметров политики и плагинов также запускаются внутри [subagents](/docs/ru/sub-agents). Когда subagent вызывает инструмент, события инструмента, такие как `PreToolUse` и `PostToolUse`, запускают те же настроенные hooks, что и в основном разговоре, и входные данные содержат поля `agent_id` и `agent_type` [общих входных полей](#common-input-fields), которые идентифицируют subagent.275Hooks из файлов настроек, управляемых параметров политики и плагинов также запускаются внутри [subagents](/docs/ru/sub-agents). Когда subagent вызывает инструмент, события инструмента, такие как `PreToolUse` и `PostToolUse`, запускают те же настроенные hooks, что и в основном разговоре, и входные данные содержат поля `agent_id` и `agent_type` [общих входных полей](#common-input-fields), которые идентифицируют subagent.
276 276
277Администраторы предприятия могут использовать `allowManagedHooksOnly` для ограничения того, какие hooks запускаются:277Администраторы могут использовать [`allowManagedHooksOnly`](/docs/ru/settings-reference#allowmanagedhooksonly) в [управляемых параметрах](/docs/ru/managed-settings) для ограничения того, какие hooks запускаются:
278 278
279* Ваши пользовательские, проектные, локальные и плагинные hooks блокируются. Hooks из плагинов, принудительно включённых в управляемых параметрах `enabledPlugins`, исключены279* Ваши пользовательские, проектные, локальные и плагинные hooks блокируются. Hooks из плагинов, принудительно включённых в управляемых параметрах `enabledPlugins`, исключены
280* Claude Code также сужает ваши параметры [`statusLine`](/docs/ru/statusline), [`fileSuggestion`](/docs/ru/settings-reference#filesuggestion) и [`subagentStatusLine`](/docs/ru/statusline#subagent-status-lines) до управляемых параметров280* Claude Code также сужает ваши параметры [`statusLine`](/docs/ru/statusline), [`fileSuggestion`](/docs/ru/settings-reference#filesuggestion) и [`subagentStatusLine`](/docs/ru/statusline#subagent-status-lines) до управляемых параметров
304 304
305Фильтр на пути регулярного выражения проверяется с помощью `RegExp.prototype.test` JavaScript, который успешно совпадает в любом месте значения. `Edit.*` совпадает как с `Edit`, так и с `NotebookEdit`; оберните шаблон в `^` и `$`, как в `^Edit$`, когда вам нужно совпадение всей строки.305Фильтр на пути регулярного выражения проверяется с помощью `RegExp.prototype.test` JavaScript, который успешно совпадает в любом месте значения. `Edit.*` совпадает как с `Edit`, так и с `NotebookEdit`; оберните шаблон в `^` и `$`, как в `^Edit$`, когда вам нужно совпадение всей строки.
306 306
307Дефисы в наборе точного совпадения требуют Claude Code v2.1.195 или позже. На более ранних версиях дефисное имя, такое как `code-reviewer`, оценивается как регулярное выражение без привязки, поэтому оно также срабатывает для `senior-code-reviewer`; закрепите его как `^code-reviewer$` на этих версиях, чтобы совпадать только с этим именем.
308
309`FileChanged` и `StopFailure` используют более узкий набор точного совпадения только букв, цифр, `_` и `|`. Дефис, пробел или запятая в фильтре для этих двух событий держит его на пути регулярного выражения, и только `|` разделяет альтернативы. Каждое другое событие с поддержкой фильтра в таблице ниже принимает `|` или `,`.307`FileChanged` и `StopFailure` используют более узкий набор точного совпадения только букв, цифр, `_` и `|`. Дефис, пробел или запятая в фильтре для этих двух событий держит его на пути регулярного выражения, и только `|` разделяет альтернативы. Каждое другое событие с поддержкой фильтра в таблице ниже принимает `|` или `,`.
310 308
311Событие `FileChanged` не следует этим правилам при построении своего списка наблюдения. См. [FileChanged](#filechanged).309Событие `FileChanged` не следует этим правилам при построении своего списка наблюдения. См. [FileChanged](#filechanged).
380* `mcp__brave-search__.*` совпадает со всеми инструментами с сервера, чьё имя содержит дефис378* `mcp__brave-search__.*` совпадает со всеми инструментами с сервера, чьё имя содержит дефис
381* `mcp__.*__write.*` совпадает с любым инструментом, чьё имя начинается с `write` из любого сервера379* `mcp__.*__write.*` совпадает с любым инструментом, чьё имя начинается с `write` из любого сервера
382 380
383Дефисы в наборе точного совпадения требуют Claude Code v2.1.195 или позже. На более ранних версиях голый дефисный префикс, такой как `mcp__brave-search`, оценивается как регулярное выражение без привязки и совпадает с каждым инструментом с этого сервера. Форма `mcp__brave-search__.*` работает на каждой версии.
384
385Инструменты из [plugin-bundled MCP server](/docs/ru/mcp#plugin-provided-mcp-servers) используют сегмент сервера с областью, который включает имя плагина: `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Фильтр, написанный против голого ключа сервера, никогда не срабатывает для этих инструментов. Для плагина с именем `my-plugin`, который объединяет сервер под ключом `db`, инструмент `query` отображается как `mcp__plugin_my-plugin_db__query`, поэтому фильтр для каждого инструмента с этого сервера — `mcp__plugin_my-plugin_db__.*`. Используйте то же имя инструмента с областью в поле [`if`](#common-fields) обработчика. См. [Plugin-provided MCP servers](/docs/ru/mcp#plugin-provided-mcp-servers) для того, как строится имя с областью.381Инструменты из [plugin-bundled MCP server](/docs/ru/mcp#plugin-provided-mcp-servers) используют сегмент сервера с областью, который включает имя плагина: `mcp__plugin_<plugin-name>_<server-name>__<tool>`. Фильтр, написанный против голого ключа сервера, никогда не срабатывает для этих инструментов. Для плагина с именем `my-plugin`, который объединяет сервер под ключом `db`, инструмент `query` отображается как `mcp__plugin_my-plugin_db__query`, поэтому фильтр для каждого инструмента с этого сервера — `mcp__plugin_my-plugin_db__.*`. Используйте то же имя инструмента с областью в поле [`if`](#common-fields) обработчика. См. [Plugin-provided MCP servers](/docs/ru/mcp#plugin-provided-mcp-servers) для того, как строится имя с областью.
386 382
387Этот пример логирует все операции сервера memory и проверяет операции записи из любого MCP сервера:383Этот пример логирует все операции сервера memory и проверяет операции записи из любого MCP сервера:
919| :- | :- | :- |915| :- | :- | :- |
920| `PreToolUse` | Да | Блокирует вызов инструмента |916| `PreToolUse` | Да | Блокирует вызов инструмента |
921| `PermissionRequest` | Нет | Exit code 2 не учитывается для этого события и поток разрешений продолжается без изменений. Отклоните через объект [`decision`](#permissionrequest-decision-control) вместо этого |917| `PermissionRequest` | Нет | Exit code 2 не учитывается для этого события и поток разрешений продолжается без изменений. Отклоните через объект [`decision`](#permissionrequest-decision-control) вместо этого |
922| `UserPromptSubmit` | Да | Блокирует обработку запроса и стирает запрос |918| `UserPromptSubmit` | Да | Блокирует обработку запроса. См. [What a blocked prompt leaves behind](#what-a-blocked-prompt-leaves-behind) |
923| `UserPromptExpansion` | Да | Блокирует расширение |919| `UserPromptExpansion` | Да | Блокирует расширение |
924| `Stop` | Да | Предотвращает остановку Claude, продолжает разговор |920| `Stop` | Да | Предотвращает остановку Claude, продолжает разговор |
925| `SubagentStop` | Да | Предотвращает остановку subagent |921| `SubagentStop` | Да | Предотвращает остановку subagent |
1169 События hooks1165 События hooks
1170</h2>1166</h2>
1171 1167
1172Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл к завершению сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.1168Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл до завершения сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.
1173 1169
1174<h3 id="sessionstart">1170<h3 id="sessionstart">
1175 SessionStart1171 SessionStart
1176</h3>1172</h3>
1177 1173
1178Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте вместо этого [CLAUDE.md](/docs/ru/memory).1174Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте [CLAUDE.md](/docs/ru/memory) вместо этого.
1179 1175
1180SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.1176SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.
1181 1177
1187| `resume` | `--resume`, `--continue` или `/resume` |1183| `resume` | `--resume`, `--continue` или `/resume` |
1188| `clear` | `/clear` |1184| `clear` | `/clear` |
1189| `compact` | Автоматическое или ручное сжатие |1185| `compact` | Автоматическое или ручное сжатие |
1190| `fork` | Новый сеанс, разветвленный из существующего: `--fork-session` с `--resume` или `--continue`, фоновая копия `/fork` или `/branch` |1186| `fork` | Новый сеанс, разветвленный из существующего: `--fork-session` с `--resume` или `--continue`, фоновая копия `/fork`, `/branch` или разговор, который вы [переместили в фон](/docs/ru/agent-view#from-inside-a-session) |
1191 1187
1192До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.1188До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.
1193 1189
1194Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоновом режиме. Вы можете сразу же печатать, и возобновленный разговор появляется без ожидания hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.1190Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоне. Вы можете сразу начать печатать, и возобновленный разговор появляется без ожидания завершения hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.
1195 1191
1196Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.1192Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.
1197 1193
1198То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока hooks SessionStart все еще выполняются, не достигает Claude до их завершения.1194То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока выполняются hooks SessionStart, не достигает Claude, пока они не завершатся.
1199 1195
1200Во время любого ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.1196Во время любого ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.
1201 1197
1202<h4 id="sessionstart-input">1198<h4 id="sessionstart-input">
1203 Ввод SessionStart1199 SessionStart input
1204</h4>1200</h4>
1205 1201
1206Помимо [общих полей ввода](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:1202Помимо [общих полей ввода](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:
1209| :- | :- |1205| :- | :- |
1210| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |1206| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |
1211| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |1207| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |
1212| `agent_type` | Имя агента, присутствует при запуске Claude Code с `claude --agent <name>` |1208| `agent_type` | Имя агента, присутствует, когда вы запускаете Claude Code с `claude --agent <name>` |
1213| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name` или `/rename`. Hook, который выдает `sessionTitle`, может сначала проверить `session_title`, чтобы избежать перезаписи названия, установленного пользователем явно |1209| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name`, `/rename`, вывод hook `sessionTitle` или метод `renameSession()` Agent SDK. Hook, который выдает `sessionTitle`, может сначала проверить это поле, чтобы избежать перезаписи существующего пользовательского названия |
1210
1211Сеанс, который вы не назвали, все еще может иметь [сгенерированное название](/docs/ru/sessions#name-your-sessions). Это название не является пользовательским названием и не появляется в `session_title`.
1214 1212
1215Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о стоимости возобновления устаревшего разговора перед первым запросом, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.1213Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о том, какие затраты на возобновление устаревшего разговора до первого запроса, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.
1216 1214
1217| Поле | Описание |1215| Поле | Описание |
1218| :- | :- |1216| :- | :- |
1239```1237```
1240 1238
1241<h4 id="sessionstart-decision-control">1239<h4 id="sessionstart-decision-control">
1242 Управление решением SessionStart1240 Управление решениями SessionStart
1243</h4>1241</h4>
1244 1242
1245Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:1243Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:
1246 1244
1247| Поле | Описание |1245| Поле | Описание |
1248| :- | :- |1246| :- | :- |
1249| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |1247| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |
1250| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |1248| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |
1251| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |1249| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |
1252| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) во время этого сеанса |1250| `watchPaths` | Массив абсолютных путей для наблюдения за событиями [FileChanged](#filechanged) во время этого сеанса |
1253| `reloadSkills` | Логическое значение. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и директории команд после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |1251| `reloadSkills` | Логическое значение. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и директории команд после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |
1254 1252
1255```json theme={null}1253```json theme={null}
1275echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1273echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1276```1274```
1277 1275
1278URL репозитория является заполнителем; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.1276URL репозитория — это заполнитель; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.
1279 1277
1280<h4 id="persist-environment-variables">1278<h4 id="persist-environment-variables">
1281 Сохранение переменных окружения1279 Persist environment variables
1282</h4>1280</h4>
1283 1281
1284Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранить переменные окружения для последующих команд Bash.1282Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранять переменные окружения для последующих команд Bash.
1285 1283
1286Чтобы установить отдельные переменные окружения, напишите операторы `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`) для сохранения переменных, установленных другими hooks:1284Чтобы установить отдельные переменные окружения, напишите операторы `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`) для сохранения переменных, установленных другими hooks:
1287 1285
1324 Setup1322 Setup
1325</h3>1323</h3>
1326 1324
1327Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте вместо этого [SessionStart](#sessionstart).1325Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте его для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте [SessionStart](#sessionstart) вместо этого.
1328 1326
1329Значение matcher соответствует флагу CLI, который запустил hook:1327Значение matcher соответствует флагу CLI, который запустил hook:
1330 1328
1337 1335
1338Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).1336Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).
1339 1337
1340При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, начните с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.1338При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, запустите с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.
1341 1339
1342Поскольку Setup не срабатывает при каждом запуске, плагин, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins/components#path-variables-and-persistent-data) для информации о том, где хранить установленные зависимости. Если вы распространяете свой плагин через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins/loading#node-js-package-dependencies) при кэшировании плагина.1340Поскольку Setup не срабатывает при каждом запуске, plugin, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins/components#path-variables-and-persistent-data) для информации о том, где хранить установленные зависимости. Если вы распространяете ваш plugin через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакета Node.js](/docs/ru/plugins/loading#node-js-package-dependencies) при кэшировании plugin.
1343 1341
1344<h4 id="setup-input">1342<h4 id="setup-input">
1345 Ввод Setup1343 Setup input
1346</h4>1344</h4>
1347 1345
1348Помимо [общих полей ввода](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:1346Помимо [общих полей ввода](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:
1358```1356```
1359 1357
1360<h4 id="setup-decision-control">1358<h4 id="setup-decision-control">
1361 Управление решением Setup1359 Управление решениями Setup
1362</h4>1360</h4>
1363 1361
1364Hooks 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`.1362Hooks 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`.
1365 1363
1366Hooks 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).1364Hooks 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).
1367 1365
1368<h3 id="instructionsloaded">1366<h3 id="instructionsloaded">
1369 InstructionsLoaded1367 InstructionsLoaded
1370</h3>1368</h3>
1371 1369
1372Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для файлов, загружаемых с нетерпением, и снова позже, когда файлы загружаются с нетерпением, например когда Claude получает доступ к подпапке, содержащей вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокировку или управление решением. Он выполняется асинхронно в целях наблюдаемости.1370Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для файлов, загруженных с нетерпением, и снова позже, когда файлы загружаются с нетерпением, например когда Claude получает доступ к подпапке, которая содержит вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокировку или управление решениями. Он выполняется асинхронно в целях наблюдаемости.
1373 1371
1374Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является символической ссылкой на него, как нормальная загрузка `CLAUDE.md`.1372Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является символической ссылкой на него, как обычная загрузка `CLAUDE.md`.
1375 1373
1376Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.1374Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.
1377 1375
1378<h4 id="instructionsloaded-input">1376<h4 id="instructionsloaded-input">
1379 Ввод InstructionsLoaded1377 InstructionsLoaded input
1380</h4>1378</h4>
1381 1379
1382Помимо [общих полей ввода](#common-input-fields), hooks InstructionsLoaded получают эти поля:1380Помимо [общих полей ввода](#common-input-fields), hooks InstructionsLoaded получают эти поля:
1385| :- | :- |1383| :- | :- |
1386| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |1384| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |
1387| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |1385| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |
1388| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |1386| `load_reason` | Почему был загружен файл: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |
1389| `globs` | Шаблоны глобов путей из frontmatter `paths:` файла, если они есть. Присутствует только для загрузок `path_glob_match` |1387| `globs` | Шаблоны glob путей из frontmatter `paths:` файла, если они есть. Присутствует только для загрузок `path_glob_match` |
1390| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |1388| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |
1391| `parent_file_path` | Путь к файлу инструкций родителя, который включил этот, для загрузок `include` |1389| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |
1392 1390
1393```json theme={null}1391```json theme={null}
1394{1392{
1403```1401```
1404 1402
1405<h4 id="instructionsloaded-decision-control">1403<h4 id="instructionsloaded-decision-control">
1406 Управление решением InstructionsLoaded1404 Управление решениями InstructionsLoaded
1407</h4>1405</h4>
1408 1406
1409Hooks InstructionsLoaded не имеют управления решением. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита логирования, отслеживания соответствия или наблюдаемости.1407Hooks InstructionsLoaded не имеют управления решениями. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита журнала, отслеживания соответствия или наблюдаемости.
1410 1408
1411<h3 id="userpromptsubmit">1409<h3 id="userpromptsubmit">
1412 UserPromptSubmit1410 UserPromptSubmit
1413</h3>1411</h3>
1414 1412
1415Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавить дополнительный контекст на основе подсказки/разговора, проверить подсказки или заблокировать определенные типы подсказок.1413Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавлять дополнительный контекст на основе подсказки/разговора, проверять подсказки или блокировать определенные типы подсказок.
1416 1414
1417Hooks `UserPromptSubmit` имеют тайм-аут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем 600-секундный стандарт для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, застрявший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1415Hooks `UserPromptSubmit` имеют тайм-аут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем 600-секундный по умолчанию для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, застрявший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1418 1416
1419Помимо command hook, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` command, HTTP или MCP tool, который достигает своего тайм-аута, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление с названием hook, тайм-аутом, который сработал, и что вывод был отброшен.1417Помимо hook команды, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` команды, HTTP или MCP tool, который достигает своего тайм-аута, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление с названием hook, тайм-аутом, который сработал, и что вывод был отброшен.
1420 1418
1421[Callback hook Agent SDK](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего тайм-аута, блокирует подсказку сообщением с названием hook и тайм-аутом, потому что callback там может действовать как политический шлюз, который не должен открываться при отказе. Сеанс продолжается. До версии 2.1.208 тайм-аут callback на этом событии заканчивал ход с ошибкой выполнения.1419[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего тайм-аута, блокирует подсказку сообщением с названием hook и тайм-аутом, потому что callback там может действовать как политический шлюз, который не должен отказывать открыто. Сеанс продолжается. До версии 2.1.208 тайм-аут callback на этом событии заканчивал ход с ошибкой выполнения.
1422 1420
1423<h4 id="userpromptsubmit-input">1421<h4 id="userpromptsubmit-input">
1424 Ввод UserPromptSubmit1422 UserPromptSubmit input
1425</h4>1423</h4>
1426 1424
1427Помимо [общих полей ввода](#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 анализирует подсказку.1425Помимо [общих полей ввода](#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 анализирует подсказку.
1428 1426
1427Hooks UserPromptSubmit также получают `session_title`, когда сеанс имеет пользовательское название, с тем же значением, что и [поле SessionStart `session_title`](#sessionstart-input).
1428
1429```json theme={null}1429```json theme={null}
1430{1430{
1431 "session_id": "abc123",1431 "session_id": "abc123",
1438```1438```
1439 1439
1440<h4 id="userpromptsubmit-decision-control">1440<h4 id="userpromptsubmit-decision-control">
1441 Управление решением UserPromptSubmit1441 Управление решениями UserPromptSubmit
1442</h4>1442</h4>
1443 1443
1444Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [поля JSON-вывода](#json-output) доступны.1444Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [поля вывода JSON](#json-output) доступны.
1445 1445
1446Есть два способа добавить контекст к разговору при коде выхода 0:1446Есть два способа добавить контекст к разговору при коде выхода 0:
1447 1447
1448* **Простой текст stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude1448* **Простой текст stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude
1449* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Значение `additionalContext` добавляется как контекст1449* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст
1450 1450
1451Ни один канал не создает видимую запись в транскрипте. Простой stdout и значение `additionalContext` каждый вводятся как системное напоминание, которое начинается с названия hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).1451Ни один канал не создает видимую запись в транскрипте. Простой stdout и значение `additionalContext` каждый вводятся как системное напоминание, которое начинается с имени hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).
1452 1452
1453Чтобы заблокировать подсказку, верните объект JSON с `decision`, установленным на `"block"`:1453Чтобы заблокировать подсказку, верните объект JSON с `decision`, установленным на `"block"`:
1454 1454
1455| Поле | Описание |1455| Поле | Описание |
1456| :- | :- |1456| :- | :- |
1457| `decision` | `"block"` предотвращает обработку подсказки и стирает ее из контекста. Опустите, чтобы позволить подсказке продолжить |1457| `decision` | `"block"` останавливает подсказку перед тем, как она достигнет Claude. Опустите, чтобы позволить подсказке продолжить |
1458| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |1458| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |
1459| `additionalContext` | Строка, добавленная в контекст Claude рядом с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1459| `additionalContext` | Строка, добавленная в контекст Claude рядом с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |
1460| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |1460| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |
1461| `suppressOriginalPrompt` | Если `true`, когда `decision` имеет значение `"block"`, опускает исходный текст подсказки из сообщения блокировки, показанного пользователю |1461| `suppressOriginalPrompt` | Если `true`, когда hook блокирует подсказку, оставляет текст подсказки вне сообщения блокировки. См. [What a blocked prompt leaves behind](#what-a-blocked-prompt-leaves-behind) |
1462 1462
1463Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю и не добавляется в контекст.1463Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю, и оно не добавляется в контекст.
1464 1464
1465```json theme={null}1465```json theme={null}
1466{1466{
1469 "hookSpecificOutput": {1469 "hookSpecificOutput": {
1470 "hookEventName": "UserPromptSubmit",1470 "hookEventName": "UserPromptSubmit",
1471 "additionalContext": "My additional context here",1471 "additionalContext": "My additional context here",
1472 "sessionTitle": "My session title"1472 "sessionTitle": "My session title",
1473 "suppressOriginalPrompt": true
1473 }1474 }
1474}1475}
1475```1476```
1476 1477
1478<h4 id="what-a-blocked-prompt-leaves-behind">
1479 Что оставляет после себя заблокированная подсказка
1480</h4>
1481
1482Заблокированная подсказка никогда не достигает Claude, но ее текст не удаляется везде. По умолчанию сообщение блокировки, показанное пользователю, заканчивается на `Original prompt:`, за которым следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сеанса на диск. Чтобы оставить текст вне сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает, блокирует ли hook с `decision: "block"` или выходом 2. Hook выхода 2, который не выводит JSON, всегда получает текст подсказки в своем сообщении блокировки.
1483
1484`suppressOriginalPrompt` изменяет только сообщение блокировки. Отправленный текст все еще может появляться в локальных файлах, таких как транскрипт сеанса и история подсказок, поэтому блокирующий hook не является способом держать секрет вне диска. Чтобы ограничить или удалить эти файлы, см. [Plaintext storage](/docs/ru/claude-directory#plaintext-storage) и [Clear local data](/docs/ru/claude-directory#clear-local-data).
1485
1477<h3 id="userpromptexpansion">1486<h3 id="userpromptexpansion">
1478 UserPromptExpansion1487 UserPromptExpansion
1479</h3>1488</h3>
1482 1491
1483Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1492Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1484 1493
1485Совпадает с `command_name`. Оставьте matcher пустым для срабатывания на каждой команде типа подсказки.1494Совпадает с `command_name`. Оставьте matcher пустым, чтобы срабатывать на каждой команде типа подсказки.
1486 1495
1487<h4 id="userpromptexpansion-input">1496<h4 id="userpromptexpansion-input">
1488 Ввод UserPromptExpansion1497 UserPromptExpansion input
1489</h4>1498</h4>
1490 1499
1491Помимо [общих полей ввода](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` имеет значение `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок сервера MCP.1500Помимо [общих полей ввода](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` — это `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.
1492 1501
1493```json theme={null}1502```json theme={null}
1494{1503{
1506```1515```
1507 1516
1508<h4 id="userpromptexpansion-decision-control">1517<h4 id="userpromptexpansion-decision-control">
1509 Управление решением UserPromptExpansion1518 Управление решениями UserPromptExpansion
1510</h4>1519</h4>
1511 1520
1512Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Все [поля JSON-вывода](#json-output) доступны.1521Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Все [поля вывода JSON](#json-output) доступны.
1513 1522
1514| Поле | Описание |1523| Поле | Описание |
1515| :- | :- |1524| :- | :- |
1516| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |1525| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |
1517| `reason` | Показано пользователю, когда `decision` имеет значение `"block"` |1526| `reason` | Показано пользователю, когда `decision` — это `"block"` |
1518| `additionalContext` | Строка, добавленная в контекст Claude рядом с развернутой подсказкой. См. [Add context for Claude](#add-context-for-claude) |1527| `additionalContext` | Строка, добавленная в контекст Claude рядом с развернутой подсказкой. См. [Add context for Claude](#add-context-for-claude) |
1519 1528
1520Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.1529Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.
1534 MessageDisplay1543 MessageDisplay
1535</h3>1544</h3>
1536 1545
1537Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отрисовке, hook выполняется один раз с этими строками, и Claude Code отображает текст замены hook на их месте. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.1546Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отрисовке, hook выполняется один раз с этими строками и Claude Code отображает текст замены hook на их месте. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.
1538 1547
1539Используйте MessageDisplay для:1548Используйте MessageDisplay для:
1540 1549
1542* преобразования текста, который приложение Agent SDK показывает своим пользователям1551* преобразования текста, который приложение Agent SDK показывает своим пользователям
1543* редактирования ключей API или внутренних имен хостов из ответов Claude1552* редактирования ключей API или внутренних имен хостов из ответов Claude
1544 1553
1545Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает время ожидания, Claude Code отображает исходный текст. Тайм-аут по умолчанию для этого события составляет 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1554Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает время ожидания, Claude Code отображает исходный текст. Тайм-аут по умолчанию для этого события — 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.
1546 1555
1547MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.1556MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.
1548 1557
1549MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое транслирует текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.1558MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое потоком выводит текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.
1550 1559
1551В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз для каждого сообщения помощника вместо один раз для каждой партии строк. Один вызов прибывает после завершения сообщения и несет полный текст сообщения: `index` имеет значение `0`, `final` имеет значение `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.1560В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз для каждого сообщения помощника вместо один раз для каждой партии строк. Один вызов прибывает после завершения сообщения и несет полный текст сообщения: `index` — это `0`, `final` — это `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.
1552 1561
1553<h4 id="messagedisplay-input">1562<h4 id="messagedisplay-input">
1554 Ввод MessageDisplay1563 MessageDisplay input
1555</h4>1564</h4>
1556 1565
1557Помимо [общих полей ввода](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как транслируется текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.1566Помимо [общих полей ввода](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как потоком выводится текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.
1558 1567
1559| Поле | Описание |1568| Поле | Описание |
1560| :- | :- |1569| :- | :- |
1562| `message_id` | UUID сообщения помощника, которое отображается. Стабилен для каждой партии одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |1571| `message_id` | UUID сообщения помощника, которое отображается. Стабилен для каждой партии одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |
1563| `index` | Индекс этой партии в сообщении, начиная с нуля |1572| `index` | Индекс этой партии в сообщении, начиная с нуля |
1564| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |1573| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |
1565| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуст, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |1574| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуста, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |
1566 1575
1567```json theme={null}1576```json theme={null}
1568{1577{
1579```1588```
1580 1589
1581<h4 id="messagedisplay-output">1590<h4 id="messagedisplay-output">
1582 Вывод MessageDisplay1591 MessageDisplay output
1583</h4>1592</h4>
1584 1593
1585Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:1594Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:
1586 1595
1587| Поле | Описание |1596| Поле | Описание |
1588| :- | :- |1597| :- | :- |
1589| `displayContent` | Текст, отображаемый вместо delta. Опустите для отображения исходного |1598| `displayContent` | Текст, отображаемый вместо delta. Опустите, чтобы отобразить исходный |
1590 1599
1591Hooks MessageDisplay не имеют управления решением. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их JSON-вывода и отбрасывает `systemMessage` и `continue`.1600Hooks MessageDisplay не имеют управления решениями. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.
1592 1601
1593Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.1602Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и встроенные обратные кавычки кода из `delta` и возвращает результат как `displayContent`.
1594 1603
1595<Tabs>1604<Tabs>
1596 <Tab title="macOS/Linux">1605 <Tab title="macOS/Linux">
1597 Зарегистрируйте command hook для события в файле параметров:1606 Зарегистрируйте hook команды для события в файле параметров:
1598 1607
1599 ```json theme={null}1608 ```json theme={null}
1600 {1609 {
1623 </Tab>1632 </Tab>
1624 1633
1625 <Tab title="Windows (PowerShell)">1634 <Tab title="Windows (PowerShell)">
1626 Зарегистрируйте command hook, который запускает скрипт через PowerShell:1635 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:
1627 1636
1628 ```json theme={null}1637 ```json theme={null}
1629 {1638 {
1649 }1658 }
1650 ```1659 ```
1651 1660
1652 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы hook запустился быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запустить локальный файл скрипта.1661 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, поэтому hook запускается быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запускать локальный файл скрипта.
1653 1662
1654 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:1663 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:
1655 1664
1666 </Tab>1675 </Tab>
1667</Tabs>1676</Tabs>
1668 1677
1669Партии без markdown проходят без изменений. Если скрипт не удается, например потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.1678Партии без markdown проходят без изменений. Если скрипт не удается, например, потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.
1670 1679
1671<h3 id="pretooluse">1680<h3 id="pretooluse">
1672 PreToolUse1681 PreToolUse
1673</h3>1682</h3>
1674 1683
1675Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым названием инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [имена инструментов MCP](#match-mcp-tools).1684Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым именем инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [имена инструментов MCP](#match-mcp-tools).
1676 1685
1677Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте вместо этого [FileChanged](#filechanged). В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения, и они не имеют управления решением, поэтому они не могут блокировать запись.1686Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged) вместо соответствия инструментам редактирования файлов по названию. В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения и они не имеют управления решениями, поэтому они не могут блокировать запись.
1678 1687
1679<Warning>1688<Warning>
1680 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).1689 PreToolUse запускается только, когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому для них не срабатывает hook PreToolUse, включая hooks, соответствующие `Read`. Чтобы заблокировать определенные пути от ссылок `@`, используйте [правило отказа `Read`](/docs/ru/permissions#read-and-edit) вместо этого.
1681 1690
1682 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).1691 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1683</Warning>1692</Warning>
1684 1693
1685Используйте [управление решением PreToolUse](#pretooluse-decision-control) для разрешения, отказа, запроса или отложения вызова инструмента.1694Используйте [управление решениями PreToolUse](#pretooluse-decision-control) для разрешения, отказа, запроса или отложения вызова инструмента.
1686 1695
1687[Callback hook Agent SDK](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой тайм-аут, блокирует вызов инструмента, и Claude получает результат ошибки с названием тайм-аута. Явный отказ, возвращенный другим hook, все еще имеет приоритет.1696[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой тайм-аут, блокирует вызов инструмента, и Claude получает результат ошибки с названием тайм-аута. Явный отказ, возвращенный другим hook, все еще имеет приоритет.
1688 1697
1689<h4 id="pretooluse-input">1698<h4 id="pretooluse-input">
1690 Ввод PreToolUse1699 PreToolUse input
1691</h4>1700</h4>
1692 1701
1693Помимо [общих полей ввода](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.1702Помимо [общих полей ввода](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1694 1703
1695Для [инструмента 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 или позже.1704Для [инструмента 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 или позже.
1696 1705
1697Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:1706Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:
1698 1707
1699* Claude Code расширяет `~` и относительные пути перед выполнением hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание одного пути1708* Claude Code расширяет `~` и относительные пути перед запуском hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание одного пути
1700* На Windows путь прибывает с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`1709* На Windows путь прибывает с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`
1701* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки1710* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки
1702* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен1711* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен
1730| `command` | string | `"npm test"` | Команда оболочки для выполнения |1739| `command` | string | `"npm test"` | Команда оболочки для выполнения |
1731| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |1740| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |
1732| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1741| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1733| `run_in_background` | boolean | `false` | Выполнять ли команду в фоновом режиме |1742| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1734 1743
1735Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude на редактирование файлов через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.1744Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude на редактирование файлов через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.
1736 1745
1737Ваш [hook PostToolUse](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.1746Ваш [hook PostToolUse](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.
1738 1747
1739<Note>1748<Note>
1740 Список лучше всего усилен и находится в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для применения политики.1749 Список — это лучшее усилие и в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для обеспечения политики.
1741</Note>1750</Note>
1742 1751
1743`changedFiles` и `files` перечисляют то, что команда изменила; остальные поля говорят, насколько полон и надежен этот список.1752`changedFiles` и `files` перечисляют то, что изменила команда; остальные поля говорят, насколько полон и надежен этот список.
1744 1753
1745| Поле | Тип | Пример | Описание |1754| Поле | Тип | Пример | Описание |
1746| :- | :- | :- | :- |1755| :- | :- | :- | :- |
1747| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые команда изменила, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |1756| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые изменила команда, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |
1748| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` имеет значение `true` для файла, который команда добавила или удалила |1757| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` — это `true` для файла, который команда добавила или удалила |
1749| `moreFiles` | number | `2` | Количество измененных файлов без diff в `files` |1758| `moreFiles` | number | `2` | Количество измененных файлов без diff в `files` |
1750| `unavailable` | boolean | `true` | Установлено, когда diff неполный или не может быть взят |1759| `unavailable` | boolean | `true` | Установлено, когда diff неполный или не мог быть взят |
1751| `skipped` | boolean | `true` | Установлено для команды Git, которая перемещает рабочее дерево, такой как `git checkout` или `git stash`, поэтому Claude Code не берет diff |1760| `skipped` | boolean | `true` | Установлено для команды Git, которая перемещает рабочее дерево, такой как `git checkout` или `git stash`, поэтому Claude Code не берет diff |
1752| `shared` | boolean | `true` | Установлено, когда другой вызов инструмента Bash, такой как вызов подагента, выполнялся в том же репозитории одновременно, поэтому некоторые перечисленные изменения могут быть этой командой |1761| `shared` | boolean | `true` | Установлено, когда другой вызов инструмента Bash, такой как вызов подагента, выполнялся в том же репозитории одновременно, поэтому некоторые перечисленные изменения могут быть этой командой |
1753 1762
1766| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |1775| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |
1767| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |1776| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |
1768| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах |1777| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах |
1769| `run_in_background` | boolean | `false` | Выполнять ли команду в фоновом режиме |1778| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1770 1779
1771Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды оболочки, чтобы они охватывали оба инструмента:1780Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды оболочки, поэтому они охватывают оба инструмента:
1772 1781
1773* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основную оболочку и маршрутизирует команды оболочки через него.1782* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основную оболочку и маршрутизирует команды оболочки через него.
1774* На Windows без Git Bash инструмент включен автоматически и Claude Code не регистрирует инструмент Bash вообще.1783* На Windows без Git Bash инструмент включен автоматически, и Claude Code не регистрирует инструмент Bash вообще.
1775* Hook, который совпадает только с `Bash`, никогда не срабатывает там.1784* Hook, который совпадает только с `Bash`, никогда не срабатывает там.
1776 1785
1777<h5 id="write">1786<h5 id="write">
1818 1827
1819| Поле | Тип | Пример | Описание |1828| Поле | Тип | Пример | Описание |
1820| :- | :- | :- | :- |1829| :- | :- | :- | :- |
1821| `pattern` | string | `"**/*.ts"` | Шаблон glob для совпадения файлов |1830| `pattern` | string | `"**/*.ts"` | Шаблон glob для соответствия файлам |
1822| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |1831| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |
1823 1832
1824<h5 id="grep">1833<h5 id="grep">
1825 Grep1834 Grep
1826</h5>1835</h5>
1827 1836
1828Ищет содержимое файлов с регулярными выражениями.1837Ищет содержимое файлов с помощью регулярных выражений.
1829 1838
1830| Поле | Тип | Пример | Описание |1839| Поле | Тип | Пример | Описание |
1831| :- | :- | :- | :- |1840| :- | :- | :- | :- |
1834| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |1843| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |
1835| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |1844| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |
1836| `-i` | boolean | `true` | Поиск без учета регистра |1845| `-i` | boolean | `true` | Поиск без учета регистра |
1837| `multiline` | boolean | `false` | Включить многострочное совпадение |1846| `multiline` | boolean | `false` | Включить многострочное соответствие |
1838 1847
1839<h5 id="webfetch">1848<h5 id="webfetch">
1840 WebFetch1849 WebFetch
1870| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |1879| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |
1871| `description` | string | `"Find API endpoints"` | Краткое описание задачи |1880| `description` | string | `"Find API endpoints"` | Краткое описание задачи |
1872| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |1881| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |
1873| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения стандартного |1882| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения по умолчанию |
1874 1883
1875Когда вызов Agent переднего плана завершается, ваш [hook PostToolUse](#posttooluse) получает результат подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [счетчики токенов и затрат](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:1884Когда вызов Agent переднего плана завершается, ваш [hook PostToolUse](#posttooluse) получает результат подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [счетчики токенов и затрат](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:
1876 1885
1877| Поле | Тип | Пример | Описание |1886| Поле | Тип | Пример | Описание |
1878| :- | :- | :- | :- |1887| :- | :- | :- | :- |
1879| `status` | string | `"completed"` | `"completed"` для подагентов переднего плана, `"async_launched"` для подагентов фонового плана. Начиная с версии 2.1.198, подагенты выполняются в фоновом режиме по умолчанию, поэтому опущенный `run_in_background` также создает `"async_launched"` |1888| `status` | string | `"completed"` | `"completed"` для подагентов переднего плана, `"async_launched"` для подагентов фона. Начиная с v2.1.198, подагенты выполняются в фоне по умолчанию, поэтому опущенный `run_in_background` также создает `"async_launched"` |
1880| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |1889| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |
1881| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этой передаче на их месте |1890| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этом hand-back на их месте |
1882| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |1891| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |
1883| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |1892| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |
1884| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |1893| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |
1885| `totalDurationMs` | number | `48211` | Настоящее время выполнения запуска подагента |1894| `totalDurationMs` | number | `48211` | Настоящее время запуска подагента |
1886| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |1895| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |
1887| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1896| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1888 1897
1889На 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`.1898На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), доставляет свой отчет через этот инструмент, а не возвращает его как текст. Поле `content` его результата `completed` затем несет краткую заметку об этом hand-back, а не сам отчет. Чтобы прочитать отчет, совпадайте с hook `PreToolUse` или `PostToolUse` на `SubagentHandback` и прочитайте `tool_input.message`.
1890 1899
1891Для подагентов фонового плана инструмент возвращается, когда задача переходит в фоновый режим, поэтому `tool_response` не несет полей использования: фоновый запуск возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фоновый режим во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.1900Для подагентов фона инструмент возвращается, когда задача переходит в фон, поэтому `tool_response` не несет полей использования: запуск фона возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фон во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1892 1901
1893На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, которая может отличаться от значения `model` в `tool_input`, такой как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент перешел в фоновый режим, поэтому переключение, которое произошло перед переходом в фоновый режим, отражается там. `modelsUsed` и поведение `resolvedModel` во время перехода в фоновый режим требуют Claude Code v2.1.212 или позже.1902На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, которая может отличаться от значения `model` в `tool_input`, такой как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент перешел в фон, поэтому переключение, которое произошло перед переводом в фон, отражается там. `modelsUsed` и поведение `resolvedModel` во время перевода в фон требуют Claude Code v2.1.212 или позже.
1894 1903
1895<a id="askuserquestion" />1904<a id="askuserquestion" />
1896 1905
1909 ExitPlanMode1918 ExitPlanMode
1910</h5>1919</h5>
1911 1920
1912Представляет план и просит пользователя одобрить его перед тем, как Claude покинет [режим плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.1921Представляет план и просит пользователя одобрить его перед тем, как Claude покидает [режим плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.
1913 1922
1914| Поле | Тип | Пример | Описание |1923| Поле | Тип | Пример | Описание |
1915| :- | :- | :- | :- |1924| :- | :- | :- | :- |
1916| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |1925| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |
1917| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |1926| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |
1918| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До версии 2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |1927| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |
1919 1928
1920В `PostToolUse`, `tool_response` — это объект с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.1929В `PostToolUse`, `tool_response` является объектом с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.
1921 1930
1922<h4 id="pretooluse-decision-control">1931<h4 id="pretooluse-decision-control">
1923 Управление решением PreToolUse1932 Управление решениями PreToolUse
1924</h4>1933</h4>
1925 1934
1926Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отложить) плюс возможность изменить ввод инструмента перед выполнением.1935Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отложить) плюс возможность изменить ввод инструмента перед выполнением.
1927 1936
1928| Поле | Описание |1937| Поле | Описание |
1929| :- | :- |1938| :- | :- |
1930| `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 |1939| `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 |
1931| `permissionDecisionReason` | Для `"deny"`, показано Claude. Для `"ask"`, показано пользователю, но не Claude. Для `"allow"` и `"defer"`, написано в [debug log](#debug-hooks) только |1940| `permissionDecisionReason` | Для `"ask"`, показано пользователю, но не Claude. Для `"deny"`, показано Claude. Для `"allow"` и `"defer"`, написано в [debug log](#debug-hooks) только |
1932| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Claude Code оценивает правила разрешения и [автоматическую фоновую приемлемость](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или с `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |1941| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Claude Code оценивает правила разрешения и [автоматическое фоновое выполнение](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |
1933| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |1942| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |
1934 1943
1935Когда несколько hooks PreToolUse возвращают разные решения, приоритет — `deny` > `defer` > `ask` > `allow`.1944Когда несколько hooks PreToolUse возвращают разные решения, приоритет `deny` > `defer` > `ask` > `allow`.
1936 1945
1937Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.1946Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.
1938 1947
1939Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает ярлык, определяющий, откуда пришел hook: `[settings]` для hook из любого файла параметров или из frontmatter агента, `[plugin:<name>]` для hook плагина или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1948Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает ярлык, определяющий, откуда пришел hook: `[settings]` для hook из любого файла параметров или frontmatter агента, `[plugin:<name>]` для hook plugin или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1940 1949
1941`"ask"` hook также принуждает подсказку разрешения в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызову инструмента, но не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и hook `"deny"` всегда соблюдался.1950`"ask"` hook также принуждает подсказку разрешения в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызов инструмента, но не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и отказ hook `"deny"` всегда соблюдался.
1942 1951
1943```json theme={null}1952```json theme={null}
1944{1953{
1956 1965
1957<span id="allow-with-updatedinput" />1966<span id="allow-with-updatedinput" />
1958 1967
1959В [неинтерактивном режиме](/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), отображающий текст каждого вопроса на выбранный ответ.1968В [неинтерактивном режиме](/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), отображающий текст каждого вопроса на выбранный ярлык опции.
1960 1969
1961Начиная с версии 2.1.199, инструмент MCP, сервер которого отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с `updatedInput` или без него, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое требует инструмент.1970Начиная с v2.1.199, инструмент MCP, сервер которого отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с или без `updatedInput`, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое нужно инструменту.
1962 1971
1963<Note>1972<Note>
1964 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте вместо этого `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.1973 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.
1965</Note>1974</Note>
1966 1975
1967<h4 id="defer-a-tool-call-for-later">1976<h4 id="defer-a-tool-call-for-later">
1968 Отложить вызов инструмента на потом1977 Defer a tool call for later
1969</h4>1978</h4>
1970 1979
1971`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его JSON-вывод, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить, где он остановился. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он логирует предупреждение и игнорирует результат hook.1980`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить, где он остановился. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он регистрирует предупреждение и игнорирует результат hook.
1972 1981
1973Инструмент `AskUserQuestion` — типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому начните запуск с одного. Круговой путь работает так:1982Инструмент `AskUserQuestion` — типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому запустите запуск с одним. Круговой путь работает так:
1974 1983
19751. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.19841. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.
19762. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и отложенный вызов инструмента сохраняется в транскрипте.19852. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и сохраненным вызовом инструмента в транскрипте.
19773. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.19863. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.
19784. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента срабатывает `PreToolUse` снова.19874. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента срабатывает `PreToolUse` снова.
19795. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.19885. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.
1994}2003}
1995```2004```
1996 2005
1997Нет тайм-аута или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [правилам очистки](/docs/ru/claude-directory#cleaned-up-automatically) [retention sweep](/docs/ru/settings-reference#cleanupperioddays), которая удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.2006Нет тайм-аута или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [правилам очистки](/docs/ru/claude-directory#cleaned-up-automatically) сметания удержания [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которое удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.
1998 2007
1999`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отложить один вызов из партии без оставления других неразрешенными.2008`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отложить один вызов из партии без оставления других неразрешенными.
2000 2009
2001Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, чтобы вы могли определить, какой инструмент исчез.2010Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, поэтому вы можете определить, какой инструмент исчез.
2002 2011
2003<Note>2012<Note>
2004 Чтобы возобновить отложенный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Если вы передаете определенные другие флаги запуска, возобновленный запуск не возвращается в режим плана; см. [Resume in plan mode with `-p`](/docs/ru/sessions#resume-in-plan-mode-with-p). Требует Claude Code v2.1.246 или позже.2013 Чтобы возобновить отложенный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Если вы передадите определенные другие флаги запуска, возобновленный запуск не возвращается в режим плана; см. [Resume in plan mode with `-p`](/docs/ru/sessions#resume-in-plan-mode-with-p). Требует Claude Code v2.1.246 или позже.
2005 2014
2006 Когда вы возобновляете с `-p`, Claude Code не восстанавливает никакой другой сохраненный режим разрешений. Он запускает запуск в режиме разрешений, который новый запуск `claude -p` запустил бы, поэтому передайте `--permission-mode` или `--dangerously-skip-permissions` снова, если отложенный сеанс использовал один. Когда вы возобновляете с `claude --resume <session-id>` без `-p`, Claude Code восстанавливает сохраненный режим разрешений, с исключениями, перечисленными в [режим разрешений при возобновлении](/docs/ru/sessions#permission-mode-on-resume).2015 Когда вы возобновляете с `-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).
2007</Note>2016</Note>
2008 2017
2009<h3 id="permissionrequest">2018<h3 id="permissionrequest">
2010 PermissionRequest2019 PermissionRequest
2011</h3>2020</h3>
2012 2021
2013Запускается, когда Claude Code собирается попросить вас разрешение на использование инструмента. В сеансах, которые не могут показать подсказку, такие как фоновые подагенты в [неинтерактивном режиме](/docs/ru/headless), Claude Code все еще запускает эти hooks, и если ни один hook не возвращает решение, он отказывает вызову инструмента.2022Запускается, когда Claude Code собирается попросить у вас разрешение на использование инструмента. В сеансах, которые не могут показать подсказку, такие как фоновые подагенты в [неинтерактивном режиме](/docs/ru/headless), Claude Code все еще запускает эти hooks, и если ни один hook не возвращает решение, он отказывает вызову инструмента.
2014Используйте [управление решением PermissionRequest](#permissionrequest-decision-control) для разрешения или отказа от имени пользователя.2023Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control) для разрешения или отказа от имени пользователя.
2015 2024
2016Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает hook [Notification](#notification) с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.2025Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает hook [Notification](#notification) с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.
2017 2026
2018Claude Code не запускает hooks PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.2027Claude Code не запускает hooks PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.
2019 2028
2020Совпадает с названием инструмента, те же значения, что и PreToolUse.2029Совпадает с именем инструмента, те же значения, что и PreToolUse.
2021 2030
2022<h4 id="permissionrequest-input">2031<h4 id="permissionrequest-input">
2023 Ввод PermissionRequest2032 PermissionRequest input
2024</h4>2033</h4>
2025 2034
2026Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.2035Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.
2027 2036
2028Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как диалог для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может скрыть опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.2037Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может скрыть опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.
2029 2038
2030Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).2039Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить у вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
2031 2040
2032```json theme={null}2041```json theme={null}
2033{2042{
2053```2062```
2054 2063
2055<h4 id="permissionrequest-decision-control">2064<h4 id="permissionrequest-decision-control">
2056 Управление решением PermissionRequest2065 Управление решениями PermissionRequest
2057</h4>2066</h4>
2058 2067
2059Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:2068Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:
2060 2069
2061| Поле | Описание |2070| Поле | Описание |
2062| :- | :- |2071| :- | :- |
2063| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает его. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |2072| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |
2064| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |2073| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |
2065| `updatedPermissions` | Для `"allow"` только: массив [записей обновления разрешений](#permission-update-entries) для применения, такие как добавление правила разрешения или изменение режима разрешений сеанса |2074| `updatedPermissions` | Для `"allow"` только: массив [записей обновления разрешений](#permission-update-entries) для применения, такие как добавление правила разрешения или изменение режима разрешений сеанса |
2066| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |2075| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |
2067| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |2076| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |
2068 2077
2069Hook, который выходит 2 без объекта `decision`, оставляет поток разрешений неизменным, и его stderr отбрасывается. Только объект `decision` может предоставить или отказать в запросе.2078Hook, который выходит 2 без объекта `decision`, оставляет поток разрешений неизменным, и его stderr отбрасывается. Только объект `decision` может предоставить или отказать запрос.
2070 2079
2071```json theme={null}2080```json theme={null}
2072{2081{
2083```2092```
2084 2093
2085<h4 id="permission-update-entries">2094<h4 id="permission-update-entries">
2086 Записи обновления разрешений2095 Permission update entries
2087</h4>2096</h4>
2088 2097
2089Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.2098Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.
2090 2099
2091| `type` | Поля | Эффект |2100| `type` | Поля | Эффект |
2092| :- | :- | :- |2101| :- | :- | :- |
2093| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |2102| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешения. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |
2094| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |2103| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |
2095| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |2104| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |
2096| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |2105| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |
2098| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |2107| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |
2099 2108
2100<Note>2109<Note>
2101 `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).2110 `setMode` с `bypassPermissions` вступает в силу только, если вы запустили сеанс с режимом обхода, уже доступным: `--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).
2102 2111
2103 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2112 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.
2104</Note>2113</Note>
2120 2129
2121Запускается сразу после успешного завершения инструмента.2130Запускается сразу после успешного завершения инструмента.
2122 2131
2123Совпадает с названием инструмента, те же значения, что и PreToolUse.2132Совпадает с именем инструмента, те же значения, что и PreToolUse.
2124 2133
2125Совпадайте более широко, когда название инструмента не является правильным фильтром:2134Совпадайте более широко, когда имя инструмента не является правильным фильтром:
2126 2135
2127* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook может затем обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).2136* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook затем может обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).
2128* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.2137* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.
2129 2138
2130<h4 id="posttooluse-input">2139<h4 id="posttooluse-input">
2131 Ввод PostToolUse2140 PostToolUse input
2132</h4>2141</h4>
2133 2142
2134Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути `tool_input` инструментов файлов прибывают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).2143Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути инструментов файлов `tool_input` прибывают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).
2135 2144
2136```json theme={null}2145```json theme={null}
2137{2146{
2159| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2168| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
2160 2169
2161<h4 id="posttooluse-decision-control">2170<h4 id="posttooluse-decision-control">
2162 Управление решением PostToolUse2171 Управление решениями PostToolUse
2163</h4>2172</h4>
2164 2173
2165Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2174Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2166 2175
2167| Поле | Описание |2176| Поле | Описание |
2168| :- | :- |2177| :- | :- |
2169| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |2178| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |
2170| `reason` | Объяснение, показанное Claude, когда `decision` имеет значение `"block"` |2179| `reason` | Объяснение, показанное Claude, когда `decision` — это `"block"` |
2171| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |2180| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |
2172| `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 или позже |2181| `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 или позже |
2173| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |2182| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |
2191```2200```
2192 2201
2193<Warning>2202<Warning>
2194 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте вместо этого hook [PreToolUse](#pretooluse).2203 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте hook [PreToolUse](#pretooluse) вместо этого.
2195 2204
2196 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.2205 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.
2197</Warning>2206</Warning>
2198 2207
2199<h4 id="annotate-a-result-for-the-auto-mode-classifier">2208<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2200 Аннотирование результата для классификатора режима auto2209 Annotate a result for the auto mode classifier
2201</h4>2210</h4>
2202 2211
2203Верните `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 или позже.2212Верните `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 или позже.
2204 2213
2205Пример ниже говорит классификатору, откуда пришел вывод запроса:2214Пример ниже говорит классификатору, откуда пришел вывод запроса:
2206 2215
2215 2224
2216Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:2225Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:
2217 2226
2218* **Hooks, настроенные в Claude Code**: для hooks из файлов параметров, плагинов, skills и frontmatter агента классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре2227* **Hooks, настроенные в Claude Code**: для hooks из файлов параметров, plugins, skills и frontmatter агента классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре
2219* **In-process callbacks Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует hook как [callback TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединенную заметку как непроверенный контекст2228* **In-process callbacks Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует hook как [callback TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один вызов, классификатор рассматривает объединенную заметку как непроверенный контекст
2220 2229
2221Claude Code применяет эти ограничения при доставке заметки:2230Claude Code применяет эти ограничения при доставке заметки:
2222 2231
2223* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов2232* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов
2224* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоновом режиме](#run-hooks-in-the-background), потому что этот ответ прибывает после того, как Claude Code записывает результат инструмента2233* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоне](#run-hooks-in-the-background), потому что этот ответ прибывает после того, как Claude Code записывает результат инструмента
2225* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов2234* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов
2226* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод2235* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод
2227 2236
2228<Warning>2237<Warning>
2229 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте в него ненадежный вывод инструмента или текст третьих сторон. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя о нем; не используйте поле для доставки несвязанных сообщений или потока событий.2238 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте в него ненадежный вывод инструмента или текст третьих сторон. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя об этом; не используйте поле для доставки несвязанных сообщений или потока событий.
2230</Warning>2239</Warning>
2231 2240
2232<h3 id="posttoolusefailure">2241<h3 id="posttoolusefailure">
2235 2244
2236Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.2245Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.
2237 2246
2238Совпадает с названием инструмента, те же значения, что и PreToolUse.2247Совпадает с именем инструмента, те же значения, что и PreToolUse.
2239 2248
2240<Note>2249<Note>
2241 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное название инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы в проверке возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).2250 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное название инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы в проверке возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни этим событием. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
2242</Note>2251</Note>
2243 2252
2244<h4 id="posttoolusefailure-input">2253<h4 id="posttoolusefailure-input">
2245 Ввод PostToolUseFailure2254 PostToolUseFailure input
2246</h4>2255</h4>
2247 2256
2248Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:2257Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:
2269| Поле | Описание |2278| Поле | Описание |
2270| :- | :- |2279| :- | :- |
2271| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |2280| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |
2272| `is_interrupt` | Опциональное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этот hook; результат инструмента несет сообщение прерывания вместо этого |2281| `is_interrupt` | Опциональное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этим hook; результат инструмента несет сообщение прерывания вместо этого |
2273| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2282| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |
2274 2283
2275Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется в зависимости от инструмента и сбоя. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.2284Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется по инструменту и сбою. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.
2276 2285
2277* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными2286* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными
2278* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс оболочки2287* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс оболочки
2279* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`2288* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`
2280 2289
2281<h4 id="posttoolusefailure-decision-control">2290<h4 id="posttoolusefailure-decision-control">
2282 Управление решением PostToolUseFailure2291 Управление решениями PostToolUseFailure
2283</h4>2292</h4>
2284 2293
2285Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2294Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2286 2295
2287| Поле | Описание |2296| Поле | Описание |
2288| :- | :- |2297| :- | :- |
2301 PostToolBatch2310 PostToolBatch
2302</h3>2311</h3>
2303 2312
2304Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед тем как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.2313Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз для каждого инструмента, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.
2305 2314
2306<h4 id="posttoolbatch-input">2315<h4 id="posttoolbatch-input">
2307 Ввод PostToolBatch2316 PostToolBatch input
2308</h4>2317</h4>
2309 2318
2310Помимо [общих полей ввода](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:2319Помимо [общих полей ввода](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:
2340</Note>2349</Note>
2341 2350
2342<h4 id="posttoolbatch-decision-control">2351<h4 id="posttoolbatch-decision-control">
2343 Управление решением PostToolBatch2352 Управление решениями PostToolBatch
2344</h4>2353</h4>
2345 2354
2346Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2355Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2347 2356
2348| Поле | Описание |2357| Поле | Описание |
2349| :- | :- |2358| :- | :- |
2358}2367}
2359```2368```
2360 2369
2361Возврат `decision: "block"` или `continue: false` останавливает агентский цикл перед следующим вызовом модели. Сообщение блокировки поступает из JSON `reason` или `stopReason` или из stderr при выходе 2. Вы видите его как предупреждение в транскрипте, и оно остается в разговоре, поэтому Claude видит его при продолжении разговора.2370Возврат `decision: "block"` или `continue: false` останавливает агентский цикл перед следующим вызовом модели. Сообщение блокировки поступает из JSON `reason` или `stopReason`, или из stderr при выходе 2. Вы видите его как предупреждение в транскрипте, и оно остается в разговоре, поэтому Claude видит его, когда разговор продолжается.
2362 2371
2363<h3 id="permissiondenied">2372<h3 id="permissiondenied">
2364 PermissionDenied2373 PermissionDenied
2365</h3>2374</h3>
2366 2375
2367Запускается, когда [режим 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`. Используйте его для логирования отказов, настройки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.2376Запускается, когда [режим 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`. Используйте его для логирования отказов, корректировки конфигурации или сообщения модели, что она может повторить вызов инструмента.
2368 2377
2369Совпадает с названием инструмента, те же значения, что и PreToolUse.2378Совпадает с именем инструмента, те же значения, что и PreToolUse.
2370 2379
2371<h4 id="permissiondenied-input">2380<h4 id="permissiondenied-input">
2372 Ввод PermissionDenied2381 PermissionDenied input
2373</h4>2382</h4>
2374 2383
2375Помимо [общих полей ввода](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).2384Помимо [общих полей ввода](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).
2396| `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` |2405| `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` |
2397 2406
2398<h4 id="permissiondenied-decision-control">2407<h4 id="permissiondenied-decision-control">
2399 Управление решением PermissionDenied2408 Управление решениями PermissionDenied
2400</h4>2409</h4>
2401 2410
2402Hooks PermissionDenied могут сказать модели, что она может повторить попытку отклоненного вызова инструмента. Верните объект JSON с `hookSpecificOutput.retry`, установленным на `true`:2411Hooks PermissionDenied могут сказать модели, что она может повторить отклоненный вызов инструмента. Верните объект JSON с `hookSpecificOutput.retry`, установленным на `true`:
2403 2412
2404```json theme={null}2413```json theme={null}
2405{2414{
2410}2419}
2411```2420```
2412 2421
2413Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить попытку вызова инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.2422Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить вызов инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.
2414 2423
2415Claude Code игнорирует `retry: true`, когда классификатор создал [отсутствие вердикта на действие](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от режима auto, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли попытку позже или продолжить.2424Claude Code игнорирует `retry: true`, когда классификатор создал [отсутствие вердикта на действие](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от режима auto, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли позже или продолжить.
2416 2425
2417<h3 id="notification">2426<h3 id="notification">
2418 Notification2427 Notification
2420 2429
2421Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.2430Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.
2422 2431
2423Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вас оповещают, а не запускается ли ваш hook.2432Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вас оповещают, а не срабатывает ли ваш hook.
2424 2433
2425| Matcher | Когда срабатывает |2434| Matcher | Когда срабатывает |
2426| :- | :- |2435| :- | :- |
2430| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |2439| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |
2431| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |2440| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |
2432| `elicitation_complete` | Сервер MCP сообщает, что [URL-режим запроса](#elicitation-input) завершен |2441| `elicitation_complete` | Сервер MCP сообщает, что [URL-режим запроса](#elicitation-input) завершен |
2433| `elicitation_response` | Ответ запроса MCP отправляется обратно на сервер |2442| `elicitation_response` | Ответ на запрос MCP отправляется обратно на сервер |
2434| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале, или текущий сеанс задает вам вопрос [настройки терминала товарища команды агентов](/docs/ru/agent-teams#choose-a-display-mode) и вы не печатали около шести секунд |2443| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале. Также срабатывает, когда сеанс терминала показывает вам [вопрос настройки терминала товарища команды агентов](/docs/ru/agent-teams#choose-a-display-mode) или уведомление режима auto о [расходах на запрос классификатора](/docs/ru/auto-mode-classifier-billing) и вы не печатали около шести секунд |
2435| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |2444| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |
2436| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление вашего плана или переключение моделей, снова делает использование доступным, с [исключением параметра модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |2445| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление плана или переключение моделей, снова делает использование доступным, с [исключением параметра модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |
2437| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter`, вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |2446| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter`, вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |
2438| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил самостоятельно, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |2447| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил сам, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |
2439 2448
2440Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.2449Типы `agent_needs_input` и `agent_completed` требуют Claude Code v2.1.198 или позже.
2441 2450
2448<Note>2457<Note>
2449 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:2458 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:
2450 2459
2451 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).2460 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте [PermissionRequest](#permissionrequest) вместо этого.
2452 * Ожидайте `idle_prompt` около 60 секунд после того, как Claude закончит отвечать, и только если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается самостоятельно, один из типов `quota_auto_resume_*` срабатывает вместо этого.2461 * Ожидайте `idle_prompt` около 60 секунд после завершения Claude ответа и только, если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается само по себе, один из типов `quota_auto_resume_*` срабатывает вместо этого.
2453 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один и тот же шестисекундный шлюз как `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.2462 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один шестисекундный шлюз с `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.
2454 2463
2455 Запрос разрешения или запрос, который прибывает, пока другой диалог находится на экране, сохраняет один и тот же шестисекундный шлюз, рассчитанный с момента прибытия запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.2464 Запрос разрешения или запрос, который прибывает, пока другой диалог находится на экране, сохраняет один шестисекундный шлюз, рассчитанный с момента прибытия запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.
2456</Note>2465</Note>
2457 2466
2458Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback [`canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK, что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:2467Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback `canUseTool` Agent SDK, что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:
2459 2468
2460* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.2469* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.
2461* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.2470* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2493```2502```
2494 2503
2495<h4 id="notification-input">2504<h4 id="notification-input">
2496 Ввод Notification2505 Notification input
2497</h4>2506</h4>
2498 2507
2499Помимо [общих полей ввода](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.2508Помимо [общих полей ввода](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.
2510}2519}
2511```2520```
2512 2521
2513Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которую полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления на внешний сервис.2522Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которое полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис.
2514 2523
2515<h3 id="subagentstart">2524<h3 id="subagentstart">
2516 SubagentStart2525 SubagentStart
2517</h3>2526</h3>
2518 2527
2519Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ [команды агентов](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по названию типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [пользовательских подагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.2528Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ [команды агентов](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по имени типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [пользовательских подагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.
2520 2529
2521Для подагентов, поставляемых [плагином](/docs/ru/plugins/overview), тип агента — это идентификатор с областью плагина, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью плагина на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.2530Для подагентов, поставляемых [plugin](/docs/ru/plugins/overview), тип агента — это идентификатор с областью plugin, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью plugin на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.
2522 2531
2523<h4 id="subagentstart-input">2532<h4 id="subagentstart-input">
2524 Ввод SubagentStart2533 SubagentStart input
2525</h4>2534</h4>
2526 2535
2527Помимо [общих полей ввода](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором подагента и `agent_type` с названием агента, который matcher фильтрует.2536Помимо [общих полей ввода](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором подагента и `agent_type` с именем агента, который matcher фильтрует.
2528 2537
2529```json theme={null}2538```json theme={null}
2530{2539{
2537}2546}
2538```2547```
2539 2548
2540Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть:2549Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:
2541 2550
2542| Поле | Описание |2551| Поле | Описание |
2543| :- | :- |2552| :- | :- |
2561Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.2570Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.
2562 2571
2563<h4 id="subagentstop-input">2572<h4 id="subagentstop-input">
2564 Ввод SubagentStop2573 SubagentStop input
2565</h4>2574</h4>
2566 2575
2567Помимо [общих полей ввода](#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 могут получить доступ к нему без анализа файла транскрипта.2576Помимо [общих полей ввода](#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 могут получить доступ к нему без анализа файла транскрипта.
2568 2577
2569Не каждое событие 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), и пустая строка, когда сеанс запускается без одного.2578Не каждое событие 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), и пустая строка, когда сеанс запускается без одного.
2570 2579
2571`matcher`, который называет типы агентов, не совпадает с пустым `agent_type`. Hook, чей matcher опущен, `""` или `"*"`, или является регулярным выражением, которое совпадает с пустой строкой, запускается для событий с пустым `agent_type` тоже.2580`matcher`, который называет типы агентов, не совпадает с пустым `agent_type`. Hook, чей matcher опущен, `""` или `"*"`, или является регулярным выражением, которое совпадает с пустой строкой, запускается для событий с пустым `agent_type` тоже.
2572 2581
2573На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если он есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, соответствующий `SubagentHandback`, получает как `tool_input.message`.2582На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, соответствующий `SubagentHandback`, получает как `tool_input.message`.
2574 2583
2575Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.2584Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.
2576 2585
2591}2600}
2592```2601```
2593 2602
2594Hooks SubagentStop используют тот же формат управления решением, что и [hooks Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте вместо этого hook [`PostToolUse`](#posttooluse) на инструменте `Agent`.2603Hooks SubagentStop используют тот же формат управления решениями, что и [hooks Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.
2595 2604
2596<h3 id="taskcreated">2605<h3 id="taskcreated">
2597 TaskCreated2606 TaskCreated
2598</h3>2607</h3>
2599 2608
2600Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для применения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.2609Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для обеспечения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.
2601 2610
2602Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.2611Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.
2603 2612
2604<h4 id="taskcreated-input">2613<h4 id="taskcreated-input">
2605 Ввод TaskCreated2614 TaskCreated input
2606</h4>2615</h4>
2607 2616
2608Помимо [общих полей ввода](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2617Помимо [общих полей ввода](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2627| `task_subject` | Название задачи |2636| `task_subject` | Название задачи |
2628| `task_description` | Подробное описание задачи. Может отсутствовать |2637| `task_description` | Подробное описание задачи. Может отсутствовать |
2629| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |2638| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |
2630| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2639| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |
2631 2640
2632<h4 id="taskcreated-decision-control">2641<h4 id="taskcreated-decision-control">
2633 Управление решением TaskCreated2642 Управление решениями TaskCreated
2634</h4>2643</h4>
2635 2644
2636Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.2645Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.
2657 TaskCompleted2666 TaskCompleted
2658</h3>2667</h3>
2659 2668
2660Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ [команды агентов](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для применения критериев завершения, таких как прохождение тестов или проверок lint, перед закрытием задачи.2669Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ [команды агентов](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для обеспечения критериев завершения, таких как прохождение тестов или проверок lint перед закрытием задачи.
2661 2670
2662Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.2671Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.
2663 2672
2664<h4 id="taskcompleted-input">2673<h4 id="taskcompleted-input">
2665 Ввод TaskCompleted2674 TaskCompleted input
2666</h4>2675</h4>
2667 2676
2668Помимо [общих полей ввода](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2677Помимо [общих полей ввода](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.
2688| `task_subject` | Название задачи |2697| `task_subject` | Название задачи |
2689| `task_description` | Подробное описание задачи. Может отсутствовать |2698| `task_description` | Подробное описание задачи. Может отсутствовать |
2690| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |2699| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |
2691| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2700| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |
2692 2701
2693<h4 id="taskcompleted-decision-control">2702<h4 id="taskcompleted-decision-control">
2694 Управление решением TaskCompleted2703 Управление решениями TaskCompleted
2695</h4>2704</h4>
2696 2705
2697Hooks TaskCompleted поддерживают два способа управления завершением задачи:2706Hooks TaskCompleted поддерживают два способа управления завершением задачи:
2698 2707
2699* **Код выхода 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.2708* **Код выхода 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.
2700* **JSON `{"continue": false, "stopReason": "..."}`**: когда товарищ, завершающий свой ход, запустил событие, полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда инструмент `TaskUpdate` запустил событие, Claude Code игнорирует `continue: false`; код выхода 2 все еще блокирует завершение.2709* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие запустил товарищ, завершающий свой ход, полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда событие запустил инструмент `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 все еще блокирует завершение.
2701 2710
2702Этот пример запускает тесты и блокирует завершение задачи, если они не пройдут:2711Этот пример запускает тесты и блокирует завершение задачи, если они не удаются:
2703 2712
2704```bash theme={null}2713```bash theme={null}
2705#!/bin/bash2714#!/bin/bash
2719 Stop2728 Stop
2720</h3>2729</h3>
2721 2730
2722Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API срабатывают вместо этого [StopFailure](#stopfailure).2731Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API запускают [StopFailure](#stopfailure) вместо этого.
2723 2732
2724<Tip>2733<Tip>
2725 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.2734 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.
2726</Tip>2735</Tip>
2727 2736
2728<h4 id="stop-input">2737<h4 id="stop-input">
2729 Ввод Stop2738 Stop input
2730</h4>2739</h4>
2731 2740
2732Помимо [общих полей ввода](#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 последовательных блокировок. Чтобы повысить ограничение, установите [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).2741Помимо [общих полей ввода](#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 применяет ограничение на 8 последовательных продолжений: после того, как hooks stop продолжили ход восемь раз подряд, Claude Code переопределяет следующий блок и заканчивает ход. Чтобы поднять ограничение, установите [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).
2733 2742
2734Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантируется включать финальное сообщение во время Stop на всех версиях.2743Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантирует включение финального сообщения в момент Stop на всех версиях.
2735 2744
2736Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен, ожидая фоновой работы для пробуждения его обратно". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.2745Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен в ожидании фоновой работы для его пробуждения". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.
2737 2746
2738Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:2747Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:
2739 2748
2742| `id` | Идентификатор задачи |2751| `id` | Идентификатор задачи |
2743| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |2752| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |
2744| `status` | Текущий статус задачи |2753| `status` | Текущий статус задачи |
2745| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезке |2754| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезании |
2746| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |2755| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |
2747| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |2756| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |
2748| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |2757| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |
2753 2762
2754| Поле | Описание |2763| Поле | Описание |
2755| :- | :- |2764| :- | :- |
2756| `id` | Идентификатор задачи Cron |2765| `id` | Идентификатор задачи cron |
2757| `schedule` | Выражение Cron, например `0 9 * * 1-5` |2766| `schedule` | Выражение cron, например `0 9 * * 1-5` |
2758| `recurring` | `false` для одноразовых пробуждений, чье расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |2767| `recurring` | `false` для одноразовых пробуждений, чье расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |
2759| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |2768| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |
2760 2769
2761Этот пример показывает ввод Stop с одной выполняющейся задачей shell и одним повторяющимся cron:2770Этот пример показывает ввод Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:
2762 2771
2763```json theme={null}2772```json theme={null}
2764{2773{
2790```2799```
2791 2800
2792<h4 id="stop-decision-control">2801<h4 id="stop-decision-control">
2793 Управление решением Stop2802 Управление решениями Stop
2794</h4>2803</h4>
2795 2804
2796Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2805Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:
2797 2806
2798| Поле | Описание |2807| Поле | Описание |
2799| :- | :- |2808| :- | :- |
2800| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |2809| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |
2801| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |2810| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |
2802| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на ней, но в отличие от `decision: "block"` она показана в транскрипте как обратная связь hook, а не ошибка hook |2811| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на ней, но в отличие от `decision: "block"`, она показывается в транскрипте как обратная связь hook, а не ошибка hook |
2803 2812
2804Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.2813Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.
2805 2814
2810}2819}
2811```2820```
2812 2821
2813Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение 8-последовательного продолжения, но транскрипт помечает его `Stop hook feedback` и уведомление об ошибке hook не показывается:2822Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение на 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и уведомление об ошибке hook не показывается:
2814 2823
2815```json theme={null}2824```json theme={null}
2816{2825{
2828Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.2837Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.
2829 2838
2830<h4 id="stopfailure-input">2839<h4 id="stopfailure-input">
2831 Ввод StopFailure2840 StopFailure input
2832</h4>2841</h4>
2833 2842
2834Помимо [общих полей ввода](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.2843Помимо [общих полей ввода](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.
2851}2860}
2852```2861```
2853 2862
2854Hooks StopFailure не имеют управления решением. Они запускаются только в целях уведомления и логирования.2863Hooks StopFailure не имеют управления решениями. Они запускаются только в целях уведомления и логирования.
2855 2864
2856<h3 id="teammateidle">2865<h3 id="teammateidle">
2857 TeammateIdle2866 TeammateIdle
2858</h3>2867</h3>
2859 2868
2860Запускается, когда товарищ [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для применения шлюзов качества перед остановкой товарища, такие как требование прохождения проверок lint или проверка существования выходных файлов.2869Запускается, когда товарищ [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для обеспечения шлюзов качества перед остановкой товарища, такие как требование прохождения проверок lint или проверка существования выходных файлов.
2861 2870
2862Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.2871Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.
2863 2872
2864<h4 id="teammateidle-input">2873<h4 id="teammateidle-input">
2865 Ввод TeammateIdle2874 TeammateIdle input
2866</h4>2875</h4>
2867 2876
2868Помимо [общих полей ввода](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.2877Помимо [общих полей ввода](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.
2882| Поле | Описание |2891| Поле | Описание |
2883| :- | :- |2892| :- | :- |
2884| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |2893| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |
2885| `team_name` | Устарело. Имя команды, полученное из сеанса; будет удалено в будущем выпуске |2894| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |
2886 2895
2887<h4 id="teammateidle-decision-control">2896<h4 id="teammateidle-decision-control">
2888 Управление решением TeammateIdle2897 Управление решениями TeammateIdle
2889</h4>2898</h4>
2890 2899
2891Hooks TeammateIdle поддерживают два способа управления поведением товарища:2900Hooks TeammateIdle поддерживают два способа управления поведением товарища:
2910 ConfigChange2919 ConfigChange
2911</h3>2920</h3>
2912 2921
2913Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений параметров, применения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.2922Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений параметров, обеспечения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.
2914 2923
2915Claude 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 на его опросе политики без их запуска.2924Claude 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 на его опросе политики без запуска их.
2916 2925
2917Matcher фильтрует по источнику конфигурации:2926Matcher фильтрует по источнику конфигурации:
2918 2927
2945```2954```
2946 2955
2947<h4 id="configchange-input">2956<h4 id="configchange-input">
2948 Ввод ConfigChange2957 ConfigChange input
2949</h4>2958</h4>
2950 2959
2951Помимо [общих полей ввода](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.2960Помимо [общих полей ввода](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.
2962```2971```
2963 2972
2964<h4 id="configchange-decision-control">2973<h4 id="configchange-decision-control">
2965 Управление решением ConfigChange2974 Управление решениями ConfigChange
2966</h4>2975</h4>
2967 2976
2968Hooks ConfigChange могут блокировать изменения конфигурации от вступления в силу. Используйте код выхода 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к работающему сеансу.2977Hooks ConfigChange могут блокировать изменения конфигурации от вступления в силу. Используйте код выхода 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к работающему сеансу.
2979}2988}
2980```2989```
2981 2990
2982Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых параметров на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда прибывают или обновляются [параметры, управляемые сервером](/docs/ru/server-managed-settings).2991Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых параметров на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда прибывают [параметры, управляемые сервером](/docs/ru/server-managed-settings) или обновляются.
2983 2992
2984Claude Code действует на решение блокировки из JSON-вывода hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, независимо от того, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только записывает строку в debug log.2993Claude Code действует на решение блокировки из вывода JSON hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только записывает строку в debug log.
2985 2994
2986<h3 id="cwdchanged">2995<h3 id="cwdchanged">
2987 CwdChanged2996 CwdChanged
2988</h3>2997</h3>
2989 2998
2990Запускается, когда команда оболочки в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов для конкретного проекта или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.2999Запускается, когда команда оболочки в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов, специфичных для проекта, или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.
2991 3000
2992Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code их очищает.3001Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code их очищает.
2993 3002
2994CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.3003CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.
2995 3004
2996<h4 id="cwdchanged-input">3005<h4 id="cwdchanged-input">
2997 Ввод CwdChanged3006 CwdChanged input
2998</h4>3007</h4>
2999 3008
3000Помимо [общих полей ввода](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.3009Помимо [общих полей ввода](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.
3011```3020```
3012 3021
3013<h4 id="cwdchanged-output">3022<h4 id="cwdchanged-output">
3014 Вывод CwdChanged3023 CwdChanged output
3015</h4>3024</h4>
3016 3025
3017Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) отслеживает:3026Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) наблюдает:
3018 3027
3019| Поле | Описание |3028| Поле | Описание |
3020| :- | :- |3029| :- | :- |
3021| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список отслеживания. Пути из конфигурации вашего `matcher` всегда отслеживаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |3030| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |
3022 3031
3023Hooks CwdChanged не имеют управления решением. Они не могут блокировать изменение директории.3032Hooks CwdChanged не имеют управления решениями. Они не могут блокировать изменение директории.
3024 3033
3025Claude Code читает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3034Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
3026 3035
3027<h3 id="directoryadded">3036<h3 id="directoryadded">
3028 DirectoryAdded3037 DirectoryAdded
3029</h3>3038</h3>
3030 3039
3031Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления клиентом SDK с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например установки его зависимостей.3040Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления клиентом SDK с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например, установки его зависимостей.
3032 3041
3033Claude Code не срабатывает это событие, когда:3042Claude Code не срабатывает это событие, когда:
3034 3043
3035* Вы передаете директорию с флагом запуска `--add-dir`; [SessionStart](#sessionstart) охватывает эти директории3044* Вы передаете директорию с флагом запуска `--add-dir`; [SessionStart](#sessionstart) охватывает эти директории
3036* Вы добавляете директорию на вкладку `/permissions` Workspace3045* Вы добавляете директорию на вкладку Workspace `/permissions`
3037* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной3046* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной
3038 3047
3039Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда выполняется ваш hook. Команды hook сами выполняются без изоляции.3048Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда запускается ваш hook. Команды hook сами выполняются без изоляции.
3040 3049
3041Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоновом режиме с тайм-аутом по умолчанию 600 секунд.3050Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоне с тайм-аутом по умолчанию 600 секунд.
3042 3051
3043Matcher фильтрует по тому, как была добавлена директория:3052Matcher фильтрует по тому, как была добавлена директория:
3044 3053
3048| `register_repo_root` | Клиент SDK добавляет директорию с запросом управления `register_repo_root` |3057| `register_repo_root` | Клиент SDK добавляет директорию с запросом управления `register_repo_root` |
3049 3058
3050<h4 id="directoryadded-input">3059<h4 id="directoryadded-input">
3051 Ввод DirectoryAdded3060 DirectoryAdded input
3052</h4>3061</h4>
3053 3062
3054Помимо [общих полей ввода](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.3063Помимо [общих полей ввода](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.
3069}3078}
3070```3079```
3071 3080
3072Hooks DirectoryAdded не имеют управления решением. Они не могут блокировать добавление, которое уже завершилось. Claude Code отбрасывает поле `continue` из их JSON-вывода и выводит остальное по-разному в зависимости от источника:3081Hooks DirectoryAdded не имеют управления решениями. Они не могут блокировать добавление, которое уже завершилось, когда выполняется hook. Claude Code отбрасывает поле `continue` из их вывода JSON и выводит остальное по-разному в зависимости от источника:
3073 3082
3074* `slash_command`: Claude Code доставляет `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log3083* `slash_command`: Claude Code доставляет `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log
3075* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоя только в debug log3084* `register_repo_root`: Claude Code пишет вывод `systemMessage` и вывод сбоя только в debug log
3076 3085
3077<h3 id="filechanged">3086<h3 id="filechanged">
3078 FileChanged3087 FileChanged
3079</h3>3088</h3>
3080 3089
3081Запускается, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code полностью. Обычное использование — перезагрузка переменных окружения при изменении файлов конфигурации проекта.3090Запускается, когда наблюдаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code полностью. Обычное использование — перезагрузка переменных окружения, когда изменяются файлы конфигурации проекта.
3082 3091
3083`matcher` для этого события служит двум целям:3092`matcher` для этого события служит двум целям:
3084 3093
3085* **Построить список отслеживания**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, отслеживало бы файл буквально названный `^\.env`.3094* **Построение списка наблюдения**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` наблюдает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, наблюдало бы файл буквально названный `^\.env`.
3086* **Фильтровать, какие hooks запускаются**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила matcher](#matcher-patterns) против базового имени измененного файла.3095* **Фильтрация, какие hooks запускаются**: когда наблюдаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила matcher](#matcher-patterns) против базового имени измененного файла.
3087 3096
3088Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая команду `Bash` или внешний скрипт, переписывающий файл:3097Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая команду `Bash` или внешний скрипт, переписывающий файл:
3089 3098
3105}3114}
3106```3115```
3107 3116
3108Hook читает абсолютный путь измененного файла из поля `file_path` JSON-ввода на stdin. Его охрана `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабая охрана зацикливается навсегда, потому что `perl -i` переписывает файл, даже когда он ничего не заменяет, и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:3117Hook читает абсолютный путь измененного файла из поля `file_path` [JSON ввода](#filechanged-input) из stdin. Его охрана `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабая охрана зацикливается навсегда, потому что `perl -i` переписывает файл, даже когда он ничего не заменяет, и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3109 3118
3110```bash theme={null}3119```bash theme={null}
3111#!/bin/bash3120#!/bin/bash
3117 3126
3118Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.3127Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.
3119 3128
3120Чтобы отслеживать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка отслеживания. Claude Code запускает наблюдатель только, когда что-то называет файл для отслеживания, поэтому заполните список группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда отслеживаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым отслеживаемым файлом и ничего не добавляет в список отслеживания. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке отслеживания, как любое другое значение, как буквальный файл названный `*`.3129Чтобы наблюдать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка наблюдения. Claude Code запускает наблюдатель только, когда что-то называет файл для наблюдения, поэтому посейте список с группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда наблюдаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым наблюдаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения, как любое другое значение, как буквальный файл с именем `*`.
3121 3130
3122Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.3131Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.
3123 3132
3124<h4 id="filechanged-input">3133<h4 id="filechanged-input">
3125 Ввод FileChanged3134 FileChanged input
3126</h4>3135</h4>
3127 3136
3128Помимо [общих полей ввода](#common-input-fields), hooks FileChanged получают `file_path` и `event`.3137Помимо [общих полей ввода](#common-input-fields), hooks FileChanged получают `file_path` и `event`.
3144```3153```
3145 3154
3146<h4 id="filechanged-output">3155<h4 id="filechanged-output">
3147 Вывод FileChanged3156 FileChanged output
3148</h4>3157</h4>
3149 3158
3150Помимо [полей JSON-вывода](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов отслеживаются:3159Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов наблюдаются:
3151 3160
3152| Поле | Описание |3161| Поле | Описание |
3153| :- | :- |3162| :- | :- |
3154| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список отслеживания. Пути из конфигурации вашего `matcher` всегда отслеживаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для отслеживания на основе измененного файла |3163| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для наблюдения на основе измененного файла |
3155 3164
3156Hooks FileChanged не имеют управления решением. Они не могут блокировать изменение файла от возникновения.3165Hooks FileChanged не имеют управления решениями. Они не могут блокировать изменение файла от возникновения.
3157 3166
3158Claude Code читает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3167Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.
3159 3168
3160<h3 id="worktreecreate">3169<h3 id="worktreecreate">
3161 WorktreeCreate3170 WorktreeCreate
3162</h3>3171</h3>
3163 3172
3164Запускается, когда создается 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Запускается, когда создается 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.
3165 3174
3166Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.3175Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.
3167 3176
3188}3197}
3189```3198```
3190 3199
3191Hook читает `name` worktree из JSON-ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.3200Hook читает `name` worktree из JSON ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.
3192 3201
3193<h4 id="worktreecreate-input">3202<h4 id="worktreecreate-input">
3194 Ввод WorktreeCreate3203 WorktreeCreate input
3195</h4>3204</h4>
3196 3205
3197Помимо [общих полей ввода](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.3206Помимо [общих полей ввода](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.
3207```3216```
3208 3217
3209<h4 id="worktreecreate-output">3218<h4 id="worktreecreate-output">
3210 Вывод WorktreeCreate3219 WorktreeCreate output
3211</h4>3220</h4>
3212 3221
3213Hooks WorktreeCreate не используют стандартную модель решения разрешить/блокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:3222Hooks WorktreeCreate не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:
3214 3223
3215* **Command hooks** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.3224* **Hooks команды** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.
3216* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3225* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
3217 3226
3218Если hook не удается или не создает путь, создание worktree не удается с ошибкой.3227Если hook не удается или не создает путь, создание worktree не удается с ошибкой.
3219 3228
3220Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку с названием пути и выходит с кодом 1.3229Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1.
3221 3230
3222Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через символическую ссылку ниже корня репозитория, потому что символическая ссылка, зафиксированная в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.3231Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через символическую ссылку ниже корня репозитория, потому что символическая ссылка, зафиксированная в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.
3223 3232
3225 WorktreeRemove3234 WorktreeRemove
3226</h3>3235</h3>
3227 3236
3228Запускается, когда worktree удаляется. Это очистка, соответствующая [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:3237Запускается, когда worktree удаляется. Это парный hook очистки для [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:
3229 3238
3230* вы выходите из сеанса `--worktree` и выбираете его удаление3239* вы выходите из сеанса `--worktree` и выбираете его удаление
3231* подагент с `isolation: "worktree"` завершается3240* подагент с `isolation: "worktree"` завершается
3232* вы удаляете [фоновый сеанс](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook3241* вы удаляете [фоновый сеанс](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook
3233 3242
3234Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate для системы контроля версий, не основанной на git, свяжите его с hook WorktreeRemove для обработки очистки. Без него директория worktree остается на диске.3243Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate, свяжите его с hook WorktreeRemove для управления очисткой worktrees, которые он создает:
3244
3245* **Нет hook WorktreeRemove**: когда вы выходите из сеанса `--worktree` и выбираете удаление, Claude Code возвращается к `git worktree remove --force` на пути, который вернул ваш hook WorktreeCreate, поэтому worktree, который git узнает, удаляется. Worktree, который git не узнает, например тот, который ваш hook создал с системой контроля версий, отличной от git, остается на диске. Для того, что удаление [фонового сеанса](/docs/ru/agent-view#what-deleting-a-session-removes) делает с hook-созданным worktree, см. правила удаления agent view.
3246* **Hook выходит 0**: worktree считается удаленным. Claude Code ничего больше не читает из hook, поэтому убедитесь, что ваш hook удалил директорию.
3247* **Hook выходит не-нулевой**: удаление не удается, если директория в `worktree_path` все еще существует после этого, и worktree остается на диске без fallback git. Hook, который удалил директорию перед выходом не-нулевой, считается удаленным. Для того, как сбой сообщается, см. [WorktreeRemove input](#worktreeremove-input).
3248
3249Claude Code никогда не удаляет ветку, принадлежащую hook-созданному worktree, потому что он знает только путь, который вернул ваш hook WorktreeCreate. Если ваш hook WorktreeCreate создает ветку, удалите ее в вашем hook WorktreeRemove.
3235 3250
3236Claude Code отбрасывает [поля JSON-вывода](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.3251Claude Code отбрасывает [поля вывода JSON](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.
3237 3252
3238Для удаления фонового сеанса 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 запускался на сохраненном пути без этих проверок.3253Для удаления фонового сеанса 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 запускался на сохраненном пути без этих проверок.
3239 3254
3240Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:3255Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:
3241 3256
3257```3272```
3258 3273
3259<h4 id="worktreeremove-input">3274<h4 id="worktreeremove-input">
3260 Ввод WorktreeRemove3275 WorktreeRemove input
3261</h4>3276</h4>
3262 3277
3263Помимо [общих полей ввода](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.3278Помимо [общих полей ввода](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.
3272}3287}
3273```3288```
3274 3289
3275Код выхода hook WorktreeRemove определяет результат. Когда hook выходит с ненулевым кодом и директория в `worktree_path` все еще существует после этого, удаление не удается:3290Код выхода hook WorktreeRemove определяет результат. Когда hook выходит не-нулевой и директория в `worktree_path` все еще существует после этого, удаление не удается:
3276 3291
3277* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).3292* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).
3278* Если вы удаляли фоновый сеанс, сеанс остается тоже. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удаляет ли удаление сеанса снова директорию в любом случае.3293* Если вы удаляли фоновый сеанс, сеанс остается тоже. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удалит ли удаление сеанса снова директорию в любом случае.
3279 3294
3280<h3 id="precompact">3295<h3 id="precompact">
3281 PreCompact3296 PreCompact
3290| `manual` | `/compact` |3305| `manual` | `/compact` |
3291| `auto` | Auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3306| `auto` | Auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |
3292 3307
3293Выйдите с кодом 2 для блокировки сжатия. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете блокировать, возвращая JSON с `"decision": "block"`.3308Выйдите с кодом 2 для блокировки сжатия. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.
3294 3309
3295Блокировка автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено упреждающе перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.3310Блокировка автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено проактивно перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.
3296 3311
3297Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.3312Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.
3298 3313
3299<h4 id="precompact-input">3314<h4 id="precompact-input">
3300 Ввод PreCompact3315 PreCompact input
3301</h4>3316</h4>
3302 3317
3303Помимо [общих полей ввода](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и имеет значение `null`, когда они ничего не передают. Для `auto`, `custom_instructions` имеет значение `null`.3318Помимо [общих полей ввода](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и является `null`, когда они ничего не передают. Для `auto`, `custom_instructions` — это `null`.
3304 3319
3305```json theme={null}3320```json theme={null}
3306{3321{
3317 PostCompact3332 PostCompact
3318</h3>3333</h3>
3319 3334
3320Запускается после завершения операции compact Claude Code. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированного резюме или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.3335Запускается после завершения Claude Code операции compact. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированного резюме или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.
3321 3336
3322Те же значения matcher применяются, как для `PreCompact`:3337Те же значения matcher применяются, как для `PreCompact`:
3323 3338
3327| `auto` | После auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3342| `auto` | После auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |
3328 3343
3329<h4 id="postcompact-input">3344<h4 id="postcompact-input">
3330 Ввод PostCompact3345 PostCompact input
3331</h4>3346</h4>
3332 3347
3333Помимо [общих полей ввода](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией compact.3348Помимо [общих полей ввода](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией compact.
3343}3358}
3344```3359```
3345 3360
3346Hooks PostCompact не имеют управления решением. Они не могут влиять на результат сжатия, но могут выполнять последующие задачи.3361Hooks PostCompact не имеют управления решениями. Они не могут влиять на результат сжатия, но могут выполнять последующие задачи.
3347 3362
3348<h3 id="premodelswitch">3363<h3 id="premodelswitch">
3349 PreModelSwitch3364 PreModelSwitch
3350</h3>3365</h3>
3351 3366
3352Запускается перед применением переключения модели, которое вы или клиент запросили. Используйте это для блокировки переключения, требования подтверждения или показа стоимости переключения перед его выполнением.3367Запускается перед применением Claude Code переключения модели, которое вы или клиент запросили. Используйте это для блокировки переключения, требования подтверждения или показа того, что переключение будет стоить, перед его возникновением.
3353 3368
3354PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:3369PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:
3355 3370
3359* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса3374* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса
3360* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)3375* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3361 3376
3362Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает самостоятельно, такие как [автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.3377Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает сам, такие как [автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.
3363 3378
3364Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Псевдоним, такой как `opus`, датированный ID модели и ID, специфичный для поставщика, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.3379Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Псевдоним, такой как `opus`, датированный ID модели и ID, специфичный для провайдера, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.
3365 3380
3366Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из своего ввода, а не полагаться только на matcher.3381Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из его ввода, а не полагаться только на matcher.
3367 3382
3368Напишите matcher как точное имя, список, разделенный `|`, такой как `claude-opus-4-6|claude-opus-5`, или регулярное выражение, такое как `.*opus.*`. Этот пример использует matcher точного имени и также проверяет `to_model` из ввода hook, поэтому он отказывает переключению на Opus 4.6 выходом 2 и позволяет любой другой цели пройти:3383Напишите matcher как точное имя, список, разделенный `|`, такой как `claude-opus-4-6|claude-opus-5`, или регулярное выражение, такое как `.*opus.*`. Этот пример использует matcher точного имени и также проверяет `to_model` из ввода hook, поэтому он отказывает переключению на Opus 4.6, выходя с кодом 2, и позволяет любой другой цели пройти:
3369 3384
3370<Tabs>3385<Tabs>
3371 <Tab title="macOS/Linux">3386 <Tab title="macOS/Linux">
3391 </Tab>3406 </Tab>
3392 3407
3393 <Tab title="Windows (PowerShell)">3408 <Tab title="Windows (PowerShell)">
3394 Зарегистрируйте command hook, который запускает скрипт через PowerShell:3409 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:
3395 3410
3396 ```json theme={null}3411 ```json theme={null}
3397 {3412 {
3431 </Tab>3446 </Tab>
3432</Tabs>3447</Tabs>
3433 3448
3434Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, работающего на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.3449Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, запущенного на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.
3435 3450
3436<h4 id="premodelswitch-input">3451<h4 id="premodelswitch-input">
3437 Ввод PreModelSwitch3452 PreModelSwitch input
3438</h4>3453</h4>
3439 3454
3440Помимо [общих полей ввода](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что стоит повторная отправка разговора на новую модель, поэтому hook может показать эту цифру перед переключением.3455Помимо [общих полей ввода](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что повторная отправка разговора на новую модель стоит, поэтому hook может показать эту цифру перед переключением.
3441 3456
3442| Поле | Тип | Описание |3457| Поле | Тип | Описание |
3443| :- | :- | :- |3458| :- | :- | :- |
3444| `from_model` | string | ID модели, на которую переключается |3459| `from_model` | string | ID модели, на которую переключается |
3445| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |3460| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |
3446| `requested_model` | string или `null` | Модель, которую назвал запрос: псевдоним, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |3461| `requested_model` | string или `null` | Модель, которую запрос назвал: псевдоним, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |
3447| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |3462| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3448| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш-чтение, кэш-создание и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |3463| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш-чтение, кэш-создание и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |
3449| `prompt_cache_warm` | boolean | Теплый ли кэш подсказок текущей модели, означая, что переключение его теряет |3464| `prompt_cache_warm` | boolean | Вероятно ли, что кэш подсказок текущей модели все еще теплый, означая, что переключение его теряет |
3450| `cache_ttl` | string | [Время жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |3465| `cache_ttl` | string | [Время жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |
3451| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` при ставке `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |3466| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` по ставке `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |
3452| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по вашим собственным ставкам организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил ставку по умолчанию |3467| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по собственным ставкам вашей организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил ставку по умолчанию |
3453 3468
3454Этот пример показывает ввод для `/model opus` в сеансе, работающем на Sonnet 5:3469Этот пример показывает ввод для `/model opus` в сеансе, запущенном на Sonnet 5:
3455 3470
3456```json theme={null}3471```json theme={null}
3457{3472{
3472```3487```
3473 3488
3474<h4 id="premodelswitch-decision-control">3489<h4 id="premodelswitch-decision-control">
3475 Управление решением PreModelSwitch3490 Управление решениями PreModelSwitch
3476</h4>3491</h4>
3477 3492
3478Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.3493Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.
3498}3513}
3499```3514```
3500 3515
3501Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет — `deny` > `ask` > `allow`.3516Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет `deny` > `ask` > `allow`.
3502 3517
3503Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета стоимости может вернуть `{"systemMessage": "..."}` и выйти 0.3518Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета о затратах может вернуть `{"systemMessage": "..."}` и выйти 0.
3504 3519
3505Hook PreModelSwitch, который не отвечает перед своим тайм-аутом, блокирует переключение. На [PreToolUse](#timeouts), в отличие от этого, тайм-аут command hook позволяет вызову инструмента продолжить. Тайм-аут по умолчанию для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандарты `prompt` и `agent` не применяются.3520Hook PreModelSwitch, который не отвечает перед своим тайм-аутом, блокирует переключение. На [PreToolUse](#timeouts), в отличие от этого, hook команды с истекшим временем позволяет вызову инструмента продолжить. Тайм-аут по умолчанию для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандарты `prompt` и `agent` не применяются.
3506 3521
3507Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).3522Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).
3508 3523
3519* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана3534* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана
3520* Claude Code восстанавливает модель при возобновлении сеанса3535* Claude Code восстанавливает модель при возобновлении сеанса
3521 3536
3522Claude Code не запускает hooks PostModelSwitch, когда модель из [цепочки fallback модели](/docs/ru/model-config#fallback-model-chains) обслуживает ход, потому что эта замена длится один ход и оставляет модель сеанса неизменной.3537Claude Code не запускает hooks PostModelSwitch, когда модель из [цепочки fallback модели](/docs/ru/model-config#fallback-model-chains) служит ходу, потому что эта замена длится один ход и оставляет модель сеанса неизменной.
3523 3538
3524Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.3539Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.
3525 3540
3543}3558}
3544```3559```
3545 3560
3546Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, работающего на другой модели, например запустите `/model opus` из сеанса Sonnet, затем спросите Claude, какое руководство оно имеет о текущей модели.3561Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, запущенного на другой модели, например запустите `/model opus` из сеанса Sonnet, затем попросите Claude, какое руководство у него есть о текущей модели.
3547 3562
3548<h4 id="postmodelswitch-input">3563<h4 id="postmodelswitch-input">
3549 Ввод PostModelSwitch3564 PostModelSwitch input
3550</h4>3565</h4>
3551 3566
3552Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сеанса.3567Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал сам, и `"resume"` для модели, восстановленной при возобновлении сеанса.
3553 3568
3554`requested_model` имеет значение `null`, когда `source` имеет значение `"auto"`. Когда `source` имеет значение `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.3569`requested_model` — это `null`, когда `source` — это `"auto"`. Когда `source` — это `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.
3555 3570
3556<h4 id="postmodelswitch-decision-control">3571<h4 id="postmodelswitch-decision-control">
3557 Управление решением PostModelSwitch3572 Управление решениями PostModelSwitch
3558</h4>3573</h4>
3559 3574
3560Claude Code берет ваш [простой текст stdout](#exit-code-0) hook при выходе 0 или `additionalContext` из JSON-вывода и доставляет его Claude со следующим запросом после переключения. Помимо [полей JSON-вывода](#json-output), доступных всем hooks, вы можете вернуть:3575Claude Code берет ваш [простой текст stdout](#exit-code-0) hook при выходе 0 или `additionalContext` из вывода JSON и доставляет его Claude со следующим запросом после переключения. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:
3561 3576
3562| Поле | Описание |3577| Поле | Описание |
3563| :- | :- |3578| :- | :- |
3564| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |3579| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |
3565 3580
3566Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для переключения целевой модели последнего.3581Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для переключения последней цели модели.
3567 3582
3568<h3 id="sessionend">3583<h3 id="sessionend">
3569 SessionEnd3584 SessionEnd
3575 3590
3576| Причина | Описание |3591| Причина | Описание |
3577| :- | :- |3592| :- | :- |
3578| `clear` | Сеанс очищен с командой `/clear` |3593| `clear` | Сеанс очищен с помощью команды `/clear` |
3579| `resume` | Сеанс переключен через интерактивный `/resume` |3594| `resume` | Сеанс переключен через интерактивный `/resume` |
3580| `logout` | Пользователь вышел |3595| `logout` | Пользователь вышел |
3581| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |3596| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |
3582| `other` | Другие причины выхода |3597| `other` | Другие причины выхода |
3583| `bypass_permissions_disabled` | Удалено в версии 2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |3598| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |
3584 3599
3585<h4 id="sessionend-input">3600<h4 id="sessionend-input">
3586 Ввод SessionEnd3601 SessionEnd input
3587</h4>3602</h4>
3588 3603
3589Помимо [общих полей ввода](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. [таблицу причин](#sessionend) выше для всех значений.3604Помимо [общих полей ввода](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. [таблицу причин](#sessionend) выше для всех значений.
3598}3613}
3599```3614```
3600 3615
3601Hooks SessionEnd не имеют управления решением. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage`.3616Hooks SessionEnd не имеют управления решениями. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage`.
3602 3617
3603Hooks SessionEnd имеют тайм-аут по умолчанию 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:3618Hooks SessionEnd имеют тайм-аут по умолчанию 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:
3604 3619
3605* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` per-hook в ваших файлах параметров, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандарт. Тайм-ауты, установленные на hooks, предоставленные плагином, не повышают бюджет.3620* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` per-hook в ваших файлах параметров, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандарт. Тайм-ауты, установленные на hooks, предоставленные plugin, не повышают бюджет.
3606* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится тайм-аутом для каждого hook без своего собственного `timeout`.3621* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится тайм-аутом для каждого hook без своего собственного `timeout`.
3607 3622
3608Этот пример устанавливает бюджет на 5 секунд:3623Этот пример устанавливает бюджет на 5 секунд:
3619 3634
3620Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.3635Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.
3621 3636
3622Поле matcher совпадает с названием сервера MCP.3637Поле matcher совпадает с именем сервера MCP.
3623 3638
3624<h4 id="elicitation-input">3639<h4 id="elicitation-input">
3625 Ввод Elicitation3640 Elicitation input
3626</h4>3641</h4>
3627 3642
3628Помимо [общих полей ввода](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные `mode`, `url`, `elicitation_id` и `requested_schema` поля.3643Помимо [общих полей ввода](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные поля `mode`, `url`, `elicitation_id` и `requested_schema`.
3629 3644
3630Для запроса в режиме формы, наиболее распространенный случай:3645Для режима формы elicitation, наиболее распространенный случай:
3631 3646
3632```json theme={null}3647```json theme={null}
3633{3648{
3647}3662}
3648```3663```
3649 3664
3650Для запроса в режиме URL, используемого для аутентификации на основе браузера:3665Для URL-режима elicitation, используемого для аутентификации на основе браузера:
3651 3666
3652```json theme={null}3667```json theme={null}
3653{3668{
3663```3678```
3664 3679
3665<h4 id="elicitation-output">3680<h4 id="elicitation-output">
3666 Вывод Elicitation3681 Elicitation output
3667</h4>3682</h4>
3668 3683
3669Чтобы ответить программно без показа диалога, верните объект JSON с `hookSpecificOutput`:3684Чтобы ответить программно без показа диалога, верните объект JSON с `hookSpecificOutput`:
3683| Поле | Значения | Описание |3698| Поле | Значения | Описание |
3684| :- | :- | :- |3699| :- | :- | :- |
3685| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |3700| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |
3686| `content` | object | Значения полей формы для отправки. Используется только, когда `action` имеет значение `accept` |3701| `content` | object | Значения полей формы для отправки. Используется только, когда `action` — это `accept` |
3687 3702
3688Код выхода 2 отклоняет запрос. Claude Code не показывает ваше сообщение stderr нигде.3703Код выхода 2 отклоняет elicitation. Claude Code не показывает ваше сообщение stderr нигде.
3689 3704
3690Claude Code действует на `hookSpecificOutput` из JSON-вывода hook Elicitation и отбрасывает `systemMessage` и `continue`.3705Claude Code действует на `hookSpecificOutput` из вывода JSON hook Elicitation и отбрасывает `systemMessage` и `continue`.
3691 3706
3692<h3 id="elicitationresult">3707<h3 id="elicitationresult">
3693 ElicitationResult3708 ElicitationResult
3694</h3>3709</h3>
3695 3710
3696Запускается после того, как пользователь ответит на запрос MCP. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.3711Запускается после того, как пользователь отвечает на запрос MCP elicitation. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.
3697 3712
3698Поле matcher совпадает с названием сервера MCP.3713Поле matcher совпадает с именем сервера MCP.
3699 3714
3700<h4 id="elicitationresult-input">3715<h4 id="elicitationresult-input">
3701 Ввод ElicitationResult3716 ElicitationResult input
3702</h4>3717</h4>
3703 3718
3704Помимо [общих полей ввода](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные `mode`, `elicitation_id` и `content` поля.3719Помимо [общих полей ввода](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные поля `mode`, `elicitation_id` и `content`.
3705 3720
3706```json theme={null}3721```json theme={null}
3707{3722{
3718```3733```
3719 3734
3720<h4 id="elicitationresult-output">3735<h4 id="elicitationresult-output">
3721 Вывод ElicitationResult3736 ElicitationResult output
3722</h4>3737</h4>
3723 3738
3724Чтобы переопределить ответ пользователя, верните объект JSON с `hookSpecificOutput`:3739Чтобы переопределить ответ пользователя, верните объект JSON с `hookSpecificOutput`:
3736| Поле | Значения | Описание |3751| Поле | Значения | Описание |
3737| :- | :- | :- |3752| :- | :- | :- |
3738| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3753| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |
3739| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` имеет значение `accept` |3754| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` — это `accept` |
3740 3755
3741Код выхода 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.3756Код выхода 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.
3742 3757
3743Claude Code действует на `hookSpecificOutput` из JSON-вывода hook ElicitationResult и отбрасывает `systemMessage` и `continue`.3758Claude Code действует на `hookSpecificOutput` из вывода JSON hook ElicitationResult и отбрасывает `systemMessage` и `continue`.
3744 3759
3745<h2 id="prompt-based-hooks">3760<h2 id="prompt-based-hooks">
3746 Prompt-based hooks3761 Prompt-based hooks