938| `PostCompact` | Нет | Показывает stderr только пользователю |938| `PostCompact` | Нет | Показывает stderr только пользователю |
939| `PreModelSwitch` | Да | Блокирует переключение модели и показывает stderr пользователю |939| `PreModelSwitch` | Да | Блокирует переключение модели и показывает stderr пользователю |
940| `PostModelSwitch` | Нет | Показывает stderr только пользователю; модель уже переключена |940| `PostModelSwitch` | Нет | Показывает stderr только пользователю; модель уже переключена |
941| `Elicitation` | Да | Отклоняет запрос elicitation |941| `Elicitation` | Да | Отклоняет запрос, и диалоговое окно не появляется |
942| `ElicitationResult` | Да | Блокирует ответ (действие становится отказом) |942| `ElicitationResult` | Да | Блокирует ответ (действие становится отказом) |
943| `WorktreeCreate` | Да | Любой ненулевой код выхода приводит к ошибке создания worktree |943| `WorktreeCreate` | Да | Любой ненулевой код выхода приводит к ошибке создания worktree |
944| `WorktreeRemove` | Да | Любой ненулевой код выхода приводит к ошибке удаления worktree, если каталог после этого всё ещё существует. Смотрите [WorktreeRemove](#worktreeremove), чтобы узнать, что происходит с каталогом |944| `WorktreeRemove` | Да | Любой ненулевой код выхода приводит к ошибке удаления worktree, если каталог после этого всё ещё существует. Смотрите [WorktreeRemove](#worktreeremove), чтобы узнать, что происходит с каталогом |
1095| PermissionDenied | `hookSpecificOutput` | `retry: true` сообщает модели, что она может повторить попытку отклонённого вызова инструмента; Claude Code игнорирует его для [отказов без вердикта](#permissiondenied-decision-control) |1095| PermissionDenied | `hookSpecificOutput` | `retry: true` сообщает модели, что она может повторить попытку отклонённого вызова инструмента; Claude Code игнорирует его для [отказов без вердикта](#permissiondenied-decision-control) |
1096| WorktreeCreate | возврат пути | Командный хук выводит путь в stdout; HTTP-хук возвращает `hookSpecificOutput.worktreePath`. Сбой хука или отсутствие пути прерывает создание |1096| WorktreeCreate | возврат пути | Командный хук выводит путь в stdout; HTTP-хук возвращает `hookSpecificOutput.worktreePath`. Сбой хука или отсутствие пути прерывает создание |
1097| WorktreeRemove | Код выхода | Любой ненулевой код выхода приводит к ошибке удаления, если каталог после этого всё ещё существует. Вывод JSON отбрасывается |1097| WorktreeRemove | Код выхода | Любой ненулевой код выхода приводит к ошибке удаления, если каталог после этого всё ещё существует. Вывод JSON отбрасывается |
1098| Elicitation | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (значения полей формы для accept) |1098| Elicitation, ElicitationResult | `hookSpecificOutput` или `decision` верхнего уровня | `action` (accept/decline/cancel), `content` (значения полей формы). `decision: "block"` также [отклоняет запрос](#other-ways-to-decline-an-elicitation) |
1099| ElicitationResult | `hookSpecificOutput` | `action` (accept/decline/cancel), `content` (переопределение значений полей формы) |
1100| MessageDisplay | `hookSpecificOutput` | `displayContent` заменяет отображаемый на экране текст. Только для отображения: транскрипт и то, что видит Claude, сохраняют оригинал |1099| MessageDisplay | `hookSpecificOutput` | `displayContent` заменяет отображаемый на экране текст. Только для отображения: транскрипт и то, что видит Claude, сохраняют оригинал |
1101| SessionStart, SubagentStart, PostModelSwitch | Только контекст | `hookSpecificOutput.additionalContext` добавляет контекст для Claude. SessionStart также принимает [`initialUserMessage`, `watchPaths`, `sessionTitle` и `reloadSkills`](#sessionstart-decision-control). Без блокировки и управления решениями |1100| SessionStart, SubagentStart, PostModelSwitch | Только контекст | `hookSpecificOutput.additionalContext` добавляет контекст для Claude. SessionStart также принимает [`initialUserMessage`, `watchPaths`, `sessionTitle` и `reloadSkills`](#sessionstart-decision-control). Без блокировки и управления решениями |
1102| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Нет | Без управления решениями. Используются для побочных эффектов, таких как логирование или очистка |1101| Setup, Notification, SessionEnd, PostCompact, InstructionsLoaded, StopFailure, CwdChanged, DirectoryAdded, FileChanged | Нет | Без управления решениями. Используются для побочных эффектов, таких как логирование или очистка |
1169 SessionStart1168 SessionStart
1170</h3>1169</h3>
1171 1170
1172Выполняется, когда Claude Code запускает новую сессию или возобновляет существующую. Полезно для загрузки контекста разработки, например существующих задач или недавних изменений в кодовой базе, или для настройки переменных окружения. Для статического контекста, которому не нужен скрипт, используйте вместо этого [CLAUDE.md](/docs/ru/memory).1171Выполняется, когда Claude Code начинает новую сессию или возобновляет существующую. Полезно для загрузки контекста разработки, например существующих задач или недавних изменений в вашей кодовой базе, или для настройки переменных окружения. Для статического контекста, которому не требуется скрипт, используйте вместо этого [CLAUDE.md](/docs/ru/memory).
1173 1172
1174SessionStart выполняется в каждой сессии, поэтому такие хуки должны работать быстро. Поддерживаются только хуки `type: "command"` и `type: "mcp_tool"`. О том, когда выполняются хуки `mcp_tool`, см. [Поля хуков MCP-инструментов](#mcp-tool-hook-fields).1173SessionStart выполняется в каждой сессии, поэтому такие хуки должны работать быстро. Поддерживаются только хуки `type: "command"` и `type: "mcp_tool"`. О том, когда выполняются хуки `mcp_tool`, см. [Поля хуков инструментов MCP](#mcp-tool-hook-fields).
1175 1174
1176Значение matcher соответствует тому, как была инициирована сессия:1175Значение matcher соответствует тому, как была запущена сессия:
1177 1176
1178| Matcher | Когда срабатывает |1177| Matcher | Когда срабатывает |
1179| :- | :- |1178| :- | :- |
1181| `resume` | `--resume`, `--continue` или `/resume` |1180| `resume` | `--resume`, `--continue` или `/resume` |
1182| `clear` | `/clear` |1181| `clear` | `/clear` |
1183| `compact` | Автоматическое или ручное сжатие контекста |1182| `compact` | Автоматическое или ручное сжатие контекста |
1184| `fork` | Новая сессия, ответвлённая от существующей: `--fork-session` вместе с `--resume` или `--continue`, фоновая копия `/fork`, `/branch` или диалог, который вы [перевели в фон](/docs/ru/agent-view#from-inside-a-session) |1183| `fork` | Новая сессия, ответвлённая от существующей: `--fork-session` вместе с `--resume` или `--continue`, фоновая копия `/fork`, `/branch` или диалог, который вы [переводите в фон](/docs/ru/agent-view#from-inside-a-session) |
1185 1184
1186До v2.1.214 ответвлённые сессии сообщали источник `"resume"`.1185До версии v2.1.214 ответвлённые сессии сообщали источник `"resume"`.
1187 1186
1188Когда вы запускаете интерактивную сессию, возобновляете диалог при запуске с помощью `--continue` или `--resume` или выполняете `/clear`, хуки SessionStart выполняются в фоне. Вы можете сразу начать вводить текст, а возобновлённый диалог появляется, не дожидаясь хуков. Первый ответ Claude всё же ожидает завершения хуков, чтобы их контекст дошёл до Claude.1187Когда вы запускаете интерактивную сессию, возобновляете диалог при запуске с помощью `--continue` или `--resume` или выполняете `/clear`, хуки SessionStart выполняются в фоне. Вы можете сразу начать печатать, а возобновлённый диалог появляется, не дожидаясь хуков. Первый ответ Claude всё равно ждёт завершения хуков, чтобы их контекст дошёл до Claude.
1189 1188
1190Когда вы переключаете диалоги с помощью `/resume` внутри сессии, переключение, напротив, ожидает завершения хуков. Если вы выполните `/clear` или переключитесь на другой диалог, пока фоновые хуки ещё работают, ничто из возвращённого ими к сессии не применяется.1189Когда вы переключаетесь между диалогами с помощью `/resume` внутри сессии, переключение, наоборот, ждёт завершения хуков. Если вы выполните `/clear` или переключитесь на другой диалог, пока фоновые хуки ещё выполняются, ничего из того, что они вернут, не применяется к сессии.
1191 1190
1192То же ожидание действует при запуске, в том числе для возобновлённой сессии: промпт, отправленный, пока хуки SessionStart ещё выполняются, не дойдёт до Claude, пока они не завершатся.1191То же ожидание действует и при запуске, включая возобновлённую сессию: промпт, отправленный, пока хуки SessionStart ещё выполняются, не дойдёт до Claude, пока они не завершатся.
1193 1192
1194Во время любого из этих ожиданий нажмите `Esc`, чтобы вернуть промпт в поле ввода, не отправляя его. Хуки продолжат выполняться.1193Во время любого из этих ожиданий нажмите `Esc`, чтобы вернуть промпт в поле ввода, не отправляя его. Хуки продолжают выполняться.
1195 1194
1196<h4 id="sessionstart-input">1195<h4 id="sessionstart-input">
1197 Входные данные SessionStart1196 Входные данные SessionStart
1201 1200
1202| Поле | Описание |1201| Поле | Описание |
1203| :- | :- |1202| :- | :- |
1204| `source` | Как началась сессия: `"startup"` для новых сессий, `"resume"` для возобновлённых, `"clear"` после `/clear`, `"compact"` после сжатия контекста или `"fork"` для новой сессии, ответвлённой от существующей |1203| `source` | Как началась сессия: `"startup"` для новых сессий, `"resume"` для возобновлённых сессий, `"clear"` после `/clear`, `"compact"` после сжатия контекста или `"fork"` для новой сессии, ответвлённой от существующей |
1205| `model` | Идентификатор активной модели. Может отсутствовать, например после `/clear` или когда сессия восстановлена через восстановление диалога, поэтому проверяйте наличие поля перед чтением |1204| `model` | Идентификатор активной модели. Может отсутствовать, например после `/clear` или когда сессия восстановлена через восстановление диалога, поэтому проверяйте наличие поля перед его чтением |
1206| `agent_type` | Имя агента; присутствует, когда вы запускаете Claude Code командой `claude --agent <name>` |1205| `agent_type` | Имя агента; присутствует, когда вы запускаете Claude Code с `claude --agent <name>` |
1207| `session_title` | Пользовательское название сессии; присутствует, если оно задано, например через `--name`, `/rename`, вывод хука `sessionTitle` или `renameSession()` в Agent SDK. Хук, выдающий `sessionTitle`, может сначала проверить это поле, чтобы не перезаписать существующее пользовательское название |1206| `session_title` | Пользовательское название сессии; присутствует, если оно задано, например через `--name`, `/rename`, вывод `sessionTitle` хука или `renameSession()` в Agent SDK. Хук, который выдаёт `sessionTitle`, может сначала проверить это поле, чтобы не перезаписать существующее пользовательское название |
1208 1207
1209У сессии, которую вы не назвали, всё равно может быть [сгенерированное название](/docs/ru/sessions#name-your-sessions). Такое название не является пользовательским и не появляется в `session_title`.1208У сессии, которой вы не дали имя, всё равно может быть [сгенерированное название](/docs/ru/sessions#name-your-sessions). Такое название не является пользовательским и не появляется в `session_title`.
1210 1209
1211Когда `source` равно `"resume"` или `"fork"` и транскрипт содержит хотя бы один ответ от Claude, хуки SessionStart также получают четыре поля ниже. Ваш хук может использовать их, чтобы до первого запроса сообщить, во что обойдётся возобновление устаревшего диалога, например в [`systemMessage`](#json-output). Для этих полей требуется Claude Code v2.1.251 или новее.1210Когда `source` равен `"resume"` или `"fork"` и транскрипт содержит хотя бы один ответ Claude, хуки SessionStart также получают четыре поля, перечисленные ниже. Ваш хук может использовать их, чтобы до первого запроса сообщить, во что обойдётся возобновление устаревшего диалога, например в [`systemMessage`](#json-output). Для этих полей требуется Claude Code v2.1.251 или новее.
1212 1211
1213| Поле | Описание |1212| Поле | Описание |
1214| :- | :- |1213| :- | :- |
1215| `seconds_since_last_response` | Реальное время в секундах с момента последнего ответа в возобновлённом транскрипте |1214| `seconds_since_last_response` | Реальное время в секундах с момента последнего ответа в возобновлённом транскрипте |
1216| `context_tokens` | Токены, которые первый запрос возобновлённой сессии повторно отправляет в качестве промпта |1215| `context_tokens` | Токены, которые первый запрос возобновлённой сессии повторно отправляет в качестве промпта |
1217| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [времени жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime) сессии или более позднее сжатие контекста заменило кэшированный диалог |1216| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [срока жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime) сессии или когда последующее сжатие контекста заменило кэшированный диалог |
1218| `estimated_cache_write_usd` | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на модели сессии, без учёта ответа |1217| `estimated_cache_write_usd` | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на модели сессии, без учёта ответа |
1219 1218
1220В этом примере показаны входные данные для сессии, возобновлённой через 90 минут после последнего ответа:1219В этом примере показаны входные данные для сессии, возобновлённой через 90 минут после её последнего ответа:
1221 1220
1222```json theme={null}1221```json theme={null}
1223{1222{
1242 1241
1243| Поле | Описание |1242| Поле | Описание |
1244| :- | :- |1243| :- | :- |
1245| `additionalContext` | Строка, добавляемая в контекст Claude в начале диалога, перед первым промптом. О том, как доставляется текст и что в него включать, см. [Добавление контекста для Claude](#add-context-for-claude) |1244| `additionalContext` | Строка, добавляемая в контекст Claude в начале диалога, до первого промпта. О том, как доставляется текст и что в него помещать, см. [Добавление контекста для Claude](#add-context-for-claude) |
1246| `initialUserMessage` | Строка, используемая как первое пользовательское сообщение сессии. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если промпт не передан. Если промпт передан, он следует как следующий ход. В отличие от `additionalContext`, который прикрепляется к существующему ходу, это поле создаёт ход |1245| `initialUserMessage` | Строка, используемая как первое пользовательское сообщение сессии. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если промпт не передан. Если промпт передан, он следует за ней как следующий ход. В отличие от `additionalContext`, который прикрепляется к существующему ходу, это поле создаёт ход |
1247| `sessionTitle` | Задаёт название сессии с тем же эффектом, что и `/rename`. Используйте для автоматического именования сессий по каталогу запуска, ветке git или имени worktree. Применяется, когда `source` равно `"startup"`, `"resume"` или `"fork"`; игнорируется при `"clear"` и `"compact"` |1246| `sessionTitle` | Задаёт название сессии, с тем же эффектом, что и `/rename`. Используйте, чтобы автоматически именовать сессии по папке запуска, ветке git или имени worktree. Применяется, когда `source` равен `"startup"`, `"resume"` или `"fork"`; игнорируется для `"clear"` и `"compact"` |
1248| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) в этой сессии |1247| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) во время этой сессии |
1249| `reloadSkills` | Логическое значение. При `true` Claude Code повторно сканирует каталоги [скиллов](/docs/ru/skills) и команд после завершения хуков SessionStart, так что установленные хуком скиллы доступны в той же сессии, начиная с первого промпта |1248| `reloadSkills` | Логическое значение. При `true` Claude Code повторно сканирует каталоги [скиллов](/docs/ru/skills) и команд после завершения хуков SessionStart, чтобы скиллы, установленные хуком, были доступны в той же сессии, начиная с первого промпта |
1250 1249
1251```json theme={null}1250```json theme={null}
1252{1251{
1258}1257}
1259```1258```
1260 1259
1261Поскольку для этого события обычный stdout и так доходит до Claude, хук, который только загружает контекст, может выводить данные прямо в stdout, не формируя JSON. Используйте форму JSON, когда нужно совместить контекст с другими полями, например `sessionTitle`.1260Поскольку для этого события обычный stdout и так доходит до Claude, хук, который только загружает контекст, может выводить его прямо в stdout, не формируя JSON. Используйте форму JSON, когда нужно совместить контекст с другими полями, например `sessionTitle`.
1262 1261
1263Используйте `reloadSkills`, когда хук SessionStart устанавливает или обновляет скиллы. Обнаружение скиллов обычно выполняется до завершения хуков SessionStart, поэтому файлы, которые хук записывает в `~/.claude/skills/` или `.claude/skills/`, иначе появились бы только в следующей сессии. В этом примере синхронизируется общий репозиторий скиллов и запрашивается повторное сканирование:1262Используйте `reloadSkills`, когда хук SessionStart устанавливает или обновляет скиллы. Обнаружение скиллов обычно выполняется до завершения хуков SessionStart, поэтому файлы, которые хук записывает в `~/.claude/skills/` или `.claude/skills/`, иначе появились бы только в следующей сессии. Этот пример синхронизирует общий репозиторий скиллов и запрашивает повторное сканирование:
1264 1263
1265```bash theme={null}1264```bash theme={null}
1266#!/bin/bash1265#!/bin/bash
1271echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1270echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1272```1271```
1273 1272
1274URL репозитория — это заполнитель; замените его на собственный репозиторий скиллов. С заполнителем клонирование завершится ошибкой и выведет сообщение `fatal:` в stderr. Stderr хука SessionStart, завершившегося с кодом 0, носит лишь информационный характер, поэтому запрос `reloadSkills` всё равно применяется.1273URL репозитория здесь — заглушка; замените его на собственный репозиторий скиллов. С заглушкой клонирование завершается ошибкой и выводит сообщение `fatal:` в stderr. Stderr хука SessionStart, завершившегося с кодом 0, носит лишь информационный характер, поэтому запрос `reloadSkills` всё равно применяется.
1275 1274
1276<h4 id="persist-environment-variables">1275<h4 id="persist-environment-variables">
1277 Сохранение переменных окружения1276 Сохранение переменных окружения
1278</h4>1277</h4>
1279 1278
1280Хукам SessionStart доступна переменная окружения `CLAUDE_ENV_FILE`, содержащая путь к файлу, в котором можно сохранять переменные окружения для последующих команд Bash.1279Хуки SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая содержит путь к файлу, где можно сохранить переменные окружения для последующих команд Bash.
1281 1280
1282Чтобы задать отдельные переменные окружения, запишите инструкции `export` в `CLAUDE_ENV_FILE`. Используйте дозапись (`>>`), чтобы сохранить переменные, заданные другими хуками:1281Чтобы задать отдельные переменные окружения, запишите инструкции `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`), чтобы сохранить переменные, заданные другими хуками:
1283 1282
1284```bash theme={null}1283```bash theme={null}
1285#!/bin/bash1284#!/bin/bash
1313```1312```
1314 1313
1315<Note>1314<Note>
1316 `CLAUDE_ENV_FILE` доступна для хуков SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged). Хукам других типов эта переменная недоступна.1315 `CLAUDE_ENV_FILE` доступна для хуков SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged). Другие типы хуков не имеют доступа к этой переменной.
1317</Note>1316</Note>
1318 1317
1319<h3 id="setup">1318<h3 id="setup">
1320 Setup1319 Setup
1321</h3>1320</h3>
1322 1321
1323Срабатывает, только когда вы запускаете Claude Code с `--init-only` либо с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. При обычном запуске не срабатывает. Используйте его для однократной установки зависимостей или плановой очистки, которую вы явно запускаете из CI или скриптов, отдельно от обычного запуска сессии. Для инициализации каждой сессии используйте вместо этого [SessionStart](#sessionstart).1322Срабатывает только при запуске Claude Code с `--init-only` либо с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. При обычном запуске не срабатывает. Используйте его для одноразовой установки зависимостей или плановой очистки, которую вы явно запускаете из CI или скриптов, отдельно от обычного запуска сессии. Для инициализации на уровне каждой сессии используйте вместо этого [SessionStart](#sessionstart).
1324 1323
1325Значение matcher соответствует флагу CLI, вызвавшему хук:1324Значение matcher соответствует флагу CLI, который вызвал хук:
1326 1325
1327| Matcher | Когда срабатывает |1326| Matcher | Когда срабатывает |
1328| :- | :- |1327| :- | :- |
1331 1330
1332Когда вы выполняете `claude --init-only`, Claude Code запускает хуки Setup и хуки `SessionStart` с matcher `startup`, а затем завершает работу, не начиная диалог.1331Когда вы выполняете `claude --init-only`, Claude Code запускает хуки Setup и хуки `SessionStart` с matcher `startup`, а затем завершает работу, не начиная диалог.
1333 1332
1334Когда вы начинаете или продолжаете диалог с `-p`, также нужно передать промпт — как аргумент или через stdin. Промпт можно не передавать, если хук `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или если вы возобновляете сессию с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).1333Когда вы начинаете или продолжаете диалог с `-p`, нужно также передать промпт — в качестве аргумента или через stdin. Промпт можно не передавать, если хук `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или если вы возобновляете сессию с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).
1335 1334
1336При успехе `--init-only` ничего не выводит в терминал. Чтобы убедиться, что хуки выполнились, запустите `claude --debug-file <path> --init-only`, заменив `<path>` на расположение файла лога, и проверьте в логе записи хуков Setup и SessionStart.1335При успешном выполнении `--init-only` ничего не выводит в терминал. Чтобы убедиться, что хуки выполнились, запустите `claude --debug-file <path> --init-only`, заменив `<path>` на расположение файла лога, и проверьте в логе записи хуков Setup и SessionStart.
1337 1336
1338Поскольку Setup срабатывает не при каждом запуске, плагин, которому нужна установленная зависимость, не может полагаться только на Setup. Практичный подход — проверять наличие зависимости при первом использовании и устанавливать её при отсутствии, например с помощью хука или скилла, который проверяет `${CLAUDE_PLUGIN_DATA}/node_modules` и выполняет `npm install`, если каталога нет. О том, где хранить установленные зависимости, см. [постоянный каталог данных](/docs/ru/plugins/components#path-variables-and-persistent-data). Если вы распространяете плагин через маркетплейс, этот подход может не понадобиться: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins/loading#node-js-package-dependencies) при кэшировании плагина.1337Поскольку Setup срабатывает не при каждом запуске, плагин, которому нужна установленная зависимость, не может полагаться только на Setup. Практичный подход — проверять наличие зависимости при первом использовании и устанавливать её при отсутствии, например хуком или скиллом, который проверяет наличие `${CLAUDE_PLUGIN_DATA}/node_modules` и выполняет `npm install`, если его нет. О том, где хранить установленные зависимости, см. [постоянный каталог данных](/docs/ru/plugins/components#path-variables-and-persistent-data). Если вы распространяете плагин через маркетплейс, этот подход может не понадобиться: Claude Code [автоматически устанавливает подходящие зависимости пакетов Node.js](/docs/ru/plugins/loading#node-js-package-dependencies) при кэшировании плагина.
1339 1338
1340<h4 id="setup-input">1339<h4 id="setup-input">
1341 Входные данные Setup1340 Входные данные Setup
1357 Управление решениями Setup1356 Управление решениями Setup
1358</h4>1357</h4>
1359 1358
1360Хуки Setup не могут блокировать; выполнение продолжается при любом коде выхода. При любом коде выхода Claude Code отбрасывает [поля вывода JSON](#json-output) хука Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода хука Setup появляются в выводе запуска только в виде [событий `hook_response`](/docs/ru/headless#read-session-metadata), когда вы запускаете с `--output-format stream-json --verbose`.1359Хуки Setup не могут блокировать; выполнение продолжается при любом коде выхода. При любом коде выхода Claude Code отбрасывает [поля вывода JSON](#json-output) хука Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода хука Setup появляются в выводе запуска только как [события `hook_response`](/docs/ru/headless#read-session-metadata), когда вы запускаете с `--output-format stream-json --verbose`.
1361 1360
1362Хуки Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются для последующих команд Bash в сессии, как в [хуках SessionStart](#persist-environment-variables). На `Setup` выполняются только хуки `type: "command"`. Хук `type: "mcp_tool"` на `Setup` всегда пропускается, как описано в разделе [Поля хука MCP-инструмента](#mcp-tool-hook-fields).1361Хуки Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются для последующих команд Bash в сессии, как и в [хуках SessionStart](#persist-environment-variables). Для `Setup` выполняются только хуки `type: "command"`. Хук `type: "mcp_tool"` для `Setup` всегда пропускается, как описано в разделе [Поля хуков инструментов MCP](#mcp-tool-hook-fields).
1363 1362
1364<h3 id="instructionsloaded">1363<h3 id="instructionsloaded">
1365 InstructionsLoaded1364 InstructionsLoaded
1366</h3>1365</h3>
1367 1366
1368Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при старте сессии для файлов, загружаемых сразу, и позже при отложенной загрузке файлов, например когда Claude обращается к подкаталогу, содержащему вложенный `CLAUDE.md`, или когда срабатывают условные правила с frontmatter `paths:`. Хук не поддерживает блокировку или управление решениями. Он выполняется асинхронно в целях наблюдаемости.1367Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сессии для файлов, загружаемых сразу, и повторно позже, когда файлы загружаются отложенно, например когда Claude обращается к подкаталогу, содержащему вложенный `CLAUDE.md`, или когда срабатывают условные правила с frontmatter `paths:`. Хук не поддерживает блокировку или управление решениями. Он выполняется асинхронно в целях наблюдаемости.
1369 1368
1370Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через настройку **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` — с `load_reason`, равным `include`, как для любого другого импортированного файла, — и когда `CLAUDE.md` является символической ссылкой на него — как обычная загрузка `CLAUDE.md`.1369Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через настройку **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` — с `load_reason`, равным `include`, как и для любого другого импортируемого файла, — а также когда `CLAUDE.md` является символической ссылкой на него, как при обычной загрузке `CLAUDE.md`.
1371 1370
1372Matcher сопоставляется с `load_reason`. Например, используйте `"matcher": "session_start"`, чтобы срабатывать только для файлов, загруженных при запуске сессии, или `"matcher": "path_glob_match|nested_traversal"`, чтобы срабатывать только при отложенных загрузках.1371Matcher сопоставляется с `load_reason`. Например, используйте `"matcher": "session_start"`, чтобы срабатывать только для файлов, загруженных при запуске сессии, или `"matcher": "path_glob_match|nested_traversal"`, чтобы срабатывать только при отложенной загрузке.
1373 1372
1374<h4 id="instructionsloaded-input">1373<h4 id="instructionsloaded-input">
1375 Входные данные InstructionsLoaded1374 Входные данные InstructionsLoaded
1381| :- | :- |1380| :- | :- |
1382| `file_path` | Абсолютный путь к загруженному файлу инструкций |1381| `file_path` | Абсолютный путь к загруженному файлу инструкций |
1383| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |1382| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |
1384| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций повторно загружаются после сжатия контекста |1383| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` используется, когда файлы инструкций повторно загружаются после сжатия контекста |
1385| `globs` | Glob-шаблоны путей из frontmatter `paths:` файла, если есть. Присутствует только для загрузок `path_glob_match` |1384| `globs` | Glob-шаблоны путей из frontmatter `paths:` файла, если они есть. Присутствует только при загрузках `path_glob_match` |
1386| `trigger_file_path` | Путь к файлу, обращение к которому вызвало эту загрузку, для отложенных загрузок |1385| `trigger_file_path` | Путь к файлу, обращение к которому вызвало эту загрузку, для отложенных загрузок |
1387| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |1386| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |
1388 1387
1402 Управление решениями InstructionsLoaded1401 Управление решениями InstructionsLoaded
1403</h4>1402</h4>
1404 1403
1405У хуков InstructionsLoaded нет управления решениями. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для журнала аудита, отслеживания соответствия требованиям или наблюдаемости.1404Хуки InstructionsLoaded не имеют управления решениями. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для журнала аудита, отслеживания соответствия требованиям или наблюдаемости.
1406 1405
1407<h3 id="userpromptsubmit">1406<h3 id="userpromptsubmit">
1408 UserPromptSubmit1407 UserPromptSubmit
1409</h3>1408</h3>
1410 1409
1411Запускается при отправке промпта, до того как Claude его обработает. Это позволяет1410Выполняется при отправке промпта, до того как Claude его обработает. Это позволяет
1412добавлять дополнительный контекст на основе промпта/диалога, проверять промпты или1411добавлять дополнительный контекст на основе промпта или диалога, проверять промпты или
1413блокировать определённые типы промптов.1412блокировать определённые типы промптов.
1414 1413
1415Хуки `UserPromptSubmit` срабатывают не только на промпты, которые вы вводите. Claude Code также запускает их, когда:1414Хуки `UserPromptSubmit` срабатывают не только на промпты, которые вы вводите. Claude Code также запускает их, когда:
1416 1415
1417* срабатывает [запланированная задача](/docs/ru/scheduled-tasks), включая итерацию `/loop`1416* срабатывает [запланированная задача](/docs/ru/scheduled-tasks), включая итерацию `/loop`
1418* [фоновый субагент](/docs/ru/sub-agents#run-subagents-in-foreground-or-background) отчитывается сессии, которая его запустила1417* [фоновый субагент](/docs/ru/sub-agents#run-subagents-in-foreground-or-background) отчитывается перед сессией, которая его запустила
1419* [другая сессия отправляет сообщение](/docs/ru/cross-session-messaging) в ваш основной диалог1418* [другая сессия отправляет сообщение](/docs/ru/cross-session-messaging) в ваш основной диалог
1420 1419
1421У хуков `UserPromptSubmit` таймаут по умолчанию составляет 30 секунд для типов `command`, `http` и `mcp_tool` — меньше, чем 600 секунд по умолчанию для этих типов в большинстве других событий. Поскольку этот хук выполняется перед каждым промптом и блокирует обработку моделью до своего завершения, зависший хук останавливает сессию. Если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.1420Хуки `UserPromptSubmit` имеют таймаут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool` — меньше, чем стандартные 600 секунд для этих типов в большинстве других событий. Поскольку этот хук выполняется перед каждым промптом и блокирует обработку моделью до своего завершения, зависший хук останавливает сессию. Если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1422 1421
1423За исключением command-хука, запущенного с [`async: true`](#run-hooks-in-the-background), command-, HTTP- или MCP-хук `UserPromptSubmit`, достигший таймаута, отменяется, а его вывод, включая любой `additionalContext`, отбрасывается. Промпт всё равно доходит до Claude, но без этого контекста. В транскрипте отображается уведомление с именем хука, сработавшим таймаутом и указанием на то, что вывод был отброшен.1422За исключением командного хука, который вы запускаете с [`async: true`](#run-hooks-in-the-background), хук `UserPromptSubmit` типа command, HTTP или MCP tool, достигший таймаута, отменяется, а его вывод, включая `additionalContext`, отбрасывается. Промпт всё равно доходит до Claude, но без этого контекста. В транскрипте отображается уведомление с именем хука, сработавшим таймаутом и сообщением о том, что вывод был отброшен.
1424 1423
1425[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, достигший таймаута, блокирует промпт с сообщением, в котором указаны хук и таймаут, поскольку callback в этом месте может выступать шлюзом политики, который не должен при сбое пропускать запросы. Сессия продолжается. До v2.1.208 таймаут callback для этого события завершал ход с ошибкой выполнения.1424[Хук обратного вызова Agent SDK](/docs/ru/agent-sdk/hooks) для `UserPromptSubmit`, достигший таймаута, блокирует промпт с сообщением, в котором названы хук и таймаут, поскольку обратный вызов в этом месте может выступать в роли шлюза политики, который не должен при сбое пропускать всё подряд. Сессия продолжается. До версии v2.1.208 таймаут обратного вызова для этого события завершал ход с ошибкой выполнения.
1426 1425
1427<h4 id="userpromptsubmit-input">1426<h4 id="userpromptsubmit-input">
1428 Входные данные UserPromptSubmit1427 Входные данные UserPromptSubmit
1429</h4>1428</h4>
1430 1429
1431Помимо [общих входных полей](#common-input-fields), хуки UserPromptSubmit получают поле `prompt`, содержащее отправленный текст. Вставленное содержимое, свёрнутое в заглушку `[Pasted text #N]`, приходит развёрнутым на своём месте. В сессиях, где Claude Code [помечает вставленный текст для Claude](/docs/ru/terminal-config#how-claude-treats-pasted-text), это развёрнутое содержимое находится между строкой `<pasted_content id="…">` и строкой `</pasted_content id="…">`, поэтому учитывайте эти строки, если ваш хук разбирает промпт.1430Помимо [общих входных полей](#common-input-fields), хуки UserPromptSubmit получают поле `prompt`, содержащее отправленный текст. Вставленное содержимое, свёрнутое в заполнитель `[Pasted text #N]`, поступает развёрнутым на своём месте. В сессиях, где Claude Code [помечает вставленный текст для Claude](/docs/ru/terminal-config#how-claude-treats-pasted-text), это развёрнутое содержимое находится между строкой `<pasted_content id="…">` и строкой `</pasted_content id="…">`, поэтому учитывайте эти строки, если ваш хук разбирает промпт.
1432 1431
1433Хуки UserPromptSubmit также получают `session_title`, когда у сессии есть пользовательское название, с тем же значением, что и [поле `session_title` в SessionStart](#sessionstart-input).1432Хуки UserPromptSubmit также получают `session_title`, когда у сессии есть пользовательское название, с тем же значением, что и у [поля `session_title` в SessionStart](#sessionstart-input).
1434 1433
1435```json theme={null}1434```json theme={null}
1436{1435{
1447 Управление решениями UserPromptSubmit1446 Управление решениями UserPromptSubmit
1448</h4>1447</h4>
1449 1448
1450Хуки `UserPromptSubmit` могут управлять тем, обрабатывается ли отправленный промпт, и добавлять контекст. Доступны все [поля вывода JSON](#json-output).1449Хуки `UserPromptSubmit` могут управлять тем, будет ли обработан отправленный промпт, и добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1451 1450
1452Есть два способа добавить контекст в диалог при коде выхода 0:1451Есть два способа добавить контекст в диалог при коде выхода 0:
1453 1452
1454* **stdout в виде обычного текста**: Claude Code добавляет в контекст Claude stdout, который он [обрабатывает как обычный текст](#exit-code-0)1453* **Обычный текст в stdout**: Claude Code добавляет в контекст Claude stdout, который он [обрабатывает как обычный текст](#exit-code-0)
1455* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст1454* **JSON с `additionalContext`**: используйте формат JSON ниже для более тонкого управления. Поле `additionalContext` добавляется как контекст
1456 1455
1457Ни один из каналов не создаёт видимой записи в транскрипте. Обычный stdout и значение `additionalContext` внедряются каждое как системное напоминание, начинающееся с имени хука; Claude читает оба. Чтобы подтвердить доставку, проверьте [отладочный лог](#debug-hooks).1456Ни один из каналов не создаёт видимой записи в транскрипте. Обычный stdout и значение `additionalContext` внедряются каждый как системное напоминание, начинающееся с имени хука; Claude читает оба. Чтобы убедиться в доставке, проверьте [лог отладки](#debug-hooks).
1458 1457
1459Чтобы заблокировать промпт, верните объект JSON с `decision`, равным `"block"`:1458Чтобы заблокировать промпт, верните объект JSON с `decision`, равным `"block"`:
1460 1459
1461| Поле | Описание |1460| Поле | Описание |
1462| :- | :- |1461| :- | :- |
1463| `decision` | `"block"` останавливает промпт до того, как он дойдёт до Claude. Не указывайте, чтобы разрешить промпту пройти |1462| `decision` | `"block"` останавливает промпт до того, как он дойдёт до Claude. Не указывайте, чтобы разрешить обработку промпта |
1464| `reason` | Показывается пользователю, когда `decision` равно `"block"`. Не добавляется в контекст |1463| `reason` | Показывается пользователю, когда `decision` равен `"block"`. Не добавляется в контекст |
1465| `additionalContext` | Строка, добавляемая в контекст Claude вместе с отправленным промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |1464| `additionalContext` | Строка, добавляемая в контекст Claude вместе с отправленным промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1466| `sessionTitle` | Задаёт название сессии. Используйте для автоматического именования сессий на основе содержимого промпта |1465| `sessionTitle` | Задаёт название сессии. Используйте, чтобы автоматически именовать сессии на основе содержимого промпта |
1467| `suppressOriginalPrompt` | Если `true`, когда хук блокирует промпт, текст промпта не включается в сообщение о блокировке. См. [Что остаётся после заблокированного промпта](#what-a-blocked-prompt-leaves-behind) |1466| `suppressOriginalPrompt` | Если `true` и хук блокирует промпт, текст промпта не включается в сообщение о блокировке. См. [Что остаётся после заблокированного промпта](#what-a-blocked-prompt-leaves-behind) |
1468 1467
1469Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr, и он не добавляется в контекст.1468Хук, который блокирует, завершаясь с кодом 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr, и он не добавляется в контекст.
1470 1469
1471```json theme={null}1470```json theme={null}
1472{1471{
1485 Что остаётся после заблокированного промпта1484 Что остаётся после заблокированного промпта
1486</h4>1485</h4>
1487 1486
1488Заблокированный промпт никогда не доходит до Claude, но его текст удаляется не везде. По умолчанию сообщение о блокировке, показываемое пользователю, заканчивается строкой `Original prompt:`, за которой следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сессии на диске. Чтобы исключить текст из сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает независимо от того, блокирует ли хук через `decision: "block"` или завершаясь с кодом 2.1487Заблокированный промпт никогда не доходит до Claude, но его текст удаляется не отовсюду. По умолчанию сообщение о блокировке, показываемое пользователю, заканчивается строкой `Original prompt:`, за которой следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сессии на диске. Чтобы исключить текст из сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает независимо от того, блокирует ли хук через `decision: "block"` или завершением с кодом 2.
1489 1488
1490`suppressOriginalPrompt` изменяет только сообщение о блокировке. Отправленный текст всё равно может появиться в локальных файлах, таких как транскрипт сессии и история промптов, поэтому блокирующий хук не является способом не допустить попадания секрета на диск. Чтобы ограничить или удалить эти файлы, см. [Хранение в открытом виде](/docs/ru/claude-directory#plaintext-storage) и [Очистка локальных данных](/docs/ru/claude-directory#clear-local-data).1489`suppressOriginalPrompt` изменяет только сообщение о блокировке. Отправленный текст всё равно может оказаться в локальных файлах, таких как транскрипт сессии и история промптов, поэтому блокирующий хук — не способ уберечь секрет от записи на диск. Чтобы ограничить или удалить эти файлы, см. [Хранение в открытом виде](/docs/ru/claude-directory#plaintext-storage) и [Очистка локальных данных](/docs/ru/claude-directory#clear-local-data).
1491 1490
1492<h3 id="userpromptexpansion">1491<h3 id="userpromptexpansion">
1493 UserPromptExpansion1492 UserPromptExpansion
1494</h3>1493</h3>
1495 1494
1496Выполняется, когда введённая пользователем команда разворачивается в промпт до того, как дойти до Claude. Используйте его, чтобы запретить прямой вызов определённых команд, внедрить контекст для конкретного скилла или логировать, какие команды вызывают пользователи. Например, хук с matcher `deploy` может блокировать `/deploy`, если нет файла подтверждения, а хук, соответствующий скиллу ревью, может добавлять чек-лист ревью команды как `additionalContext`.1495Выполняется, когда введённая пользователем команда разворачивается в промпт до того, как дойти до Claude. Используйте его, чтобы блокировать прямой вызов определённых команд, внедрять контекст для конкретного скилла или логировать, какие команды вызывают пользователи. Например, хук с matcher `deploy` может блокировать `/deploy`, если нет файла одобрения, а хук с matcher для скилла ревью может добавлять чек-лист ревью команды в качестве `additionalContext`.
1497 1496
1498Это событие покрывает путь, который не покрывает `PreToolUse`: хук `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только когда Claude вызывает этот инструмент, но прямой ввод `/skillname` обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1497Это событие покрывает путь, который не покрывает `PreToolUse`: хук `PreToolUse`, сопоставленный с инструментом `Skill`, срабатывает только когда Claude вызывает инструмент, а прямой ввод `/skillname` обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1499 1498
1500Сопоставляется по `command_name`. Оставьте matcher пустым, чтобы срабатывать для каждой команды, разворачивающейся в промпт.1499Сопоставляется с `command_name`. Оставьте matcher пустым, чтобы срабатывать на каждую команду промптового типа.
1501 1500
1502<h4 id="userpromptexpansion-input">1501<h4 id="userpromptexpansion-input">
1503 Входные данные UserPromptExpansion1502 Входные данные UserPromptExpansion
1524 Управление решениями UserPromptExpansion1523 Управление решениями UserPromptExpansion
1525</h4>1524</h4>
1526 1525
1527Хуки `UserPromptExpansion` могут блокировать развёртывание или добавлять контекст. Доступны все [поля вывода JSON](#json-output).1526Хуки `UserPromptExpansion` могут блокировать разворачивание или добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1528 1527
1529| Поле | Описание |1528| Поле | Описание |
1530| :- | :- |1529| :- | :- |
1531| `decision` | `"block"` не даёт команде развернуться. Не указывайте, чтобы разрешить продолжение |1530| `decision` | `"block"` не даёт команде развернуться. Не указывайте, чтобы разрешить продолжение |
1532| `reason` | Показывается пользователю, когда `decision` равно `"block"` |1531| `reason` | Показывается пользователю, когда `decision` равен `"block"` |
1533| `additionalContext` | Строка, добавляемая в контекст Claude вместе с развёрнутым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |1532| `additionalContext` | Строка, добавляемая в контекст Claude вместе с развёрнутым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1534 1533
1535Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr.1534Хук, который блокирует, завершаясь с кодом 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr.
1536 1535
1537```json theme={null}1536```json theme={null}
1538{1537{
1549 MessageDisplay1548 MessageDisplay
1550</h3>1549</h3>
1551 1550
1552Выполняется, пока сообщение ассистента потоково выводится на экран. Claude Code отображает сообщение частями: каждый раз, когда пакет только что завершённых строк готов к отрисовке, хук выполняется один раз с этими строками, и Claude Code отображает на их месте текст-замену, возвращённый хуком. Длинное сообщение порождает несколько вызовов; короткое может породить только один.1551Выполняется во время потокового вывода сообщения ассистента на экран. Claude Code отображает сообщение порциями: каждый раз, когда пакет новых завершённых строк готов к отрисовке, хук выполняется один раз с этими строками, и Claude Code отрисовывает на их месте текст замены, возвращённый хуком. Длинное сообщение порождает несколько вызовов; короткое может породить только один.
1553 1552
1554Используйте MessageDisplay, чтобы:1553Используйте MessageDisplay, чтобы:
1555 1554
1559 1558
1560Claude Code удерживает каждый пакет, пока ваш хук не вернёт результат, поэтому хук должен работать быстро. Если хук завершается ошибкой или по таймауту, Claude Code отображает исходный текст. Таймаут по умолчанию для этого события — 10 секунд; если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.1559Claude Code удерживает каждый пакет, пока ваш хук не вернёт результат, поэтому хук должен работать быстро. Если хук завершается ошибкой или по таймауту, Claude Code отображает исходный текст. Таймаут по умолчанию для этого события — 10 секунд; если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1561 1560
1562MessageDisplay влияет только на отображение: текст-замена меняет лишь то, что выводится на экран. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, а подробный режим показывает оригинал. Хук получает только текст сообщений ассистента, поэтому результаты инструментов и вводимый вами текст отображаются без изменений.1561MessageDisplay влияет только на отображение: текст замены изменяет лишь то, что отрисовывается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, а подробный режим показывает исходный текст. Хук получает только текст сообщений ассистента, поэтому результаты инструментов и вводимый вами текст отображаются без изменений.
1563 1562
1564MessageDisplay не поддерживает matcher и срабатывает для каждого сообщения ассистента, выводящего текст потоком; сообщения без текста, например ответы, содержащие только вызовы инструментов, его не вызывают.1563MessageDisplay не поддерживает matcher и срабатывает для каждого сообщения ассистента, которое выводит текст потоком; сообщения без текста, например ответы, состоящие только из вызовов инструментов, его не вызывают.
1565 1564
1566В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение ассистента, а не один раз на пакет строк. Единственный вызов приходит после завершения сообщения и содержит полный текст сообщения: `index` равно `0`, `final` равно `true`, а `delta` содержит всё сообщение. Хук, собирающий текст `delta` для каждого сообщения, получает одинаковый итоговый текст в обоих режимах.1565В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение ассистента, а не один раз на пакет строк. Единственный вызов приходит после завершения сообщения и содержит полный текст сообщения: `index` равен `0`, `final` равен `true`, а `delta` содержит всё сообщение. Хук, собирающий текст `delta` для каждого сообщения, получает один и тот же общий текст в обоих режимах.
1567 1566
1568<h4 id="messagedisplay-input">1567<h4 id="messagedisplay-input">
1569 Входные данные MessageDisplay1568 Входные данные MessageDisplay
1570</h4>1569</h4>
1571 1570
1572Помимо [общих входных полей](#common-input-fields), хуки MessageDisplay получают идентификаторы хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы пакетов зависят от того, как текст поступает потоком, поэтому используйте `index` и `final` для отслеживания прогресса по сообщению, а не рассчитывайте на определённую группировку строк.1571Помимо [общих входных полей](#common-input-fields), хуки MessageDisplay получают идентификаторы хода и сообщения, позицию этого вызова внутри сообщения и новый текст в `delta`. Границы пакетов зависят от того, как поступает поток текста, поэтому используйте `index` и `final` для отслеживания продвижения по сообщению, а не рассчитывайте на определённую группировку строк.
1573 1572
1574| Поле | Описание |1573| Поле | Описание |
1575| :- | :- |1574| :- | :- |
1576| `turn_id` | UUID текущего хода |1575| `turn_id` | UUID текущего хода |
1577| `message_id` | UUID отображаемого сообщения ассистента. Неизменен во всех пакетах одного сообщения. Это не идентификатор API `msg_…`, поэтому его нельзя сопоставить с идентификаторами сообщений в транскрипте |1576| `message_id` | UUID отображаемого сообщения ассистента. Одинаков для всех пакетов одного сообщения. Это не идентификатор API `msg_…`, поэтому его нельзя сопоставить с идентификаторами сообщений в транскрипте |
1578| `index` | Индекс этого пакета в сообщении, начиная с нуля |1577| `index` | Индекс этого пакета внутри сообщения, начиная с нуля |
1579| `final` | `true` для последнего пакета сообщения. У каждого сообщения ровно один последний пакет |1578| `final` | `true` для последнего пакета сообщения. У каждого сообщения ровно один финальный пакет |
1580| `delta` | Строки, завершённые после предыдущего пакета, включая завершающие символы новой строки. Всегда целые строки, кроме последнего пакета, который может закончиться посреди строки. В интерактивных запусках delta последнего пакета пуста, если сообщение заканчивается символом новой строки, поэтому считайте сигналом конца сообщения `final`, а не непустую delta. В запусках Agent SDK и `claude -p` единственный вызов содержит всё сообщение |1579| `delta` | Новые завершённые строки с момента предыдущего пакета, включая завершающие символы новой строки. Всегда целые строки, кроме финального пакета, который может заканчиваться посреди строки. В интерактивных запусках delta финального пакета пуста, если сообщение заканчивается символом новой строки, поэтому считайте сигналом конца сообщения `final`, а не непустую delta. В запусках Agent SDK и `claude -p` единственный вызов содержит всё сообщение |
1581 1580
1582```json theme={null}1581```json theme={null}
1583{1582{
1601 1600
1602| Поле | Описание |1601| Поле | Описание |
1603| :- | :- |1602| :- | :- |
1604| `displayContent` | Текст, отображаемый вместо delta. Не указывайте, чтобы отобразить оригинал |1603| `displayContent` | Текст, отображаемый вместо delta. Не указывайте, чтобы отобразить исходный текст |
1605 1604
1606У хуков MessageDisplay нет управления решениями. Они не могут блокировать сообщение или изменять то, что сохраняется в транскрипте или отправляется Claude. Claude Code учитывает `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.1605Хуки MessageDisplay не имеют управления решениями. Они не могут заблокировать сообщение или изменить то, что хранится в транскрипте или отправляется Claude. Claude Code использует `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.
1607 1606
1608В этом примере из ответов Claude удаляется форматирование markdown для отображения в виде обычного текста. Скрипт читает каждый пакет из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.1607Этот пример удаляет форматирование markdown из ответов Claude для отображения обычным текстом. Скрипт читает каждый пакет из stdin, удаляет из `delta` маркеры полужирного начертания и обратные кавычки встроенного кода и возвращает результат в виде `displayContent`.
1609 1608
1610<Tabs>1609<Tabs>
1611 <Tab title="macOS/Linux">1610 <Tab title="macOS/Linux">
1612 Зарегистрируйте command-хук для события в файле настроек:1611 Зарегистрируйте командный хук для события в файле настроек:
1613 1612
1614 ```json theme={null}1613 ```json theme={null}
1615 {1614 {
1638 </Tab>1637 </Tab>
1639 1638
1640 <Tab title="Windows (PowerShell)">1639 <Tab title="Windows (PowerShell)">
1641 Зарегистрируйте command-хук, который запускает скрипт через PowerShell:1640 Зарегистрируйте командный хук, который запускает скрипт через PowerShell:
1642 1641
1643 ```json theme={null}1642 ```json theme={null}
1644 {1643 {
1681 </Tab>1680 </Tab>
1682</Tabs>1681</Tabs>
1683 1682
1684Пакеты без markdown проходят без изменений. Если скрипт завершается ошибкой, например из-за отсутствия `jq`, Claude Code отображает исходный текст и отмечает сбой только в [отладочном выводе](#debug-hooks), а не в сессии.1683Пакеты без разметки markdown проходят без изменений. Если скрипт завершается ошибкой, например из-за отсутствия `jq`, Claude Code отображает исходный текст и отмечает сбой только в [отладочном выводе](#debug-hooks), а не в сессии.
1685 1684
1686<h3 id="pretooluse">1685<h3 id="pretooluse">
1687 PreToolUse1686 PreToolUse
1688</h3>1687</h3>
1689 1688
1690Выполняется после того, как Claude создаёт параметры инструмента, и до обработки вызова инструмента. Сопоставляется с любым именем инструмента, кроме `EndConversation`: встроенными инструментами, такими как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, а также любыми [именами MCP-инструментов](#match-mcp-tools).1689Выполняется после того, как Claude сформирует параметры инструмента, и до обработки вызова инструмента. Сопоставляется с любым именем инструмента, кроме `EndConversation`: со встроенными инструментами, такими как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, а также с любыми [именами инструментов MCP](#match-mcp-tools).
1691 1690
1692Чтобы запускать хук при изменении определённого файла на диске, кто бы его ни записал, используйте [FileChanged](#filechanged) вместо сопоставления инструментов редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает хуки FileChanged после изменения, и у них нет управления решениями, поэтому они не могут блокировать запись.1691Чтобы запускать хук при изменении конкретного файла на диске, независимо от того, что его записало, используйте [FileChanged](#filechanged) вместо сопоставления инструментов редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает хуки FileChanged после изменения, и у них нет управления решениями, поэтому они не могут заблокировать запись.
1693 1692
1694<Warning>1693<Warning>
1695 PreToolUse выполняется только когда Claude вызывает инструмент. Файлы, на которые вы [ссылаетесь через `@` в промпте](/docs/ru/common-workflows#reference-files-and-directories), добавляются без какого-либо вызова инструмента: Claude Code вставляет их содержимое при построении промпта, поэтому для них не срабатывает ни один хук PreToolUse, включая хуки, соответствующие `Read`. Чтобы заблокировать определённые пути для ссылок через `@`, используйте вместо этого [правило запрета `Read`](/docs/ru/permissions#read-and-edit).1694 PreToolUse выполняется только когда Claude вызывает инструмент. Файлы, на которые вы [ссылаетесь с помощью `@` в промпте](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при формировании промпта, поэтому для них не срабатывает ни один хук PreToolUse, включая хуки с matcher `Read`. Чтобы запретить определённые пути в ссылках `@`, используйте вместо этого [правило запрета `Read`](/docs/ru/permissions#read-and-edit).
1696 1695
1697 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).1696 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1698</Warning>1697</Warning>
1699 1698
1700Используйте [управление решениями PreToolUse](#pretooluse-decision-control), чтобы разрешить, запретить, запросить подтверждение или отложить вызов инструмента.1699Используйте [управление решениями PreToolUse](#pretooluse-decision-control), чтобы разрешить, запретить, запросить подтверждение или отложить вызов инструмента.
1701 1700
1702[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `PreToolUse`, превысивший таймаут, блокирует вызов инструмента, и Claude получает результат с ошибкой, указывающей на таймаут. Явный запрет, возвращённый другим хуком, по-прежнему имеет приоритет.1701[Хук обратного вызова Agent SDK](/docs/ru/agent-sdk/hooks) для `PreToolUse`, превысивший свой таймаут, блокирует вызов инструмента, и Claude получает результат с ошибкой, в котором указан таймаут. Явный запрет, возвращённый другим хуком, по-прежнему имеет приоритет.
1703 1702
1704<h4 id="pretooluse-input">1703<h4 id="pretooluse-input">
1705 Входные данные PreToolUse1704 Входные данные PreToolUse
1707 1706
1708Помимо [общих входных полей](#common-input-fields), хуки PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.1707Помимо [общих входных полей](#common-input-fields), хуки PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1709 1708
1710Для [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 или новее.1709Для [инструмента 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 или новее.
1711 1710
1712Для файловых инструментов `Write`, `Edit` и `Read` значение `tool_input.file_path` всегда абсолютное:1711Для файловых инструментов `Write`, `Edit` и `Read` значение `tool_input.file_path` всегда абсолютное:
1713 1712
1714* Claude Code раскрывает `~` и относительные пути до запуска хуков, поэтому хук, сопоставляющий пути, нельзя обойти через `~` или относительную запись того же пути1713* Claude Code разворачивает `~` и относительные пути до запуска хуков, поэтому хук, сопоставляющий пути, нельзя обойти через `~` или относительное написание того же пути
1715* В Windows путь приходит с разделителями-обратными слешами, даже если ваш хук работает в Git Bash, где `$PWD` выглядит как `/c/project`1714* В Windows путь приходит с разделителями-обратными слешами, даже если ваш хук выполняется в Git Bash, где `$PWD` выглядит как `/c/project`
1716* Сравнение, записанное с прямыми слешами, например проверка `/src/`, никогда не совпадёт с путём с обратными слешами, и вызов инструмента пройдёт так, будто хуку нечего блокировать1715* Сравнение, записанное с прямыми слешами, например проверка `/src/`, никогда не совпадёт с путём с обратными слешами, и вызов инструмента продолжится так, будто хуку нечего было блокировать
1717* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, а затем сопоставляйте сегмент пути, например `/src/`, а не привязывайтесь к началу через `^`, поскольку путь абсолютный1716* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, а затем сопоставляйте сегмент пути, например `/src/`, а не привязывайтесь к началу через `^`, поскольку путь абсолютный
1718 1717
1719Вызов `Write` в Windows передаёт:1718Вызов `Write` в Windows передаёт:
1747| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1746| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1748| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1747| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1749 1748
1750Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записывать, что изменилось. Изменения записываются во всех режимах разрешений, когда настройка [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; в описании этой настройки указано, в каких файлах её можно задать. В противном случае изменения записываются только в авторежиме и режиме `bypassPermissions`, и только когда Claude Code поручает Claude редактировать файлы через Bash. Установите `bashEditDiffEnabled` в `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не содержат diff.1749Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записывать, что изменилось. Он записывает изменения во всех режимах разрешений, если запись включена настройкой [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled); в описании этой настройки указано, какие файлы могут её задавать. В противном случае он записывает их только в авторежиме и режиме `bypassPermissions`, и только когда Claude Code направляет Claude редактировать файлы через Bash. Задайте `bashEditDiffEnabled` значение `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не содержат diff.
1751 1750
1752Затем ваш [хук PostToolUse](#posttooluse) получает изменённые файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории за время выполнения команды. Файлы, которые Git игнорирует, и файлы в подмодулях не включаются. Требуется Claude Code v2.1.269 или новее.1751Затем ваш [хук PostToolUse](#posttooluse) получает изменённые файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории во время выполнения команды. Файлы, игнорируемые Git, и файлы в подмодулях не перечисляются. Требуется Claude Code v2.1.269 или новее.
1753 1752
1754<Note>1753<Note>
1755 Список формируется по принципу «насколько возможно» и доступен в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который одновременно изменил другой процесс, или остановиться на своих ограничениях размера. Структура поля может измениться. Используйте список, чтобы найти, что проверить, а не для применения политики.1754 Список формируется по возможности и находится в стадии публичной беты. Claude Code может пропустить изменение, включить файл, который одновременно изменил другой процесс, или остановиться на своих ограничениях размера. Структура поля может измениться. Используйте список, чтобы найти, что нужно проверить, а не для применения политики.
1756</Note>1755</Note>
1757 1756
1758`changedFiles` и `files` перечисляют, что изменила команда; остальные поля показывают, насколько этот список полон и надёжен.1757`changedFiles` и `files` перечисляют, что изменила команда; остальные поля сообщают, насколько полон и надёжен этот список.
1759 1758
1760| Поле | Тип | Пример | Описание |1759| Поле | Тип | Пример | Описание |
1761| :- | :- | :- | :- |1760| :- | :- | :- | :- |
1762| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, изменённых командой, не более 200. Присутствует, когда `files` содержит diff или `moreFiles` больше нуля |1761| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, изменённых командой, не более 200. Присутствует, когда `files` содержит diff или `moreFiles` больше нуля |
1763| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff до 5 изменённых файлов для отображения. `created` или `deleted` равно `true` для файла, который команда добавила или удалила |1762| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff не более 5 изменённых файлов, для отображения. `created` или `deleted` равно `true` для файла, который команда добавила или удалила |
1764| `moreFiles` | number | `2` | Количество изменённых файлов без diff в `files` |1763| `moreFiles` | number | `2` | Количество изменённых файлов без diff в `files` |
1765| `unavailable` | boolean | `true` | Устанавливается, когда diff неполон или его не удалось получить |1764| `unavailable` | boolean | `true` | Задаётся, когда diff неполон или его не удалось получить |
1766| `skipped` | boolean | `true` | Устанавливается для команды Git, перемещающей рабочее дерево, например `git checkout` или `git stash`, поэтому Claude Code не получает diff |1765| `skipped` | boolean | `true` | Задаётся для команды Git, которая перемещает рабочее дерево, например `git checkout` или `git stash`, поэтому Claude Code не получает diff |
1767| `shared` | boolean | `true` | Устанавливается, когда другой вызов инструмента Bash, например субагента, выполнялся в том же репозитории в то же время, поэтому некоторые перечисленные изменения могут принадлежать той команде |1766| `shared` | boolean | `true` | Задаётся, когда другой вызов инструмента Bash, например вызов субагента, выполнялся в том же репозитории в то же время, поэтому некоторые перечисленные изменения могут относиться к той команде |
1768 1767
1769<a id="powershell" />1768<a id="powershell" />
1770 1769
1772 PowerShell1771 PowerShell
1773</h5>1772</h5>
1774 1773
1775Выполняет команды PowerShell. Доступность по платформам см. в разделе об [инструменте PowerShell](/docs/ru/tools-reference#powershell-tool).1774Выполняет команды PowerShell. Доступность по платформам см. в описании [инструмента PowerShell](/docs/ru/tools-reference#powershell-tool).
1776 1775
1777Поля совпадают с инструментом Bash, строка команды — в `command`:1776Поля совпадают с инструментом Bash, строка команды находится в `command`:
1778 1777
1779| Поле | Тип | Пример | Описание |1778| Поле | Тип | Пример | Описание |
1780| :- | :- | :- | :- |1779| :- | :- | :- | :- |
1783| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах |1782| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах |
1784| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1783| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1785 1784
1786В хуках, проверяющих shell-команды, используйте matcher `Bash|PowerShell`, чтобы охватить оба инструмента:1785В хуках, которые проверяют shell-команды, используйте matcher `Bash|PowerShell`, чтобы охватить оба инструмента:
1787 1786
1788* В Windows, где бы ни был включён инструмент PowerShell, Claude считает PowerShell основной оболочкой и направляет через неё shell-команды.1787* В Windows везде, где включён инструмент PowerShell, Claude считает PowerShell основной оболочкой и направляет shell-команды через неё.
1789* В Windows без Git Bash инструмент включается автоматически, а Claude Code вообще не регистрирует инструмент Bash.1788* В Windows без Git Bash инструмент включается автоматически, и Claude Code вообще не регистрирует инструмент Bash.
1790* Хук, соответствующий только `Bash`, там никогда не срабатывает.1789* Хук, сопоставленный только с `Bash`, там никогда не сработает.
1791 1790
1792<h5 id="write">1791<h5 id="write">
1793 Write1792 Write
1822| Поле | Тип | Пример | Описание |1821| Поле | Тип | Пример | Описание |
1823| :- | :- | :- | :- |1822| :- | :- | :- | :- |
1824| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |1823| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |
1825| `offset` | number | `10` | Необязательный номер строки, с которой начать чтение |1824| `offset` | number | `10` | Необязательный номер строки, с которой начинать чтение |
1826| `limit` | number | `50` | Необязательное количество строк для чтения |1825| `limit` | number | `50` | Необязательное количество строк для чтения |
1827 1826
1828<h5 id="glob">1827<h5 id="glob">
1855 WebFetch1854 WebFetch
1856</h5>1855</h5>
1857 1856
1858Загружает и обрабатывает веб-контент.1857Загружает и обрабатывает веб-содержимое.
1859 1858
1860| Поле | Тип | Пример | Описание |1859| Поле | Тип | Пример | Описание |
1861| :- | :- | :- | :- |1860| :- | :- | :- | :- |
1862| `url` | string | `"https://example.com/api"` | URL, с которого загружается контент |1861| `url` | string | `"https://example.com/api"` | URL, с которого загружается содержимое |
1863| `prompt` | string | `"Extract the API endpoints"` | Промпт, применяемый к загруженному контенту |1862| `prompt` | string | `"Extract the API endpoints"` | Промпт, применяемый к загруженному содержимому |
1864 1863
1865<h5 id="websearch">1864<h5 id="websearch">
1866 WebSearch1865 WebSearch
1871| Поле | Тип | Пример | Описание |1870| Поле | Тип | Пример | Описание |
1872| :- | :- | :- | :- |1871| :- | :- | :- | :- |
1873| `query` | string | `"react hooks best practices"` | Поисковый запрос |1872| `query` | string | `"react hooks best practices"` | Поисковый запрос |
1874| `allowed_domains` | array | `["docs.example.com"]` | Необязательно: включать результаты только с этих доменов |1873| `allowed_domains` | array | `["docs.example.com"]` | Необязательно: включать только результаты с этих доменов |
1875| `blocked_domains` | array | `["spam.example.com"]` | Необязательно: исключать результаты с этих доменов |1874| `blocked_domains` | array | `["spam.example.com"]` | Необязательно: исключать результаты с этих доменов |
1876 1875
1877<h5 id="agent">1876<h5 id="agent">
1887| `subagent_type` | string | `"Explore"` | Тип используемого специализированного агента |1886| `subagent_type` | string | `"Explore"` | Тип используемого специализированного агента |
1888| `model` | string | `"sonnet"` | Необязательный псевдоним модели для переопределения модели по умолчанию |1887| `model` | string | `"sonnet"` | Необязательный псевдоним модели для переопределения модели по умолчанию |
1889 1888
1890Когда вызов Agent на переднем плане завершается, ваш [хук PostToolUse](#posttooluse) получает результат субагента и телеметрию запуска в `tool_response`. Читайте эти поля для анализа запуска; для сводных данных по токенам и стоимости по всем субагентам используйте [счётчики токенов и стоимости](/docs/ru/monitoring-usage#token-counter) с фильтром `query_source` `"subagent"`, поскольку `totalTokens` и `usage` охватывают только последний запрос:1889Когда вызов Agent на переднем плане завершается, ваш [хук PostToolUse](#posttooluse) получает результат субагента и телеметрию запуска в `tool_response`. Читайте эти поля, чтобы изучить запуск; для сводок по токенам и стоимости по всем субагентам используйте [счётчики токенов и стоимости](/docs/ru/monitoring-usage#token-counter) с фильтром `query_source` `"subagent"`, поскольку `totalTokens` и `usage` охватывают только последний запрос:
1891 1890
1892| Поле | Тип | Пример | Описание |1891| Поле | Тип | Пример | Описание |
1893| :- | :- | :- | :- |1892| :- | :- | :- | :- |
1894| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. По умолчанию субагенты выполняются в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |1893| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. Субагенты по умолчанию выполняются в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |
1895| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор запуска субагента |1894| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор запуска субагента |
1896| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Итоговые текстовые блоки субагента или, для субагента, чей отчёт передаётся через `SubagentHandback`, вместо них краткая заметка об этой передаче |1895| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки субагента или, для субагента, чей отчёт передаётся через `SubagentHandback`, вместо них краткая заметка об этой передаче |
1897| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, с которой субагент начал работу; может отличаться от запрошенной |1896| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой субагент начал работу; может отличаться от запрошенной модели |
1898| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Использованные модели по порядку, с объединением последовательных повторов; задаётся только если модель была заменена во время запуска. Требуется Claude Code v2.1.212 или новее |1897| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Использованные модели по порядку, с объединением последовательных повторов; задаётся только когда модель сменилась во время запуска. Требуется Claude Code v2.1.212 или новее |
1899| `totalTokens` | number | `12450` | Количество токенов последнего запроса API субагента: входные, выходные и токены кэша вместе. Это не итог за весь запуск |1898| `totalTokens` | number | `12450` | Количество токенов из последнего запроса API субагента: входные, выходные и кэш-токены вместе. Это не итог за весь запуск |
1900| `totalDurationMs` | number | `48211` | Реальная длительность запуска субагента |1899| `totalDurationMs` | number | `48211` | Реальная длительность запуска субагента |
1901| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, сделанных субагентом |1900| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, сделанных субагентом |
1902| `usage` | object | `{"input_tokens": 8320, ...}` | Разбивка токенов последнего запроса API по типам: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1901| `usage` | object | `{"input_tokens": 8320, ...}` | Разбивка токенов по типам для последнего запроса API: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1903 1902
1904В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), передаёт свой отчёт через этот инструмент, а не возвращает его текстом. Тогда поле `content` его результата `completed` содержит краткую заметку об этой передаче, а не сам отчёт. Чтобы прочитать отчёт, настройте хук `PreToolUse` или `PostToolUse` с matcher `SubagentHandback` и читайте `tool_input.message`.1903В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), передаёт свой отчёт через этот инструмент, а не возвращает его текстом. Поле `content` его результата `completed` тогда содержит краткую заметку об этой передаче, а не сам отчёт. Чтобы прочитать отчёт, сопоставьте хук `PreToolUse` или `PostToolUse` с `SubagentHandback` и прочитайте `tool_input.message`.
1905 1904
1906Для фоновых субагентов инструмент возвращает результат, когда задача переходит в фон, поэтому `tool_response` не содержит полей использования: фоновый запуск возвращается сразу, а задача на переднем плане, которую Claude Code переводит в фон во время выполнения, возвращается в момент этого перехода. Ответ содержит `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.1905Для фоновых субагентов инструмент возвращает результат, когда задача переходит в фон, поэтому `tool_response` не содержит полей использования: фоновый запуск возвращается немедленно, а задача на переднем плане, которую Claude Code переводит в фон во время выполнения, возвращается в момент этого перехода. Он содержит `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1907 1906
1908В ответе `completed` поле `resolvedModel` указывает модель, с которой начал субагент; она может отличаться от значения `model` в `tool_input`, например когда применяется `availableModels` или другое переопределение. В ответе `async_launched` поле `resolvedModel` указывает модель, использовавшуюся в момент перехода агента в фон, поэтому замена, произошедшая до перевода в фон, в нём отражается. Для `modelsUsed` и поведения `resolvedModel` на момент перевода в фон требуется Claude Code v2.1.212 или новее.1907В ответе `completed` поле `resolvedModel` называет модель, на которой субагент начал работу; она может отличаться от значения `model` в `tool_input`, например когда применяется `availableModels` или другое переопределение. В ответе `async_launched` поле `resolvedModel` называет модель, использовавшуюся в момент перевода агента в фон, поэтому смена модели, произошедшая до перевода в фон, отражается там. Для `modelsUsed` и поведения `resolvedModel` на момент перевода в фон требуется Claude Code v2.1.212 или новее.
1909 1908
1910<a id="askuserquestion" />1909<a id="askuserquestion" />
1911 1910
1917 1916
1918| Поле | Тип | Пример | Описание |1917| Поле | Тип | Пример | Описание |
1919| :- | :- | :- | :- |1918| :- | :- | :- | :- |
1920| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Вопросы для показа, каждый со строкой `question`, коротким `header`, массивом `options` и необязательным флагом `multiSelect` |1919| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React", "description": "Component library"}, {"label": "Vue", "description": "Progressive framework"}], "multiSelect": false}]` | Вопросы для показа, каждый со строкой `question`, кратким `header`, массивом `options` и необязательным флагом `multiSelect` |
1921| `answers` | object | `{"Which framework?": "React"}` | Необязательно. Сопоставляет текст вопроса с меткой выбранного варианта. В ответах с множественным выбором метки объединяются через запятую. Claude не задаёт это поле; передайте его через `updatedInput`, чтобы ответить программно |1920| `answers` | object | `{"Which framework?": "React"}` | Необязательно. Сопоставляет текст вопроса с меткой выбранного варианта. В ответах с множественным выбором метки объединяются через запятые. Claude не задаёт это поле; передайте его через `updatedInput`, чтобы отвечать программно |
1922 1921
1923<h5 id="exitplanmode">1922<h5 id="exitplanmode">
1924 ExitPlanMode1923 ExitPlanMode
1930| :- | :- | :- | :- |1929| :- | :- | :- | :- |
1931| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Внедряется из файла плана на диске |1930| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Внедряется из файла плана на диске |
1932| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Внедряется |1931| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Внедряется |
1933| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устаревшее. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно содержало разрешения на основе промптов, которые Claude запрашивал для реализации плана |1932| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устаревшее. Claude Code принимает это поле, но игнорирует его. До версии v2.1.205 оно содержало разрешения на основе промптов, которые Claude запрашивал для реализации плана |
1934 1933
1935В `PostToolUse` поле `tool_response` — это объект с полями `plan` и `filePath`, содержащими утверждённый план, а также внутренними флагами состояния. Читайте `tool_response.plan` для получения содержимого плана, а не перечитывайте файл с диска.1934В `PostToolUse` поле `tool_response` — это объект с полями `plan` и `filePath`, содержащими утверждённый план, а также внутренними флагами состояния. Читайте содержимое плана из `tool_response.plan`, а не перечитывайте файл с диска.
1936 1935
1937<h4 id="pretooluse-decision-control">1936<h4 id="pretooluse-decision-control">
1938 Управление решениями PreToolUse1937 Управление решениями PreToolUse
1939</h4>1938</h4>
1940 1939
1941Хуки `PreToolUse` могут управлять тем, выполняется ли вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт ему более широкие возможности управления: четыре исхода (разрешить, запретить, запросить подтверждение или отложить) и возможность изменить входные данные инструмента перед выполнением.1940Хуки `PreToolUse` могут управлять тем, будет ли выполнен вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт более богатые возможности управления: четыре исхода (разрешить, запретить, запросить подтверждение или отложить), а также возможность изменить входные данные инструмента перед выполнением.
1942 1941
1943| Поле | Описание |1942| Поле | Описание |
1944| :- | :- |1943| :- | :- |
1945| `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) всё равно применяются независимо от того, что возвращает хук |1944| `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) всё равно применяются независимо от того, что вернул хук |
1946| `permissionDecisionReason` | Для `"ask"` показывается пользователю в запросе разрешения. Когда Claude Code [отклоняет вызов](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) в запуске с `-p`, где никто не может ответить на этот запрос, Claude вместо этого читает причину в результате инструмента. Для `"deny"` показывается Claude. Для `"allow"` и `"defer"` записывается только в [отладочный лог](#debug-hooks) |1945| `permissionDecisionReason` | Для `"ask"` показывается пользователю в запросе разрешения. Когда Claude Code [отклоняет вызов](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) в запуске `-p`, где никто не может ответить на этот запрос, Claude вместо этого читает причину в результате инструмента. Для `"deny"` показывается Claude. Для `"allow"` и `"defer"` записывается только в [лог отладки](#debug-hooks) |
1947| `updatedInput` | Изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Claude Code проверяет правила разрешений и [возможность автоматического перевода в фон](/docs/ru/tools-reference#foreground-commands-that-move-to-the-background) команды Bash по входным данным, возвращённым вашим хуком, а не по тем, что отправил Claude. Используйте вместе с `"allow"` для автоматического подтверждения или с `"ask"`, чтобы показать пользователю изменённые входные данные. Для `"defer"` игнорируется |1946| `updatedInput` | Изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Claude Code проверяет правила разрешений и [пригодность к автоматическому переводу в фон](/docs/ru/tools-reference#foreground-commands-that-move-to-the-background) команды Bash по входным данным, которые возвращает ваш хук, а не по тем, что отправил Claude. Сочетайте с `"allow"` для автоматического одобрения или с `"ask"`, чтобы показать пользователю изменённые входные данные. Для `"defer"` игнорируется |
1948| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. Игнорируется, когда `permissionDecision` равно `"defer"`. См. [Добавление контекста для Claude](#add-context-for-claude) |1947| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. Игнорируется, когда `permissionDecision` равен `"defer"`. См. [Добавление контекста для Claude](#add-context-for-claude) |
1949 1948
1950Когда несколько хуков PreToolUse возвращают разные решения, приоритет таков: `deny` > `defer` > `ask` > `allow`.1949Когда несколько хуков PreToolUse возвращают разные решения, приоритет такой: `deny` > `defer` > `ask` > `allow`.
1951 1950
1952Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `"deny"`: Claude видит сообщение из stderr как причину запрета.1951Хук, который блокирует, завершаясь с кодом 2, обрабатывается так же, как `"deny"`: Claude видит сообщение из stderr как причину отказа.
1953 1952
1954Когда хук возвращает `"ask"`, запрос разрешения, показываемый пользователю, содержит метку, указывающую, откуда взялся хук: `[settings]` для хука из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для хука плагина или `[skill]` для хука из frontmatter скилла. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1953Когда хук возвращает `"ask"`, запрос разрешения, показываемый пользователю, содержит метку, указывающую, откуда взялся хук: `[settings]` для хука из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для хука плагина или `[skill]` для хука из frontmatter скилла. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1955 1954
1956`"ask"` от хука также принудительно вызывает запрос разрешения в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор по-прежнему может запретить вызов инструмента, но не может молча его одобрить. До v2.1.211 классификатор мог одобрить команду Bash, выполняемую вне [песочницы](/docs/ru/sandboxing), не показывая запрошенный хуком запрос; при этом классификатор всё равно применял к этой команде собственные правила безопасности, а `"deny"` от хука всегда соблюдался.1955`"ask"` от хука также принудительно вызывает запрос разрешения в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор по-прежнему может отклонить вызов инструмента, но не может одобрить его молча. До версии v2.1.211 классификатор мог одобрить команду Bash, выполняемую вне [песочницы](/docs/ru/sandboxing), не показывая запрос, затребованный хуком; при этом классификатор всё равно применял к этой команде собственные правила безопасности, а `"deny"` от хука всегда соблюдался.
1957 1956
1958```json theme={null}1957```json theme={null}
1959{1958{
1970```1969```
1971 1970
1972<Note>1971<Note>
1973 Ранее PreToolUse использовал поля `decision` и `reason` верхнего уровня, но для этого события они объявлены устаревшими. Используйте вместо них `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` соответствуют `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня в качестве текущего формата.1972 Ранее PreToolUse использовал поля верхнего уровня `decision` и `reason`, но для этого события они объявлены устаревшими. Используйте вместо них `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` соответствуют `"allow"` и `"deny"`. Другие события, такие как PostToolUse и Stop, продолжают использовать поля верхнего уровня `decision` и `reason` в качестве текущего формата.
1974</Note>1973</Note>
1975 1974
1976<h4 id="allow-with-updatedinput">1975<h4 id="allow-with-updatedinput">
1977 Инструменты, требующие взаимодействия с пользователем1976 Инструменты, требующие взаимодействия с пользователем
1978</h4>1977</h4>
1979 1978
1980`AskUserQuestion` и `ExitPlanMode` требуют взаимодействия с пользователем. В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code предлагает их, только когда у запуска есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), который получает запрос, например callback `canUseTool` в Agent SDK.1979`AskUserQuestion` и `ExitPlanMode` требуют взаимодействия с пользователем. В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code предлагает их только когда у запуска есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), который принимает запрос, например обратный вызов `canUseTool` в Agent SDK.
1981 1980
1982Хук `PreToolUse` удовлетворяет этому требованию, если он делает следующее:1981Хук `PreToolUse` удовлетворяет этому требованию, если делает следующее:
1983 1982
19841. Читает входные данные инструмента из stdin19831. Читает входные данные инструмента из stdin
19852. Собирает ответ через ваш собственный интерфейс19842. Собирает ответ через ваш собственный интерфейс
2009}2008}
2010```2009```
2011 2010
2012MCP-инструмент, который его сервер помечает с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), строже: хук не может пропустить его запрос подтверждения с помощью `"allow"`, с `updatedInput` или без него, потому что Claude Code не может убедиться, что хук получил необходимое инструменту взаимодействие.2011Инструмент MCP, который сервер помечает с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), устроен строже: хук не может пропустить его запрос подтверждения с помощью `"allow"`, с `updatedInput` или без него, поскольку Claude Code не может убедиться, что хук провёл взаимодействие, необходимое инструменту.
2013 2012
2014<h4 id="defer-a-tool-call-for-later">2013<h4 id="defer-a-tool-call-for-later">
2015 Отложить вызов инструмента2014 Отложить вызов инструмента на потом
2016</h4>2015</h4>
2017 2016
2018`"defer"` предназначено для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, например приложения на Agent SDK или пользовательского интерфейса, построенного поверх Claude Code. Оно позволяет вызывающему процессу приостановить Claude на вызове инструмента, получить ввод через собственный интерфейс и продолжить с того же места. Claude Code учитывает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сессиях он записывает в лог предупреждение и игнорирует результат хука.2017`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, например приложения на Agent SDK или пользовательского интерфейса, построенного поверх Claude Code. Он позволяет вызывающему процессу приостановить Claude на вызове инструмента, собрать входные данные через собственный интерфейс и продолжить с того же места. Claude Code учитывает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сессиях он записывает в лог предупреждение и игнорирует результат хука.
2019 2018
2020Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но терминала для ответа нет. Запуск с `-p` предлагает `AskUserQuestion`, только если у него есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), например MCP-инструмент, переданный через `--permission-prompt-tool`, поэтому запускайте с ним. Цикл работает так:2019Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но нет терминала, в котором можно ответить. Запуск `-p` предлагает `AskUserQuestion` только когда у него есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), например инструмент MCP, передаваемый через `--permission-prompt-tool`, поэтому начинайте запуск с ним. Цикл работает так:
2021 2020
20221. Claude вызывает `AskUserQuestion`. Срабатывает хук `PreToolUse`.20211. Claude вызывает `AskUserQuestion`. Срабатывает хук `PreToolUse`.
20232. Хук возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс завершается с `stop_reason: "tool_deferred"`, а ожидающий вызов инструмента сохраняется в транскрипте.20222. Хук возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс завершается с `stop_reason: "tool_deferred"`, а ожидающий вызов инструмента сохраняется в транскрипте.
20243. Вызывающий процесс читает `deferred_tool_use` из результата SDK, показывает вопрос в своём интерфейсе и ждёт ответа.20233. Вызывающий процесс читает `deferred_tool_use` из результата SDK, показывает вопрос в собственном интерфейсе и ждёт ответа.
20254. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова запускает `PreToolUse`.20244. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова вызывает `PreToolUse`.
20265. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.20255. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.
2027 2026
2028Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, сгенерированные Claude для вызова инструмента и зафиксированные до выполнения:2027Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сформировал для вызова инструмента, зафиксированные до выполнения:
2029 2028
2030```json theme={null}2029```json theme={null}
2031{2030{
2041}2040}
2042```2041```
2043 2042
2044Ограничений по таймауту или количеству повторных попыток нет. Сессия остаётся на диске, пока вы её не возобновите, с учётом очистки по сроку хранения [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая по умолчанию удаляет файлы сессий через 30 дней согласно [правилам очистки по сроку хранения](/docs/ru/claude-directory#cleaned-up-automatically). Если ответ не готов к моменту возобновления, хук может снова вернуть `"defer"`, и процесс завершится так же. Вызывающий процесс сам решает, когда выйти из цикла, в итоге возвращая из хука `"allow"` или `"deny"`.2043Ограничений по таймауту или количеству повторных попыток нет. Сессия хранится на диске, пока вы её не возобновите, с учётом очистки по сроку хранения [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая по умолчанию удаляет файлы сессий через 30 дней в соответствии с [правилами очистки по сроку хранения](/docs/ru/claude-directory#cleaned-up-automatically). Если ответ не готов к моменту возобновления, хук может снова вернуть `"defer"`, и процесс завершится так же. Вызывающий процесс сам решает, когда выйти из цикла, в итоге вернув из хука `"allow"` или `"deny"`.
2045 2044
2046`"defer"` работает, только когда Claude делает в ходе один вызов инструмента. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением, и инструмент проходит обычный процесс проверки разрешений. Это ограничение существует потому, что при возобновлении можно повторно выполнить только один инструмент: нельзя отложить один вызов из пакета, не оставив остальные неразрешёнными.2045`"defer"` работает, только когда Claude делает в ходе один вызов инструмента. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением, и инструмент проходит обычный процесс проверки разрешений. Это ограничение существует потому, что при возобновлении можно повторно выполнить только один инструмент: нельзя отложить один вызов из пакета, не оставив остальные неразрешёнными.
2047 2046
2048Если отложенный инструмент при возобновлении больше недоступен, процесс завершается с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` до срабатывания хука. Это происходит, когда MCP-сервер, предоставлявший инструмент, не подключён в возобновлённой сессии. Данные `deferred_tool_use` всё равно включаются, чтобы вы могли определить, какой инструмент пропал.2047Если отложенный инструмент больше недоступен при возобновлении, процесс завершается с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` до срабатывания хука. Это происходит, когда MCP-сервер, предоставлявший инструмент, не подключён в возобновлённой сессии. Данные `deferred_tool_use` всё равно включаются, чтобы вы могли определить, какой инструмент пропал.
2049 2048
2050<Note>2049<Note>
2051 Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план на утверждение. Если вы передаёте некоторые другие флаги запуска, возобновлённый запуск не возвращается в режим планирования; см. [Возобновление в режиме планирования с `-p`](/docs/ru/sessions#resume-in-plan-mode-with-p). Требуется Claude Code v2.1.246 или новее.2050 Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план на утверждение. Если вы передаёте некоторые другие флаги запуска, возобновлённый запуск не возвращается в режим планирования; см. [Возобновление в режиме планирования с `-p`](/docs/ru/sessions#resume-in-plan-mode-with-p). Требуется Claude Code v2.1.246 или новее.
2052 2051
2053 При возобновлении с `-p` Claude Code не восстанавливает никакой другой сохранённый режим разрешений. Он запускает работу в том режиме разрешений, в котором запустился бы новый запуск `claude -p`, поэтому снова передайте `--permission-mode` или `--dangerously-skip-permissions`, если отложенная сессия их использовала. При возобновлении с `claude --resume <session-id>` без `-p` Claude Code восстанавливает сохранённый режим разрешений, за исключениями, перечисленными в разделе [режим разрешений при возобновлении](/docs/ru/sessions#permission-mode-on-resume).2052 При возобновлении с `-p` Claude Code не восстанавливает никакой другой сохранённый режим разрешений. Он запускается в том режиме разрешений, в котором запустился бы новый запуск `claude -p`, поэтому снова передайте `--permission-mode` или `--dangerously-skip-permissions`, если отложенная сессия их использовала. При возобновлении с `claude --resume <session-id>` без `-p` Claude Code восстанавливает сохранённый режим разрешений, за исключениями, перечисленными в разделе [режим разрешений при возобновлении](/docs/ru/sessions#permission-mode-on-resume).
2054</Note>2053</Note>
2055 2054
2056<h3 id="permissionrequest">2055<h3 id="permissionrequest">
2057 PermissionRequest2056 PermissionRequest
2058</h3>2057</h3>
2059 2058
2060Выполняется, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не вернёт решение, он запрещает вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [callback `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется то решение, которое принято первым.2059Выполняется, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не возвращает решение, он отклоняет вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [обратного вызова `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется решение того, кто решит первым.
2061Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.2060Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.
2062 2061
2063Используйте это событие, когда нужен сигнал в момент, когда Claude запрашивает разрешение на использование инструмента. Claude Code запускает хук [Notification](#notification) с типом `permission_prompt` только после того, как запрос прождёт около шести секунд.2062Используйте это событие, когда вам нужен сигнал в тот момент, когда Claude запрашивает разрешение на использование инструмента. Claude Code запускает хук [Notification](#notification) с типом `permission_prompt` только после того, как запрос прождёт около шести секунд.
2064 2063
2065Claude Code не запускает хуки PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) команды, выполняемой в песочнице. Чтобы получить сигнал для такого запроса, используйте тип уведомления `permission_prompt`.2064Claude Code не запускает хуки PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) команды в песочнице. Чтобы получить сигнал об этом запросе, используйте тип уведомления `permission_prompt`.
2066 2065
2067Сопоставляется по имени инструмента, с теми же значениями, что и PreToolUse.2066Сопоставляется с именем инструмента, с теми же значениями, что и PreToolUse.
2068 2067
2069<h4 id="permissionrequest-input">2068<h4 id="permissionrequest-input">
2070 Входные данные PermissionRequest2069 Входные данные PermissionRequest
2071</h4>2070</h4>
2072 2071
2073Хуки PermissionRequest получают поля `tool_name` и `tool_input`, как хуки PreToolUse, но без `tool_use_id`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Необязательный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, например добавление правила разрешения или смену режима разрешений.2072Хуки PermissionRequest получают поля `tool_name` и `tool_input`, как хуки PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Необязательный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, например добавление правила разрешения или изменение режима разрешений.
2074 2073
2075Массив `permission_suggestions` не является точным списком вариантов, которые вы видите, поскольку каждое диалоговое окно разрешений формирует собственные варианты. Некоторые диалоговые окна, например для редактирования файлов, вообще не читают этот массив и выводят варианты из самого запроса. Диалоговое окно, которое его читает, всё равно может скрыть вариант, предложение для которого остаётся в массиве, например когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает варианты сохранения правил. Оно также может предлагать варианты без соответствующей записи, например [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), который меняет режим разрешений напрямую, а не через обновление разрешений.2074Массив `permission_suggestions` не является точным списком вариантов, которые вы видите, поскольку каждое диалоговое окно разрешения формирует собственные варианты. Некоторые диалоговые окна, например для редактирования файлов, вообще не читают этот массив и выводят варианты из самого запроса. Диалоговое окно, которое его читает, всё равно может скрыть вариант, предложение для которого остаётся в массиве, например когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает варианты сохранения правил. Оно также может предлагать варианты без соответствующей записи предложения, например [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), который меняет режим разрешений напрямую, а не через обновление разрешений.
2076 2075
2077Хуки PreToolUse выполняются перед каждым вызовом инструмента, независимо от того, нужно ли для него разрешение. Хуки PermissionRequest выполняются только когда Claude Code собирается запросить у вас разрешение или когда он иначе автоматически запретил бы вызов, который не может показать запрос. Ни одно из этих событий не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).2076Хуки PreToolUse выполняются перед каждым вызовом инструмента, независимо от того, требуется ли разрешение. Хуки PermissionRequest выполняются только когда Claude Code собирается запросить у вас разрешение или когда он иначе автоматически отклонил бы вызов, который не может показать запрос. Ни одно из этих событий не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
2078 2077
2079```json theme={null}2078```json theme={null}
2080{2079{
2103 Управление решениями PermissionRequest2102 Управление решениями PermissionRequest
2104</h4>2103</h4>
2105 2104
2106Хуки `PermissionRequest` могут разрешать или запрещать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может вернуть объект `decision` со следующими полями, специфичными для события:2105Хуки `PermissionRequest` могут разрешать или отклонять запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем хукам, скрипт хука может возвращать объект `decision` со следующими полями, специфичными для события:
2107 2106
2108| Поле | Описание |2107| Поле | Описание |
2109| :- | :- |2108| :- | :- |
2110| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отклоняет его. [Правила запрета и запроса подтверждения](/docs/ru/permissions#manage-permissions) всё равно применяются, поэтому хук, возвращающий `"allow"`, не переопределяет соответствующее правило запрета |2109| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отклоняет его. [Правила запрета и подтверждения](/docs/ru/permissions#manage-permissions) всё равно применяются, поэтому хук, вернувший `"allow"`, не переопределяет подходящее правило запрета |
2111| `updatedInput` | Только для `"allow"`: изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Изменённые входные данные повторно проверяются по правилам запрета и запроса подтверждения |2110| `updatedInput` | Только для `"allow"`: изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Изменённые входные данные повторно проверяются по правилам запрета и подтверждения |
2112| `updatedPermissions` | Только для `"allow"`: массив [записей обновления разрешений](#permission-update-entries) для применения, например добавление правила разрешения или смена режима разрешений сессии |2111| `updatedPermissions` | Только для `"allow"`: массив [записей обновления разрешений](#permission-update-entries) для применения, например добавление правила разрешения или изменение режима разрешений сессии |
2113| `message` | Только для `"deny"`: сообщает Claude, почему в разрешении отказано |2112| `message` | Только для `"deny"`: сообщает Claude, почему в разрешении отказано |
2114| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |2113| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |
2115 2114
2116Хук, завершившийся с кодом выхода 2 без объекта `decision`, оставляет процесс проверки разрешений без изменений, а его stderr отбрасывается. Предоставить или отклонить запрос может только объект `decision`.2115Хук, который завершается с кодом 2 без объекта `decision`, оставляет процесс проверки разрешений без изменений, а его stderr отбрасывается. Предоставить или отклонить запрос может только объект `decision`.
2117 2116
2118```json theme={null}2117```json theme={null}
2119{2118{
2133 Записи обновления разрешений2132 Записи обновления разрешений
2134</h4>2133</h4>
2135 2134
2136Поле вывода `updatedPermissions` и [входное поле `permission_suggestions`](#permissionrequest-input) используют один и тот же массив объектов-записей. У каждой записи есть `type`, определяющий её остальные поля, и `destination`, управляющий тем, куда записывается изменение.2135Выходное поле `updatedPermissions` и [входное поле `permission_suggestions`](#permissionrequest-input) используют один и тот же массив объектов-записей. У каждой записи есть поле `type`, которое определяет остальные её поля, и поле `destination`, которое определяет, куда записывается изменение.
2137 2136
2138| `type` | Поля | Действие |2137| `type` | Поля | Действие |
2139| :- | :- | :- |2138| :- | :- | :- |
2140| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — массив объектов `{toolName, ruleContent?}`. Не указывайте `ruleContent`, чтобы охватить весь инструмент. `behavior` — `"allow"`, `"deny"` или `"ask"` |2139| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent`, чтобы правило соответствовало всему инструменту. `behavior` принимает значение `"allow"`, `"deny"` или `"ask"` |
2141| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила заданного `behavior` в `destination` переданными `rules` |2140| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила с указанным `behavior` в `destination` на переданные `rules` |
2142| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила заданного `behavior` |2141| `removeRules` | `rules`, `behavior`, `destination` | Удаляет совпадающие правила с указанным `behavior` |
2143| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы: `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, а также `manual` как псевдоним для `default` |2142| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы: `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan`, а также `manual` как псевдоним для `default` |
2144| `addDirectories` | `directories`, `destination` | Добавляет рабочие каталоги. `directories` — массив строк путей |2143| `addDirectories` | `directories`, `destination` | Добавляет рабочие каталоги. `directories` — это массив строк с путями |
2145| `removeDirectories` | `directories`, `destination` | Удаляет рабочие каталоги |2144| `removeDirectories` | `directories`, `destination` | Удаляет рабочие каталоги |
2146 2145
2147<Note>2146<Note>
2148 `setMode` с `bypassPermissions` действует, только если вы запустили сессию с уже доступным режимом обхода: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [пользовательских настройках, `--settings` или управляемых настройках](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление ничего не делает. Обновление также ничего не делает, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает этот режим или когда сессия запускается в [ограниченном режиме](/docs/ru/cli-reference#cli-flags).2147 `setMode` со значением `bypassPermissions` действует только в том случае, если вы запустили сессию с уже доступным режимом обхода: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [пользовательских настройках, `--settings` или управляемых настройках](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление ничего не делает. Обновление также ничего не делает, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает этот режим или когда сессия запускается в [ограниченном режиме](/docs/ru/cli-reference#cli-flags).
2149 2148
2150 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2149 `bypassPermissions` никогда не сохраняется как `defaultMode`, независимо от `destination`.
2151</Note>2150</Note>
2152 2151
2153Поле `destination` в каждой записи определяет, остаётся ли изменение в памяти или сохраняется в файл настроек.2152Поле `destination` в каждой записи определяет, останется ли изменение только в памяти или будет сохранено в файл настроек.
2154 2153
2155| `destination` | Куда записывается |2154| `destination` | Куда записывается |
2156| :- | :- |2155| :- | :- |
2159| `projectSettings` | `.claude/settings.json` |2158| `projectSettings` | `.claude/settings.json` |
2160| `userSettings` | `~/.claude/settings.json` |2159| `userSettings` | `~/.claude/settings.json` |
2161 2160
2162Хук может вернуть одно из полученных `permission_suggestions` в качестве собственного вывода `updatedPermissions`.2161Хук может вернуть одну из полученных `permission_suggestions` в качестве собственного вывода `updatedPermissions`.
2163 2162
2164<h3 id="posttooluse">2163<h3 id="posttooluse">
2165 PostToolUse2164 PostToolUse
2166</h3>2165</h3>
2167 2166
2168Запускается сразу после успешного завершения инструмента.2167Выполняется сразу после успешного завершения инструмента.
2169 2168
2170Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.2169Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2171 2170
2172Используйте более широкое сопоставление, когда имя инструмента не подходит в качестве фильтра:2171Используйте более широкое сопоставление, когда имя инструмента не подходит в качестве фильтра:
2173 2172
2174* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или задайте ему значение `"*"`. Тогда ваш хук сможет сам определить, что изменилось, например выполнив `git status --porcelain`, который также показывает неотслеживаемые файлы, пропускаемые `git diff`. Для вызовов инструментов, завершившихся сбоем, добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).2173* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или задайте ему значение `"*"`. Тогда ваш хук может сам определить, что изменилось, например выполнив `git status --porcelain`, который также выводит неотслеживаемые файлы, пропускаемые `git diff`. Для неудавшихся вызовов инструментов добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).
2175* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, что его записало, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse`, сопоставленный с `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.2174* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, что его записало, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse` с matcher `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.
2176 2175
2177<h4 id="posttooluse-input">2176<h4 id="posttooluse-input">
2178 Входные данные PostToolUse2177 Входные данные PostToolUse
2179</h4>2178</h4>
2180 2179
2181Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, так и `tool_response` — возвращённый им результат. Точная схема обоих зависит от инструмента. Пути в `tool_input` файловых инструментов поступают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для MCP-инструмента входные данные также содержат объект [`mcp_server`](#pretooluse-input).2180Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, — так и `tool_response` — возвращённый им результат. Точная схема обоих полей зависит от инструмента. Пути в `tool_input` для файловых инструментов приходят в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для инструмента MCP входные данные также содержат объект [`mcp_server`](#pretooluse-input).
2182 2181
2183```json theme={null}2182```json theme={null}
2184{2183{
2203 2202
2204| Поле | Описание |2203| Поле | Описание |
2205| :- | :- |2204| :- | :- |
2206| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |2205| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешения и хуках PreToolUse |
2207 2206
2208<h4 id="posttooluse-decision-control">2207<h4 id="posttooluse-decision-control">
2209 Управление решениями PostToolUse2208 Управление решениями PostToolUse
2210</h4>2209</h4>
2211 2210
2212Хуки `PostToolUse` могут передавать Claude обратную связь после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:2211Хуки `PostToolUse` могут передавать Claude обратную связь после выполнения инструмента. Помимо [выходных полей JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2213 2212
2214| Поле | Описание |2213| Поле | Описание |
2215| :- | :- |2214| :- | :- |
2217| `reason` | Пояснение, показываемое Claude, когда `decision` равно `"block"` |2216| `reason` | Пояснение, показываемое Claude, когда `decision` равно `"block"` |
2218| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. См. [Добавление контекста для Claude](#add-context-for-claude) |2217| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. См. [Добавление контекста для Claude](#add-context-for-claude) |
2219| `classifierContext` | Короткая заметка о результате этого вызова для классификатора [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не для Claude. См. [Аннотирование результата для классификатора авторежима](#annotate-a-result-for-the-auto-mode-classifier). Требуется Claude Code v2.1.236 или новее |2218| `classifierContext` | Короткая заметка о результате этого вызова для классификатора [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не для Claude. См. [Аннотирование результата для классификатора авторежима](#annotate-a-result-for-the-auto-mode-classifier). Требуется Claude Code v2.1.236 или новее |
2220| `updatedToolOutput` | Заменяет вывод инструмента указанным значением перед отправкой Claude. Значение должно соответствовать форме вывода инструмента |2219| `updatedToolOutput` | Заменяет вывод инструмента переданным значением до того, как он будет отправлен Claude. Значение должно соответствовать форме вывода инструмента |
2221| `updatedMCPToolOutput` | Заменяет вывод только для [MCP-инструментов](#match-mcp-tools). Предпочтительнее использовать `updatedToolOutput`, который работает для всех инструментов |2220| `updatedMCPToolOutput` | Заменяет вывод только для [инструментов MCP](#match-mcp-tools). Предпочтительнее использовать `updatedToolOutput`, который работает для всех инструментов |
2222 2221
2223Пример ниже заменяет вывод вызова `Bash`. Значение замены соответствует форме вывода инструмента `Bash`:2222В примере ниже заменяется вывод вызова `Bash`. Значение замены соответствует форме вывода инструмента `Bash`:
2224 2223
2225```json theme={null}2224```json theme={null}
2226{2225{
2238```2237```
2239 2238
2240<Warning>2239<Warning>
2241 `updatedToolOutput` изменяет только то, что видит Claude. К моменту срабатывания хука инструмент уже выполнился, поэтому все записанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, например спаны инструментов OpenTelemetry и аналитические события, также фиксирует исходный вывод до запуска хука. Чтобы предотвратить или изменить вызов инструмента до его выполнения, используйте вместо этого хук [PreToolUse](#pretooluse).2240 `updatedToolOutput` меняет только то, что видит Claude. К моменту срабатывания хука инструмент уже выполнился, поэтому все записанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как спаны инструментов OpenTelemetry и аналитические события, также фиксирует исходный вывод до запуска хука. Чтобы предотвратить или изменить вызов инструмента до его выполнения, используйте вместо этого хук [PreToolUse](#pretooluse).
2242 2241
2243 Значение замены должно соответствовать форме вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, не соответствующее схеме вывода инструмента, игнорируется, и используется исходный вывод. Вывод MCP-инструментов передаётся без проверки схемы. Удаление сведений об ошибках, которые нужны Claude, может привести к тому, что он продолжит работу на основе ложного предположения.2242 Значение замены должно соответствовать форме вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, не соответствующее схеме вывода инструмента, игнорируется, и используется исходный вывод. Вывод инструментов MCP передаётся без проверки схемы. Удаление сведений об ошибках, которые нужны Claude, может привести к тому, что он продолжит работу на основе ложного предположения.
2244</Warning>2243</Warning>
2245 2244
2246<h4 id="annotate-a-result-for-the-auto-mode-classifier">2245<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2247 Аннотирование результата для классификатора авторежима2246 Аннотирование результата для классификатора авторежима
2248</h4>2247</h4>
2249 2248
2250Верните `classifierContext`, чтобы отправить короткую заметку о результате вызова инструмента классификатору [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не Claude. Классификатор [никогда не получает сами результаты инструментов](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ сообщить ему что-либо о том, что вернул вызов, прежде чем он проверит последующие действия. Для этого поля требуется Claude Code v2.1.236 или новее.2249Верните `classifierContext`, чтобы отправить короткую заметку о результате вызова инструмента классификатору [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не Claude. Классификатор [никогда не получает сами результаты инструментов](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ сообщить ему что-либо о том, что вернул вызов, прежде чем он будет проверять последующие действия. Для этого поля требуется Claude Code v2.1.236 или новее.
2251 2250
2252Пример ниже сообщает классификатору, откуда взялся вывод запроса:2251В примере ниже классификатору сообщается, откуда получен вывод запроса:
2253 2252
2254```json theme={null}2253```json theme={null}
2255{2254{
2263Какой вес классификатор придаёт заметке, зависит от того, где вы настроили хук:2262Какой вес классификатор придаёт заметке, зависит от того, где вы настроили хук:
2264 2263
2265* **Хуки, настроенные в Claude Code**: для хуков из файлов настроек, плагинов, скиллов и frontmatter агентов классификатор рассматривает заметку как непроверенный контекст, предоставленный приложением. Заметка никогда не устанавливает намерение пользователя, и если в ней утверждается, что вы что-то одобрили или запросили, классификатор сверяет это утверждение с вашими собственными сообщениями в диалоге2264* **Хуки, настроенные в Claude Code**: для хуков из файлов настроек, плагинов, скиллов и frontmatter агентов классификатор рассматривает заметку как непроверенный контекст, предоставленный приложением. Заметка никогда не устанавливает намерение пользователя, и если в ней утверждается, что вы что-то одобрили или запросили, классификатор сверяет это утверждение с вашими собственными сообщениями в диалоге
2266* **Внутрипроцессные колбэки Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует хук как [колбэк TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время активной сессии, классификатор может учитывать переданное в заметке утверждение пользователя как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из отправленного вами сообщения, но оно никогда не снимает блокировку, которую не смогло бы снять и ваше собственное сообщение. После возобновления сессии Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда хуки из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединённую заметку как непроверенную2265* **Внутрипроцессные обратные вызовы Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует хук как [обратный вызов TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время активной сессии, классификатор может рассматривать переданное в заметке утверждение пользователя как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из отправленного вами сообщения, но оно никогда не снимает блокировку, которую не смогло бы снять и ваше собственное сообщение. После возобновления сессии Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда хуки из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединённую заметку как непроверенную
2267 2266
2268Claude Code применяет следующие ограничения при доставке заметки:2267Claude Code применяет следующие ограничения при доставке заметки:
2269 2268
2270* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2 000 символами и обрезает остальное. Ограничение общее для всех хуков, отвечающих на этот вызов2269* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и обрезает остальное. Ограничение общее для всех хуков, отвечающих на этот вызов
2271* **Только синхронные ответы**: Claude Code игнорирует это поле в ответе хука, который [выполняется в фоне](#run-hooks-in-the-background), поскольку такой ответ приходит после того, как Claude Code записывает результат инструмента2270* **Только синхронные ответы**: Claude Code игнорирует это поле в ответе хука, который [выполняется в фоне](#run-hooks-in-the-background), потому что такой ответ приходит уже после того, как Claude Code зафиксирует результат инструмента
2272* **Вызовы, которые классификатор не записывает**: транскрипт классификатора не включает операции только для чтения, такие как чтение файлов и поиск. Claude Code отбрасывает заметку, прикреплённую к одному из таких вызовов2271* **Вызовы, которые классификатор не фиксирует**: транскрипт классификатора опускает поиск только для чтения, такой как чтение файлов и поиск. Claude Code отбрасывает заметку, прикреплённую к одному из таких вызовов
2273* **Взаимодействие с перезаписью**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе хука. Claude Code отбрасывает заметку, если эта перезапись отклонена или её заменяет перезапись другого хука. Claude Code доставляет заметку, возвращённую без перезаписи, даже когда другой хук перезаписывает вывод2272* **Взаимодействие с перезаписью**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, возвращайте оба поля в одном и том же ответе хука. Claude Code отбрасывает заметку, если эта перезапись отклонена или её заменяет перезапись другого хука. Claude Code доставляет заметку, возвращённую без перезаписи, даже если другой хук перезаписывает вывод
2274 2273
2275<Warning>2274<Warning>
2276 Классификатор воспринимает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, в котором размещена сессия, поэтому не копируйте в него недоверенный вывод инструментов или сторонний текст. Ограничьте заметку коротким утверждением об этом конкретном вызове, например фактом о его происхождении или утверждением пользователя о нём; не используйте это поле для доставки несвязанных сообщений или потока событий.2275 Классификатор воспринимает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, в котором размещена сессия, поэтому не копируйте туда недоверенный вывод инструментов или сторонний текст. Ограничьте заметку коротким утверждением об этом одном вызове, например фактом о его происхождении или утверждением пользователя о нём; не используйте это поле для доставки несвязанных сообщений или потока событий.
2277</Warning>2276</Warning>
2278 2277
2279<h3 id="posttoolusefailure">2278<h3 id="posttoolusefailure">
2280 PostToolUseFailure2279 PostToolUseFailure
2281</h3>2280</h3>
2282 2281
2283Запускается, когда инструмент, начавший выполнение, завершается сбоем: инструмент выбросил ошибку или MCP-инструмент вернул результат с ошибкой. Используйте его для записи сбоев в лог, отправки оповещений или передачи Claude корректирующей обратной связи.2282Выполняется, когда инструмент, начавший выполнение, завершается с ошибкой: инструмент выбросил ошибку или инструмент MCP вернул результат с ошибкой. Используйте его, чтобы логировать сбои, отправлять оповещения или давать Claude корректирующую обратную связь.
2284 2283
2285Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.2284Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2286 2285
2287<Note>2286<Note>
2288 Это событие не срабатывает для вызовов инструментов, отклонённых до выполнения: неизвестное имя инструмента, входные данные, не прошедшие проверку схемы или специфичную для инструмента проверку, или отказ в разрешении. Отклонения при проверке возвращаются как результаты `tool_use_error` и происходят до запуска хуков, поэтому они не вызывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении вызывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).2287 Это событие не срабатывает для вызовов инструментов, отклонённых до выполнения: неизвестное имя инструмента, входные данные, не прошедшие проверку схемы или специфичную для инструмента проверку, либо отказ в разрешении. Отклонения при проверке возвращаются как результаты `tool_use_error` и происходят до запуска хуков, поэтому они не вызывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении вызывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
2289</Note>2288</Note>
2290 2289
2291<h4 id="posttoolusefailure-input">2290<h4 id="posttoolusefailure-input">
2292 Входные данные PostToolUseFailure2291 Входные данные PostToolUseFailure
2293</h4>2292</h4>
2294 2293
2295Хуки PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, а также информацию об ошибке в виде полей верхнего уровня. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может передать:2294Хуки PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, а также информацию об ошибке в виде полей верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудавшаяся команда `npm test` может передать:
2296 2295
2297```json theme={null}2296```json theme={null}
2298{2297{
2315 2314
2316| Поле | Описание |2315| Поле | Описание |
2317| :- | :- |2316| :- | :- |
2318| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, завершившегося сбоем |2317| `error` | Строка с описанием того, что пошло не так. Формат зависит от инструмента, завершившегося с ошибкой |
2319| `is_interrupt` | Необязательное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, о которой сообщил инструмент. Отмена выполняющегося инструмента не вызывает этот хук; вместо этого результат инструмента содержит сообщение о прерывании |2318| `is_interrupt` | Необязательное логическое значение. True, когда сбой дошёл до Claude Code как прерывание, а не как ошибка, о которой сообщил инструмент. Отмена работающего инструмента не вызывает этот хук; вместо этого результат инструмента содержит сообщение о прерывании |
2320| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |2319| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешения и хуках PreToolUse |
2321 2320
2322Строка `error` обычно совпадает с текстом, который Claude получает в качестве результата неудавшегося инструмента. Её формат зависит от инструмента и сбоя. Ориентируйте хук на `tool_name`, `is_interrupt` и первую строку `Exit code N`; остальную часть строки рассматривайте как отображаемый текст, а не как стабильный формат.2321Строка `error`, как правило, совпадает с текстом, который Claude получает в качестве результата неудавшегося инструмента. Её формат зависит от инструмента и типа сбоя. Ориентируйте логику хука на `tool_name`, `is_interrupt` и первую строку `Exit code N`; остальную часть строки рассматривайте как текст для отображения, а не как стабильный формат.
2323 2322
2324* Для Bash и PowerShell команда, которая выполнилась и завершилась, даёт первую строку `Exit code N`, а затем весь вывод команды одним блоком с чередующимися stdout и stderr2323* Для Bash и PowerShell команда, которая выполнилась и завершилась, даёт первую строку `Exit code N`, а затем весь вывод команды одним блоком, в котором stdout и stderr перемешаны
2325* Данные события также могут содержать простое сообщение о сбое без строки с кодом выхода, когда Claude Code не смог запустить сам процесс оболочки2324* Данные события также могут содержать просто сообщение о сбое без строки с кодом выхода, если Claude Code не смог запустить сам процесс оболочки
2326* Claude Code обрезает длинные строки посередине вокруг маркера `... [N characters truncated] ...` и может вставлять собственные строки, например `Command timed out after 2m 0s`2325* Claude Code обрезает середину длинных строк, вставляя маркер `... [N characters truncated] ...`, и может добавлять собственные строки, например `Command timed out after 2m 0s`
2327 2326
2328<h4 id="posttoolusefailure-decision-control">2327<h4 id="posttoolusefailure-decision-control">
2329 Управление решениями PostToolUseFailure2328 Управление решениями PostToolUseFailure
2330</h4>2329</h4>
2331 2330
2332Хуки `PostToolUseFailure` могут передавать Claude контекст после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:2331Хуки `PostToolUseFailure` могут передавать Claude контекст после сбоя инструмента. Помимо [выходных полей JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2333 2332
2334| Поле | Описание |2333| Поле | Описание |
2335| :- | :- |2334| :- | :- |
2348 PostToolBatch2347 PostToolBatch
2349</h3>2348</h3>
2350 2349
2351Запускается один раз после того, как разрешились все вызовы инструментов в пакете, до того как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, то есть срабатывает параллельно, когда Claude выполняет параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз с полным пакетом, поэтому это подходящее место для внедрения контекста, который зависит от набора выполненных инструментов, а не от какого-то одного инструмента. Для этого события matcher не поддерживается.2350Выполняется один раз после того, как все вызовы инструментов в пакете завершены, перед тем как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, а значит, срабатывает параллельно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз с полным пакетом, поэтому это подходящее место для внедрения контекста, который зависит от набора выполненных инструментов, а не от какого-то одного инструмента. Для этого события нет matcher.
2352 2351
2353<h4 id="posttoolbatch-input">2352<h4 id="posttoolbatch-input">
2354 Входные данные PostToolBatch2353 Входные данные PostToolBatch
2380}2379}
2381```2380```
2382 2381
2383`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — сериализованная строка или массив блоков содержимого, в точности как их выдал инструмент. Для `Read` это означает текст с префиксами номеров строк, а не необработанное содержимое файла. Ответы могут быть большими, поэтому разбирайте только нужные поля.2382`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков содержимого, точно в том виде, в каком его выдал инструмент. Для `Read` это означает текст с префиксами номеров строк, а не сырое содержимое файла. Ответы могут быть большими, поэтому разбирайте только нужные вам поля.
2384 2383
2385<Note>2384<Note>
2386 Форма `tool_response` отличается от формы в `PostToolUse`. `PostToolUse` передаёт структурированный объект `Output` инструмента, например `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передаёт сериализованное содержимое `tool_result`, которое видит модель.2385 Форма `tool_response` отличается от формы в `PostToolUse`. `PostToolUse` передаёт структурированный объект `Output` инструмента, например `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передаёт сериализованное содержимое `tool_result`, которое видит модель.
2390 Управление решениями PostToolBatch2389 Управление решениями PostToolBatch
2391</h4>2390</h4>
2392 2391
2393Хуки `PostToolBatch` могут внедрять контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:2392Хуки `PostToolBatch` могут внедрять контекст для Claude. Помимо [выходных полей JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2394 2393
2395| Поле | Описание |2394| Поле | Описание |
2396| :- | :- |2395| :- | :- |
2411 PermissionDenied2410 PermissionDenied
2412</h3>2411</h3>
2413 2412
2414Запускается, когда [авторежим](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отклоняет вызов инструмента, в том числе когда он отклоняет вызов без вердикта классификатора, потому что [проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не удалось разобрать. Этот хук срабатывает только в авторежиме: он не запускается, когда вы вручную отклоняете диалоговое окно разрешения, когда хук `PreToolUse` блокирует вызов или когда срабатывает правило `deny`. Используйте его для записи отказов в лог, корректировки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.2413Выполняется, когда [авторежим](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отклоняет вызов инструмента, в том числе когда он отклоняет вызов без вердикта классификатора, потому что [проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не удалось разобрать. Этот хук срабатывает только в авторежиме: он не запускается, когда вы вручную отклоняете диалоговое окно разрешения, когда хук `PreToolUse` блокирует вызов или когда срабатывает правило `deny`. Используйте его, чтобы логировать отказы, корректировать конфигурацию или сообщать модели, что она может повторить попытку вызова инструмента.
2415 2414
2416Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.2415Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2417 2416
2419 Входные данные PermissionDenied2418 Входные данные PermissionDenied
2420</h4>2419</h4>
2421 2420
2422Помимо [общих входных полей](#common-input-fields), хуки PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input).2421Помимо [общих входных полей](#common-input-fields), хуки PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).
2423 2422
2424```json theme={null}2423```json theme={null}
2425{2424{
2440 2439
2441| Поле | Описание |2440| Поле | Описание |
2442| :- | :- |2441| :- | :- |
2443| `reason` | Причина отказа. Для вердикта классификатора в большинстве сессий она называет сработавшее правило в квадратных скобках, например `[Data Exfiltration]`; другие формы см. в разделе [Просмотр отказов](/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` |2442| `reason` | Причина отказа. Для вердикта классификатора в большинстве сессий в ней указывается сработавшее правило в квадратных скобках, например `[Data Exfiltration]`; другие формы см. в разделе [Просмотр отказов](/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` |
2444 2443
2445<h4 id="permissiondenied-decision-control">2444<h4 id="permissiondenied-decision-control">
2446 Управление решениями PermissionDenied2445 Управление решениями PermissionDenied
2459 2458
2460Когда `retry` равно `true`, Claude Code добавляет в диалог сообщение, сообщающее модели, что она может повторить попытку вызова инструмента. Сам отказ Claude Code не отменяет. Если ваш хук не возвращает JSON или возвращает `retry: false`, отказ остаётся в силе, и модель получает исходное сообщение об отклонении.2459Когда `retry` равно `true`, Claude Code добавляет в диалог сообщение, сообщающее модели, что она может повторить попытку вызова инструмента. Сам отказ Claude Code не отменяет. Если ваш хук не возвращает JSON или возвращает `retry: false`, отказ остаётся в силе, и модель получает исходное сообщение об отклонении.
2461 2460
2462Claude Code игнорирует `retry: true`, когда классификатор [не вынес вердикта по действию](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не удалось разобрать, или проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора. Для таких отказов Claude Code уже сообщает модели в сообщении об отклонении, следует ли повторить попытку позже или двигаться дальше.2461Claude Code игнорирует `retry: true`, когда классификатор не вынес [вердикта по действию](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не удалось разобрать или проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора. Для таких отказов Claude Code уже сообщает модели в сообщении об отклонении, следует ли повторить попытку позже или двигаться дальше.
2463 2462
2464<h3 id="notification">2463<h3 id="notification">
2465 Notification2464 Notification
2466</h3>2465</h3>
2467 2466
2468Запускается, когда Claude Code отправляет уведомления. Сопоставляется по типу уведомления. Опустите matcher, чтобы запускать хуки для всех типов уведомлений.2467Выполняется, когда Claude Code отправляет уведомления. Сопоставляется по типу уведомления. Опустите matcher, чтобы запускать хуки для всех типов уведомлений.
2469 2468
2470Вы получаете эти события хуков даже при отключённых уведомлениях рабочего стола: настройка `preferredNotifChannel`, включая `notifications_disabled`, меняет только способ оповещения, но не то, запускается ли ваш хук.2469Вы получаете эти события хуков даже при отключённых уведомлениях рабочего стола: настройка `preferredNotifChannel`, включая `notifications_disabled`, меняет только способ оповещения, а не то, запускается ли ваш хук.
2471 2470
2472| Matcher | Когда срабатывает |2471| Matcher | Когда срабатывает |
2473| :- | :- |2472| :- | :- |
2477| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |2476| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |
2478| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |2477| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |
2479| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |2478| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |
2480| `elicitation_response` | Ответ на запрос данных MCP отправляется обратно на сервер |2479| `elicitation_response` | Ответ на запрос данных MCP отправлен обратно серверу |
2481| `agent_needs_input` | Фоновая сессия начинает ожидать вашего ввода, пока в терминале открыт [вид агентов](/docs/ru/agent-view). Также срабатывает, когда терминальная сессия показывает вам [вопрос участника команды агентов о настройке терминала](/docs/ru/agent-teams#choose-a-display-mode) или уведомление авторежима о [плате за запросы классификатора](/docs/ru/auto-mode-classifier-billing), и вы ничего не вводили около шести секунд |2480| `agent_needs_input` | Фоновая сессия начинает ждать вашего ввода, пока в терминале открыт [вид агентов](/docs/ru/agent-view). Также срабатывает, когда терминальная сессия показывает вам [вопрос о настройке терминала участника команды агентов](/docs/ru/agent-teams#choose-a-display-mode) или уведомление авторежима о [плате за запросы классификатора](/docs/ru/auto-mode-classifier-billing), и вы ничего не вводили около шести секунд |
2482| `agent_completed` | Фоновая сессия завершается или завершается сбоем. Срабатывает, только пока в терминале открыт [вид агентов](/docs/ru/agent-view) |2481| `agent_completed` | Фоновая сессия завершается или завершается со сбоем. Срабатывает только пока в терминале открыт [вид агентов](/docs/ru/agent-view) |
2483| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил её: в момент сброса или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, например добавление кредитов использования, повышение тарифного плана или смена модели, снова делает использование доступным, с [исключением для настройки модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |2482| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как её приостановил лимит использования claude.ai: в момент сброса или раньше, если какое-то ваше действие в Claude Code во время ожидания, например добавление кредитов использования, повышение тарифа или смена модели, снова делает использование доступным, с [исключением для настройки модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |
2484| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер находился в спящем режиме более 30 минут. Claude Code ждёт, пока вы нажмёте `Enter`, вместо того чтобы продолжить. После более короткого сна он продолжает работу и вместо этого вызывает `quota_auto_resume_fired` |2483| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер находился в спящем режиме более 30 минут. Claude Code ждёт, пока вы нажмёте `Enter`, вместо того чтобы продолжить. После более короткого сна он продолжает работу и вместо этого вызывает `quota_auto_resume_fired` |
2485| `quota_auto_resume_disabled` | Claude Code завершает ожидание лимита использования claude.ai, не продолжая вашу задачу: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключена или сброс сместился более чем на 24 часа во время ожидания, которое Claude Code начал самостоятельно, продолженная задача продолжала упираться в лимит, или продолжение было заблокировано до того, как достигло модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` либо выбираете **Don't continue automatically** |2484| `quota_auto_resume_disabled` | Claude Code прекращает ожидание сброса лимита использования claude.ai, не продолжая вашу задачу: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключена или сброс сместился более чем на 24 часа вперёд во время ожидания, начатого Claude Code самостоятельно, продолженная задача снова и снова упиралась в лимит или продолжение было заблокировано до того, как дошло до модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |
2486 2485
2487Для типов `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуется Claude Code v2.1.234 или новее.2486Для типов `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуется Claude Code v2.1.234 или новее.
2488 2487
2489В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.2488В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.
2490 2489
2491Для `agent_needs_input` при вопросе участника команды о настройке терминала требуется Claude Code v2.1.248 или новее.2490Для `agent_needs_input` при вопросе о настройке терминала участника команды требуется Claude Code v2.1.248 или новее.
2492 2491
2493<Note>2492<Note>
2494 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` используют те же тайминги, что и уведомления рабочего стола, поэтому в терминальных сессиях вы видите их, только когда, судя по всему, отошли от терминала:2493 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` используют те же тайминги, что и уведомления рабочего стола, поэтому в терминальных сессиях вы увидите их, только если кажется, что вы отошли от терминала:
2495 2494
2496 * Ожидайте `permission_prompt`, когда вы ничего не вводили около шести секунд. Таймер запускается при появлении запроса разрешения, и каждое нажатие клавиши откладывает его. Чтобы запускать хук сразу, когда Claude запрашивает разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).2495 * Ожидайте `permission_prompt`, когда вы ничего не вводили около шести секунд. Таймер запускается при появлении запроса разрешения, и каждое нажатие клавиши откладывает его. Чтобы запускать хук сразу, когда Claude запрашивает разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).
2497 * Ожидайте `idle_prompt` примерно через 60 секунд после того, как Claude закончит отвечать, и только если с тех пор вы ничего не вводили и ни один фоновый агент, например фоновый [субагент](/docs/ru/sub-agents), ещё не работает. Claude Code не отправляет `idle_prompt`, пока ожидает сброса лимита использования claude.ai. Когда ожидание заканчивается само по себе, вместо этого срабатывает один из типов `quota_auto_resume_*`.2496 * Ожидайте `idle_prompt` примерно через 60 секунд после того, как Claude закончит отвечать, и только если вы с тех пор ничего не вводили и ни один фоновый агент, например фоновый [субагент](/docs/ru/sub-agents), больше не работает. Claude Code не отправляет `idle_prompt`, пока ждёт сброса лимита использования claude.ai. Когда ожидание заканчивается само, вместо этого срабатывает один из типов `quota_auto_resume_*`.
2498 * Ожидайте `elicitation_dialog` для формы запроса данных или `elicitation_url_dialog` для запроса URL в браузере, когда вы ничего не вводили около шести секунд. Оба используют тот же шестисекундный порог, что и `permission_prompt`: таймер запускается при появлении диалогового окна, и каждое нажатие клавиши откладывает его.2497 * Ожидайте `elicitation_dialog` для формы запроса данных или `elicitation_url_dialog` для запроса URL в браузере, когда вы ничего не вводили около шести секунд. Оба используют тот же шестисекундный порог, что и `permission_prompt`: таймер запускается при появлении диалогового окна, и каждое нажатие клавиши откладывает его.
2499 2498
2500 Запрос разрешения или запрос данных, поступивший, пока на экране открыто другое диалоговое окно, сохраняет тот же шестисекундный порог, отсчитываемый с момента поступления запроса. Уведомление о нём может дойти до вас, пока запрос всё ещё ожидает за открытым диалоговым окном.2499 Запрос разрешения или запрос данных, который поступает, пока на экране открыто другое диалоговое окно, сохраняет тот же шестисекундный порог, отсчитываемый с момента поступления запроса. Уведомление о нём может дойти до вас, пока запрос всё ещё ждёт за открытым диалоговым окном.
2501</Note>2500</Note>
2502 2501
2503Claude Code иначе рассчитывает время `permission_prompt` в сессиях, где он отправляет запросы разрешений в [колбэк `canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK — именно так Claude Desktop и расширение VS Code размещают Claude Code:2502Claude Code иначе рассчитывает время для `permission_prompt` в сессиях, где он отправляет запросы разрешения в [обратный вызов `canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK — именно так Claude Desktop и расширение VS Code размещают Claude Code:
2504 2503
2505* Ожидайте `permission_prompt` примерно через шесть секунд после того, как Claude запросит разрешение. Claude Code не откладывает его, пока вы вводите текст.2504* Ожидайте `permission_prompt` примерно через шесть секунд после того, как Claude запросит разрешение. Claude Code не откладывает его, пока вы вводите текст.
2506* Если вы или хук [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.2505* Если вы или хук [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2507* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) в `1`, чтобы отключить `permission_prompt` в таких сессиях.2506* Задайте [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) значение `1`, чтобы отключить `permission_prompt` в этих сессиях.
2508 2507
2509До v2.1.233 `permission_prompt` в таких сессиях не срабатывал.2508До v2.1.233 `permission_prompt` в этих сессиях не срабатывал.
2510 2509
2511Используйте отдельные matcher, чтобы запускать разные обработчики в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения о разрешениях, когда Claude нужно подтверждение разрешения, и другое уведомление, когда Claude простаивает:2510Используйте отдельные matcher, чтобы запускать разные обработчики в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения о разрешениях, когда Claude нужно подтверждение разрешения, и другое уведомление, когда Claude простаивает:
2512 2511
2541 Входные данные Notification2540 Входные данные Notification
2542</h4>2541</h4>
2543 2542
2544Помимо [общих входных полей](#common-input-fields), хуки Notification получают `message` с текстом уведомления, необязательное `title` и `notification_type`, указывающее, какой тип сработал.2543Помимо [общих входных полей](#common-input-fields), хуки Notification получают `message` с текстом уведомления, необязательный `title` и `notification_type`, указывающий, какой тип сработал.
2545 2544
2546```json theme={null}2545```json theme={null}
2547{2546{
2555}2554}
2556```2555```
2557 2556
2558Хуки Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но по-прежнему выводит [`terminalSequence`](#emit-terminal-notifications), на чём основан пример уведомления рабочего стола. Хуки Notification предназначены для побочных эффектов, например пересылки уведомления во внешний сервис.2557Хуки Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но по-прежнему выводит [`terminalSequence`](#emit-terminal-notifications), на чём основан пример с уведомлением рабочего стола. Хуки Notification предназначены для побочных действий, например для пересылки уведомления во внешний сервис.
2559 2558
2560<h3 id="subagentstart">2559<h3 id="subagentstart">
2561 SubagentStart2560 SubagentStart
2562</h3>2561</h3>
2563 2562
2564Запускается, когда Claude создаёт субагента с помощью инструмента Agent, когда Claude [возобновляет субагента](/docs/ru/sub-agents#resume-subagents), и каждый раз, когда внутрипроцессный участник [команды агентов](/docs/ru/agent-teams) обрабатывает новое сообщение. Поддерживает matcher для фильтрации по имени типа агента. Для встроенных агентов это имя агента, например `general-purpose`, `Explore` или `Plan`. Для [пользовательских субагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.2563Выполняется, когда Claude запускает субагента с помощью инструмента Agent, когда Claude [возобновляет субагента](/docs/ru/sub-agents#resume-subagents), а также каждый раз, когда внутрипроцессный участник [команды агентов](/docs/ru/agent-teams) обрабатывает новое сообщение. Поддерживает matcher для фильтрации по имени типа агента. Для встроенных агентов это имя агента, например `general-purpose`, `Explore` или `Plan`. Для [пользовательских субагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.
2565 2564
2566Для субагентов, поставляемых [плагином](/docs/ru/plugins/overview), тип агента — это идентификатор с областью плагина, например `my-plugin:reviewer`, а не просто имя из frontmatter. Двоеточие переводит имя с областью плагина на путь регулярных выражений, поэтому для точного совпадения закрепите matcher с помощью `^` и `$`: `^my-plugin:reviewer$`.2565Для субагентов, поставляемых [плагином](/docs/ru/plugins/overview), тип агента — это идентификатор в области плагина, например `my-plugin:reviewer`, а не просто имя из frontmatter. Двоеточие переводит имя в области плагина на путь регулярных выражений, поэтому для точного совпадения закрепите matcher с помощью `^` и `$`: `^my-plugin:reviewer$`.
2567 2566
2568<h4 id="subagentstart-input">2567<h4 id="subagentstart-input">
2569 Входные данные SubagentStart2568 Входные данные SubagentStart
2582}2581}
2583```2582```
2584 2583
2585Хуки SubagentStart не могут блокировать создание субагента, но могут внедрять в него контекст. Помимо [полей вывода JSON](#json-output), доступных всем хукам, вы можете вернуть:2584Хуки SubagentStart не могут блокировать создание субагента, но могут внедрять контекст в субагента. Помимо [выходных полей JSON](#json-output), доступных всем хукам, вы можете вернуть:
2586 2585
2587| Поле | Описание |2586| Поле | Описание |
2588| :- | :- |2587| :- | :- |
2589| `additionalContext` | Строка, добавляемая в контекст субагента в начале его диалога, перед первым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |2588| `additionalContext` | Строка, добавляемая в контекст субагента в начале его диалога, перед его первым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
2590 2589
2591```json theme={null}2590```json theme={null}
2592{2591{
2597}2596}
2598```2597```
2599 2598
2600Когда хук снова запускается для того же субагента, Claude Code внедряет возвращённый контекст, только если контекст субагента ещё не содержит копию из предыдущего запуска. Копия, внедрённая при запуске, остаётся на месте, сохраняя [кэш промптов](/docs/ru/prompt-caching#subagents-and-the-cache) субагента нетронутым. После того как [автосжатие](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code снова внедряет контекст следующего запуска.2599Когда хук снова запускается для того же субагента, Claude Code внедряет возвращённый контекст только в том случае, если контекст субагента ещё не содержит копию из предыдущего запуска. Копия, внедрённая при запуске, остаётся на месте, сохраняя [кэш промптов](/docs/ru/prompt-caching#subagents-and-the-cache) субагента нетронутым. После того как [автосжатие](/docs/ru/sub-agents#auto-compaction) отбросит эту копию, Claude Code снова внедряет контекст следующего запуска.
2601 2600
2602<h3 id="subagentstop">2601<h3 id="subagentstop">
2603 SubagentStop2602 SubagentStop
2604</h3>2603</h3>
2605 2604
2606Запускается, когда субагент Claude Code закончил отвечать. Сопоставляется по типу агента, значения те же, что и для SubagentStart.2605Выполняется, когда субагент Claude Code закончил отвечать. Сопоставляется по типу агента, значения те же, что и для SubagentStart.
2607 2606
2608<h4 id="subagentstop-input">2607<h4 id="subagentstop-input">
2609 Входные данные SubagentStop2608 Входные данные SubagentStop
2610</h4>2609</h4>
2611 2610
2612Помимо [общих входных полей](#common-input-fields), хуки 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` содержит текстовое содержимое последнего ответа субагента, поэтому хуки могут получить к нему доступ без разбора файла транскрипта.2611Помимо [общих входных полей](#common-input-fields), хуки 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` содержит текстовое содержимое финального ответа субагента, поэтому хуки могут получить к нему доступ без разбора файла транскрипта.
2613 2612
2614Не каждое событие 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), и пустая строка, когда сессия работает без него.2613Не каждое событие 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), и пустая строка, если сессия работает без него.
2615 2614
2616`matcher`, называющий типы агентов, не совпадает с пустым `agent_type`. Хук, у которого matcher опущен, равен `""` или `"*"` либо является регулярным выражением, совпадающим с пустой строкой, запускается и для событий с пустым `agent_type`.2615`matcher`, в котором указаны типы агентов, не соответствует пустому `agent_type`. Хук, у которого matcher опущен, равен `""` или `"*"` либо является регулярным выражением, соответствующим пустой строке, запускается и для событий с пустым `agent_type`.
2617 2616
2618В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчёт через этот инструмент перед остановкой. Тогда поле `last_assistant_message` содержит заключительный текст субагента, если он есть, который не является доставленным отчётом. Отчёт — это входное значение `message` этого вызова, которое хук `PreToolUse` или `PostToolUse`, сопоставленный с `SubagentHandback`, получает как `tool_input.message`.2617В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчёт через этот инструмент перед остановкой. Поле `last_assistant_message` в этом случае содержит заключительный текст субагента, если он есть, и это не доставленный отчёт. Отчёт — это входное поле `message` этого вызова, которое хук `PreToolUse` или `PostToolUse` с matcher `SubagentHandback` получает как `tool_input.message`.
2619 2618
2620Хуки SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в разделе [Входные данные Stop](#stop-input). Оба массива относятся к родительской сессии, а не к субагенту.2619Хуки SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в разделе [Входные данные Stop](#stop-input). Оба массива относятся к родительской сессии, а не к субагенту.
2621 2620
2636}2635}
2637```2636```
2638 2637
2639Хуки SubagentStop используют тот же формат управления решениями, что и [хуки Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, равным `"SubagentStop"`, для обратной связи без ошибки, которая продолжает работу субагента. Возврат `decision: "block"` с `reason` продолжает работу субагента и доставляет `reason` субагенту в качестве следующей инструкции. Хук, который блокирует с кодом выхода 2, доставляет своё сообщение stderr тем же способом. Чтобы внедрить контекст в родительскую сессию после возврата субагента, используйте вместо этого хук [`PostToolUse`](#posttooluse) для инструмента `Agent`.2638Хуки SubagentStop используют тот же формат управления решениями, что и [хуки Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, равным `"SubagentStop"`, для обратной связи без ошибки, которая продолжает работу субагента. Возврат `decision: "block"` с `reason` продолжает работу субагента и передаёт ему `reason` в качестве следующей инструкции. Хук, который блокирует, завершаясь с кодом 2, передаёт своё сообщение из stderr тем же способом. Чтобы внедрить контекст в родительскую сессию после возврата субагента, используйте вместо этого хук [`PostToolUse`](#posttooluse) для инструмента `Agent`.
2640 2639
2641<h3 id="taskcreated">2640<h3 id="taskcreated">
2642 TaskCreated2641 TaskCreated
2643</h3>2642</h3>
2644 2643
2645Запускается, когда задача создаётся с помощью инструмента `TaskCreate`. Используйте его для соблюдения соглашений об именовании, обязательного указания описаний задач или предотвращения создания определённых задач. В [сессии без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.2644Выполняется, когда задача создаётся с помощью инструмента `TaskCreate`. Используйте его, чтобы обеспечивать соблюдение соглашений об именовании, требовать описания задач или предотвращать создание определённых задач. В [сессии без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.
2646 2645
2647Хуки TaskCreated не поддерживают matcher и срабатывают при каждом возникновении события.2646Хуки TaskCreated не поддерживают matcher и срабатывают при каждом возникновении события.
2648 2647
2650 Входные данные TaskCreated2649 Входные данные TaskCreated
2651</h4>2650</h4>
2652 2651
2653Помимо [общих входных полей](#common-input-fields), хуки TaskCreated получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.2652Помимо [общих входных полей](#common-input-fields), хуки TaskCreated получают `task_id`, `task_subject` и, при наличии, `task_description`, `teammate_name` и `team_name`.
2654 2653
2655```json theme={null}2654```json theme={null}
2656{2655{
2672| `task_subject` | Заголовок задачи |2671| `task_subject` | Заголовок задачи |
2673| `task_description` | Подробное описание задачи. Может отсутствовать |2672| `task_description` | Подробное описание задачи. Может отсутствовать |
2674| `teammate_name` | Имя участника команды, создающего задачу. Может отсутствовать |2673| `teammate_name` | Имя участника команды, создающего задачу. Может отсутствовать |
2675| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |2674| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в одном из будущих выпусков |
2675| `agent_id` | В этом событии [общее входное поле](#common-input-fields) идентифицирует субагента или [внутрипроцессного участника команды](/docs/ru/agent-teams#choose-a-display-mode), создающего задачу. Может отсутствовать. Требуется Claude Code v2.1.290 или новее |
2676 2676
2677<h4 id="taskcreated-decision-control">2677<h4 id="taskcreated-decision-control">
2678 Управление решениями TaskCreated2678 Управление решениями TaskCreated
2680 2680
2681Хук TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude в качестве ошибки инструмента. Claude Code игнорирует `continue: false` от этого события, и Claude продолжает работу.2681Хук TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude в качестве ошибки инструмента. Claude Code игнорирует `continue: false` от этого события, и Claude продолжает работу.
2682 2682
2683* **Код выхода 2**: Claude Code возвращает текст stderr в качестве сообщения.2683* **Код выхода 2**: Claude Code возвращает текст из stderr в качестве сообщения.
2684* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` в качестве сообщения.2684* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` в качестве сообщения.
2685 2685
2686Этот пример блокирует задачи, заголовки которых не соответствуют требуемому формату:2686В этом примере блокируются задачи, заголовки которых не соответствуют требуемому формату:
2687 2687
2688```bash theme={null}2688```bash theme={null}
2689#!/bin/bash2689#!/bin/bash
2702 TaskCompleted2702 TaskCompleted
2703</h3>2703</h3>
2704 2704
2705Запускается, когда задача помечается как выполненная. Это происходит в двух ситуациях: когда любой агент явно помечает задачу как выполненную с помощью инструмента TaskUpdate или когда участник [команды агентов](/docs/ru/agent-teams) завершает свой ход с задачами в процессе выполнения. Используйте его для соблюдения критериев завершения, таких как прохождение тестов или проверок линтера, прежде чем задачу можно будет закрыть.2705Выполняется, когда задача помечается как выполненная. Это происходит в двух ситуациях: когда любой агент явно помечает задачу как выполненную с помощью инструмента TaskUpdate или когда участник [команды агентов](/docs/ru/agent-teams) завершает свой ход с задачами в процессе выполнения. Используйте его, чтобы обеспечивать соблюдение критериев завершения, например прохождение тестов или проверок линтера, прежде чем задачу можно будет закрыть.
2706 2706
2707Хуки TaskCompleted не поддерживают matcher и срабатывают при каждом возникновении события.2707Хуки TaskCompleted не поддерживают matcher и срабатывают при каждом возникновении события.
2708 2708
2710 Входные данные TaskCompleted2710 Входные данные TaskCompleted
2711</h4>2711</h4>
2712 2712
2713Помимо [общих входных полей](#common-input-fields), хуки TaskCompleted получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.2713Помимо [общих входных полей](#common-input-fields), хуки TaskCompleted получают `task_id`, `task_subject` и, при наличии, `task_description`, `teammate_name` и `team_name`.
2714 2714
2715```json theme={null}2715```json theme={null}
2716{2716{
2733| `task_subject` | Заголовок задачи |2733| `task_subject` | Заголовок задачи |
2734| `task_description` | Подробное описание задачи. Может отсутствовать |2734| `task_description` | Подробное описание задачи. Может отсутствовать |
2735| `teammate_name` | Имя участника команды, завершающего задачу. Может отсутствовать |2735| `teammate_name` | Имя участника команды, завершающего задачу. Может отсутствовать |
2736| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |2736| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в одном из будущих выпусков |
2737| `agent_id` | В этом событии [общее входное поле](#common-input-fields) идентифицирует субагента или [внутрипроцессного участника команды](/docs/ru/agent-teams#choose-a-display-mode), завершающего задачу. Может отсутствовать. Требуется Claude Code v2.1.290 или новее |
2737 2738
2738<h4 id="taskcompleted-decision-control">2739<h4 id="taskcompleted-decision-control">
2739 Управление решениями TaskCompleted2740 Управление решениями TaskCompleted
2741 2742
2742Хуки TaskCompleted поддерживают два способа управления завершением задачи:2743Хуки TaskCompleted поддерживают два способа управления завершением задачи:
2743 2744
2744* **Код выхода 2**: задача не помечается как выполненная, а сообщение stderr передаётся модели в качестве обратной связи.2745* **Код выхода 2**: задача не помечается как выполненная, а сообщение из stderr передаётся модели в качестве обратной связи.
2745* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие вызвано завершением хода участника команды, полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю. Когда событие вызвано инструментом `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 по-прежнему блокирует завершение.2746* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие вызвано завершением хода участника команды, полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю. Когда событие вызвано инструментом `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 по-прежнему блокирует завершение.
2746 2747
2747Этот пример запускает тесты и блокирует завершение задачи, если они не проходят:2748В этом примере запускаются тесты и блокируется завершение задачи, если они не проходят:
2748 2749
2749```bash theme={null}2750```bash theme={null}
2750#!/bin/bash2751#!/bin/bash
2764 Stop2765 Stop
2765</h3>2766</h3>
2766 2767
2767Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если2768Выполняется, когда основной агент Claude Code закончил отвечать. Не выполняется, если
2768остановка произошла из-за прерывания пользователем. При ошибках API вместо этого2769остановка произошла из-за прерывания пользователем. Ошибки API вместо этого вызывают
2769срабатывает [StopFailure](#stopfailure).2770[StopFailure](#stopfailure).
2770 2771
2771<Tip>2772<Tip>
2772 Команда [`/goal`](/docs/ru/goal) — встроенный ярлык для хука Stop на основе промпта с областью действия сессии. Используйте её, когда хотите, чтобы Claude продолжал работать над достижением условия, без написания конфигурации хука.2773 Команда [`/goal`](/docs/ru/goal) — это встроенное сокращение для хука Stop на основе промпта, действующего в рамках сессии. Используйте её, когда хотите, чтобы Claude продолжал работать до выполнения условия, не создавая конфигурацию хука.
2773</Tip>2774</Tip>
2774 2775
2775<h4 id="stop-input">2776<h4 id="stop-input">
2780 2781
2781Claude Code применяет ограничение в 8 последовательных продолжений: после того как хуки остановки продолжили ход восемь раз подряд, Claude Code переопределяет следующую блокировку и завершает ход. Счётчик последовательных продолжений сбрасывается каждый раз, когда Claude вызывает инструмент. Чтобы повысить ограничение, задайте [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).2782Claude Code применяет ограничение в 8 последовательных продолжений: после того как хуки остановки продолжили ход восемь раз подряд, Claude Code переопределяет следующую блокировку и завершает ход. Счётчик последовательных продолжений сбрасывается каждый раз, когда Claude вызывает инструмент. Чтобы повысить ограничение, задайте [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).
2782 2783
2783Поле `last_assistant_message` содержит текстовое содержимое последнего ответа Claude, поэтому хуки могут получить к нему доступ без разбора файла транскрипта. Для хуков, которые действуют по только что завершённому ходу, например хуков чтения вслух или уведомлений, используйте это поле, а не чтение `transcript_path`: не во всех версиях гарантируется, что файл транскрипта содержит последнее сообщение в момент Stop.2784Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому хуки могут получить к нему доступ без разбора файла транскрипта. Для хуков, работающих с только что завершённым ходом, например хуков чтения вслух или уведомлений, используйте это поле, а не чтение `transcript_path`: не во всех версиях гарантируется, что файл транскрипта содержит финальное сообщение в момент Stop.
2784 2785
2785Массивы `background_tasks` и `session_crons` позволяют хукам отличать «сессия завершена» от «сессия приостановлена в ожидании, пока фоновая работа снова её разбудит». Оба массива присутствуют, когда реестр задач доступен, и пусты, когда ничего не выполняется и не запланировано.2786Массивы `background_tasks` и `session_crons` позволяют хукам отличать ситуацию «сессия завершена» от ситуации «сессия приостановлена в ожидании фоновой работы, которая её снова разбудит». Оба массива присутствуют, когда реестр задач доступен, и пусты, когда ничего не выполняется и не запланировано.
2786 2787
2787Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует следующие поля:2788Каждая запись в `background_tasks` описывает одну выполняемую задачу и использует следующие поля:
2788 2789
2789| Поле | Описание |2790| Поле | Описание |
2790| :- | :- |2791| :- | :- |
2791| `id` | Идентификатор задачи |2792| `id` | Идентификатор задачи |
2792| `type` | Понятная метка типа задачи, например `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждая метка указывает, какая функция Claude Code создала задачу. Для нераспознанных типов используется необработанный дискриминант |2793| `type` | Понятная метка типа задачи, например `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждая метка указывает, какая функция Claude Code создала задачу. Для нераспознанных типов используется исходный дискриминант |
2793| `status` | Текущий статус задачи |2794| `status` | Текущий статус задачи |
2794| `description` | Произвольное текстовое описание, ограниченное 1000 символами, с маркером `… [+N chars]` внутри строки при обрезке |2795| `description` | Описание в свободной форме, ограниченное 1000 символами, с маркером `… [+N chars]` внутри строки при обрезке |
2795| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |2796| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |
2796| `agent_type` | Имя типа субагента. Присутствует только для задач `subagent` |2797| `agent_type` | Имя типа субагента. Присутствует только для задач `subagent` |
2797| `server` | Имя MCP-сервера. Присутствует только для задач `monitor` и `MCP task` |2798| `server` | Имя MCP-сервера. Присутствует только для задач `monitor` и `MCP task` |
2798| `tool` | Имя MCP-инструмента. Присутствует только для задач `monitor` и `MCP task` |2799| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |
2799| `name` | Имя workflow. Присутствует только для задач `workflow` |2800| `name` | Имя workflow. Присутствует только для задач `workflow` |
2800 2801
2801Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью действия сессии, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:2802Каждая запись в `session_crons` описывает одно запланированное пробуждение в рамках сессии, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:
2802 2803
2803| Поле | Описание |2804| Поле | Описание |
2804| :- | :- |2805| :- | :- |
2805| `id` | Идентификатор cron-задачи |2806| `id` | Идентификатор задачи cron |
2806| `schedule` | Cron-выражение, например `0 9 * * 1-5` |2807| `schedule` | Выражение cron, например `0 9 * * 1-5` |
2807| `recurring` | `false` для однократных пробуждений, расписание которых задаёт одно время срабатывания, `true` для задач, которые срабатывают повторно при каждом совпадении |2808| `recurring` | `false` для одноразовых пробуждений, расписание которых задаёт одно время срабатывания, `true` для задач, срабатывающих повторно при каждом совпадении |
2808| `prompt` | Промпт, отправляемый при срабатывании cron, ограниченный 1000 символами с тем же маркером `… [+N chars]` |2809| `prompt` | Промпт, отправляемый при срабатывании cron, ограниченный 1000 символами с тем же маркером `… [+N chars]` |
2809 2810
2810Этот пример показывает входные данные Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:2811В этом примере показаны входные данные Stop с одной выполняемой задачей оболочки и одним повторяющимся cron:
2811 2812
2812```json theme={null}2813```json theme={null}
2813{2814{
2842 Управление решениями Stop2843 Управление решениями Stop
2843</h4>2844</h4>
2844 2845
2845Хуки `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude работу. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:2846Хуки `Stop` и `SubagentStop` могут управлять тем, продолжит ли Claude работу. Помимо [выходных полей JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2846 2847
2847| Поле | Описание |2848| Поле | Описание |
2848| :- | :- |2849| :- | :- |
2849| `decision` | `"block"` не даёт Claude остановиться. Опустите, чтобы разрешить Claude остановиться |2850| `decision` | `"block"` не даёт Claude остановиться. Опустите, чтобы разрешить Claude остановиться |
2850| `reason` | Обязательно, когда `decision` равно `"block"`. Сообщает Claude, почему он должен продолжить |2851| `reason` | Обязательно, когда `decision` равно `"block"`. Сообщает Claude, почему ему следует продолжить |
2851| `hookSpecificOutput.additionalContext` | Обратная связь для Claude без ошибки. Диалог продолжается, чтобы Claude мог действовать на её основе, но, в отличие от `decision: "block"`, она отображается в транскрипте как обратная связь хука, а не как ошибка хука |2852| `hookSpecificOutput.additionalContext` | Обратная связь для Claude, не являющаяся ошибкой. Диалог продолжается, чтобы Claude мог на неё отреагировать, но, в отличие от `decision: "block"`, в транскрипте она отображается как обратная связь хука, а не как ошибка хука |
2852 2853
2853Хук, который блокирует с кодом выхода 2, обрабатывается так же, как `reason`: Claude получает сообщение stderr в качестве объяснения, почему он должен продолжить.2854Хук, который блокирует, завершаясь с кодом 2, обрабатывается так же, как `reason`: Claude получает сообщение из stderr в качестве пояснения, почему ему следует продолжить.
2854 2855
2855```json theme={null}2856```json theme={null}
2856{2857{
2874 StopFailure2875 StopFailure
2875</h3>2876</h3>
2876 2877
2877Запускается вместо [Stop](#stop), когда ход завершается из-за ошибки API. Claude Code игнорирует вывод и код выхода хука, за исключением [`terminalSequence`](#emit-terminal-notifications). Используйте его для записи сбоев в лог, отправки оповещений или выполнения действий по восстановлению, когда Claude не может завершить ответ из-за ограничений частоты запросов, проблем с аутентификацией или других ошибок API.2878Выполняется вместо [Stop](#stop), когда ход завершается из-за ошибки API. Claude Code игнорирует вывод и код выхода хука, за исключением [`terminalSequence`](#emit-terminal-notifications). Используйте его, чтобы логировать сбои, отправлять оповещения или выполнять действия по восстановлению, когда Claude не может завершить ответ из-за ограничений частоты запросов, проблем с аутентификацией или других ошибок API.
2878 2879
2879<h4 id="stopfailure-input">2880<h4 id="stopfailure-input">
2880 Входные данные StopFailure2881 Входные данные StopFailure
2886| :- | :- |2887| :- | :- |
2887| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |2888| `error` | Тип ошибки: `rate_limit`, `overloaded`, `authentication_failed`, `oauth_org_not_allowed`, `account_on_hold`, `billing_error`, `invalid_request`, `model_not_found`, `server_error`, `max_output_tokens`, `cloud_credential_error` или `unknown` |
2888| `error_details` | Дополнительные сведения об ошибке, если они доступны |2889| `error_details` | Дополнительные сведения об ошибке, если они доступны |
2889| `last_assistant_message` | Отображаемый текст ошибки, показанный в диалоге. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит саму строку ошибки API, например `"API Error: Rate limit reached"` |2890| `last_assistant_message` | Отрисованный текст ошибки, показанный в диалоге. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит саму строку ошибки API, например `"API Error: Rate limit reached"` |
2890 2891
2891```json theme={null}2892```json theme={null}
2892{2893{
2900}2901}
2901```2902```
2902 2903
2903Хуки StopFailure не имеют управления решениями. Они запускаются только для уведомлений и логирования.2904У хуков StopFailure нет управления решениями. Они выполняются только для уведомлений и логирования.
2904 2905
2905<h3 id="teammateidle">2906<h3 id="teammateidle">
2906 TeammateIdle2907 TeammateIdle
2907</h3>2908</h3>
2908 2909
2909Запускается, когда участник [команды агентов](/docs/ru/agent-teams) собирается перейти в режим простоя после завершения своего хода. Используйте его для применения контроля качества до того, как участник команды прекратит работу, например требуя прохождения проверок линтера или проверяя наличие выходных файлов.2910Выполняется, когда участник [команды агентов](/docs/ru/agent-teams) вот-вот перейдёт в режим простоя после завершения своего хода. Используйте его, чтобы обеспечивать контроль качества до того, как участник команды прекратит работу, например требовать прохождения проверок линтера или проверять наличие выходных файлов.
2910 2911
2911Хуки TeammateIdle не поддерживают matcher и срабатывают при каждом возникновении события.2912Хуки TeammateIdle не поддерживают matcher и срабатывают при каждом возникновении события.
2912 2913
2930 2931
2931| Поле | Описание |2932| Поле | Описание |
2932| :- | :- |2933| :- | :- |
2933| `teammate_name` | Имя участника команды, который собирается перейти в режим простоя |2934| `teammate_name` | Имя участника команды, который вот-вот перейдёт в режим простоя |
2934| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |2935| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в одном из будущих выпусков |
2936| `agent_id` | В этом событии [общее входное поле](#common-input-fields) идентифицирует [внутрипроцессного участника команды](/docs/ru/agent-teams#choose-a-display-mode), который вот-вот перейдёт в режим простоя. Может отсутствовать. Требуется Claude Code v2.1.290 или новее |
2935 2937
2936<h4 id="teammateidle-decision-control">2938<h4 id="teammateidle-decision-control">
2937 Управление решениями TeammateIdle2939 Управление решениями TeammateIdle
2939 2941
2940Хуки TeammateIdle поддерживают два способа управления поведением участника команды:2942Хуки TeammateIdle поддерживают два способа управления поведением участника команды:
2941 2943
2942* **Код выхода 2**: участник команды получает сообщение stderr в качестве обратной связи и продолжает работу вместо перехода в режим простоя.2944* **Код выхода 2**: участник команды получает сообщение из stderr в качестве обратной связи и продолжает работу вместо перехода в режим простоя.
2943* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю.2945* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю.
2944 2946
2945Этот пример проверяет наличие артефакта сборки, прежде чем разрешить участнику команды перейти в режим простоя:2947В этом примере проверяется наличие артефакта сборки, прежде чем разрешить участнику команды перейти в режим простоя:
2946 2948
2947```bash theme={null}2949```bash theme={null}
2948#!/bin/bash2950#!/bin/bash
2959 ConfigChange2961 ConfigChange
2960</h3>2962</h3>
2961 2963
2962Запускается, когда файл конфигурации изменяется во время сессии. Используйте его для аудита изменений настроек, применения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.2964Выполняется, когда файл конфигурации изменяется во время сессии. Используйте его для аудита изменений настроек, обеспечения соблюдения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.
2963 2965
2964Claude Code запускает хуки ConfigChange, когда изменяется файл настроек, файл управляемой политики или файл скилла. Для управляемой политики он запускает их, только когда изменяется `managed-settings.json` или файл в `managed-settings.d/`. [Настройки, управляемые сервером](/docs/ru/server-managed-settings), и изменения управляемых настроек macOS или политики реестра Windows он применяет без запуска хуков. В WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет изменённый файл управляемых настроек на стороне Windows при опросе политики, не запуская хуки.2966Claude Code запускает хуки ConfigChange, когда изменяется файл настроек, файл управляемой политики или файл скилла. Для управляемой политики он запускает их только при изменении `managed-settings.json` или файла в `managed-settings.d/`. [Настройки, управляемые сервером](/docs/ru/server-managed-settings), и изменения управляемых настроек macOS или политики реестра Windows он применяет без запуска хуков. В WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет изменённый файл управляемых настроек на стороне Windows при опросе политики без запуска хуков.
2965 2967
2966Matcher фильтрует по источнику конфигурации:2968Matcher фильтрует по источнику конфигурации:
2967 2969
2973| `policy_settings` | Изменяется `managed-settings.json` или файл в `managed-settings.d/` |2975| `policy_settings` | Изменяется `managed-settings.json` или файл в `managed-settings.d/` |
2974| `skills` | Изменяется файл скилла в `.claude/skills/` |2976| `skills` | Изменяется файл скилла в `.claude/skills/` |
2975 2977
2976Этот пример записывает в лог все изменения конфигурации для аудита безопасности:2978В этом примере все изменения конфигурации записываются в журнал для аудита безопасности:
2977 2979
2978```json theme={null}2980```json theme={null}
2979{2981{
2997 Входные данные ConfigChange2999 Входные данные ConfigChange
2998</h4>3000</h4>
2999 3001
3000Помимо [общих входных полей](#common-input-fields), хуки ConfigChange получают `source` и, необязательно, `file_path`. Поле `source` указывает, какой тип конфигурации изменился, а `file_path` содержит путь к конкретному изменённому файлу.3002Помимо [общих входных полей](#common-input-fields), хуки ConfigChange получают `source` и, при наличии, `file_path`. Поле `source` указывает, какой тип конфигурации изменился, а `file_path` содержит путь к конкретному изменённому файлу.
3001 3003
3002```json theme={null}3004```json theme={null}
3003{3005{
3014 Управление решениями ConfigChange3016 Управление решениями ConfigChange
3015</h4>3017</h4>
3016 3018
3017Хуки ConfigChange могут блокировать вступление изменений конфигурации в силу. Используйте код выхода 2 или JSON-поле `decision`, чтобы предотвратить изменение. При блокировке новые настройки не применяются к работающей сессии.3019Хуки ConfigChange могут блокировать вступление изменений конфигурации в силу. Используйте код выхода 2 или JSON-поле `decision`, чтобы предотвратить изменение. При блокировке новые настройки не применяются к текущей сессии.
3018 3020
3019| Поле | Описание |3021| Поле | Описание |
3020| :- | :- |3022| :- | :- |
3028}3030}
3029```3031```
3030 3032
3031Изменения `policy_settings` нельзя заблокировать. Хуки по-прежнему срабатывают для источников `policy_settings`, когда изменяется файл управляемых настроек на компьютере, поэтому вы можете использовать их для записи этих правок в лог, но любое решение о блокировке игнорируется. Это гарантирует, что настройки, управляемые организацией, всегда вступают в силу. Claude Code не запускает хуки `ConfigChange`, когда [настройки, управляемые сервером](/docs/ru/server-managed-settings), поступают или обновляются.3033Изменения `policy_settings` нельзя заблокировать. Хуки по-прежнему срабатывают для источников `policy_settings`, когда изменяется файл управляемых настроек на компьютере, поэтому вы можете использовать их для записи этих изменений в журнал, но любое решение о блокировке игнорируется. Это гарантирует, что настройки, управляемые организацией, всегда вступают в силу. Claude Code не запускает хуки `ConfigChange`, когда [настройки, управляемые сервером](/docs/ru/server-managed-settings), поступают или обновляются.
3032 3034
3033Claude Code учитывает решение о блокировке из JSON-вывода хука ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения ни вам, ни Claude, независимо от того, блокируете ли вы с помощью `reason` или через stderr с кодом выхода 2. Claude Code лишь записывает строку в лог отладки.3035Claude Code учитывает решение о блокировке из JSON-вывода хука ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения ни вам, ни Claude, независимо от того, блокируете ли вы с помощью `reason` или через stderr с кодом выхода 2. Claude Code лишь записывает строку в отладочный лог.
3034 3036
3035<h3 id="cwdchanged">3037<h3 id="cwdchanged">
3036 CwdChanged3038 CwdChanged
3037</h3>3039</h3>
3038 3040
3039Запускается, когда shell-команда в основном диалоге изменяет рабочий каталог, например когда Claude выполняет команду `cd`. Используйте его для реакции на смену каталога: перезагрузки переменных окружения, активации инструментальных цепочек проекта или автоматического запуска скриптов настройки. Работает в паре с [FileChanged](#filechanged) для таких инструментов, как [direnv](https://direnv.net/), которые управляют окружением для каждого каталога.3041Выполняется, когда shell-команда в основном диалоге изменяет рабочий каталог, например когда Claude выполняет команду `cd`. Используйте его, чтобы реагировать на смену каталога: перезагружать переменные окружения, активировать наборы инструментов для конкретного проекта или автоматически запускать скрипты настройки. Работает в паре с [FileChanged](#filechanged) для таких инструментов, как [direnv](https://direnv.net/), которые управляют окружением для каждого каталога.
3040 3042
3041Хуки CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события CwdChanged, когда Claude Code их очищает.3043Хуки CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события CwdChanged, когда Claude Code их очищает.
3042 3044
3063 Вывод CwdChanged3065 Вывод CwdChanged
3064</h4>3066</h4>
3065 3067
3066Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки CwdChanged могут возвращать `watchPaths`, чтобы динамически задавать, за какими путями файлов следит [FileChanged](#filechanged):3068Помимо [выходных полей JSON](#json-output), доступных всем хукам, хуки CwdChanged могут возвращать `watchPaths`, чтобы динамически задавать, за какими путями к файлам следит [FileChanged](#filechanged):
3067 3069
3068| Поле | Описание |3070| Поле | Описание |
3069| :- | :- |3071| :- | :- |
3070| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Возврат пустого массива очищает динамический список, что типично при входе в новый каталог |3072| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. За путями из вашей конфигурации `matcher` наблюдение ведётся всегда. Возврат пустого массива очищает динамический список, что типично при входе в новый каталог |
3071 3073
3072Хуки CwdChanged не имеют управления решениями. Они не могут заблокировать смену каталога.3074У хуков CwdChanged нет управления решениями. Они не могут заблокировать смену каталога.
3073 3075
3074Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.3076Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как короткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3075 3077
3076<h3 id="directoryadded">3078<h3 id="directoryadded">
3077 DirectoryAdded3079 DirectoryAdded
3078</h3>3080</h3>
3079 3081
3080Запускается после того, как вы добавляете рабочий каталог в середине сессии командой `/add-dir` или после того, как клиент SDK добавляет его управляющим запросом `register_repo_root`. Используйте его для подготовки только что добавленного репозитория, например для установки его зависимостей.3082Выполняется после того, как вы добавляете рабочий каталог посреди сессии с помощью команды `/add-dir` или после того, как клиент SDK добавляет его с помощью управляющего запроса `register_repo_root`. Используйте его, чтобы подготовить только что добавленный репозиторий, например установить его зависимости.
3081 3083
3082Claude Code не вызывает это событие, когда:3084Claude Code не вызывает это событие, когда:
3083 3085
3084* Вы передаёте каталог с помощью флага запуска `--add-dir`; такие каталоги охватывает [SessionStart](#sessionstart)3086* Вы передаёте каталог с помощью флага запуска `--add-dir`; такие каталоги покрывает [SessionStart](#sessionstart)
3085* Вы добавляете каталог на вкладке Workspace в `/permissions`3087* Вы добавляете каталог на вкладке Workspace в `/permissions`
3086* Вы добавляете каталог, который уже является рабочим каталогом или находится внутри него3088* Вы добавляете каталог, который уже является рабочим каталогом или находится внутри него
3087 3089
3088Claude Code вызывает DirectoryAdded после обновления состояния песочницы и разрешений, поэтому инструменты в песочнице уже видят новый каталог, когда запускается ваш хук. Сами команды хуков выполняются вне песочницы.3090Claude Code вызывает DirectoryAdded после обновления состояния песочницы и разрешений, поэтому инструменты в песочнице уже видят новый каталог, когда запускается ваш хук. Сами команды хуков выполняются вне песочницы.
3089 3091
3090Claude Code не ждёт хук: добавление завершается немедленно, а хук выполняется в фоне со стандартным таймаутом 600 секунд.3092Claude Code не ждёт хук: добавление завершается немедленно, а хук выполняется в фоне с таймаутом по умолчанию 600 секунд.
3091 3093
3092Matcher фильтрует по способу добавления каталога:3094Matcher фильтрует по способу добавления каталога:
3093 3095
3094| Matcher | Когда срабатывает |3096| Matcher | Когда срабатывает |
3095| :- | :- |3097| :- | :- |
3096| `slash_command` | Вы добавляете каталог с помощью `/add-dir` |3098| `slash_command` | Вы добавляете каталог с помощью `/add-dir` |
3097| `register_repo_root` | Клиент SDK добавляет каталог управляющим запросом `register_repo_root` |3099| `register_repo_root` | Клиент SDK добавляет каталог с помощью управляющего запроса `register_repo_root` |
3098 3100
3099<h4 id="directoryadded-input">3101<h4 id="directoryadded-input">
3100 Входные данные DirectoryAdded3102 Входные данные DirectoryAdded
3118}3120}
3119```3121```
3120 3122
3121Хуки DirectoryAdded не имеют управления решениями. Они не могут заблокировать добавление, которое уже завершено к моменту запуска хука. Claude Code отбрасывает поле `continue` из их JSON-вывода, а остальное обрабатывает по-разному в зависимости от источника:3123У хуков DirectoryAdded нет управления решениями. Они не могут заблокировать добавление, которое уже завершено к моменту запуска хука. Claude Code отбрасывает поле `continue` из их JSON-вывода, а остальное выводит по-разному в зависимости от источника:
3122 3124
3123* `slash_command`: Claude Code доставляет `systemMessage` хука Claude в качестве контекста на следующем ходе диалога, а не показывает его вам. Количество неудавшихся хуков отображается в транскрипте. Полный вывод сбоев записывается в лог отладки3125* `slash_command`: Claude Code передаёт `systemMessage` хука Claude в качестве контекста на следующем ходе диалога, а не показывает его вам. Количество неудавшихся хуков отображается в транскрипте. Полный вывод сбоев записывается в отладочный лог
3124* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоев только в лог отладки3126* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоев только в отладочный лог
3125 3127
3126<h3 id="filechanged">3128<h3 id="filechanged">
3127 FileChanged3129 FileChanged
3128</h3>3130</h3>
3129 3131
3130Запускается, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путём анализа вызовов инструментов, поэтому он запускает хук независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает через `Bash`, или процесс полностью вне Claude Code. Типичное применение — перезагрузка переменных окружения при изменении файлов конфигурации проекта.3132Выполняется, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путём проверки вызовов инструментов, поэтому он запускает хук независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с помощью `Bash`, или процесс полностью вне Claude Code. Типичное применение — перезагрузка переменных окружения при изменении файлов конфигурации проекта.
3131 3133
3132`matcher` для этого события выполняет две роли:3134`matcher` для этого события выполняет две роли:
3133 3135
3134* **Построение списка наблюдения**: значение разбивается по `|`, и каждый сегмент регистрируется как буквальное имя файла в рабочем каталоге, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны регулярных выражений здесь бесполезны: значение вроде `^\.env` будет отслеживать файл с буквальным именем `^\.env`.3136* **Построение списка наблюдения**: значение разбивается по `|`, и каждый сегмент регистрируется как буквальное имя файла в рабочем каталоге, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны регулярных выражений здесь бесполезны: значение вроде `^\.env` будет отслеживать файл с буквальным именем `^\.env`.
3135* **Фильтрация запускаемых хуков**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы хуков запускаются, по стандартным [правилам matcher](#matcher-patterns) применительно к базовому имени изменённого файла.3137* **Фильтрация запускаемых хуков**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы хуков запускаются, по стандартным [правилам matcher](#matcher-patterns) относительно базового имени изменённого файла.
3136 3138
3137Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая перезапись файла командой `Bash` или внешним скриптом:3139В этом примере нормализуются окончания строк в `data.csv` после любого изменения, включая перезапись файла командой `Bash` или внешним скриптом:
3138 3140
3139```json theme={null}3141```json theme={null}
3140{3142{
3154}3156}
3155```3157```
3156 3158
3157Хук считывает абсолютный путь изменённого файла из поля `file_path` [входных данных JSON](#filechanged-input) в stdin. Его защитная проверка `grep` ищет то же, что удаляет `perl`, — CR в конце строки, поэтому запуск после нормализации завершается, не трогая файл. Менее строгая проверка приводит к бесконечному циклу, потому что `perl -i` перезаписывает файл, даже если ничего не заменяет, а Claude Code снова запускает хук после каждой перезаписи. Сохраните этот скрипт по пути `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:3159Хук считывает абсолютный путь к изменённому файлу из поля `file_path` [входных данных JSON](#filechanged-input) в stdin. Его проверка с помощью `grep` ищет то же, что удаляет `perl`, — CR в конце строки, поэтому запуск после нормализации завершается, не трогая файл. Менее строгая проверка приводит к бесконечному циклу, потому что `perl -i` перезаписывает файл, даже если ничего не заменяет, а Claude Code снова запускает хук после каждой перезаписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3158 3160
3159```bash theme={null}3161```bash theme={null}
3160#!/bin/bash3162#!/bin/bash
3164fi3166fi
3165```3167```
3166 3168
3167Чтобы убедиться, что хук работает, попросите Claude добавить строку с CRLF в `data.csv` с помощью команды `Bash`. Claude Code запускает хук, и в итоге файл получает окончания строк LF.3169Чтобы убедиться, что хук работает, попросите Claude дописать строку с CRLF в `data.csv` с помощью команды `Bash`. Claude Code запустит хук, и в итоге файл будет содержать окончания строк LF.
3168 3170
3169Чтобы отслеживать файлы, которые нельзя назвать заранее, возвращайте [`watchPaths`](#filechanged-output) из хука для динамического обновления списка наблюдения. Claude Code запускает наблюдатель, только когда что-то указывает файл для наблюдения, поэтому заполните список группой FileChanged, matcher которой называет хотя бы один файл, или хуком [SessionStart](#sessionstart-decision-control) либо [CwdChanged](#cwdchanged), возвращающим `watchPaths`. Matcher по-прежнему фильтрует, какие группы хуков запускаются при изменении отслеживаемого файла, поэтому для группы, обрабатывающей динамические пути, опустите matcher — тогда он совпадает с каждым отслеживаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` тоже совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения как любое другое значение — как буквальный файл с именем `*`.3171Чтобы отслеживать файлы, которые нельзя назвать заранее, возвращайте из хука [`watchPaths`](#filechanged-output) для динамического обновления списка наблюдения. Claude Code запускает наблюдателя только тогда, когда что-то называет файл для отслеживания, поэтому заполните список группой FileChanged, matcher которой называет хотя бы один файл, или хуком [SessionStart](#sessionstart-decision-control) либо [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher по-прежнему фильтрует, какие группы хуков запускаются при изменении отслеживаемого файла, поэтому для группы, обрабатывающей динамические пути, опустите matcher: такой matcher соответствует каждому отслеживаемому файлу и ничего не добавляет в список наблюдения. Matcher `"*"` также соответствует каждому файлу, но Claude Code регистрирует его в списке наблюдения, как и любое другое значение, — как буквальный файл с именем `*`.
3170 3172
3171Хуки FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.3173Хуки FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.
3172 3174
3196 Вывод FileChanged3198 Вывод FileChanged
3197</h4>3199</h4>
3198 3200
3199Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки FileChanged могут возвращать `watchPaths`, чтобы динамически обновлять отслеживаемые пути файлов:3201Помимо [выходных полей JSON](#json-output), доступных всем хукам, хуки FileChanged могут возвращать `watchPaths`, чтобы динамически обновлять, за какими путями к файлам ведётся наблюдение:
3200 3202
3201| Поле | Описание |3203| Поле | Описание |
3202| :- | :- |3204| :- | :- |
3203| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Используйте это, когда ваш скрипт хука обнаруживает дополнительные файлы для наблюдения на основе изменённого файла |3205| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. За путями из вашей конфигурации `matcher` наблюдение ведётся всегда. Используйте это, когда ваш скрипт хука обнаруживает дополнительные файлы для отслеживания на основе изменённого файла |
3204 3206
3205Хуки FileChanged не имеют управления решениями. Они не могут предотвратить изменение файла.3207У хуков FileChanged нет управления решениями. Они не могут предотвратить изменение файла.
3206 3208
3207Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.3209Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как короткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3208 3210
3209<h3 id="worktreecreate">3211<h3 id="worktreecreate">
3210 WorktreeCreate3212 WorktreeCreate
3211</h3>3213</h3>
3212 3214
3213Запускается при создании 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`. Настройка хука WorktreeCreate заменяет это стандартное поведение Git, позволяя использовать другую систему контроля версий, например SVN, Perforce или Mercurial.3215Запускается при создании 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`. Настройка хука WorktreeCreate заменяет это стандартное поведение Git, позволяя использовать другую систему контроля версий, например SVN, Perforce или Mercurial.
3214 3216
3215Поскольку хук полностью заменяет стандартное поведение, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, например `.env`, в новый worktree, сделайте это в своём скрипте хука.3217Поскольку хук полностью заменяет стандартное поведение, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать в новый worktree локальные файлы конфигурации, например `.env`, сделайте это внутри скрипта хука.
3216 3218
3217Хук должен вернуть путь к созданному каталогу worktree. Claude Code использует этот путь как рабочий каталог для изолированной сессии. О том, как каждый тип хука возвращает путь, см. в разделе [Вывод WorktreeCreate](#worktreecreate-output).3219Хук должен вернуть путь к каталогу созданного worktree. Claude Code использует этот путь как рабочий каталог изолированной сессии. О том, как каждый тип хука возвращает путь, см. в разделе [Вывод WorktreeCreate](#worktreecreate-output).
3218 3220
3219Claude Code учитывает успешность хука и возвращённый путь и отбрасывает `systemMessage` и `continue`.3221Claude Code учитывает успешность выполнения хука и возвращённый путь, а `systemMessage` и `continue` отбрасывает.
3220 3222
3221Этот пример создаёт рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой:3223Этот пример создаёт рабочую копию SVN и выводит путь, который будет использовать Claude Code. Замените URL репозитория на свой:
3222 3224
3223```json theme={null}3225```json theme={null}
3224{3226{
3237}3239}
3238```3240```
3239 3241
3240Хук считывает `name` worktree из входных данных JSON в stdin, извлекает свежую копию в новый каталог и выводит путь к каталогу. `echo` в последней строке — это то, что Claude Code считывает как путь к worktree. Перенаправляйте любой другой вывод в stderr, чтобы он не мешал пути.3242Хук считывает `name` worktree из входных данных JSON в stdin, извлекает свежую копию в новый каталог и выводит путь к каталогу. Именно `echo` в последней строке Claude Code считывает как путь к worktree. Перенаправляйте любой другой вывод в stderr, чтобы он не мешал пути.
3241 3243
3242<h4 id="worktreecreate-input">3244<h4 id="worktreecreate-input">
3243 Входные данные WorktreeCreate3245 Входные данные WorktreeCreate
3244</h4>3246</h4>
3245 3247
3246Помимо [общих входных полей](#common-input-fields), хуки WorktreeCreate получают поле `name`. Это идентификатор-слаг для нового worktree, заданный пользователем или сгенерированный автоматически, например `bold-oak-a3f2`.3248Помимо [общих входных полей](#common-input-fields), хуки WorktreeCreate получают поле `name`. Это идентификатор-слаг нового worktree, заданный пользователем или сгенерированный автоматически, например `bold-oak-a3f2`.
3247 3249
3248```json theme={null}3250```json theme={null}
3249{3251{
3259 Вывод WorktreeCreate3261 Вывод WorktreeCreate
3260</h4>3262</h4>
3261 3263
3262Хуки WorktreeCreate не используют стандартную модель решений allow/block. Вместо этого результат определяется успехом или неудачей хука. Хук должен вернуть путь к созданному каталогу worktree:3264Хуки WorktreeCreate не используют стандартную модель решений «разрешить/заблокировать». Вместо этого результат определяется успехом или неудачей хука. Хук должен вернуть путь к каталогу созданного worktree:
3263 3265
3264* **Командные хуки** (`type: "command"`): выведите путь последней непустой строкой stdout. Claude Code удаляет escape-последовательности ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные до вашего `echo`, игнорируются. Перенаправляйте любой другой вывод хука в stderr.3266* **Командные хуки** (`type: "command"`): выведите путь последней непустой строкой stdout. Claude Code удаляет управляющие последовательности ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные до вашего `echo`, игнорируются. Перенаправляйте любой другой вывод хука в stderr.
3265* **HTTP-хуки** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3267* **HTTP-хуки** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
3266 3268
3267Если хук завершается с ошибкой или не возвращает путь, создание worktree завершается ошибкой.3269Если хук завершается с ошибкой или не выдаёт путь, создание worktree завершается ошибкой.
3268 3270
3269Claude Code разрешает относительный путь относительно каталога, в котором выполнялся хук, сворачивая все сегменты `.` или `..` в нём. Если полученный путь не является каталогом, в который Claude Code может перейти, сессия выводит ошибку с указанием пути и завершается с кодом 1.3271Claude Code разрешает относительный путь относительно каталога, в котором выполнялся хук, сворачивая в нём любые сегменты `.` или `..`. Если полученный путь не является каталогом, в который Claude Code может перейти, сессия выводит ошибку с указанием пути и завершается с кодом выхода 1.
3270 3272
3271Claude Code отклоняет абсолютный путь, содержащий сегменты `.` или `..`, а также любой путь, проходящий через символическую ссылку ниже корня репозитория, поскольку символическая ссылка, закоммиченная в репозиторий, могла бы перенаправить worktree за его пределы. В ошибке указывается отклонённый компонент. Возвращайте нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До v2.1.216 создание worktree следовало по пути хука без этой проверки.3273Claude Code отклоняет абсолютный путь, содержащий сегменты `.` или `..`, а также любой путь, проходящий через символическую ссылку ниже корня репозитория, поскольку символическая ссылка, закоммиченная в репозиторий, может перенаправить worktree за его пределы. В ошибке указывается отклонённый компонент. Возвращайте нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До v2.1.216 создание worktree следовало пути хука без такой проверки.
3272 3274
3273<h3 id="worktreeremove">3275<h3 id="worktreeremove">
3274 WorktreeRemove3276 WorktreeRemove
3275</h3>3277</h3>
3276 3278
3277Выполняется, когда Claude Code удаляет worktree, созданный вашим хуком [`WorktreeCreate`](#worktreecreate). Событие срабатывает, когда:3279Запускается, когда Claude Code очищает worktree, созданный вашим хуком [`WorktreeCreate`](#worktreecreate). Событие срабатывает, когда:
3278 3280
3279* Вы выходите из интерактивной [сессии worktree](/docs/ru/worktrees#start-claude-in-a-worktree) и выбираете удаление worktree, когда Claude Code предлагает это сделать3281* Вы выходите из интерактивной [сессии в worktree](/docs/ru/worktrees#start-claude-in-a-worktree) и соглашаетесь удалить worktree, когда Claude Code спрашивает об этом
3280* Вы выходите из интерактивной сессии worktree, которой не [присвоили имя](/docs/ru/sessions#name-your-sessions), Claude Code не находит изменённых или неотслеживаемых файлов и удаляет worktree без запроса3282* Вы выходите из интерактивной сессии в worktree, которой не [дали имя](/docs/ru/sessions#name-your-sessions), Claude Code не находит изменённых или неотслеживаемых файлов и удаляет worktree, не спрашивая вас
3281* Вы удаляете [фоновую сессию](/docs/ru/agent-view#what-deleting-a-session-removes), которая работает в этом worktree3283* Вы удаляете [фоновую сессию](/docs/ru/agent-view#what-deleting-a-session-removes), которая работает в этом worktree
3282 3284
3283Claude Code использует git для поиска изменённых или неотслеживаемых файлов, поэтому не находит их в worktree, который не является git checkout и не находится внутри него, даже если в каталоге есть незакоммиченная работа. Проверяйте наличие такой работы в вашем хуке WorktreeRemove, прежде чем он что-либо удалит.3285Claude Code ищет изменённые или неотслеживаемые файлы с помощью Git, поэтому не находит их в worktree, который не является Git-checkout и не находится внутри него, даже если в каталоге есть незакоммиченная работа. Проверяйте наличие такой работы в хуке WorktreeRemove, прежде чем он что-либо удалит.
3284 3286
3285Для worktree на основе git Claude Code выполняет очистку автоматически с помощью `git worktree remove`. Если вы настроили хук WorktreeCreate, добавьте к нему хук WorktreeRemove, чтобы управлять очисткой создаваемых им worktree:3287Для worktree на основе Git Claude Code выполняет очистку автоматически с помощью `git worktree remove`. Если вы настроили хук WorktreeCreate, используйте вместе с ним хук WorktreeRemove, чтобы управлять очисткой создаваемых им worktree:
3286 3288
3287* **Нет хука WorktreeRemove**: когда Claude Code удаляет worktree при выходе из сессии worktree, он использует как резервный вариант `git worktree remove --force` для пути, возвращённого вашим хуком WorktreeCreate, поэтому worktree, распознаваемый git, удаляется. Worktree, который git не распознаёт, например созданный вашим хуком с помощью системы контроля версий, отличной от git, остаётся на диске. О том, что происходит с созданным хуком worktree при удалении [фоновой сессии](/docs/ru/agent-view#what-deleting-a-session-removes), см. правила удаления в agent view.3289* **Нет хука WorktreeRemove**: когда Claude Code удаляет worktree при выходе из сессии в worktree, в качестве резервного варианта он выполняет `git worktree remove --force` для пути, возвращённого вашим хуком WorktreeCreate, поэтому worktree, который распознаёт Git, удаляется. Worktree, который Git не распознаёт, например созданный вашим хуком с помощью системы контроля версий, отличной от Git, остаётся на диске. О том, что удаление [фоновой сессии](/docs/ru/agent-view#what-deleting-a-session-removes) делает с worktree, созданным хуком, см. правила удаления в agent view.
3288* **Хук завершается с кодом 0**: worktree считается удалённым. Claude Code больше ничего не читает из хука, поэтому убедитесь, что ваш хук удалил каталог.3290* **Хук завершается с кодом 0**: worktree считается удалённым. Claude Code больше ничего не считывает из хука, поэтому убедитесь, что ваш хук удалил каталог.
3289* **Хук завершается с ненулевым кодом**: удаление завершается ошибкой, если каталог по пути `worktree_path` после этого всё ещё существует, и worktree остаётся на диске без резервного варианта через git. Хук, удаливший каталог перед завершением с ненулевым кодом, считается выполнившим удаление. О том, как сообщается об ошибке, см. [Входные данные WorktreeRemove](#worktreeremove-input).3291* **Хук завершается с ненулевым кодом**: удаление завершается неудачей, если каталог по пути `worktree_path` после этого всё ещё существует, и worktree остаётся на диске без резервного варианта через Git. Хук, который удалил каталог перед завершением с ненулевым кодом, считается успешно удалившим worktree. О том, как сообщается об ошибке, см. в разделе [Входные данные WorktreeRemove](#worktreeremove-input).
3290 3292
3291Claude Code никогда не удаляет ветку, принадлежащую созданному хуком worktree, поскольку ему известен только путь, который вернул ваш хук WorktreeCreate. Если ваш хук WorktreeCreate создаёт ветку, удаляйте её в хуке WorktreeRemove.3293Claude Code никогда не удаляет ветку, принадлежащую worktree, созданному хуком, поскольку знает только путь, возвращённый вашим хуком WorktreeCreate. Если ваш хук WorktreeCreate создаёт ветку, удаляйте её в хуке WorktreeRemove.
3292 3294
3293Claude Code отбрасывает [поля JSON-вывода](#json-output) хука WorktreeRemove, такие как `systemMessage` и `continue`.3295Claude Code отбрасывает [поля вывода JSON](#json-output) хука WorktreeRemove, такие как `systemMessage` и `continue`.
3294 3296
3295При удалении фоновой сессии Claude Code проверяет сохранённый путь worktree перед запуском хука и отклоняет путь, который является символической ссылкой или проходит через неё ниже корня репозитория. Для 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. До v2.1.216 хук выполнялся для сохранённого пути без этих проверок.3297При удалении фоновой сессии Claude Code проверяет сохранённый путь worktree перед запуском хука и отклоняет путь, который является символической ссылкой или проходит через неё ниже корня репозитория. Для 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. До v2.1.216 хук запускался для сохранённого пути без этих проверок.
3296 3298
3297Claude Code передаёт путь, возвращённый WorktreeCreate, как `worktree_path` во входных данных хука. Этот пример считывает этот путь и удаляет каталог:3299Claude Code передаёт путь, возвращённый WorktreeCreate, как `worktree_path` во входных данных хука. Этот пример считывает этот путь и удаляет каталог:
3298 3300
3317 Входные данные WorktreeRemove3319 Входные данные WorktreeRemove
3318</h4>3320</h4>
3319 3321
3320Помимо [общих полей входных данных](#common-input-fields), хуки WorktreeRemove получают поле `worktree_path` — абсолютный путь к удаляемому worktree.3322Помимо [общих входных полей](#common-input-fields), хуки WorktreeRemove получают поле `worktree_path` — абсолютный путь к удаляемому worktree.
3321 3323
3322```json theme={null}3324```json theme={null}
3323{3325{
3329}3331}
3330```3332```
3331 3333
3332Результат определяется кодом выхода хука WorktreeRemove. Когда хук завершается с ненулевым кодом и каталог по пути `worktree_path` после этого всё ещё существует, удаление завершается ошибкой:3334Результат определяется кодом выхода хука WorktreeRemove. Когда хук завершается с ненулевым кодом и каталог по пути `worktree_path` после этого всё ещё существует, удаление завершается неудачей:
3333 3335
3334* Worktree остаётся на диске, а команда хука и stderr записываются в [отладочный лог](#debug-hooks).3336* Worktree остаётся на диске, а команда хука и его stderr попадают в [лог отладки](#debug-hooks).
3335* Если вы удаляли фоновую сессию, сессия тоже сохраняется. Сообщение об отказе в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как завершился хук, например `exited 1`, цитирует начало его stderr и указывает, удалит ли повторное удаление сессии каталог в любом случае.3337* Если вы удаляли фоновую сессию, сессия тоже остаётся. Сообщение об отказе в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как завершился хук, например `exited 1`, цитирует начало его stderr и указывает, удалит ли повторное удаление сессии каталог в любом случае.
3336 3338
3337<h3 id="precompact">3339<h3 id="precompact">
3338 PreCompact3340 PreCompact
3339</h3>3341</h3>
3340 3342
3341Выполняется перед тем, как Claude Code собирается выполнить операцию сжатия контекста.3343Запускается перед тем, как Claude Code выполнит операцию сжатия контекста.
3342 3344
3343Значение matcher указывает, было ли сжатие запущено вручную или автоматически:3345Значение matcher указывает, было ли сжатие запущено вручную или автоматически:
3344 3346
3347| `manual` | `/compact` |3349| `manual` | `/compact` |
3348| `auto` | Автосжатие, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |3350| `auto` | Автосжатие, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |
3349 3351
3350Завершитесь с кодом 2, чтобы заблокировать сжатие. Для ручного `/compact` сообщение stderr показывается пользователю. Также можно заблокировать, вернув JSON с `"decision": "block"`.3352Завершитесь с кодом 2, чтобы заблокировать сжатие. Для ручного `/compact` сообщение из stderr показывается пользователю. Также можно заблокировать сжатие, вернув JSON с `"decision": "block"`.
3351 3353
3352Блокировка автоматического сжатия даёт разный эффект в зависимости от того, когда она срабатывает. Если сжатие было запущено упреждающе до достижения лимита контекста, Claude Code пропускает его, и диалог продолжается без сжатия. Если сжатие было запущено для восстановления после ошибки лимита контекста, уже возвращённой API, исходная ошибка отображается, и текущий запрос завершается неудачей.3354Блокировка автоматического сжатия действует по-разному в зависимости от момента срабатывания. Если сжатие было запущено заранее, до достижения лимита контекста, Claude Code пропускает его, и диалог продолжается без сжатия. Если сжатие было запущено для восстановления после ошибки лимита контекста, уже возвращённой API, исходная ошибка отображается, и текущий запрос завершается неудачей.
3353 3355
3354Claude Code отбрасывает поля `systemMessage` и `continue` хука PreCompact.3356Claude Code отбрасывает поля `systemMessage` и `continue` хука PreCompact.
3355 3357
3357 Входные данные PreCompact3359 Входные данные PreCompact
3358</h4>3360</h4>
3359 3361
3360Помимо [общих полей входных данных](#common-input-fields), хуки PreCompact получают `trigger` и `custom_instructions`. Для `manual` поле `custom_instructions` содержит то, что пользователь передаёт в `/compact`, и равно `null`, если он ничего не передаёт. Для `auto` поле `custom_instructions` равно `null`.3362Помимо [общих входных полей](#common-input-fields), хуки PreCompact получают `trigger` и `custom_instructions`. Для `manual` поле `custom_instructions` содержит то, что пользователь передаёт в `/compact`, и равно `null`, если он ничего не передаёт. Для `auto` поле `custom_instructions` равно `null`.
3361 3363
3362```json theme={null}3364```json theme={null}
3363{3365{
3374 PostCompact3376 PostCompact
3375</h3>3377</h3>
3376 3378
3377Выполняется после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например записывать в лог сгенерированную сводку или обновлять внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.3379Запускается после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например чтобы записать сгенерированную сводку в лог или обновить внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.
3378 3380
3379Применяются те же значения matcher, что и для `PreCompact`:3381Применяются те же значения matcher, что и для `PreCompact`:
3380 3382
3387 Входные данные PostCompact3389 Входные данные PostCompact
3388</h4>3390</h4>
3389 3391
3390Помимо [общих полей входных данных](#common-input-fields), хуки PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку диалога, сгенерированную операцией сжатия.3392Помимо [общих входных полей](#common-input-fields), хуки PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку диалога, сгенерированную операцией сжатия.
3391 3393
3392```json theme={null}3394```json theme={null}
3393{3395{
3400}3402}
3401```3403```
3402 3404
3403Хуки PostCompact не имеют управления решениями. Они не могут повлиять на результат сжатия, но могут выполнять последующие задачи.3405Хуки PostCompact не управляют решениями. Они не могут повлиять на результат сжатия, но могут выполнять последующие задачи.
3404 3406
3405<h3 id="premodelswitch">3407<h3 id="premodelswitch">
3406 PreModelSwitch3408 PreModelSwitch
3407</h3>3409</h3>
3408 3410
3409Выполняется перед тем, как Claude Code применяет переключение модели, запрошенное вами или клиентом. Используйте его, чтобы заблокировать переключение, потребовать подтверждения или показать, во что обойдётся переключение, до того как оно произойдёт.3411Запускается до того, как Claude Code применит смену модели, запрошенную вами или клиентом. Используйте его, чтобы заблокировать смену, потребовать подтверждения или показать, во что обойдётся смена, до того как она произойдёт.
3410 3412
3411PreModelSwitch требует Claude Code v2.1.251 или новее. Claude Code запускает его для следующих запросов:3413PreModelSwitch требует Claude Code v2.1.251 или новее. Claude Code запускает его для следующих запросов:
3412 3414
3413* `/model <name>` и средство выбора `/model`3415* `/model <name>` и окно выбора `/model`
3414* Средство выбора модели `Option+P` или `Alt+P`3416* Окно выбора модели `Option+P` или `Alt+P`
3415* Настройка Model в `/config`3417* Настройка Model в `/config`
3416* Включение [быстрого режима](/docs/ru/fast-mode), если это меняет модель сессии3418* Включение [быстрого режима](/docs/ru/fast-mode), когда это меняет модель сессии
3417* Запрос `set_model` или смена модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)3419* Запрос `set_model` или смена модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3418 3420
3419Claude Code не запускает хуки PreModelSwitch для переключений, которые он выполняет самостоятельно, например при [автоматическом переключении на резервную модель](/docs/ru/model-config#automatic-model-fallback) или восстановлении модели при возобновлении сессии. Такие изменения доходят только до [PostModelSwitch](#postmodelswitch).3421Claude Code не запускает хуки PreModelSwitch для смен, которые выполняет самостоятельно, например при [автоматическом переключении на резервную модель](/docs/ru/model-config#automatic-model-fallback) или восстановлении модели при возобновлении сессии. Такие изменения доходят только до [PostModelSwitch](#postmodelswitch).
3420 3422
3421Claude Code сравнивает matcher с каноническим именем модели, на которую переключается сессия, игнорируя суффикс `[1m]`. Псевдоним, например `opus`, идентификатор модели с датой и идентификатор конкретного провайдера, например идентификатор модели Amazon Bedrock, — все соответствуют одному каноническому имени, в которое они разрешаются, поэтому `claude-opus-5` охватывает любое написание Opus 5.3423Claude Code сравнивает matcher с каноническим именем модели, на которую переключается сессия, игнорируя суффикс `[1m]`. Псевдоним, например `opus`, идентификатор модели с датой и идентификатор конкретного провайдера, например идентификатор модели Amazon Bedrock, — все соответствуют одному каноническому имени, к которому они разрешаются, поэтому `claude-opus-5` охватывает все варианты написания Opus 5.
3422 3424
3423Когда Claude Code не может определить каноническое имя целевой модели, например для пользовательского идентификатора модели, известного только вашему [LLM-шлюзу](/docs/ru/llm-gateway), он запускает каждый хук PreModelSwitch независимо от matcher. Поэтому блокирующий хук должен проверять `to_model` из своих входных данных, а не полагаться только на matcher.3425Когда Claude Code не может определить каноническое имя целевой модели, например для пользовательского идентификатора модели, который знает только ваш [LLM-шлюз](/docs/ru/llm-gateway), он запускает все хуки PreModelSwitch независимо от matcher. Поэтому блокирующий хук должен проверять `to_model` из своих входных данных, а не полагаться только на matcher.
3424 3426
3425Записывайте matcher как точное имя, список через `|`, например `claude-opus-4-6|claude-opus-5`, или регулярное выражение, например `.*opus.*`. Этот пример использует matcher с точным именем и также проверяет `to_model` из входных данных хука, поэтому он отклоняет переключение на Opus 4.6, завершаясь с кодом 2, и пропускает любую другую целевую модель:3427Записывайте matcher как точное имя, список через `|`, например `claude-opus-4-6|claude-opus-5`, или регулярное выражение, например `.*opus.*`. В этом примере используется matcher с точным именем, а также проверяется `to_model` из входных данных хука, поэтому он отклоняет переключение на Opus 4.6, завершаясь с кодом 2, и пропускает любую другую целевую модель:
3426 3428
3427<Tabs>3429<Tabs>
3428 <Tab title="macOS/Linux">3430 <Tab title="macOS/Linux">
3475 }3477 }
3476 ```3478 ```
3477 3479
3478 Сохраните этот скрипт в `.claude/hooks/block-opus-46.ps1` в вашем проекте:3480 Сохраните этот скрипт в файл `.claude/hooks/block-opus-46.ps1` в вашем проекте:
3479 3481
3480 ```powershell theme={null}3482 ```powershell theme={null}
3481 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json3483 $hookInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
3488 </Tab>3490 </Tab>
3489</Tabs>3491</Tabs>
3490 3492
3491Чтобы убедиться, что хук работает, выполните `/model claude-opus-4-6` из сессии, использующей другую модель. Claude Code сохраняет текущую модель и сообщает, что хук PreModelSwitch заблокировал переключение, указывая ваше сообщение в качестве причины.3493Чтобы убедиться, что хук работает, выполните `/model claude-opus-4-6` в сессии, использующей другую модель. Claude Code сохранит текущую модель и сообщит, что хук PreModelSwitch заблокировал смену, указав ваше сообщение в качестве причины.
3492 3494
3493<h4 id="premodelswitch-input">3495<h4 id="premodelswitch-input">
3494 Входные данные PreModelSwitch3496 Входные данные PreModelSwitch
3495</h4>3497</h4>
3496 3498
3497Помимо [общих полей входных данных](#common-input-fields), хуки PreModelSwitch получают поля из этой таблицы. Последние пять описывают стоимость повторной отправки диалога новой модели, чтобы хук мог показать эту сумму до переключения.3499Помимо [общих входных полей](#common-input-fields), хуки PreModelSwitch получают поля из этой таблицы. Последние пять описывают стоимость повторной отправки диалога новой модели, чтобы хук мог показать эту сумму до смены.
3498 3500
3499| Поле | Тип | Описание |3501| Поле | Тип | Описание |
3500| :- | :- | :- |3502| :- | :- | :- |
3501| `from_model` | string | Идентификатор модели, с которой выполняется переключение |3503| `from_model` | string | Идентификатор модели, с которой происходит смена |
3502| `to_model` | string | Идентификатор модели, на которую выполняется переключение. Matcher сравнивается с каноническим именем этой модели |3504| `to_model` | string | Идентификатор модели, на которую происходит смена. Matcher сравнивается с каноническим именем этой модели |
3503| `requested_model` | string или `null` | Модель, указанная в запросе: псевдоним, например `opus`, полный идентификатор модели или `null`, если запрос был для модели по умолчанию |3505| `requested_model` | string или `null` | Модель, указанная в запросе: псевдоним, например `opus`, полный идентификатор модели или `null`, если запрос был на модель по умолчанию |
3504| `source` | string | Откуда пришёл запрос: `"command"` для `/model <name>`, настройки Model в `/config` или включения быстрого режима; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или смены модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |3506| `source` | string | Откуда пришёл запрос: `"command"` для `/model <name>`, настройки Model в `/config` или включения быстрого режима; `"picker"` для окна выбора модели; `"sdk"` для запроса `set_model` или смены модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3505| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет в качестве промпта: суммарно входные токены, токены чтения кэша, создания кэша и выходные токены последнего ответа в основном диалоге. `0` до первого ответа |3507| `context_tokens` | number | Токены, которые следующий запрос повторно отправит в качестве промпта: сумма входных токенов, токенов чтения кэша, создания кэша и выходных токенов последнего ответа в основном диалоге. `0` до первого ответа |
3506| `prompt_cache_warm` | boolean | Вероятно ли, что кэш промптов текущей модели всё ещё прогрет, то есть переключение приведёт к его потере |3508| `prompt_cache_warm` | boolean | Вероятно ли, что кэш промптов текущей модели всё ещё «тёплый», то есть смена приведёт к его потере |
3507| `cache_ttl` | string | [Время жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime), запрашиваемое Claude Code для этой сессии: `"5m"` или `"1h"` |3509| `cache_ttl` | string | [Время жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этой сессии: `"5m"` или `"1h"` |
3508| `estimated_cache_write_usd` | number | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на `to_model` по тарифу `cache_ttl`, без учёта следующего ответа. Серверу может не потребоваться повторно кэшировать весь контекст, поэтому рассматривайте это как оценку |3510| `estimated_cache_write_usd` | number | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на `to_model` по тарифу `cache_ttl`, без учёта следующего ответа. Серверу может не понадобиться повторно кэшировать весь контекст, поэтому рассматривайте это значение как оценку |
3509| `pricing` | string | Как Claude Code рассчитал `estimated_cache_write_usd`: `"configured"` — по собственным тарифам вашей организации, если она их настроила, `"catalog"` — по прейскурантной цене, или `"default"`, если для `to_model` нет известной цены и Claude Code использовал тариф по умолчанию |3511| `pricing` | string | Как Claude Code рассчитал `estimated_cache_write_usd`: `"configured"` — по собственным тарифам вашей организации, если она их настроила, `"catalog"` — по прейскурантной цене, или `"default"`, когда цена `to_model` неизвестна и Claude Code принял тариф по умолчанию |
3510 3512
3511Этот пример показывает входные данные для `/model opus` в сессии, использующей Sonnet 5:3513В этом примере показаны входные данные для `/model opus` в сессии, использующей Sonnet 5:
3512 3514
3513```json theme={null}3515```json theme={null}
3514{3516{
3532 Управление решениями PreModelSwitch3534 Управление решениями PreModelSwitch
3533</h4>3535</h4>
3534 3536
3535Хуки `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или разрешить его выполнение. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.3537Хуки `PreModelSwitch` могут отменить смену, попросить пользователя подтвердить её или позволить ей выполниться. Код выхода 2 или `decision: "block"` верхнего уровня отменяет смену.
3536 3538
3537Для более тонкого управления возвращайте `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как в [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. В таблице ниже описаны оба поля:3539Для более тонкого управления возвращайте `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как для [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. В таблице ниже описаны оба поля:
3538 3540
3539| Поле | Описание |3541| Поле | Описание |
3540| :- | :- |3542| :- | :- |
3541| `permissionDecision` | `"allow"` выполняет переключение и пропускает [подтверждение, которое Claude Code показывает, пока кэш промптов прогрет](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` запрашивает у пользователя подтверждение |3543| `permissionDecision` | `"allow"` выполняет смену и пропускает [подтверждение, которое Claude Code показывает, пока кэш промптов «тёплый»](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет смену. `"ask"` просит пользователя подтвердить её |
3542| `permissionDecisionReason` | Для `"deny"` показывается пользователю как причина блокировки переключения или возвращается как ошибка для запроса `set_model`. Для `"ask"` показывается в запросе подтверждения. Игнорируется для `"allow"` |3544| `permissionDecisionReason` | Для `"deny"` показывается пользователю как причина блокировки смены или возвращается как ошибка для запроса `set_model`. Для `"ask"` показывается в запросе подтверждения. Игнорируется для `"allow"` |
3543 3545
3544Только `/model` в интерактивной сессии может показать запрос `"ask"`. Во всех остальных интерфейсах, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.3546Показать запрос `"ask"` может только `/model` в интерактивной сессии. На всех остальных интерфейсах, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.
3545 3547
3546Этот пример просит пользователя подтвердить переключение и приводит количество токенов из `context_tokens`:3548Этот пример просит пользователя подтвердить смену и приводит количество токенов из `context_tokens`:
3547 3549
3548```json theme={null}3550```json theme={null}
3549{3551{
3557 3559
3558Когда несколько хуков PreModelSwitch возвращают разные решения, приоритет таков: `deny` > `ask` > `allow`.3560Когда несколько хуков PreModelSwitch возвращают разные решения, приоритет таков: `deny` > `ask` > `allow`.
3559 3561
3560Claude Code показывает пользователю любое `systemMessage`, которое возвращает ваш хук, независимо от решения, поэтому хук для отчёта о стоимости может вернуть `{"systemMessage": "..."}` и завершиться с кодом 0.3562Claude Code показывает пользователю любое `systemMessage`, возвращённое вашим хуком, независимо от решения, поэтому хук, сообщающий о стоимости, может вернуть `{"systemMessage": "..."}` и завершиться с кодом 0.
3561 3563
3562Хук PreModelSwitch, который не отвечает до истечения таймаута, блокирует переключение. В [PreToolUse](#timeouts), напротив, командный хук с истёкшим таймаутом позволяет вызову инструмента продолжиться. Таймаут по умолчанию для этого события — 30 секунд. `PreModelSwitch` запускает только хуки `command`, `http` и `mcp_tool`, поэтому значения по умолчанию для `prompt` и `agent` не применяются.3564Хук PreModelSwitch, который не ответил до истечения таймаута, блокирует смену. Для [PreToolUse](#timeouts), напротив, командный хук с истёкшим таймаутом позволяет вызову инструмента продолжиться. Таймаут по умолчанию для этого события — 30 секунд. `PreModelSwitch` запускает только хуки `command`, `http` и `mcp_tool`, поэтому значения по умолчанию для `prompt` и `agent` не применяются.
3563 3565
3564Хук, который завершается с кодом, отличным от 0 или 2, и не выводит JSON-решения, не блокирует переключение: Claude Code показывает его stderr и применяет переключение, как описано в разделе [Другие коды выхода](#other-exit-codes).3566Хук, который завершается с кодом, отличным от 0 или 2, и не выводит JSON-решение, не блокирует смену: Claude Code показывает его stderr и применяет смену, как описано в разделе [Другие коды выхода](#other-exit-codes).
3565 3567
3566<h3 id="postmodelswitch">3568<h3 id="postmodelswitch">
3567 PostModelSwitch3569 PostModelSwitch
3568</h3>3570</h3>
3569 3571
3570Выполняется после смены модели сессии. Используйте его, чтобы давать Claude указания, специфичные для модели, без редактирования каждого CLAUDE.md, например инструкцию для всей организации, которая применяется к определённым моделям.3572Запускается после смены модели сессии. Используйте его, чтобы давать Claude указания для конкретной модели, не редактируя каждый CLAUDE.md, например инструкцию для всей организации, действующую для определённых моделей.
3571 3573
3572PostModelSwitch требует Claude Code v2.1.251 или новее. Он не может блокировать, поскольку модель уже сменилась. Claude Code запускает хуки PostModelSwitch после любого из следующих изменений:3574PostModelSwitch требует Claude Code v2.1.251 или новее. Он не может блокировать, поскольку модель уже сменилась. Claude Code запускает хуки PostModelSwitch после любого из следующих изменений:
3573 3575
3574* Переключение, запрошенное вами или клиентом3576* Смена, запрошенная вами или клиентом
3575* [Автоматическое переключение на резервную модель](/docs/ru/model-config#automatic-model-fallback), которое меняет модель сессии3577* [Автоматическое переключение на резервную модель](/docs/ru/model-config#automatic-model-fallback), которое меняет модель сессии
3576* Настройка, например [`opusplan`](/docs/ru/model-config#opusplan-model-setting), при входе в режим планирования или выходе из него3578* Вход в режим планирования или выход из него при настройке, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting)
3577* Восстановление модели Claude Code при возобновлении сессии3579* Восстановление модели Claude Code при возобновлении сессии
3578 3580
3579Claude Code не запускает хуки PostModelSwitch, когда ход обслуживает модель из [цепочки резервных моделей](/docs/ru/model-config#fallback-model-chains), поскольку такая замена длится один ход и оставляет модель сессии неизменной.3581Claude Code не запускает хуки PostModelSwitch, когда ход обслуживает модель из [цепочки резервных моделей](/docs/ru/model-config#fallback-model-chains), поскольку такая замена длится один ход и не меняет модель сессии.
3580 3582
3581Matcher подчиняется тем же правилам, что и в [PreModelSwitch](#premodelswitch): Claude Code сравнивает его с каноническим именем модели, на которую переключилась сессия.3583Matcher подчиняется тем же правилам, что и для [PreModelSwitch](#premodelswitch): Claude Code сравнивает его с каноническим именем модели, на которую переключилась сессия.
3582 3584
3583Этот пример добавляет указания всякий раз, когда модель сессии меняется на любую модель Opus:3585Этот пример добавляет указания всякий раз, когда модель сессии меняется на любую модель Opus:
3584 3586
3600}3602}
3601```3603```
3602 3604
3603Чтобы убедиться, что хук работает, переключитесь на модель Opus из сессии, использующей другую модель, например выполните `/model opus` из сессии Sonnet, а затем спросите Claude, какие у него есть указания относительно текущей модели.3605Чтобы убедиться, что хук работает, переключитесь на модель Opus в сессии, использующей другую модель, например выполните `/model opus` в сессии Sonnet, а затем спросите Claude, какие указания у него есть относительно текущей модели.
3604 3606
3605<h4 id="postmodelswitch-input">3607<h4 id="postmodelswitch-input">
3606 Входные данные PostModelSwitch3608 Входные данные PostModelSwitch
3607</h4>3609</h4>
3608 3610
3609Хуки PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), при этом `hook_event_name` имеет значение `"PostModelSwitch"`, а для `source` есть ещё два значения: `"auto"` для автоматического переключения на резервную модель или другого изменения, которое Claude Code выполнил самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сессии.3611Хуки PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, равным `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического переключения на резервную модель или другого изменения, которое Claude Code выполнил самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сессии.
3610 3612
3611`requested_model` равно `null`, когда `source` равно `"auto"`. Когда `source` равно `"resume"`, это сохранённая настройка модели, которую восстановил Claude Code.3613`requested_model` равно `null`, когда `source` равно `"auto"`. Когда `source` равно `"resume"`, это сохранённая настройка модели, которую восстановил Claude Code.
3612 3614
3614 Управление решениями PostModelSwitch3616 Управление решениями PostModelSwitch
3615</h4>3617</h4>
3616 3618
3617Claude Code берёт [простой текстовый stdout](#exit-code-0) вашего хука при коде выхода 0 или `additionalContext` из JSON-вывода и передаёт его Claude со следующим запросом после переключения. Помимо [полей JSON-вывода](#json-output), доступных всем хукам, вы можете вернуть:3619Claude Code берёт [обычный текстовый stdout](#exit-code-0) вашего хука при коде выхода 0 или `additionalContext` из вывода JSON и передаёт его Claude вместе со следующим запросом после смены. Помимо [полей вывода JSON](#json-output), доступных всем хукам, можно вернуть:
3618 3620
3619| Поле | Описание |3621| Поле | Описание |
3620| :- | :- |3622| :- | :- |
3621| `additionalContext` | Строка, добавляемая в контекст Claude со следующим запросом. См. [Добавление контекста для Claude](#add-context-for-claude) |3623| `additionalContext` | Строка, добавляемая в контекст Claude со следующим запросом. См. [Добавление контекста для Claude](#add-context-for-claude) |
3622 3624
3623Если хук не завершился в течение пяти секунд после отправки следующего промпта, Claude Code отправляет этот запрос без вывода и вместо этого прикрепляет его к последующему запросу. Если модель меняется несколько раз до следующего запроса, Claude Code передаёт только вывод для целевой модели последнего переключения.3625Если хук не завершился в течение пяти секунд после отправки следующего промпта, Claude Code отправляет этот запрос без вывода и прикрепляет вывод к следующему запросу. Если модель меняется несколько раз до следующего запроса, Claude Code передаёт только вывод для целевой модели последней смены.
3624 3626
3625<h3 id="sessionend">3627<h3 id="sessionend">
3626 SessionEnd3628 SessionEnd
3627</h3>3629</h3>
3628 3630
3629Выполняется при завершении сессии Claude Code. Полезен для задач очистки, записи в лог статистики3631Запускается при завершении сессии Claude Code. Полезен для задач очистки, записи статистики
3630сессии или сохранения состояния сессии. Поддерживает matcher для фильтрации по причине выхода.3632сессии в лог или сохранения состояния сессии. Поддерживает matcher для фильтрации по причине выхода.
3631 3633
3632Поле `reason` во входных данных хука указывает, почему завершилась сессия:3634Поле `reason` во входных данных хука указывает, почему сессия завершилась:
3633 3635
3634| Причина | Описание |3636| Причина | Описание |
3635| :- | :- |3637| :- | :- |
3636| `clear` | Сессия очищена командой `/clear` |3638| `clear` | Сессия очищена командой `/clear` |
3637| `resume` | Сессия переключена через интерактивную `/resume` |3639| `resume` | Сессия переключена через интерактивную команду `/resume` |
3638| `logout` | Пользователь вышел из системы |3640| `logout` | Пользователь вышел из системы |
3639| `prompt_input_exit` | Пользователь вышел, когда поле ввода промпта было видимо |3641| `prompt_input_exit` | Пользователь вышел, когда было видно поле ввода промпта |
3640| `other` | Другие причины выхода |3642| `other` | Другие причины выхода |
3641| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code его не отправляет. Уберите его из matcher ваших `SessionEnd` |3643| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code его не отправляет. Уберите его из своих matcher для `SessionEnd` |
3642 3644
3643<h4 id="sessionend-input">3645<h4 id="sessionend-input">
3644 Входные данные SessionEnd3646 Входные данные SessionEnd
3645</h4>3647</h4>
3646 3648
3647Помимо [общих полей входных данных](#common-input-fields), хуки SessionEnd получают поле `reason`, указывающее, почему завершилась сессия. Все значения см. в [таблице причин](#sessionend) выше.3649Помимо [общих входных полей](#common-input-fields), хуки SessionEnd получают поле `reason`, указывающее, почему сессия завершилась. Все значения см. в [таблице причин](#sessionend) выше.
3648 3650
3649```json theme={null}3651```json theme={null}
3650{3652{
3656}3658}
3657```3659```
3658 3660
3659Хуки SessionEnd не имеют управления решениями. Они не могут заблокировать завершение сессии, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage`.3661Хуки SessionEnd не управляют решениями. Они не могут заблокировать завершение сессии, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage`.
3660 3662
3661Хуки SessionEnd имеют таймаут по умолчанию 1,5 секунды. Он применяется, когда вы выходите, выполняете `/clear` или переключаете сессии с помощью интерактивной `/resume`. Дать хуку больше времени можно двумя способами:3663Таймаут по умолчанию для хуков SessionEnd — 1,5 секунды. Он применяется, когда вы выходите, выполняете `/clear` или переключаете сессии с помощью интерактивной команды `/resume`. Дать хуку больше времени можно двумя способами:
3662 3664
3663* **`timeout` для отдельного хука**: задайте `timeout` в конфигурации этого хука. Общий лимит времени автоматически повышается до наибольшего значения `timeout` среди хуков в ваших файлах настроек, но не более 60 секунд. Если вы повышаете лимит таким образом, хук без собственного `timeout` по-прежнему сохраняет значение по умолчанию. Таймауты, заданные для хуков из плагинов, не повышают лимит.3665* **`timeout` для отдельного хука**: задайте `timeout` в конфигурации этого хука. Общий лимит времени автоматически увеличивается до наибольшего значения `timeout` отдельного хука в ваших файлах настроек, но не более 60 секунд. Если вы увеличиваете лимит таким способом, хук без собственного `timeout` по-прежнему использует значение по умолчанию. Таймауты, заданные для хуков, предоставляемых плагинами, не увеличивают лимит.
3664* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: задайте эту переменную окружения в миллисекундах, чтобы явно переопределить лимит. Заданное значение также становится таймаутом для каждого хука без собственного `timeout`.3666* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: задайте эту переменную окружения в миллисекундах, чтобы явно переопределить лимит. Заданное значение также становится таймаутом для каждого хука без собственного `timeout`.
3665 3667
3666Этот пример устанавливает лимит в 5 секунд:3668Этот пример устанавливает лимит в 5 секунд:
3669CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3671CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3670```3672```
3671 3673
3672До v2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышала только общий лимит, а хук без собственного `timeout` всё равно отменялся через 1,5 секунды.3674До v2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` увеличивала только общий лимит, а хук без собственного `timeout` всё равно прерывался через 1,5 секунды.
3673 3675
3674<h3 id="elicitation">3676<h3 id="elicitation">
3675 Elicitation3677 Elicitation
3676</h3>3678</h3>
3677 3679
3678Выполняется, когда MCP-сервер запрашивает ввод пользователя во время выполнения задачи. По умолчанию Claude Code показывает интерактивное диалоговое окно для ответа пользователя. Хуки могут перехватить этот запрос и ответить программно, полностью пропустив диалоговое окно.3680Запускается, когда MCP-сервер запрашивает ввод пользователя в процессе выполнения задачи. По умолчанию Claude Code показывает интерактивное диалоговое окно, в котором пользователь может ответить. Хуки могут перехватить этот запрос и ответить программно, полностью пропустив диалоговое окно.
3681
3682Полный пример хука с записью в настройках и скриптом см. в разделе [Ответ на запрос формы из скрипта](#answer-a-form-request-from-a-script).
3679 3683
3680Поле matcher сопоставляется с именем MCP-сервера.3684Поле matcher сопоставляется с именем MCP-сервера.
3681 3685
3683 Входные данные Elicitation3687 Входные данные Elicitation
3684</h4>3688</h4>
3685 3689
3686Помимо [общих полей входных данных](#common-input-fields), хуки Elicitation получают поля `mcp_server_name`, `message` и необязательные поля `mode`, `url`, `elicitation_id` и `requested_schema`.3690Помимо [общих входных полей](#common-input-fields), хуки Elicitation получают поля `mcp_server_name`, `message` и необязательные поля `mode`, `url`, `elicitation_id` и `requested_schema`.
3687 3691
3688Для elicitation в режиме формы, наиболее распространённого случая:3692Для запроса в режиме формы — самого распространённого случая:
3689 3693
3690```json theme={null}3694```json theme={null}
3691{3695{
3705}3709}
3706```3710```
3707 3711
3708Для elicitation в режиме URL, используемого для аутентификации через браузер:3712Для запроса в режиме URL, используемого для аутентификации через браузер:
3709 3713
3710```json theme={null}3714```json theme={null}
3711{3715{
3724 Вывод Elicitation3728 Вывод Elicitation
3725</h4>3729</h4>
3726 3730
3727Чтобы ответить программно без показа диалогового окна, верните JSON-объект с `hookSpecificOutput`:3731Хук Elicitation может ответить на запрос за пользователя, отклонить или отменить его либо оставить его диалоговому окну. Чтобы ответить, отклонить или отменить, завершитесь с кодом 0 и выведите объект `hookSpecificOutput` с `action`. Сервер получает ваш ответ, и диалоговое окно не появляется. Каждая строка этой таблицы показывает, что вернуть для одного исхода и что получает MCP-сервер:
3732
3733| Чтобы | Верните | Сервер получает |
3734| :- | :- | :- |
3735| Ответить за пользователя | `"action": "accept"` со значениями полей формы в `content` | `accept` с вашим `content` |
3736| Отклонить запрос | `"action": "decline"` | `decline` |
3737| Отменить запрос | `"action": "cancel"` | `cancel` |
3738| Оставить запрос пользователю | Нет вывода, код выхода 0 | Ответ пользователя из [диалогового окна](/docs/ru/mcp#respond-to-mcp-elicitation-requests) |
3739
3740Этот вывод отвечает на запрос в режиме формы, показанный в разделе [Входные данные Elicitation](#elicitation-input). Ключи в `content` — это имена свойств из `requested_schema` этого запроса:
3728 3741
3729```json theme={null}3742```json theme={null}
3730{3743{
3738}3751}
3739```3752```
3740 3753
3741| Поле | Значения | Описание |3754Этот вывод отклоняет запрос:
3742| :- | :- | :- |3755
3743| `action` | `accept`, `decline`, `cancel` | Принять, отклонить или отменить запрос |3756```json theme={null}
3744| `content` | object | Значения полей формы для отправки. Используется только когда `action` равно `accept` |3757{
3758 "hookSpecificOutput": {
3759 "hookEventName": "Elicitation",
3760 "action": "decline"
3761 }
3762}
3763```
3764
3765В диалоговом окне выбор **Decline** отправляет `decline`, а нажатие `Esc` отправляет `cancel`, поэтому возвращайте то, что вы хотите, чтобы увидел сервер.
3766
3767Для запроса в режиме URL хук, возвращающий `accept`, пропускает диалоговое окно, поэтому URL так и не открывается.
3768
3769Claude Code отбрасывает `reason`, `systemMessage` и `continue` из вывода JSON хука Elicitation, какое бы `action` вы ни вернули.
3770
3771<h4 id="other-ways-to-decline-an-elicitation">
3772 Другие способы отклонить запрос elicitation
3773</h4>
3774
3775Ваш хук также может отклонить запрос следующими способами. Сервер получает тот же `decline`, что и при `"action": "decline"`:
3776
3777* **Завершение с кодом 2**: Claude Code игнорирует `hookSpecificOutput`, выведенный тем же хуком
3778* **Вывод `"decision": "block"` верхнего уровня**: блокировка переопределяет `action` в том же выводе
3779
3780Когда одному запросу соответствует несколько хуков, отклонение от одного из них переопределяет `accept` или `cancel` от другого.
3781
3782Этот скрипт отклоняет запросы в режиме URL и оставляет запросы форм диалоговому окну:
3783
3784```bash theme={null}
3785#!/bin/bash
3786if [ "$(jq -r '.mode')" = "url" ]; then
3787 exit 2
3788fi
3789```
3790
3791Ни пользователь, ни сервер не видят, почему ваш хук отклонил запрос, поскольку Claude Code не показывает ваш stderr или ваш `reason`.
3792
3793Claude Code игнорировал `decision` верхнего уровня от хуков `Elicitation` и `ElicitationResult` начиная с v2.1.105 и до исправления в v2.1.284.
3794
3795<h4 id="answer-a-form-request-from-a-script">
3796 Ответ на запрос формы из скрипта
3797</h4>
3798
3799Этот пример отвечает за пользователя на один повторяющийся вопрос. MCP-сервер с именем `issue-tracker` запрашивает в форме ключ проекта, а хук подставляет `DOCS`. Скрипт принимает запрос, когда `project_key` — единственное поле формы. Для любого другого запроса он ничего не выводит, поэтому появляется диалоговое окно.
3800
3801<Tabs>
3802 <Tab title="macOS/Linux">
3803 Зарегистрируйте командный хук для события в файле настроек, указав имя сервера в качестве matcher:
3804
3805 ```json theme={null}
3806 {
3807 "hooks": {
3808 "Elicitation": [
3809 {
3810 "matcher": "issue-tracker",
3811 "hooks": [
3812 {
3813 "type": "command",
3814 "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.sh",
3815 "args": []
3816 }
3817 ]
3818 }
3819 ]
3820 }
3821 }
3822 ```
3823
3824 Сохраните этот скрипт в файл `.claude/hooks/answer-project-key.sh` в вашем проекте и сделайте его исполняемым с помощью `chmod +x`:
3825
3826 ```bash theme={null}
3827 #!/bin/bash
3828 input=$(cat)
3829 fields=$(jq -c '.requested_schema.properties // {} | keys' <<<"$input")
3830
3831 if [ "$fields" = '["project_key"]' ]; then
3832 jq -n '{hookSpecificOutput: {hookEventName: "Elicitation", action: "accept", content: {project_key: "DOCS"}}}'
3833 fi
3834 ```
3835 </Tab>
3745 3836
3746Код выхода 2 отклоняет elicitation. Claude Code нигде не показывает ваше сообщение stderr.3837 <Tab title="Windows (PowerShell)">
3838 Зарегистрируйте командный хук, который запускает скрипт через PowerShell, указав имя сервера в качестве matcher:
3747 3839
3748Claude Code использует `hookSpecificOutput` из JSON-вывода хука Elicitation и отбрасывает `systemMessage` и `continue`.3840 ```json theme={null}
3841 {
3842 "hooks": {
3843 "Elicitation": [
3844 {
3845 "matcher": "issue-tracker",
3846 "hooks": [
3847 {
3848 "type": "command",
3849 "command": "powershell.exe",
3850 "args": [
3851 "-NoProfile",
3852 "-ExecutionPolicy",
3853 "Bypass",
3854 "-File",
3855 "${CLAUDE_PROJECT_DIR}/.claude/hooks/answer-project-key.ps1"
3856 ]
3857 }
3858 ]
3859 }
3860 ]
3861 }
3862 }
3863 ```
3864
3865 Сохраните этот скрипт в файл `.claude/hooks/answer-project-key.ps1` в вашем проекте:
3866
3867 ```powershell theme={null}
3868 $request = [Console]::In.ReadToEnd() | ConvertFrom-Json
3869 $fields = @($request.requested_schema.properties.PSObject.Properties.Name)
3870
3871 if ($fields.Count -eq 1 -and $fields[0] -eq 'project_key') {
3872 @{
3873 hookSpecificOutput = @{
3874 hookEventName = "Elicitation"
3875 action = "accept"
3876 content = @{ project_key = "DOCS" }
3877 }
3878 } | ConvertTo-Json -Depth 3
3879 }
3880 ```
3881 </Tab>
3882</Tabs>
3883
3884Чтобы убедиться, что хук работает, запустите Claude Code командой `claude --debug` и дайте Claude задачу, при которой сервер запросит ключ проекта. Диалоговое окно не появится, а в [логе отладки](#debug-hooks) будет строка, заканчивающаяся на `Elicitation resolved by hook: {"action":"accept","content":{"project_key":"DOCS"}}`.
3749 3885
3750<h3 id="elicitationresult">3886<h3 id="elicitationresult">
3751 ElicitationResult3887 ElicitationResult
3752</h3>3888</h3>
3753 3889
3754Выполняется после того, как пользователь отвечает на elicitation MCP. Хуки могут наблюдать, изменять или блокировать ответ до его отправки обратно MCP-серверу.3890Запускается после того, как пользователь ответил на запрос elicitation от MCP. Хуки могут просматривать, изменять или блокировать ответ до его отправки обратно MCP-серверу.
3891
3892Когда хук [Elicitation](#elicitation) отвечает на запрос, Claude Code отправляет этот ответ серверу без запуска хуков ElicitationResult.
3755 3893
3756Поле matcher сопоставляется с именем MCP-сервера.3894Поле matcher сопоставляется с именем MCP-сервера.
3757 3895
3759 Входные данные ElicitationResult3897 Входные данные ElicitationResult
3760</h4>3898</h4>
3761 3899
3762Помимо [общих полей входных данных](#common-input-fields), хуки ElicitationResult получают поля `mcp_server_name`, `action` и необязательные поля `mode`, `elicitation_id` и `content`.3900Помимо [общих входных полей](#common-input-fields), хуки ElicitationResult получают поля `mcp_server_name`, `action` и необязательные поля `mode`, `elicitation_id` и `content`.
3763 3901
3764```json theme={null}3902```json theme={null}
3765{3903{
3770 "mcp_server_name": "my-mcp-server",3908 "mcp_server_name": "my-mcp-server",
3771 "action": "accept",3909 "action": "accept",
3772 "content": { "username": "alice" },3910 "content": { "username": "alice" },
3773 "mode": "form",3911 "mode": "form"
3774 "elicitation_id": "elicit-123"
3775}3912}
3776```3913```
3777 3914
3779 Вывод ElicitationResult3916 Вывод ElicitationResult
3780</h4>3917</h4>
3781 3918
3782Чтобы переопределить ответ пользователя, верните JSON-объект с `hookSpecificOutput`:3919Хук ElicitationResult может пропустить ответ пользователя, изменить его значения или заблокировать его. Чтобы изменить или заблокировать ответ, завершитесь с кодом 0 и выведите объект `hookSpecificOutput` с `action`. Каждая строка этой таблицы показывает, что вернуть для одного исхода и что получает MCP-сервер:
3920
3921| Чтобы | Верните | Сервер получает |
3922| :- | :- | :- |
3923| Пропустить ответ | Нет вывода, код выхода 0 | Ответ пользователя без изменений |
3924| Изменить отправленные значения | `"action": "accept"` с новыми значениями в `content` | `accept` с вашим `content` вместо значений пользователя |
3925| Заблокировать ответ | `"action": "decline"` | `decline` без значений пользователя |
3926| Отменить запрос | `"action": "cancel"` | `cancel` вместе со значениями, отправленными пользователем. Чтобы скрыть их, верните `"decline"` |
3927
3928Этот вывод изменяет ответ, показанный в разделе [Входные данные ElicitationResult](#elicitationresult-input), так что сервер получает `alice@example.com` там, где пользователь отправил `alice`:
3783 3929
3784```json theme={null}3930```json theme={null}
3785{3931{
3786 "hookSpecificOutput": {3932 "hookSpecificOutput": {
3787 "hookEventName": "ElicitationResult",3933 "hookEventName": "ElicitationResult",
3788 "action": "decline",3934 "action": "accept",
3789 "content": {}3935 "content": {
3936 "username": "alice@example.com"
3937 }
3790 }3938 }
3791}3939}
3792```3940```
3793 3941
3794| Поле | Значения | Описание |3942Ваш `content` заменяет весь объект `content` пользователя, поэтому включайте поля, которые вы не меняете. Возвращайте вместе с ним `action`, поскольку Claude Code игнорирует `hookSpecificOutput` без `action`.
3795| :- | :- | :- |3943
3796| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3944Хуки ElicitationResult также запускаются, когда пользователь отклоняет или отменяет запрос, и ваше `action` заменяет его действие. Прежде чем вернуть `accept`, проверьте, что `action` во входных данных равно `accept`, иначе ваш хук превратит отклонённый запрос в принятый. Этот скрипт вносит то же изменение, когда пользователь принял запрос, сохраняет остальные поля и в противном случае ничего не выводит:
3797| `content` | object | Переопределяет значения полей формы. Имеет смысл только когда `action` равно `accept` |3945
3946```bash theme={null}
3947#!/bin/bash
3948input=$(cat)
3798 3949
3799Код выхода 2 блокирует ответ, меняя фактическое действие на `decline`. Claude Code нигде не показывает ваше сообщение stderr.3950if [ "$(jq -r '.action' <<<"$input")" = "accept" ]; then
3951 jq '{hookSpecificOutput: {hookEventName: "ElicitationResult", action: "accept", content: (.content + {username: (.content.username + "@example.com")})}}' <<<"$input"
3952fi
3953```
3800 3954
3801Claude Code использует `hookSpecificOutput` из JSON-вывода хука ElicitationResult и отбрасывает `systemMessage` и `continue`.3955Этот вывод блокирует ответ:
3956
3957```json theme={null}
3958{
3959 "hookSpecificOutput": {
3960 "hookEventName": "ElicitationResult",
3961 "action": "decline"
3962 }
3963}
3964```
3965
3966Код выхода 2 и `"decision": "block"` верхнего уровня также блокируют ответ. В разделе [Другие способы отклонить запрос elicitation](#other-ways-to-decline-an-elicitation) описано, какой из них действует, когда хук их сочетает, что видит пользователь и какие версии игнорировали `decision`.
3967
3968Claude Code отбрасывает `reason`, `systemMessage` и `continue` из вывода JSON хука ElicitationResult, какое бы `action` вы ни вернули.
3802 3969
3803<h2 id="prompt-based-hooks">3970<h2 id="prompt-based-hooks">
3804 Prompt-based hooks3971 Prompt-based hooks
3862 4029
3863Установите `type` на `"prompt"` и предоставьте строку `prompt` вместо `command`. Используйте заполнитель `$ARGUMENTS` для внедрения данных JSON входа hook в текст вашей подсказки.4030Установите `type` на `"prompt"` и предоставьте строку `prompt` вместо `command`. Используйте заполнитель `$ARGUMENTS` для внедрения данных JSON входа hook в текст вашей подсказки.
3864 4031
4032В prompt или [agent хуке](#agent-based-hooks) вы можете написать `prompt` как правило о том, что блокировать или разрешать, например «Блокировать любую команду Bash, которая читает файлы `.env`», или как условие, которое должно выполняться, например «Все модульные тесты проходят».
4033
3865Этот hook `Stop` просит LLM оценить, должен ли Claude остановиться перед разрешением Claude закончить:4034Этот hook `Stop` просит LLM оценить, должен ли Claude остановиться перед разрешением Claude закончить:
3866 4035
3867```json theme={null}4036```json theme={null}