40| :- | :- |40| :- | :- |
41| `SessionStart` | Когда сеанс начинается или возобновляется |41| `SessionStart` | Когда сеанс начинается или возобновляется |
42| `Setup` | Когда вы запускаете Claude Code с `--init-only`, или с `--init` или `--maintenance` в режиме `-p`. Для одноразовой подготовки в CI или скриптах |42| `Setup` | Когда вы запускаете Claude Code с `--init-only`, или с `--init` или `--maintenance` в режиме `-p`. Для одноразовой подготовки в CI или скриптах |
43| `UserPromptSubmit` | Когда вы отправляете запрос, прежде чем Claude его обработает |43| `UserPromptSubmit` | Когда отправляется промпт, прежде чем Claude его обработает. Также срабатывает для [ходов, которые Claude Code начинает самостоятельно](/docs/ru/hooks#userpromptsubmit) |
44| `UserPromptExpansion` | Когда команда, введённая пользователем, расширяется в запрос, прежде чем она достигнет Claude. Может заблокировать расширение |44| `UserPromptExpansion` | Когда команда, введённая пользователем, расширяется в запрос, прежде чем она достигнет Claude. Может заблокировать расширение |
45| `PreToolUse` | Перед выполнением вызова инструмента. Может заблокировать его |45| `PreToolUse` | Перед выполнением вызова инструмента. Может заблокировать его |
46| `PermissionRequest` | Когда вызов инструмента требует решения о разрешении |46| `PermissionRequest` | Когда вызов инструмента требует решения о разрешении |
1156Для расширенных примеров, включая валидацию команд Bash, фильтрацию запросов и скрипты автоматического одобрения, см. [What you can automate](/docs/ru/hooks-guide#what-you-can-automate) в руководстве и [Bash command validator reference implementation](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).1156Для расширенных примеров, включая валидацию команд Bash, фильтрацию запросов и скрипты автоматического одобрения, см. [What you can automate](/docs/ru/hooks-guide#what-you-can-automate) в руководстве и [Bash command validator reference implementation](https://github.com/anthropics/claude-code/blob/main/examples/hooks/bash_command_validator_example.py).
1157 1157
1158<h2 id="hook-events">1158<h2 id="hook-events">
1159 События hooks1159 События хуков
1160</h2>1160</h2>
1161 1161
1162Каждое событие соответствует точке в жизненном цикле Claude Code, где могут выполняться hooks. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сеанса через агентский цикл до завершения сеанса. Каждый раздел описывает, когда срабатывает событие, какие matchers оно поддерживает, какой JSON-ввод оно получает и как управлять поведением через вывод.1162Каждое событие соответствует точке жизненного цикла Claude Code, в которой могут выполняться хуки. Разделы ниже упорядочены в соответствии с жизненным циклом: от настройки сессии через агентный цикл до завершения сессии. В каждом разделе описано, когда срабатывает событие, какие значения matcher оно поддерживает, какие входные данные JSON получает и как управлять поведением через вывод.
1163 1163
1164<h3 id="sessionstart">1164<h3 id="sessionstart">
1165 SessionStart1165 SessionStart
1166</h3>1166</h3>
1167 1167
1168Запускается, когда Claude Code начинает новый сеанс или возобновляет существующий сеанс. Полезно для загрузки контекста разработки, такого как существующие проблемы или недавние изменения в вашей кодовой базе, или для установки переменных окружения. Для статического контекста, который не требует скрипта, используйте [CLAUDE.md](/docs/ru/memory) вместо этого.1168Выполняется, когда Claude Code запускает новую сессию или возобновляет существующую. Полезно для загрузки контекста разработки, например существующих задач или недавних изменений в кодовой базе, или для настройки переменных окружения. Для статического контекста, которому не нужен скрипт, используйте вместо этого [CLAUDE.md](/docs/ru/memory).
1169 1169
1170SessionStart запускается в каждом сеансе, поэтому держите эти hooks быстрыми. Поддерживаются только hooks `type: "command"` и `type: "mcp_tool"`. См. [MCP tool hook fields](#mcp-tool-hook-fields) для информации о том, когда выполняются hooks `mcp_tool`.1170SessionStart выполняется в каждой сессии, поэтому такие хуки должны работать быстро. Поддерживаются только хуки `type: "command"` и `type: "mcp_tool"`. О том, когда выполняются хуки `mcp_tool`, см. [Поля хуков MCP-инструментов](#mcp-tool-hook-fields).
1171 1171
1172Значение matcher соответствует тому, как был инициирован сеанс:1172Значение matcher соответствует тому, как была инициирована сессия:
1173 1173
1174| Matcher | Когда срабатывает |1174| Matcher | Когда срабатывает |
1175| :- | :- |1175| :- | :- |
1176| `startup` | Новый сеанс |1176| `startup` | Новая сессия |
1177| `resume` | `--resume`, `--continue` или `/resume` |1177| `resume` | `--resume`, `--continue` или `/resume` |
1178| `clear` | `/clear` |1178| `clear` | `/clear` |
1179| `compact` | Автоматическое или ручное сжатие |1179| `compact` | Автоматическое или ручное сжатие контекста |
1180| `fork` | Новый сеанс, разветвленный из существующего: `--fork-session` с `--resume` или `--continue`, фоновая копия `/fork`, `/branch` или разговор, который вы [переместили в фон](/docs/ru/agent-view#from-inside-a-session) |1180| `fork` | Новая сессия, ответвлённая от существующей: `--fork-session` вместе с `--resume` или `--continue`, фоновая копия `/fork`, `/branch` или диалог, который вы [перевели в фон](/docs/ru/agent-view#from-inside-a-session) |
1181 1181
1182До версии 2.1.214 разветвленные сеансы сообщали источник `"resume"`.1182До v2.1.214 ответвлённые сессии сообщали источник `"resume"`.
1183 1183
1184Когда вы запускаете интерактивный сеанс, возобновляете разговор при запуске с `--continue` или `--resume` или запускаете `/clear`, hooks SessionStart выполняются в фоне. Вы можете сразу начать печатать, и возобновленный разговор появляется без ожидания завершения hooks. Первый ответ Claude все еще ждет завершения hooks, поэтому их контекст достигает Claude.1184Когда вы запускаете интерактивную сессию, возобновляете диалог при запуске с помощью `--continue` или `--resume` или выполняете `/clear`, хуки SessionStart выполняются в фоне. Вы можете сразу начать вводить текст, а возобновлённый диалог появляется, не дожидаясь хуков. Первый ответ Claude всё же ожидает завершения хуков, чтобы их контекст дошёл до Claude.
1185 1185
1186Когда вы переключаете разговоры с `/resume` внутри сеанса, переключение ждет завершения hooks. Если вы запустите `/clear` или переключитесь на другой разговор, пока фоновые hooks все еще выполняются, ничего из того, что они возвращают, не применяется к сеансу.1186Когда вы переключаете диалоги с помощью `/resume` внутри сессии, переключение, напротив, ожидает завершения хуков. Если вы выполните `/clear` или переключитесь на другой диалог, пока фоновые хуки ещё работают, ничто из возвращённого ими к сессии не применяется.
1187 1187
1188То же самое ожидание применяется при запуске, включая возобновленный сеанс: подсказка, которую вы отправляете, пока выполняются hooks SessionStart, не достигает Claude, пока они не завершатся.1188То же ожидание действует при запуске, в том числе для возобновлённой сессии: промпт, отправленный, пока хуки SessionStart ещё выполняются, не дойдёт до Claude, пока они не завершатся.
1189 1189
1190Во время любого ожидания нажмите `Esc`, чтобы вернуть подсказку в ввод без отправки. Hooks продолжают выполняться.1190Во время любого из этих ожиданий нажмите `Esc`, чтобы вернуть промпт в поле ввода, не отправляя его. Хуки продолжат выполняться.
1191 1191
1192<h4 id="sessionstart-input">1192<h4 id="sessionstart-input">
1193 SessionStart input1193 Входные данные SessionStart
1194</h4>1194</h4>
1195 1195
1196Помимо [общих полей ввода](#common-input-fields), hooks SessionStart получают `source` и опционально `model`, `agent_type` и `session_title`:1196Помимо [общих входных полей](#common-input-fields), хуки SessionStart получают `source` и, необязательно, `model`, `agent_type` и `session_title`:
1197 1197
1198| Поле | Описание |1198| Поле | Описание |
1199| :- | :- |1199| :- | :- |
1200| `source` | Как был запущен сеанс: `"startup"` для новых сеансов, `"resume"` для возобновленных сеансов, `"clear"` после `/clear`, `"compact"` после сжатия или `"fork"` для нового сеанса, разветвленного из существующего |1200| `source` | Как началась сессия: `"startup"` для новых сессий, `"resume"` для возобновлённых, `"clear"` после `/clear`, `"compact"` после сжатия контекста или `"fork"` для новой сессии, ответвлённой от существующей |
1201| `model` | Идентификатор активной модели. Может быть опущен, например после `/clear` или когда сеанс восстанавливается через восстановление разговора, поэтому проверьте наличие поля перед его чтением |1201| `model` | Идентификатор активной модели. Может отсутствовать, например после `/clear` или когда сессия восстановлена через восстановление диалога, поэтому проверяйте наличие поля перед чтением |
1202| `agent_type` | Имя агента, присутствует, когда вы запускаете Claude Code с `claude --agent <name>` |1202| `agent_type` | Имя агента; присутствует, когда вы запускаете Claude Code командой `claude --agent <name>` |
1203| `session_title` | Текущее название сеанса, если оно уже установлено, например через `--name`, `/rename`, вывод hook `sessionTitle` или метод `renameSession()` Agent SDK. Hook, который выдает `sessionTitle`, может сначала проверить это поле, чтобы избежать перезаписи существующего пользовательского названия |1203| `session_title` | Пользовательское название сессии; присутствует, если оно задано, например через `--name`, `/rename`, вывод хука `sessionTitle` или `renameSession()` в Agent SDK. Хук, выдающий `sessionTitle`, может сначала проверить это поле, чтобы не перезаписать существующее пользовательское название |
1204 1204
1205Сеанс, который вы не назвали, все еще может иметь [сгенерированное название](/docs/ru/sessions#name-your-sessions). Это название не является пользовательским названием и не появляется в `session_title`.1205У сессии, которую вы не назвали, всё равно может быть [сгенерированное название](/docs/ru/sessions#name-your-sessions). Такое название не является пользовательским и не появляется в `session_title`.
1206 1206
1207Когда `source` имеет значение `"resume"` или `"fork"` и транскрипт содержит по крайней мере один ответ от Claude, hooks SessionStart также получают четыре поля ниже. Ваш hook может использовать их для сообщения о том, какие затраты на возобновление устаревшего разговора до первого запроса, например в [`systemMessage`](#json-output). Эти поля требуют Claude Code v2.1.251 или позже.1207Когда `source` равно `"resume"` или `"fork"` и транскрипт содержит хотя бы один ответ от Claude, хуки SessionStart также получают четыре поля ниже. Ваш хук может использовать их, чтобы до первого запроса сообщить, во что обойдётся возобновление устаревшего диалога, например в [`systemMessage`](#json-output). Для этих полей требуется Claude Code v2.1.251 или новее.
1208 1208
1209| Поле | Описание |1209| Поле | Описание |
1210| :- | :- |1210| :- | :- |
1211| `seconds_since_last_response` | Настоящее время в секундах с момента последнего ответа в возобновленном транскрипте |1211| `seconds_since_last_response` | Реальное время в секундах с момента последнего ответа в возобновлённом транскрипте |
1212| `context_tokens` | Токены, которые первый запрос возобновленного сеанса повторно отправляет как его подсказка |1212| `context_tokens` | Токены, которые первый запрос возобновлённой сессии повторно отправляет в качестве промпта |
1213| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [времени жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime) сеанса или более позднее сжатие заменило кэшированный разговор |1213| `prompt_cache_likely_expired` | `true`, когда последний ответ старше [времени жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime) сессии или более позднее сжатие контекста заменило кэшированный диалог |
1214| `estimated_cache_write_usd` | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на модели сеанса, исключая ответ |1214| `estimated_cache_write_usd` | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на модели сессии, без учёта ответа |
1215 1215
1216Этот пример показывает ввод для сеанса, возобновленного через 90 минут после его последнего ответа:1216В этом примере показаны входные данные для сессии, возобновлённой через 90 минут после последнего ответа:
1217 1217
1218```json theme={null}1218```json theme={null}
1219{1219{
1234 Управление решениями SessionStart1234 Управление решениями SessionStart
1235</h4>1235</h4>
1236 1236
1237Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть эти поля, специфичные для события:1237Claude Code добавляет в контекст Claude stdout, который он [обрабатывает как обычный текст](#exit-code-0). Помимо [полей вывода JSON](#json-output), доступных всем хукам, вы можете возвращать следующие поля, специфичные для события:
1238 1238
1239| Поле | Описание |1239| Поле | Описание |
1240| :- | :- |1240| :- | :- |
1241| `additionalContext` | Строка, добавленная в контекст Claude в начале разговора, перед первой подсказкой. См. [Add context for Claude](#add-context-for-claude) для информации о том, как доставляется текст и что в него поместить |1241| `additionalContext` | Строка, добавляемая в контекст Claude в начале диалога, перед первым промптом. О том, как доставляется текст и что в него включать, см. [Добавление контекста для Claude](#add-context-for-claude) |
1242| `initialUserMessage` | Строка, используемая как первое сообщение пользователя сеанса. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если подсказка не предоставлена. Если подсказка предоставлена, она следует как следующий ход. В отличие от `additionalContext`, который присоединяется к существующему ходу, это создает ход |1242| `initialUserMessage` | Строка, используемая как первое пользовательское сообщение сессии. Применяется в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`, где она становится первым ходом, даже если промпт не передан. Если промпт передан, он следует как следующий ход. В отличие от `additionalContext`, который прикрепляется к существующему ходу, это поле создаёт ход |
1243| `sessionTitle` | Устанавливает название сеанса с тем же эффектом, что и `/rename`. Используйте для автоматического именования сеансов из папки запуска, ветки git или имени worktree. Применяется, когда `source` имеет значение `"startup"`, `"resume"` или `"fork"`; игнорируется на `"clear"` и `"compact"` |1243| `sessionTitle` | Задаёт название сессии с тем же эффектом, что и `/rename`. Используйте для автоматического именования сессий по каталогу запуска, ветке git или имени worktree. Применяется, когда `source` равно `"startup"`, `"resume"` или `"fork"`; игнорируется при `"clear"` и `"compact"` |
1244| `watchPaths` | Массив абсолютных путей для наблюдения за событиями [FileChanged](#filechanged) во время этого сеанса |1244| `watchPaths` | Массив абсолютных путей для отслеживания событий [FileChanged](#filechanged) в этой сессии |
1245| `reloadSkills` | Логическое значение. Когда `true`, Claude Code повторно сканирует [skill](/docs/ru/skills) и директории команд после завершения hooks SessionStart, поэтому skills, установленные hook, доступны в том же сеансе, начиная с первой подсказки |1245| `reloadSkills` | Логическое значение. При `true` Claude Code повторно сканирует каталоги [скиллов](/docs/ru/skills) и команд после завершения хуков SessionStart, так что установленные хуком скиллы доступны в той же сессии, начиная с первого промпта |
1246 1246
1247```json theme={null}1247```json theme={null}
1248{1248{
1254}1254}
1255```1255```
1256 1256
1257Поскольку простой stdout уже достигает Claude для этого события, hook, который только загружает контекст, может печатать в stdout напрямую без построения JSON. Используйте форму JSON, когда вам нужно объединить контекст с другими полями, такими как `sessionTitle`.1257Поскольку для этого события обычный stdout и так доходит до Claude, хук, который только загружает контекст, может выводить данные прямо в stdout, не формируя JSON. Используйте форму JSON, когда нужно совместить контекст с другими полями, например `sessionTitle`.
1258 1258
1259Используйте `reloadSkills`, когда hook SessionStart устанавливает или обновляет skills. Обнаружение skills обычно выполняется до завершения hooks SessionStart, поэтому файлы, которые hook записывает в `~/.claude/skills/` или `.claude/skills/`, в противном случае появятся только в следующем сеансе. Этот пример синхронизирует репозиторий общих skills и запрашивает повторное сканирование:1259Используйте `reloadSkills`, когда хук SessionStart устанавливает или обновляет скиллы. Обнаружение скиллов обычно выполняется до завершения хуков SessionStart, поэтому файлы, которые хук записывает в `~/.claude/skills/` или `.claude/skills/`, иначе появились бы только в следующей сессии. В этом примере синхронизируется общий репозиторий скиллов и запрашивается повторное сканирование:
1260 1260
1261```bash theme={null}1261```bash theme={null}
1262#!/bin/bash1262#!/bin/bash
1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'1267echo '{"hookSpecificOutput": {"hookEventName": "SessionStart", "reloadSkills": true}}'
1268```1268```
1269 1269
1270URL репозитория — это заполнитель; замените его на URL вашего репозитория skills. С заполнителем клонирование не удается и выводит сообщение `fatal:` в stderr. Stderr из hook SessionStart, который выходит с кодом 0, только информационный, поэтому запрос `reloadSkills` все еще применяется.1270URL репозитория — это заполнитель; замените его на собственный репозиторий скиллов. С заполнителем клонирование завершится ошибкой и выведет сообщение `fatal:` в stderr. Stderr хука SessionStart, завершившегося с кодом 0, носит лишь информационный характер, поэтому запрос `reloadSkills` всё равно применяется.
1271 1271
1272<h4 id="persist-environment-variables">1272<h4 id="persist-environment-variables">
1273 Persist environment variables1273 Сохранение переменных окружения
1274</h4>1274</h4>
1275 1275
1276Hooks SessionStart имеют доступ к переменной окружения `CLAUDE_ENV_FILE`, которая предоставляет путь к файлу, где вы можете сохранять переменные окружения для последующих команд Bash.1276Хукам SessionStart доступна переменная окружения `CLAUDE_ENV_FILE`, содержащая путь к файлу, в котором можно сохранять переменные окружения для последующих команд Bash.
1277 1277
1278Чтобы установить отдельные переменные окружения, напишите операторы `export` в `CLAUDE_ENV_FILE`. Используйте добавление (`>>`) для сохранения переменных, установленных другими hooks:1278Чтобы задать отдельные переменные окружения, запишите инструкции `export` в `CLAUDE_ENV_FILE`. Используйте дозапись (`>>`), чтобы сохранить переменные, заданные другими хуками:
1279 1279
1280```bash theme={null}1280```bash theme={null}
1281#!/bin/bash1281#!/bin/bash
1289exit 01289exit 0
1290```1290```
1291 1291
1292Чтобы захватить все изменения окружения из команд настройки, сравните экспортированные переменные до и после:1292Чтобы зафиксировать все изменения окружения, внесённые командами настройки, сравните экспортированные переменные до и после:
1293 1293
1294```bash theme={null}1294```bash theme={null}
1295#!/bin/bash1295#!/bin/bash
1309```1309```
1310 1310
1311<Note>1311<Note>
1312 `CLAUDE_ENV_FILE` доступен для hooks SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged). Другие типы hooks не имеют доступа к этой переменной.1312 `CLAUDE_ENV_FILE` доступна для хуков SessionStart, [Setup](#setup), [CwdChanged](#cwdchanged) и [FileChanged](#filechanged). Хукам других типов эта переменная недоступна.
1313</Note>1313</Note>
1314 1314
1315<h3 id="setup">1315<h3 id="setup">
1316 Setup1316 Setup
1317</h3>1317</h3>
1318 1318
1319Срабатывает только при запуске Claude Code с `--init-only` или с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. Не срабатывает при нормальном запуске. Используйте его для одноразовой установки зависимостей или запланированной очистки, которую вы явно запускаете из CI или скриптов, отдельно от нормального запуска сеанса. Для инициализации для каждого сеанса используйте [SessionStart](#sessionstart) вместо этого.1319Срабатывает, только когда вы запускаете Claude Code с `--init-only` либо с `--init` или `--maintenance` в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. При обычном запуске не срабатывает. Используйте его для однократной установки зависимостей или плановой очистки, которую вы явно запускаете из CI или скриптов, отдельно от обычного запуска сессии. Для инициализации каждой сессии используйте вместо этого [SessionStart](#sessionstart).
1320 1320
1321Значение matcher соответствует флагу CLI, который запустил hook:1321Значение matcher соответствует флагу CLI, вызвавшему хук:
1322 1322
1323| Matcher | Когда срабатывает |1323| Matcher | Когда срабатывает |
1324| :- | :- |1324| :- | :- |
1325| `init` | `claude --init-only` или `claude -p --init` |1325| `init` | `claude --init-only` или `claude -p --init` |
1326| `maintenance` | `claude -p --maintenance` |1326| `maintenance` | `claude -p --maintenance` |
1327 1327
1328Когда вы запускаете `claude --init-only`, Claude Code запускает hooks Setup и hooks `SessionStart` с matcher `startup`, затем выходит без запуска разговора.1328Когда вы выполняете `claude --init-only`, Claude Code запускает хуки Setup и хуки `SessionStart` с matcher `startup`, а затем завершает работу, не начиная диалог.
1329 1329
1330Когда вы запускаете или продолжаете разговор с `-p`, вам также нужно предоставить подсказку как аргумент или через stdin. Вы можете пропустить подсказку, когда hook `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или когда вы возобновляете сеанс с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).1330Когда вы начинаете или продолжаете диалог с `-p`, также нужно передать промпт — как аргумент или через stdin. Промпт можно не передавать, если хук `SessionStart` предоставляет [`initialUserMessage`](#sessionstart-decision-control) или если вы возобновляете сессию с [отложенным вызовом инструмента](#defer-a-tool-call-for-later).
1331 1331
1332При успехе `--init-only` ничего не выводит на терминал. Чтобы подтвердить, что hooks выполнились, запустите с `claude --debug-file <path> --init-only`, заменив `<path>` на местоположение файла журнала, и проверьте журнал на наличие записей hooks Setup и SessionStart.1332При успехе `--init-only` ничего не выводит в терминал. Чтобы убедиться, что хуки выполнились, запустите `claude --debug-file <path> --init-only`, заменив `<path>` на расположение файла лога, и проверьте в логе записи хуков Setup и SessionStart.
1333 1333
1334Поскольку Setup не срабатывает при каждом запуске, plugin, которому нужна установленная зависимость, не может полагаться только на Setup. Практический паттерн — проверить зависимость при первом использовании и установить при отсутствии, например hook или skill, который тестирует `${CLAUDE_PLUGIN_DATA}/node_modules` и запускает `npm install`, если отсутствует. См. [persistent data directory](/docs/ru/plugins/components#path-variables-and-persistent-data) для информации о том, где хранить установленные зависимости. Если вы распространяете ваш plugin через marketplace, вам может не понадобиться этот паттерн: Claude Code [автоматически устанавливает подходящие зависимости пакета Node.js](/docs/ru/plugins/loading#node-js-package-dependencies) при кэшировании plugin.1334Поскольку 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) при кэшировании плагина.
1335 1335
1336<h4 id="setup-input">1336<h4 id="setup-input">
1337 Setup input1337 Входные данные Setup
1338</h4>1338</h4>
1339 1339
1340Помимо [общих полей ввода](#common-input-fields), hooks Setup получают поле `trigger`, установленное либо на `"init"`, либо на `"maintenance"`:1340Помимо [общих входных полей](#common-input-fields), хуки Setup получают поле `trigger` со значением `"init"` или `"maintenance"`:
1341 1341
1342```json theme={null}1342```json theme={null}
1343{1343{
1353 Управление решениями Setup1353 Управление решениями Setup
1354</h4>1354</h4>
1355 1355
1356Hooks Setup не могут блокировать; выполнение продолжается при любом коде выхода. При каждом коде выхода Claude Code отбрасывает [поля вывода JSON](#json-output) hook Setup, такие как `systemMessage`, `continue` и `hookSpecificOutput.additionalContext`. С `-p` stdout, stderr и код выхода hook Setup появляются в выводе запуска только как [`hook_response` события](/docs/ru/headless#read-session-metadata) при запуске с `--output-format stream-json --verbose`.1356Хуки 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`.
1357 1357
1358Hooks Setup имеют доступ к `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются в последующих командах Bash для сеанса, как в [hooks SessionStart](#persist-environment-variables). На `Setup` выполняются только hooks `type: "command"`. Hook `type: "mcp_tool"` на `Setup` всегда пропускается, как описано в [MCP tool hook fields](#mcp-tool-hook-fields).1358Хукам Setup доступна `CLAUDE_ENV_FILE`. Переменные, записанные в этот файл, сохраняются для последующих команд Bash в сессии, так же как в [хуках SessionStart](#persist-environment-variables). Для `Setup` выполняются только хуки `type: "command"`. Хук `type: "mcp_tool"` для `Setup` всегда пропускается, как описано в разделе [Поля хуков MCP-инструментов](#mcp-tool-hook-fields).
1359 1359
1360<h3 id="instructionsloaded">1360<h3 id="instructionsloaded">
1361 InstructionsLoaded1361 InstructionsLoaded
1362</h3>1362</h3>
1363 1363
1364Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сеанса для файлов, загруженных с нетерпением, и снова позже, когда файлы загружаются с нетерпением, например когда Claude получает доступ к подпапке, которая содержит вложенный `CLAUDE.md`, или когда условные правила с frontmatter `paths:` совпадают. Hook не поддерживает блокировку или управление решениями. Он выполняется асинхронно в целях наблюдаемости.1364Срабатывает, когда файл `CLAUDE.md` или `.claude/rules/*.md` загружается в контекст. Это событие срабатывает при запуске сессии для файлов, загружаемых сразу, и снова позже, когда файлы загружаются отложенно, например когда Claude обращается к подкаталогу, содержащему вложенный `CLAUDE.md`, или когда срабатывают условные правила с frontmatter `paths:`. Хук не поддерживает блокировку и управление решениями. Он выполняется асинхронно в целях наблюдаемости.
1365 1365
1366Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через параметр **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` с `load_reason`, установленным на `include`, как для любого другого импортированного файла, и когда `CLAUDE.md` является символической ссылкой на него, как обычная загрузка `CLAUDE.md`.1366Это событие не срабатывает, когда Claude [читает `AGENTS.md` напрямую](/docs/ru/memory#agents-md) через настройку **Project instructions**. Оно срабатывает, когда `CLAUDE.md` импортирует ваш `AGENTS.md` — с `load_reason`, равным `include`, как для любого другого импортированного файла, — и когда `CLAUDE.md` является символической ссылкой на него — как обычная загрузка `CLAUDE.md`.
1367 1367
1368Matcher выполняется против `load_reason`. Например, используйте `"matcher": "session_start"` для срабатывания только для файлов, загруженных при запуске сеанса, или `"matcher": "path_glob_match|nested_traversal"` для срабатывания только для ленивых загрузок.1368Matcher сопоставляется с `load_reason`. Например, используйте `"matcher": "session_start"`, чтобы срабатывать только для файлов, загруженных при запуске сессии, или `"matcher": "path_glob_match|nested_traversal"`, чтобы срабатывать только при отложенных загрузках.
1369 1369
1370<h4 id="instructionsloaded-input">1370<h4 id="instructionsloaded-input">
1371 InstructionsLoaded input1371 Входные данные InstructionsLoaded
1372</h4>1372</h4>
1373 1373
1374Помимо [общих полей ввода](#common-input-fields), hooks InstructionsLoaded получают эти поля:1374Помимо [общих входных полей](#common-input-fields), хуки InstructionsLoaded получают следующие поля:
1375 1375
1376| Поле | Описание |1376| Поле | Описание |
1377| :- | :- |1377| :- | :- |
1378| `file_path` | Абсолютный путь к файлу инструкций, который был загружен |1378| `file_path` | Абсолютный путь к загруженному файлу инструкций |
1379| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |1379| `memory_type` | Область действия файла: `"User"`, `"Project"`, `"Local"` или `"Managed"` |
1380| `load_reason` | Почему был загружен файл: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций перезагружаются после события сжатия |1380| `load_reason` | Почему файл был загружен: `"session_start"`, `"nested_traversal"`, `"path_glob_match"`, `"include"` или `"compact"`. Значение `"compact"` срабатывает, когда файлы инструкций повторно загружаются после сжатия контекста |
1381| `globs` | Шаблоны glob путей из frontmatter `paths:` файла, если они есть. Присутствует только для загрузок `path_glob_match` |1381| `globs` | Glob-шаблоны путей из frontmatter `paths:` файла, если есть. Присутствует только для загрузок `path_glob_match` |
1382| `trigger_file_path` | Путь к файлу, доступ к которому запустил эту загрузку, для ленивых загрузок |1382| `trigger_file_path` | Путь к файлу, обращение к которому вызвало эту загрузку, для отложенных загрузок |
1383| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |1383| `parent_file_path` | Путь к родительскому файлу инструкций, который включил этот, для загрузок `include` |
1384 1384
1385```json theme={null}1385```json theme={null}
1398 Управление решениями InstructionsLoaded1398 Управление решениями InstructionsLoaded
1399</h4>1399</h4>
1400 1400
1401Hooks InstructionsLoaded не имеют управления решениями. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для аудита журнала, отслеживания соответствия или наблюдаемости.1401У хуков InstructionsLoaded нет управления решениями. Они не могут блокировать или изменять загрузку инструкций. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage` и `continue`. Используйте это событие для журнала аудита, отслеживания соответствия требованиям или наблюдаемости.
1402 1402
1403<h3 id="userpromptsubmit">1403<h3 id="userpromptsubmit">
1404 UserPromptSubmit1404 UserPromptSubmit
1405</h3>1405</h3>
1406 1406
1407Запускается, когда пользователь отправляет подсказку, перед обработкой Claude. Это позволяет вам добавлять дополнительный контекст на основе подсказки/разговора, проверять подсказки или блокировать определенные типы подсказок.1407Запускается при отправке промпта, до того как Claude его обработает. Это позволяет
1408добавлять дополнительный контекст на основе промпта/диалога, проверять промпты или
1409блокировать определённые типы промптов.
1408 1410
1409Hooks `UserPromptSubmit` имеют тайм-аут по умолчанию 30 секунд для типов `command`, `http` и `mcp_tool`, короче, чем 600-секундный по умолчанию для этих типов на большинстве других событий. Поскольку этот hook выполняется перед каждой подсказкой и блокирует обработку модели до его завершения, застрявший hook замораживает сеанс. Если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1411Хуки `UserPromptSubmit` срабатывают не только на промпты, которые вы вводите. Claude Code также запускает их, когда:
1410 1412
1411Помимо hook команды, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` команды, HTTP или MCP tool, который достигает своего тайм-аута, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление с названием hook, тайм-аутом, который сработал, и что вывод был отброшен.1413* срабатывает [запланированная задача](/docs/ru/scheduled-tasks), включая итерацию `/loop`
1414* [фоновый субагент](/docs/ru/sub-agents#run-subagents-in-foreground-or-background) отчитывается сессии, которая его запустила
1415* [другая сессия отправляет сообщение](/docs/ru/cross-session-messaging) в ваш основной диалог
1412 1416
1413[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего тайм-аута, блокирует подсказку сообщением с названием hook и тайм-аутом, потому что callback там может действовать как политический шлюз, который не должен отказывать открыто. Сеанс продолжается. До версии 2.1.208 тайм-аут callback на этом событии заканчивал ход с ошибкой выполнения.1417У хуков `UserPromptSubmit` таймаут по умолчанию составляет 30 секунд для типов `command`, `http` и `mcp_tool` — меньше, чем 600 секунд по умолчанию для этих типов в большинстве других событий. Поскольку этот хук выполняется перед каждым промптом и блокирует обработку моделью до своего завершения, зависший хук останавливает сессию. Если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1418
1419За исключением command-хука, запущенного с [`async: true`](#run-hooks-in-the-background), command-, HTTP- или MCP-хук `UserPromptSubmit`, достигший таймаута, отменяется, а его вывод, включая любой `additionalContext`, отбрасывается. Промпт всё равно доходит до Claude, но без этого контекста. В транскрипте отображается уведомление с именем хука, сработавшим таймаутом и указанием на то, что вывод был отброшен.
1420
1421[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, достигший таймаута, блокирует промпт с сообщением, в котором указаны хук и таймаут, поскольку callback в этом месте может выступать шлюзом политики, который не должен при сбое пропускать запросы. Сессия продолжается. До v2.1.208 таймаут callback для этого события завершал ход с ошибкой выполнения.
1414 1422
1415<h4 id="userpromptsubmit-input">1423<h4 id="userpromptsubmit-input">
1416 UserPromptSubmit input1424 Входные данные UserPromptSubmit
1417</h4>1425</h4>
1418 1426
1419Помимо [общих полей ввода](#common-input-fields), hooks UserPromptSubmit получают поле `prompt`, содержащее текст, отправленный пользователем. Вставленный контент, который свернулся в заполнитель `[Pasted text #N]`, прибывает развернутым на месте. В сеансах, где Claude Code [отмечает вставленный текст для Claude](/docs/ru/terminal-config#how-claude-treats-pasted-text), этот развернутый контент находится между строкой `<pasted_content id="…">` и строкой `</pasted_content id="…">`, поэтому учитывайте эти строки, если ваш hook анализирует подсказку.1427Помимо [общих входных полей](#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="…">`, поэтому учитывайте эти строки, если ваш хук разбирает промпт.
1420 1428
1421Hooks UserPromptSubmit также получают `session_title`, когда сеанс имеет пользовательское название, с тем же значением, что и [поле SessionStart `session_title`](#sessionstart-input).1429Хуки UserPromptSubmit также получают `session_title`, когда у сессии есть пользовательское название, с тем же значением, что и [поле `session_title` в SessionStart](#sessionstart-input).
1422 1430
1423```json theme={null}1431```json theme={null}
1424{1432{
1435 Управление решениями UserPromptSubmit1443 Управление решениями UserPromptSubmit
1436</h4>1444</h4>
1437 1445
1438Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [поля вывода JSON](#json-output) доступны.1446Хуки `UserPromptSubmit` могут управлять тем, обрабатывается ли отправленный промпт, и добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1439 1447
1440Есть два способа добавить контекст к разговору при коде выхода 0:1448Есть два способа добавить контекст в диалог при коде выхода 0:
1441 1449
1442* **Простой текст stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude1450* **stdout в виде обычного текста**: Claude Code добавляет в контекст Claude stdout, который он [обрабатывает как обычный текст](#exit-code-0)
1443* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст1451* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст
1444 1452
1445Ни один канал не создает видимую запись в транскрипте. Простой stdout и значение `additionalContext` каждый вводятся как системное напоминание, которое начинается с имени hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).1453Ни один из каналов не создаёт видимой записи в транскрипте. Обычный stdout и значение `additionalContext` внедряются каждое как системное напоминание, начинающееся с имени хука; Claude читает оба. Чтобы подтвердить доставку, проверьте [отладочный лог](#debug-hooks).
1446 1454
1447Чтобы заблокировать подсказку, верните объект JSON с `decision`, установленным на `"block"`:1455Чтобы заблокировать промпт, верните объект JSON с `decision`, равным `"block"`:
1448 1456
1449| Поле | Описание |1457| Поле | Описание |
1450| :- | :- |1458| :- | :- |
1451| `decision` | `"block"` останавливает подсказку перед тем, как она достигнет Claude. Опустите, чтобы позволить подсказке продолжить |1459| `decision` | `"block"` останавливает промпт до того, как он дойдёт до Claude. Не указывайте, чтобы разрешить промпту пройти |
1452| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |1460| `reason` | Показывается пользователю, когда `decision` равно `"block"`. Не добавляется в контекст |
1453| `additionalContext` | Строка, добавленная в контекст Claude рядом с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1461| `additionalContext` | Строка, добавляемая в контекст Claude вместе с отправленным промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1454| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |1462| `sessionTitle` | Задаёт название сессии. Используйте для автоматического именования сессий на основе содержимого промпта |
1455| `suppressOriginalPrompt` | Если `true`, когда hook блокирует подсказку, оставляет текст подсказки вне сообщения блокировки. См. [What a blocked prompt leaves behind](#what-a-blocked-prompt-leaves-behind) |1463| `suppressOriginalPrompt` | Если `true`, когда хук блокирует промпт, текст промпта не включается в сообщение о блокировке. См. [Что остаётся после заблокированного промпта](#what-a-blocked-prompt-leaves-behind) |
1456 1464
1457Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю, и оно не добавляется в контекст.1465Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr, и он не добавляется в контекст.
1458 1466
1459```json theme={null}1467```json theme={null}
1460{1468{
1470```1478```
1471 1479
1472<h4 id="what-a-blocked-prompt-leaves-behind">1480<h4 id="what-a-blocked-prompt-leaves-behind">
1473 Что оставляет после себя заблокированная подсказка1481 Что остаётся после заблокированного промпта
1474</h4>1482</h4>
1475 1483
1476Заблокированная подсказка никогда не достигает Claude, но ее текст не удаляется везде. По умолчанию сообщение блокировки, показанное пользователю, заканчивается на `Original prompt:`, за которым следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сеанса на диск. Чтобы оставить текст вне сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает, блокирует ли hook с `decision: "block"` или выходом 2. Hook выхода 2, который не выводит JSON, всегда получает текст подсказки в своем сообщении блокировки.1484Заблокированный промпт никогда не доходит до Claude, но его текст удаляется не везде. По умолчанию сообщение о блокировке, показываемое пользователю, заканчивается строкой `Original prompt:`, за которой следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сессии на диске. Чтобы исключить текст из сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает независимо от того, блокирует ли хук с помощью `decision: "block"` или кодом выхода 2. У хука с кодом выхода 2, который не выводит JSON, текст промпта всегда попадает в сообщение о блокировке.
1477 1485
1478`suppressOriginalPrompt` изменяет только сообщение блокировки. Отправленный текст все еще может появляться в локальных файлах, таких как транскрипт сеанса и история подсказок, поэтому блокирующий hook не является способом держать секрет вне диска. Чтобы ограничить или удалить эти файлы, см. [Plaintext storage](/docs/ru/claude-directory#plaintext-storage) и [Clear local data](/docs/ru/claude-directory#clear-local-data).1486`suppressOriginalPrompt` изменяет только сообщение о блокировке. Отправленный текст всё равно может появиться в локальных файлах, таких как транскрипт сессии и история промптов, поэтому блокирующий хук не является способом не допустить попадания секрета на диск. Чтобы ограничить или удалить эти файлы, см. [Хранение в открытом виде](/docs/ru/claude-directory#plaintext-storage) и [Очистка локальных данных](/docs/ru/claude-directory#clear-local-data).
1479 1487
1480<h3 id="userpromptexpansion">1488<h3 id="userpromptexpansion">
1481 UserPromptExpansion1489 UserPromptExpansion
1482</h3>1490</h3>
1483 1491
1484Запускается, когда команда, введенная пользователем, расширяется в подсказку перед достижением Claude. Используйте это для блокировки определенных команд от прямого вызова, внедрения контекста для определенного skill или логирования того, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если отсутствует файл одобрения, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.1492Выполняется, когда введённая пользователем команда разворачивается в промпт до того, как дойти до Claude. Используйте его, чтобы запретить прямой вызов определённых команд, внедрить контекст для конкретного скилла или логировать, какие команды вызывают пользователи. Например, хук с matcher `deploy` может блокировать `/deploy`, если нет файла подтверждения, а хук, соответствующий скиллу ревью, может добавлять чек-лист ревью команды как `additionalContext`.
1485 1493
1486Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1494Это событие покрывает путь, который не покрывает `PreToolUse`: хук `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только когда Claude вызывает этот инструмент, но прямой ввод `/skillname` обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1487 1495
1488Совпадает с `command_name`. Оставьте matcher пустым, чтобы срабатывать на каждой команде типа подсказки.1496Сопоставляется по `command_name`. Оставьте matcher пустым, чтобы срабатывать для каждой команды, разворачивающейся в промпт.
1489 1497
1490<h4 id="userpromptexpansion-input">1498<h4 id="userpromptexpansion-input">
1491 UserPromptExpansion input1499 Входные данные UserPromptExpansion
1492</h4>1500</h4>
1493 1501
1494Помимо [общих полей ввода](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` — это `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.1502Помимо [общих входных полей](#common-input-fields), хуки UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` равно `slash_command` для скиллов и пользовательских команд или `mcp_prompt` для промптов MCP-серверов.
1495 1503
1496```json theme={null}1504```json theme={null}
1497{1505{
1512 Управление решениями UserPromptExpansion1520 Управление решениями UserPromptExpansion
1513</h4>1521</h4>
1514 1522
1515Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Все [поля вывода JSON](#json-output) доступны.1523Хуки `UserPromptExpansion` могут блокировать развёртывание или добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1516 1524
1517| Поле | Описание |1525| Поле | Описание |
1518| :- | :- |1526| :- | :- |
1519| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |1527| `decision` | `"block"` не даёт команде развернуться. Не указывайте, чтобы разрешить продолжение |
1520| `reason` | Показано пользователю, когда `decision` — это `"block"` |1528| `reason` | Показывается пользователю, когда `decision` равно `"block"` |
1521| `additionalContext` | Строка, добавленная в контекст Claude рядом с развернутой подсказкой. См. [Add context for Claude](#add-context-for-claude) |1529| `additionalContext` | Строка, добавляемая в контекст Claude вместе с развёрнутым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1522 1530
1523Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.1531Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr.
1524 1532
1525```json theme={null}1533```json theme={null}
1526{1534{
1537 MessageDisplay1545 MessageDisplay
1538</h3>1546</h3>
1539 1547
1540Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отрисовке, hook выполняется один раз с этими строками и Claude Code отображает текст замены hook на их месте. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.1548Выполняется, пока сообщение ассистента потоково выводится на экран. Claude Code отображает сообщение частями: каждый раз, когда пакет только что завершённых строк готов к отрисовке, хук выполняется один раз с этими строками, и Claude Code отображает на их месте текст-замену, возвращённый хуком. Длинное сообщение порождает несколько вызовов; короткое может породить только один.
1541 1549
1542Используйте MessageDisplay для:1550Используйте MessageDisplay, чтобы:
1543 1551
1544* удаления markdown для минимального отображения1552* удалять разметку markdown для минималистичного отображения
1545* преобразования текста, который приложение Agent SDK показывает своим пользователям1553* преобразовывать текст, который приложение на Agent SDK показывает своим пользователям
1546* редактирования ключей API или внутренних имен хостов из ответов Claude1554* скрывать API-ключи или внутренние имена хостов в ответах Claude
1547 1555
1548Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает время ожидания, Claude Code отображает исходный текст. Тайм-аут по умолчанию для этого события — 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1556Claude Code удерживает каждый пакет, пока ваш хук не вернёт результат, поэтому хук должен работать быстро. Если хук завершается ошибкой или по таймауту, Claude Code отображает исходный текст. Таймаут по умолчанию для этого события — 10 секунд; если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1549 1557
1550MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.1558MessageDisplay влияет только на отображение: текст-замена меняет лишь то, что выводится на экран. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, а подробный режим показывает оригинал. Хук получает только текст сообщений ассистента, поэтому результаты инструментов и вводимый вами текст отображаются без изменений.
1551 1559
1552MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое потоком выводит текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.1560MessageDisplay не поддерживает matcher и срабатывает для каждого сообщения ассистента, выводящего текст потоком; сообщения без текста, например ответы, содержащие только вызовы инструментов, его не вызывают.
1553 1561
1554В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз для каждого сообщения помощника вместо один раз для каждой партии строк. Один вызов прибывает после завершения сообщения и несет полный текст сообщения: `index` — это `0`, `final` — это `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.1562В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение ассистента, а не один раз на пакет строк. Единственный вызов приходит после завершения сообщения и содержит полный текст сообщения: `index` равно `0`, `final` равно `true`, а `delta` содержит всё сообщение. Хук, собирающий текст `delta` для каждого сообщения, получает одинаковый итоговый текст в обоих режимах.
1555 1563
1556<h4 id="messagedisplay-input">1564<h4 id="messagedisplay-input">
1557 MessageDisplay input1565 Входные данные MessageDisplay
1558</h4>1566</h4>
1559 1567
1560Помимо [общих полей ввода](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как потоком выводится текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.1568Помимо [общих входных полей](#common-input-fields), хуки MessageDisplay получают идентификаторы хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы пакетов зависят от того, как текст поступает потоком, поэтому используйте `index` и `final` для отслеживания прогресса по сообщению, а не рассчитывайте на определённую группировку строк.
1561 1569
1562| Поле | Описание |1570| Поле | Описание |
1563| :- | :- |1571| :- | :- |
1564| `turn_id` | UUID текущего хода |1572| `turn_id` | UUID текущего хода |
1565| `message_id` | UUID сообщения помощника, которое отображается. Стабилен для каждой партии одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |1573| `message_id` | UUID отображаемого сообщения ассистента. Неизменен во всех пакетах одного сообщения. Это не идентификатор API `msg_…`, поэтому его нельзя сопоставить с идентификаторами сообщений в транскрипте |
1566| `index` | Индекс этой партии в сообщении, начиная с нуля |1574| `index` | Индекс этого пакета в сообщении, начиная с нуля |
1567| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |1575| `final` | `true` для последнего пакета сообщения. У каждого сообщения ровно один последний пакет |
1568| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуста, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |1576| `delta` | Строки, завершённые после предыдущего пакета, включая завершающие символы новой строки. Всегда целые строки, кроме последнего пакета, который может закончиться посреди строки. В интерактивных запусках delta последнего пакета пуста, если сообщение заканчивается символом новой строки, поэтому считайте сигналом конца сообщения `final`, а не непустую delta. В запусках Agent SDK и `claude -p` единственный вызов содержит всё сообщение |
1569 1577
1570```json theme={null}1578```json theme={null}
1571{1579{
1582```1590```
1583 1591
1584<h4 id="messagedisplay-output">1592<h4 id="messagedisplay-output">
1585 MessageDisplay output1593 Вывод MessageDisplay
1586</h4>1594</h4>
1587 1595
1588Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:1596Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки MessageDisplay могут возвращать `displayContent`, чтобы заменить delta на экране:
1589 1597
1590| Поле | Описание |1598| Поле | Описание |
1591| :- | :- |1599| :- | :- |
1592| `displayContent` | Текст, отображаемый вместо delta. Опустите, чтобы отобразить исходный |1600| `displayContent` | Текст, отображаемый вместо delta. Не указывайте, чтобы отобразить оригинал |
1593 1601
1594Hooks MessageDisplay не имеют управления решениями. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.1602У хуков MessageDisplay нет управления решениями. Они не могут блокировать сообщение или изменять то, что сохраняется в транскрипте или отправляется Claude. Claude Code учитывает `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.
1595 1603
1596Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и встроенные обратные кавычки кода из `delta` и возвращает результат как `displayContent`.1604В этом примере из ответов Claude удаляется форматирование markdown для отображения в виде обычного текста. Скрипт читает каждый пакет из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.
1597 1605
1598<Tabs>1606<Tabs>
1599 <Tab title="macOS/Linux">1607 <Tab title="macOS/Linux">
1600 Зарегистрируйте hook команды для события в файле параметров:1608 Зарегистрируйте command-хук для события в файле настроек:
1601 1609
1602 ```json theme={null}1610 ```json theme={null}
1603 {1611 {
1626 </Tab>1634 </Tab>
1627 1635
1628 <Tab title="Windows (PowerShell)">1636 <Tab title="Windows (PowerShell)">
1629 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:1637 Зарегистрируйте command-хук, который запускает скрипт через PowerShell:
1630 1638
1631 ```json theme={null}1639 ```json theme={null}
1632 {1640 {
1652 }1660 }
1653 ```1661 ```
1654 1662
1655 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, поэтому hook запускается быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запускать локальный файл скрипта.1663 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы хук запускался быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell выполнить локальный файл скрипта.
1656 1664
1657 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:1665 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:
1658 1666
1669 </Tab>1677 </Tab>
1670</Tabs>1678</Tabs>
1671 1679
1672Партии без markdown проходят без изменений. Если скрипт не удается, например, потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.1680Пакеты без markdown проходят без изменений. Если скрипт завершается ошибкой, например из-за отсутствия `jq`, Claude Code отображает исходный текст и отмечает сбой только в [отладочном выводе](#debug-hooks), а не в сессии.
1673 1681
1674<h3 id="pretooluse">1682<h3 id="pretooluse">
1675 PreToolUse1683 PreToolUse
1676</h3>1684</h3>
1677 1685
1678Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым именем инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [имена инструментов MCP](#match-mcp-tools).1686Выполняется после того, как Claude создаёт параметры инструмента, и до обработки вызова инструмента. Сопоставляется с любым именем инструмента, кроме `EndConversation`: встроенными инструментами, такими как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, а также любыми [именами MCP-инструментов](#match-mcp-tools).
1679 1687
1680Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged) вместо соответствия инструментам редактирования файлов по названию. В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения и они не имеют управления решениями, поэтому они не могут блокировать запись.1688Чтобы запускать хук при изменении определённого файла на диске, кто бы его ни записал, используйте [FileChanged](#filechanged) вместо сопоставления инструментов редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает хуки FileChanged после изменения, и у них нет управления решениями, поэтому они не могут блокировать запись.
1681 1689
1682<Warning>1690<Warning>
1683 PreToolUse запускается только, когда Claude вызывает инструмент. Файлы, которые вы [ссылаетесь с `@` в вашей подсказке](/docs/ru/common-workflows#reference-files-and-directories), добавляются без вызова инструмента: Claude Code вставляет их содержимое при построении подсказки, поэтому для них не срабатывает hook PreToolUse, включая hooks, соответствующие `Read`. Чтобы заблокировать определенные пути от ссылок `@`, используйте [правило отказа `Read`](/docs/ru/permissions#read-and-edit) вместо этого.1691 PreToolUse выполняется только когда Claude вызывает инструмент. Файлы, на которые вы [ссылаетесь через `@` в промпте](/docs/ru/common-workflows#reference-files-and-directories), добавляются без какого-либо вызова инструмента: Claude Code вставляет их содержимое при построении промпта, поэтому для них не срабатывает ни один хук PreToolUse, включая хуки, соответствующие `Read`. Чтобы заблокировать определённые пути для ссылок через `@`, используйте вместо этого [правило запрета `Read`](/docs/ru/permissions#read-and-edit).
1684 1692
1685 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).1693 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1686</Warning>1694</Warning>
1687 1695
1688Используйте [управление решениями PreToolUse](#pretooluse-decision-control) для разрешения, отказа, запроса или отложения вызова инструмента.1696Используйте [управление решениями PreToolUse](#pretooluse-decision-control), чтобы разрешить, запретить, запросить подтверждение или отложить вызов инструмента.
1689 1697
1690[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой тайм-аут, блокирует вызов инструмента, и Claude получает результат ошибки с названием тайм-аута. Явный отказ, возвращенный другим hook, все еще имеет приоритет.1698[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `PreToolUse`, превысивший таймаут, блокирует вызов инструмента, и Claude получает результат с ошибкой, указывающей на таймаут. Явный запрет, возвращённый другим хуком, по-прежнему имеет приоритет.
1691 1699
1692<h4 id="pretooluse-input">1700<h4 id="pretooluse-input">
1693 PreToolUse input1701 Входные данные PreToolUse
1694</h4>1702</h4>
1695 1703
1696Помимо [общих полей ввода](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.1704Помимо [общих входных полей](#common-input-fields), хуки PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1697 1705
1698Для [инструмента 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 или позже.1706Для [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 или новее.
1699 1707
1700Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:1708Для файловых инструментов `Write`, `Edit` и `Read` значение `tool_input.file_path` всегда абсолютное:
1701 1709
1702* Claude Code расширяет `~` и относительные пути перед запуском hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание одного пути1710* Claude Code раскрывает `~` и относительные пути до запуска хуков, поэтому хук, сопоставляющий пути, нельзя обойти через `~` или относительную запись того же пути
1703* На Windows путь прибывает с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`1711* В Windows путь приходит с разделителями-обратными слешами, даже если ваш хук работает в Git Bash, где `$PWD` выглядит как `/c/project`
1704* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки1712* Сравнение, записанное с прямыми слешами, например проверка `/src/`, никогда не совпадёт с путём с обратными слешами, и вызов инструмента пройдёт так, будто хуку нечего блокировать
1705* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен1713* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, а затем сопоставляйте сегмент пути, например `/src/`, а не привязывайтесь к началу через `^`, поскольку путь абсолютный
1706 1714
1707Вызов `Write` на Windows доставляет:1715Вызов `Write` в Windows передаёт:
1708 1716
1709```json theme={null}1717```json theme={null}
1710{1718{
1726 Bash1734 Bash
1727</h5>1735</h5>
1728 1736
1729Выполняет команды оболочки.1737Выполняет shell-команды.
1730 1738
1731| Поле | Тип | Пример | Описание |1739| Поле | Тип | Пример | Описание |
1732| :- | :- | :- | :- |1740| :- | :- | :- | :- |
1733| `command` | string | `"npm test"` | Команда оболочки для выполнения |1741| `command` | string | `"npm test"` | Shell-команда для выполнения |
1734| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |1742| `description` | string | `"Run test suite"` | Необязательное описание того, что делает команда |
1735| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1743| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1736| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1744| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1737 1745
1738Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude на редактирование файлов через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.1746Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записывать, что изменилось. Изменения записываются во всех режимах разрешений, когда настройка [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; в описании этой настройки указано, в каких файлах её можно задать. В противном случае изменения записываются только в авторежиме и режиме `bypassPermissions`, и только когда Claude Code поручает Claude редактировать файлы через Bash. Установите `bashEditDiffEnabled` в `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не содержат diff.
1739 1747
1740Ваш [hook PostToolUse](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.1748Затем ваш [хук PostToolUse](#posttooluse) получает изменённые файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории за время выполнения команды. Файлы, которые Git игнорирует, и файлы в подмодулях не включаются. Требуется Claude Code v2.1.269 или новее.
1741 1749
1742<Note>1750<Note>
1743 Список — это лучшее усилие и в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для обеспечения политики.1751 Список формируется по принципу «насколько возможно» и доступен в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который одновременно изменил другой процесс, или остановиться на своих ограничениях размера. Структура поля может измениться. Используйте список, чтобы найти, что проверить, а не для применения политики.
1744</Note>1752</Note>
1745 1753
1746`changedFiles` и `files` перечисляют то, что изменила команда; остальные поля говорят, насколько полон и надежен этот список.1754`changedFiles` и `files` перечисляют, что изменила команда; остальные поля показывают, насколько этот список полон и надёжен.
1747 1755
1748| Поле | Тип | Пример | Описание |1756| Поле | Тип | Пример | Описание |
1749| :- | :- | :- | :- |1757| :- | :- | :- | :- |
1750| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые изменила команда, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |1758| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, изменённых командой, не более 200. Присутствует, когда `files` содержит diff или `moreFiles` больше нуля |
1751| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diffs до 5 измененных файлов для отображения. `created` или `deleted` — это `true` для файла, который команда добавила или удалила |1759| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff до 5 изменённых файлов для отображения. `created` или `deleted` равно `true` для файла, который команда добавила или удалила |
1752| `moreFiles` | number | `2` | Количество измененных файлов без diff в `files` |1760| `moreFiles` | number | `2` | Количество изменённых файлов без diff в `files` |
1753| `unavailable` | boolean | `true` | Установлено, когда diff неполный или не мог быть взят |1761| `unavailable` | boolean | `true` | Устанавливается, когда diff неполон или его не удалось получить |
1754| `skipped` | boolean | `true` | Установлено для команды Git, которая перемещает рабочее дерево, такой как `git checkout` или `git stash`, поэтому Claude Code не берет diff |1762| `skipped` | boolean | `true` | Устанавливается для команды Git, перемещающей рабочее дерево, например `git checkout` или `git stash`, поэтому Claude Code не получает diff |
1755| `shared` | boolean | `true` | Установлено, когда другой вызов инструмента Bash, такой как вызов подагента, выполнялся в том же репозитории одновременно, поэтому некоторые перечисленные изменения могут быть этой командой |1763| `shared` | boolean | `true` | Устанавливается, когда другой вызов инструмента Bash, например субагента, выполнялся в том же репозитории в то же время, поэтому некоторые перечисленные изменения могут принадлежать той команде |
1756 1764
1757<a id="powershell" />1765<a id="powershell" />
1758 1766
1760 PowerShell1768 PowerShell
1761</h5>1769</h5>
1762 1770
1763Выполняет команды PowerShell. См. [инструмент PowerShell](/docs/ru/tools-reference#powershell-tool) для доступности по платформе.1771Выполняет команды PowerShell. Доступность по платформам см. в разделе об [инструменте PowerShell](/docs/ru/tools-reference#powershell-tool).
1764 1772
1765Поля совпадают с инструментом Bash, со строкой команды в `command`:1773Поля совпадают с инструментом Bash, строка команды — в `command`:
1766 1774
1767| Поле | Тип | Пример | Описание |1775| Поле | Тип | Пример | Описание |
1768| :- | :- | :- | :- |1776| :- | :- | :- | :- |
1769| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |1777| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |
1770| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |1778| `description` | string | `"List files recursively"` | Необязательное описание того, что делает команда |
1771| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах |1779| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах |
1772| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1780| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1773 1781
1774Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды оболочки, поэтому они охватывают оба инструмента:1782В хуках, проверяющих shell-команды, используйте matcher `Bash|PowerShell`, чтобы охватить оба инструмента:
1775 1783
1776* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основную оболочку и маршрутизирует команды оболочки через него.1784* В Windows, где бы ни был включён инструмент PowerShell, Claude считает PowerShell основной оболочкой и направляет через неё shell-команды.
1777* На Windows без Git Bash инструмент включен автоматически, и Claude Code не регистрирует инструмент Bash вообще.1785* В Windows без Git Bash инструмент включается автоматически, а Claude Code вообще не регистрирует инструмент Bash.
1778* Hook, который совпадает только с `Bash`, никогда не срабатывает там.1786* Хук, соответствующий только `Bash`, там никогда не срабатывает.
1779 1787
1780<h5 id="write">1788<h5 id="write">
1781 Write1789 Write
1782</h5>1790</h5>
1783 1791
1784Создает или перезаписывает файл.1792Создаёт или перезаписывает файл.
1785 1793
1786| Поле | Тип | Пример | Описание |1794| Поле | Тип | Пример | Описание |
1787| :- | :- | :- | :- |1795| :- | :- | :- | :- |
1810| Поле | Тип | Пример | Описание |1818| Поле | Тип | Пример | Описание |
1811| :- | :- | :- | :- |1819| :- | :- | :- | :- |
1812| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |1820| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |
1813| `offset` | number | `10` | Опциональный номер строки для начала чтения |1821| `offset` | number | `10` | Необязательный номер строки, с которой начать чтение |
1814| `limit` | number | `50` | Опциональное количество строк для чтения |1822| `limit` | number | `50` | Необязательное количество строк для чтения |
1815 1823
1816<h5 id="glob">1824<h5 id="glob">
1817 Glob1825 Glob
1818</h5>1826</h5>
1819 1827
1820Находит файлы, соответствующие шаблону glob.1828Находит файлы, соответствующие glob-шаблону.
1821 1829
1822| Поле | Тип | Пример | Описание |1830| Поле | Тип | Пример | Описание |
1823| :- | :- | :- | :- |1831| :- | :- | :- | :- |
1824| `pattern` | string | `"**/*.ts"` | Шаблон glob для соответствия файлам |1832| `pattern` | string | `"**/*.ts"` | Glob-шаблон для сопоставления файлов |
1825| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |1833| `path` | string | `"/path/to/dir"` | Необязательный каталог для поиска. По умолчанию — текущий рабочий каталог |
1826 1834
1827<h5 id="grep">1835<h5 id="grep">
1828 Grep1836 Grep
1829</h5>1837</h5>
1830 1838
1831Ищет содержимое файлов с помощью регулярных выражений.1839Ищет по содержимому файлов с помощью регулярных выражений.
1832 1840
1833| Поле | Тип | Пример | Описание |1841| Поле | Тип | Пример | Описание |
1834| :- | :- | :- | :- |1842| :- | :- | :- | :- |
1835| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |1843| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |
1836| `path` | string | `"/path/to/dir"` | Опциональный файл или директория для поиска |1844| `path` | string | `"/path/to/dir"` | Необязательный файл или каталог для поиска |
1837| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |1845| `glob` | string | `"*.ts"` | Необязательный glob-шаблон для фильтрации файлов |
1838| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |1846| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |
1839| `-i` | boolean | `true` | Поиск без учета регистра |1847| `-i` | boolean | `true` | Поиск без учёта регистра |
1840| `multiline` | boolean | `false` | Включить многострочное соответствие |1848| `multiline` | boolean | `false` | Включить многострочное сопоставление |
1841 1849
1842<h5 id="webfetch">1850<h5 id="webfetch">
1843 WebFetch1851 WebFetch
1844</h5>1852</h5>
1845 1853
1846Получает и обрабатывает веб-контент.1854Загружает и обрабатывает веб-контент.
1847 1855
1848| Поле | Тип | Пример | Описание |1856| Поле | Тип | Пример | Описание |
1849| :- | :- | :- | :- |1857| :- | :- | :- | :- |
1850| `url` | string | `"https://example.com/api"` | URL для получения контента |1858| `url` | string | `"https://example.com/api"` | URL, с которого загружается контент |
1851| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном контенте |1859| `prompt` | string | `"Extract the API endpoints"` | Промпт, применяемый к загруженному контенту |
1852 1860
1853<h5 id="websearch">1861<h5 id="websearch">
1854 WebSearch1862 WebSearch
1855</h5>1863</h5>
1856 1864
1857Ищет в веб.1865Выполняет поиск в интернете.
1858 1866
1859| Поле | Тип | Пример | Описание |1867| Поле | Тип | Пример | Описание |
1860| :- | :- | :- | :- |1868| :- | :- | :- | :- |
1861| `query` | string | `"react hooks best practices"` | Поисковый запрос |1869| `query` | string | `"react hooks best practices"` | Поисковый запрос |
1862| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включить результаты только с этих доменов |1870| `allowed_domains` | array | `["docs.example.com"]` | Необязательно: включать результаты только с этих доменов |
1863| `blocked_domains` | array | `["spam.example.com"]` | Опциональный: исключить результаты с этих доменов |1871| `blocked_domains` | array | `["spam.example.com"]` | Необязательно: исключать результаты с этих доменов |
1864 1872
1865<h5 id="agent">1873<h5 id="agent">
1866 Agent1874 Agent
1867</h5>1875</h5>
1868 1876
1869Порождает [подагента](/docs/ru/sub-agents).1877Запускает [субагента](/docs/ru/sub-agents).
1870 1878
1871| Поле | Тип | Пример | Описание |1879| Поле | Тип | Пример | Описание |
1872| :- | :- | :- | :- |1880| :- | :- | :- | :- |
1873| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |1881| `prompt` | string | `"Find all API endpoints"` | Задача, которую должен выполнить агент |
1874| `description` | string | `"Find API endpoints"` | Краткое описание задачи |1882| `description` | string | `"Find API endpoints"` | Краткое описание задачи |
1875| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |1883| `subagent_type` | string | `"Explore"` | Тип используемого специализированного агента |
1876| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения по умолчанию |1884| `model` | string | `"sonnet"` | Необязательный псевдоним модели для переопределения модели по умолчанию |
1877 1885
1878Когда вызов Agent переднего плана завершается, ваш [hook PostToolUse](#posttooluse) получает результат подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [счетчики токенов и затрат](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:1886Когда вызов Agent на переднем плане завершается, ваш [хук PostToolUse](#posttooluse) получает результат субагента и телеметрию запуска в `tool_response`. Читайте эти поля для анализа запуска; для сводных данных по токенам и стоимости по всем субагентам используйте [счётчики токенов и стоимости](/docs/ru/monitoring-usage#token-counter) с фильтром `query_source` `"subagent"`, поскольку `totalTokens` и `usage` охватывают только последний запрос:
1879 1887
1880| Поле | Тип | Пример | Описание |1888| Поле | Тип | Пример | Описание |
1881| :- | :- | :- | :- |1889| :- | :- | :- | :- |
1882| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. По умолчанию субагенты работают в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |1890| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. По умолчанию субагенты выполняются в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |
1883| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |1891| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор запуска субагента |
1884| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этом hand-back на их месте |1892| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Итоговые текстовые блоки субагента или, для субагента, чей отчёт передаётся через `SubagentHandback`, вместо них краткая заметка об этой передаче |
1885| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |1893| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, с которой субагент начал работу; может отличаться от запрошенной |
1886| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |1894| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Использованные модели по порядку, с объединением последовательных повторов; задаётся только если модель была заменена во время запуска. Требуется Claude Code v2.1.212 или новее |
1887| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |1895| `totalTokens` | number | `12450` | Количество токенов последнего запроса API субагента: входные, выходные и токены кэша вместе. Это не итог за весь запуск |
1888| `totalDurationMs` | number | `48211` | Настоящее время запуска подагента |1896| `totalDurationMs` | number | `48211` | Реальная длительность запуска субагента |
1889| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |1897| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, сделанных субагентом |
1890| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1898| `usage` | object | `{"input_tokens": 8320, ...}` | Разбивка токенов последнего запроса API по типам: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1891 1899
1892На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), который Claude Code предоставляет в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), доставляет свой отчет через этот инструмент, а не возвращает его как текст. Поле `content` его результата `completed` затем несет краткую заметку об этом hand-back, а не сам отчет. Чтобы прочитать отчет, совпадайте с hook `PreToolUse` или `PostToolUse` на `SubagentHandback` и прочитайте `tool_input.message`.1900В 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`.
1893 1901
1894Для подагентов фона инструмент возвращается, когда задача переходит в фон, поэтому `tool_response` не несет полей использования: запуск фона возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фон во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.1902Для фоновых субагентов инструмент возвращает результат, когда задача переходит в фон, поэтому `tool_response` не содержит полей использования: фоновый запуск возвращается сразу, а задача на переднем плане, которую Claude Code переводит в фон во время выполнения, возвращается в момент этого перехода. Ответ содержит `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1895 1903
1896На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, которая может отличаться от значения `model` в `tool_input`, такой как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент перешел в фон, поэтому переключение, которое произошло перед переводом в фон, отражается там. `modelsUsed` и поведение `resolvedModel` во время перевода в фон требуют Claude Code v2.1.212 или позже.1904В ответе `completed` поле `resolvedModel` указывает модель, с которой начал субагент; она может отличаться от значения `model` в `tool_input`, например когда применяется `availableModels` или другое переопределение. В ответе `async_launched` поле `resolvedModel` указывает модель, использовавшуюся в момент перехода агента в фон, поэтому замена, произошедшая до перевода в фон, в нём отражается. Для `modelsUsed` и поведения `resolvedModel` на момент перевода в фон требуется Claude Code v2.1.212 или новее.
1897 1905
1898<a id="askuserquestion" />1906<a id="askuserquestion" />
1899 1907
1901 AskUserQuestion1909 AskUserQuestion
1902</h5>1910</h5>
1903 1911
1904Задает пользователю один-четыре вопроса с множественным выбором.1912Задаёт пользователю от одного до четырёх вопросов с вариантами ответа.
1905 1913
1906| Поле | Тип | Пример | Описание |1914| Поле | Тип | Пример | Описание |
1907| :- | :- | :- | :- |1915| :- | :- | :- | :- |
1908| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с строкой `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |1916| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для показа, каждый со строкой `question`, коротким `header`, массивом `options` и необязательным флагом `multiSelect` |
1909| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Отображает текст вопроса на выбранный ярлык опции. Ответы с множественным выбором объединяют ярлыки запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |1917| `answers` | object | `{"Which framework?": "React"}` | Необязательно. Сопоставляет текст вопроса с меткой выбранного варианта. В ответах с множественным выбором метки объединяются через запятую. Claude не задаёт это поле; передайте его через `updatedInput`, чтобы ответить программно |
1910 1918
1911<h5 id="exitplanmode">1919<h5 id="exitplanmode">
1912 ExitPlanMode1920 ExitPlanMode
1913</h5>1921</h5>
1914 1922
1915Представляет план и просит пользователя одобрить его перед тем, как Claude покидает [режим плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.1923Представляет план и просит пользователя утвердить его, прежде чем Claude выйдет из [режима планирования](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диске перед вызовом инструмента, поэтому буквальный `tool_input` от модели обычно пуст. Claude Code внедряет содержимое плана и путь к файлу перед передачей входных данных хукам.
1916 1924
1917| Поле | Тип | Пример | Описание |1925| Поле | Тип | Пример | Описание |
1918| :- | :- | :- | :- |1926| :- | :- | :- | :- |
1919| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |1927| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Внедряется из файла плана на диске |
1920| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |1928| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Внедряется |
1921| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |1929| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устаревшее. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно содержало разрешения на основе промптов, которые Claude запрашивал для реализации плана |
1922 1930
1923В `PostToolUse`, `tool_response` является объектом с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.1931В `PostToolUse` поле `tool_response` — это объект с полями `plan` и `filePath`, содержащими утверждённый план, а также внутренними флагами состояния. Читайте `tool_response.plan` для получения содержимого плана, а не перечитывайте файл с диска.
1924 1932
1925<h4 id="pretooluse-decision-control">1933<h4 id="pretooluse-decision-control">
1926 Управление решениями PreToolUse1934 Управление решениями PreToolUse
1927</h4>1935</h4>
1928 1936
1929Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отложить) плюс возможность изменить ввод инструмента перед выполнением.1937Хуки `PreToolUse` могут управлять тем, выполняется ли вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт ему более широкие возможности управления: четыре исхода (разрешить, запретить, запросить подтверждение или отложить) и возможность изменить входные данные инструмента перед выполнением.
1930 1938
1931| Поле | Описание |1939| Поле | Описание |
1932| :- | :- |1940| :- | :- |
1933| `permissionDecision` | `"allow"` пропускает подсказку разрешения, кроме [действий, которые ни один режим не одобряет автоматически](/docs/ru/permission-modes#actions-no-mode-auto-approves) и для `AskUserQuestion` и `ExitPlanMode`, которым нужен [`updatedInput`, связанный с ним](#allow-with-updatedinput). `"deny"` предотвращает вызов инструмента. `"ask"` подсказывает пользователю подтвердить. `"defer"` выходит корректно, чтобы инструмент мог быть возобновлен позже. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются независимо от того, что возвращает hook |1941| `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) всё равно применяются независимо от того, что возвращает хук |
1934| `permissionDecisionReason` | Для `"ask"`, показано пользователю, но не Claude. Для `"deny"`, показано Claude. Для `"allow"` и `"defer"`, написано в [debug log](#debug-hooks) только |1942| `permissionDecisionReason` | Для `"ask"` показывается пользователю в запросе разрешения. Когда Claude Code [отклоняет вызов](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) в запуске с `-p`, где никто не может ответить на этот запрос, Claude вместо этого читает причину в результате инструмента. Для `"deny"` показывается Claude. Для `"allow"` и `"defer"` записывается только в [отладочный лог](#debug-hooks) |
1935| `updatedInput` | Изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизменные поля рядом с измененными. Claude Code оценивает правила разрешения и [автоматическое фоновое выполнение](/docs/ru/tools-reference#background-commands) команды Bash против ввода, который возвращает ваш hook, а не ввода, который отправил Claude. Объедините с `"allow"` для автоматического одобрения или `"ask"` для показа измененного ввода пользователю. Для `"defer"`, игнорируется |1943| `updatedInput` | Изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Claude Code проверяет правила разрешений и [возможность автоматического перевода в фон](/docs/ru/tools-reference#foreground-commands-that-move-to-the-background) команды Bash по входным данным, возвращённым вашим хуком, а не по тем, что отправил Claude. Используйте вместе с `"allow"` для автоматического подтверждения или с `"ask"`, чтобы показать пользователю изменённые входные данные. Для `"defer"` игнорируется |
1936| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. Игнорируется, когда `permissionDecision` имеет значение `"defer"`. См. [Add context for Claude](#add-context-for-claude) |1944| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. Игнорируется, когда `permissionDecision` равно `"defer"`. См. [Добавление контекста для Claude](#add-context-for-claude) |
1937 1945
1938Когда несколько hooks PreToolUse возвращают разные решения, приоритет `deny` > `defer` > `ask` > `allow`.1946Когда несколько хуков PreToolUse возвращают разные решения, приоритет таков: `deny` > `defer` > `ask` > `allow`.
1939 1947
1940Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.1948Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `"deny"`: Claude видит сообщение из stderr как причину запрета.
1941 1949
1942Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает ярлык, определяющий, откуда пришел hook: `[settings]` для hook из любого файла параметров или frontmatter агента, `[plugin:<name>]` для hook plugin или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1950Когда хук возвращает `"ask"`, запрос разрешения, показываемый пользователю, содержит метку, указывающую, откуда взялся хук: `[settings]` для хука из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для хука плагина или `[skill]` для хука из frontmatter скилла. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1943 1951
1944`"ask"` hook также принуждает подсказку разрешения в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызов инструмента, но не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и отказ hook `"deny"` всегда соблюдался.1952`"ask"` от хука также принудительно вызывает запрос разрешения в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор по-прежнему может запретить вызов инструмента, но не может молча его одобрить. До v2.1.211 классификатор мог одобрить команду Bash, выполняемую вне [песочницы](/docs/ru/sandboxing), не показывая запрошенный хуком запрос; при этом классификатор всё равно применял к этой команде собственные правила безопасности, а `"deny"` от хука всегда соблюдался.
1945 1953
1946```json theme={null}1954```json theme={null}
1947{1955{
1959 1967
1960<span id="allow-with-updatedinput" />1968<span id="allow-with-updatedinput" />
1961 1969
1962В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code предлагает `AskUserQuestion` и `ExitPlanMode` только, когда запуск имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) для получения подсказки, такой как callback `canUseTool` Agent SDK. Эти инструменты требуют взаимодействия с пользователем. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет это требование: hook читает ввод инструмента из stdin, собирает ответ через ваш собственный UI и возвращает его в `updatedInput`, поэтому инструмент выполняется без подсказки. Возврат `"allow"` один недостаточен для этих инструментов. Для `AskUserQuestion` повторите исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), отображающий текст каждого вопроса на выбранный ярлык опции.1970В [неинтерактивном режиме](/docs/ru/headless) с флагом `-p` Claude Code предлагает `AskUserQuestion` и `ExitPlanMode` только если у запуска есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs) для получения запроса, например callback `canUseTool` в Agent SDK. Этим инструментам требуется взаимодействие с пользователем. Возврат `permissionDecision: "allow"` вместе с `updatedInput` удовлетворяет это требование: хук читает входные данные инструмента из stdin, получает ответ через ваш собственный интерфейс и возвращает его в `updatedInput`, чтобы инструмент выполнился без запроса. Одного `"allow"` для этих инструментов недостаточно. Для `AskUserQuestion` верните исходный массив `questions` и добавьте объект [`answers`](#askuserquestion), сопоставляющий текст каждого вопроса с выбранным ответом.
1963 1971
1964Начиная с v2.1.199, инструмент MCP, сервер которого отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с или без `updatedInput`, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое нужно инструменту.1972MCP-инструмент, который его сервер помечает с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), строже: хук не может пропустить его запрос подтверждения с помощью `"allow"`, с `updatedInput` или без него, потому что Claude Code не может убедиться, что хук получил необходимое инструменту взаимодействие.
1965 1973
1966<Note>1974<Note>
1967 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.1975 Ранее PreToolUse использовал поля `decision` и `reason` верхнего уровня, но для этого события они объявлены устаревшими. Используйте вместо них `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` соответствуют `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, по-прежнему используют поля `decision` и `reason` верхнего уровня в качестве текущего формата.
1968</Note>1976</Note>
1969 1977
1970<h4 id="defer-a-tool-call-for-later">1978<h4 id="defer-a-tool-call-for-later">
1971 Defer a tool call for later1979 Отложить вызов инструмента
1972</h4>1980</h4>
1973 1981
1974`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить, где он остановился. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он регистрирует предупреждение и игнорирует результат hook.1982`"defer"` предназначено для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, например приложения на Agent SDK или пользовательского интерфейса, построенного поверх Claude Code. Оно позволяет вызывающему процессу приостановить Claude на вызове инструмента, получить ввод через собственный интерфейс и продолжить с того же места. Claude Code учитывает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сессиях он записывает в лог предупреждение и игнорирует результат хука.
1975 1983
1976Инструмент `AskUserQuestion` — типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому запустите запуск с одним. Круговой путь работает так:1984Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но терминала для ответа нет. Запуск с `-p` предлагает `AskUserQuestion`, только если у него есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), например MCP-инструмент, переданный через `--permission-prompt-tool`, поэтому запускайте с ним. Цикл работает так:
1977 1985
19781. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.19861. Claude вызывает `AskUserQuestion`. Срабатывает хук `PreToolUse`.
19792. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и сохраненным вызовом инструмента в транскрипте.19872. Хук возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс завершается с `stop_reason: "tool_deferred"`, а ожидающий вызов инструмента сохраняется в транскрипте.
19803. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.19883. Вызывающий процесс читает `deferred_tool_use` из результата SDK, показывает вопрос в своём интерфейсе и ждёт ответа.
19814. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента срабатывает `PreToolUse` снова.19894. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова запускает `PreToolUse`.
19825. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.19905. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.
1983 1991
1984Поле `deferred_tool_use` несет `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:1992Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, сгенерированные Claude для вызова инструмента и зафиксированные до выполнения:
1985 1993
1986```json theme={null}1994```json theme={null}
1987{1995{
1997}2005}
1998```2006```
1999 2007
2000Нет тайм-аута или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [правилам очистки](/docs/ru/claude-directory#cleaned-up-automatically) сметания удержания [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которое удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.2008Ограничений по таймауту или количеству повторных попыток нет. Сессия остаётся на диске, пока вы её не возобновите, с учётом очистки по сроку хранения [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая по умолчанию удаляет файлы сессий через 30 дней согласно [правилам очистки по сроку хранения](/docs/ru/claude-directory#cleaned-up-automatically). Если ответ не готов к моменту возобновления, хук может снова вернуть `"defer"`, и процесс завершится так же. Вызывающий процесс сам решает, когда выйти из цикла, в итоге возвращая из хука `"allow"` или `"deny"`.
2001 2009
2002`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отложить один вызов из партии без оставления других неразрешенными.2010`"defer"` работает, только когда Claude делает в ходе один вызов инструмента. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением, и инструмент проходит обычный процесс проверки разрешений. Это ограничение существует потому, что при возобновлении можно повторно выполнить только один инструмент: нельзя отложить один вызов из пакета, не оставив остальные неразрешёнными.
2003 2011
2004Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, поэтому вы можете определить, какой инструмент исчез.2012Если отложенный инструмент при возобновлении больше недоступен, процесс завершается с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` до срабатывания хука. Это происходит, когда MCP-сервер, предоставлявший инструмент, не подключён в возобновлённой сессии. Данные `deferred_tool_use` всё равно включаются, чтобы вы могли определить, какой инструмент пропал.
2005 2013
2006<Note>2014<Note>
2007 Чтобы возобновить отложенный сеанс в режиме плана, передайте [`--permission-prompt-tool`](/docs/ru/cli-reference#cli-flags) вместе с `--resume`, чтобы Claude Code мог представить план для одобрения. Если вы передадите определенные другие флаги запуска, возобновленный запуск не возвращается в режим плана; см. [Resume in plan mode with `-p`](/docs/ru/sessions#resume-in-plan-mode-with-p). Требует Claude Code v2.1.246 или позже.2015 Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--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 или новее.
2008 2016
2009 Когда вы возобновляете с `-p`, Claude Code не восстанавливает никакой другой сохраненный режим разрешений. Он запускает запуск в режиме разрешений, который запустил бы новый запуск `claude -p`, поэтому передайте `--permission-mode` или `--dangerously-skip-permissions` снова, если отложенный сеанс использовал один. Когда вы возобновляете с `claude --resume <session-id>` без `-p`, Claude Code восстанавливает сохраненный режим разрешений, с исключениями, перечисленными в [permission mode on resume](/docs/ru/sessions#permission-mode-on-resume).2017 При возобновлении с `-p` Claude Code не восстанавливает никакой другой сохранённый режим разрешений. Он запускает работу в том режиме разрешений, в котором запустился бы новый запуск `claude -p`, поэтому снова передайте `--permission-mode` или `--dangerously-skip-permissions`, если отложенная сессия их использовала. При возобновлении с `claude --resume <session-id>` без `-p` Claude Code восстанавливает сохранённый режим разрешений, за исключениями, перечисленными в разделе [режим разрешений при возобновлении](/docs/ru/sessions#permission-mode-on-resume).
2010</Note>2018</Note>
2011 2019
2012<h3 id="permissionrequest">2020<h3 id="permissionrequest">
2013 PermissionRequest2021 PermissionRequest
2014</h3>2022</h3>
2015 2023
2016Запускается, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не возвращает решение, он запрещает вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [callback `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется решение того, кто решит первым.2024Выполняется, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не вернёт решение, он запрещает вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [callback `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется то решение, которое принято первым.
2017Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.2025Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.
2018 2026
2019Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает hook [Notification](#notification) с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.2027Используйте это событие, когда нужен сигнал в момент, когда Claude запрашивает разрешение на использование инструмента. Claude Code запускает хук [Notification](#notification) с типом `permission_prompt` только после того, как запрос прождёт около шести секунд.
2020 2028
2021Claude Code не запускает hooks PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.2029Claude Code не запускает хуки PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) команды, выполняемой в песочнице. Чтобы получить сигнал для такого запроса, используйте тип уведомления `permission_prompt`.
2022 2030
2023Совпадает с именем инструмента, те же значения, что и PreToolUse.2031Сопоставляется по имени инструмента, с теми же значениями, что и PreToolUse.
2024 2032
2025<h4 id="permissionrequest-input">2033<h4 id="permissionrequest-input">
2026 PermissionRequest input2034 Входные данные PermissionRequest
2027</h4>2035</h4>
2028 2036
2029Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.2037Хуки PermissionRequest получают поля `tool_name` и `tool_input`, как хуки PreToolUse, но без `tool_use_id`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Необязательный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, например добавление правила разрешения или смену режима разрешений.
2030 2038
2031Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может скрыть опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.2039Массив `permission_suggestions` не является точным списком вариантов, которые вы видите, поскольку каждое диалоговое окно разрешений формирует собственные варианты. Некоторые диалоговые окна, например для редактирования файлов, вообще не читают этот массив и выводят варианты из самого запроса. Диалоговое окно, которое его читает, всё равно может скрыть вариант, предложение для которого остаётся в массиве, например когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает варианты сохранения правил. Оно также может предлагать варианты без соответствующей записи, например [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), который меняет режим разрешений напрямую, а не через обновление разрешений.
2032 2040
2033Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить у вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).2041Хуки PreToolUse выполняются перед каждым вызовом инструмента, независимо от того, нужно ли для него разрешение. Хуки PermissionRequest выполняются только когда Claude Code собирается запросить у вас разрешение или когда он иначе автоматически запретил бы вызов, который не может показать запрос. Ни одно из этих событий не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
2034 2042
2035```json theme={null}2043```json theme={null}
2036{2044{
2059 Управление решениями PermissionRequest2067 Управление решениями PermissionRequest
2060</h4>2068</h4>
2061 2069
2062Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:2070Хуки `PermissionRequest` могут разрешать или запрещать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может вернуть объект `decision` со следующими полями, специфичными для события:
2063 2071
2064| Поле | Описание |2072| Поле | Описание |
2065| :- | :- |2073| :- | :- |
2066| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |2074| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отклоняет его. [Правила запрета и запроса подтверждения](/docs/ru/permissions#manage-permissions) всё равно применяются, поэтому хук, возвращающий `"allow"`, не переопределяет соответствующее правило запрета |
2067| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |2075| `updatedInput` | Только для `"allow"`: изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Изменённые входные данные повторно проверяются по правилам запрета и запроса подтверждения |
2068| `updatedPermissions` | Для `"allow"` только: массив [записей обновления разрешений](#permission-update-entries) для применения, такие как добавление правила разрешения или изменение режима разрешений сеанса |2076| `updatedPermissions` | Только для `"allow"`: массив [записей обновления разрешений](#permission-update-entries) для применения, например добавление правила разрешения или смена режима разрешений сессии |
2069| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |2077| `message` | Только для `"deny"`: сообщает Claude, почему в разрешении отказано |
2070| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |2078| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |
2071 2079
2072Hook, который выходит 2 без объекта `decision`, оставляет поток разрешений неизменным, и его stderr отбрасывается. Только объект `decision` может предоставить или отказать запрос.2080Хук, завершившийся с кодом выхода 2 без объекта `decision`, оставляет процесс проверки разрешений без изменений, а его stderr отбрасывается. Предоставить или отклонить запрос может только объект `decision`.
2073 2081
2074```json theme={null}2082```json theme={null}
2075{2083{
2086```2094```
2087 2095
2088<h4 id="permission-update-entries">2096<h4 id="permission-update-entries">
2089 Permission update entries2097 Записи обновления разрешений
2090</h4>2098</h4>
2091 2099
2092Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.2100Поле вывода `updatedPermissions` и [входное поле `permission_suggestions`](#permissionrequest-input) используют один и тот же массив объектов-записей. У каждой записи есть `type`, определяющий её остальные поля, и `destination`, управляющий тем, куда записывается изменение.
2093 2101
2094| `type` | Поля | Эффект |2102| `type` | Поля | Действие |
2095| :- | :- | :- |2103| :- | :- | :- |
2096| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешения. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |2104| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — массив объектов `{toolName, ruleContent?}`. Не указывайте `ruleContent`, чтобы охватить весь инструмент. `behavior` — `"allow"`, `"deny"` или `"ask"` |
2097| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |2105| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила заданного `behavior` в `destination` переданными `rules` |
2098| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |2106| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила заданного `behavior` |
2099| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |2107| `setMode` | `mode`, `destination` | Меняет режим разрешений. Допустимые режимы: `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Для псевдонима `manual` требуется Claude Code v2.1.200 или новее |
2100| `addDirectories` | `directories`, `destination` | Добавляет рабочие директории. `directories` — это массив строк путей |2108| `addDirectories` | `directories`, `destination` | Добавляет рабочие каталоги. `directories` — массив строк путей |
2101| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |2109| `removeDirectories` | `directories`, `destination` | Удаляет рабочие каталоги |
2102 2110
2103<Note>2111<Note>
2104 `setMode` с `bypassPermissions` вступает в силу только, если вы запустили сеанс с режимом обхода, уже доступным: `--dangerously-skip-permissions`, `--permission-mode bypassPermissions`, `--allow-dangerously-skip-permissions` или `permissions.defaultMode: "bypassPermissions"` в [user, `--settings` или managed settings](/docs/ru/settings-reference#permissions-defaultmode). В противном случае обновление — это no-op. Обновление также является no-op, когда [`permissions.disableBypassPermissionsMode`](/docs/ru/permissions#managed-settings) отключает режим или когда сеанс запускается в [restricted mode](/docs/ru/cli-reference#cli-flags).2112 `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).
2105 2113
2106 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2114 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.
2107</Note>2115</Note>
2108 2116
2109Поле `destination` на каждой записи определяет, остается ли изменение в памяти или сохраняется в файл параметров.2117Поле `destination` в каждой записи определяет, остаётся ли изменение в памяти или сохраняется в файл настроек.
2110 2118
2111| `destination` | Записывает в |2119| `destination` | Куда записывается |
2112| :- | :- |2120| :- | :- |
2113| `session` | только в памяти, отбрасывается при завершении сеанса |2121| `session` | только в памяти, отбрасывается при завершении сессии |
2114| `localSettings` | `.claude/settings.local.json` |2122| `localSettings` | `.claude/settings.local.json` |
2115| `projectSettings` | `.claude/settings.json` |2123| `projectSettings` | `.claude/settings.json` |
2116| `userSettings` | `~/.claude/settings.json` |2124| `userSettings` | `~/.claude/settings.json` |
2117 2125
2118Hook может повторить одно из `permission_suggestions`, которые он получил, как свой собственный вывод `updatedPermissions`.2126Хук может вернуть одно из полученных `permission_suggestions` в качестве собственного вывода `updatedPermissions`.
2119 2127
2120<h3 id="posttooluse">2128<h3 id="posttooluse">
2121 PostToolUse2129 PostToolUse
2123 2131
2124Запускается сразу после успешного завершения инструмента.2132Запускается сразу после успешного завершения инструмента.
2125 2133
2126Совпадает с именем инструмента, те же значения, что и PreToolUse.2134Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2127 2135
2128Совпадайте более широко, когда имя инструмента не является правильным фильтром:2136Используйте более широкое сопоставление, когда имя инструмента не подходит в качестве фильтра:
2129 2137
2130* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook затем может обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).2138* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или задайте ему значение `"*"`. Тогда ваш хук сможет сам определить, что изменилось, например выполнив `git status --porcelain`, который также показывает неотслеживаемые файлы, пропускаемые `git diff`. Для вызовов инструментов, завершившихся сбоем, добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).
2131* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.2139* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, что его записало, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse`, сопоставленный с `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.
2132 2140
2133<h4 id="posttooluse-input">2141<h4 id="posttooluse-input">
2134 PostToolUse input2142 Входные данные PostToolUse
2135</h4>2143</h4>
2136 2144
2137Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути инструментов файлов `tool_input` прибывают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).2145Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, так и `tool_response` — возвращённый им результат. Точная схема обоих зависит от инструмента. Пути в `tool_input` файловых инструментов поступают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для MCP-инструмента входные данные также содержат объект [`mcp_server`](#pretooluse-input).
2138 2146
2139```json theme={null}2147```json theme={null}
2140{2148{
2159 2167
2160| Поле | Описание |2168| Поле | Описание |
2161| :- | :- |2169| :- | :- |
2162| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2170| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |
2163 2171
2164<h4 id="posttooluse-decision-control">2172<h4 id="posttooluse-decision-control">
2165 Управление решениями PostToolUse2173 Управление решениями PostToolUse
2166</h4>2174</h4>
2167 2175
2168Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2176Хуки `PostToolUse` могут передавать Claude обратную связь после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2169 2177
2170| Поле | Описание |2178| Поле | Описание |
2171| :- | :- |2179| :- | :- |
2172| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |2180| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude по-прежнему видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |
2173| `reason` | Объяснение, показанное Claude, когда `decision` — это `"block"` |2181| `reason` | Пояснение, показываемое Claude, когда `decision` равно `"block"` |
2174| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |2182| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. См. [Добавление контекста для Claude](#add-context-for-claude) |
2175| `classifierContext` | Краткая заметка об этом результате вызова для [классификатора режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не для Claude. См. [Annotate a result for the auto mode classifier](#annotate-a-result-for-the-auto-mode-classifier). Требует Claude Code v2.1.236 или позже |2183| `classifierContext` | Короткая заметка о результате этого вызова для классификатора [авторежима](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не для Claude. См. [Аннотирование результата для классификатора авторежима](#annotate-a-result-for-the-auto-mode-classifier). Требуется Claude Code v2.1.236 или новее |
2176| `updatedToolOutput` | Заменяет вывод инструмента предоставленным значением перед отправкой Claude. Значение должно совпадать с формой вывода инструмента |2184| `updatedToolOutput` | Заменяет вывод инструмента указанным значением перед отправкой Claude. Значение должно соответствовать форме вывода инструмента |
2177| `updatedMCPToolOutput` | Заменяет вывод для [инструментов MCP](#match-mcp-tools) только. Предпочитайте `updatedToolOutput`, который работает для всех инструментов |2185| `updatedMCPToolOutput` | Заменяет вывод только для [MCP-инструментов](#match-mcp-tools). Предпочтительнее использовать `updatedToolOutput`, который работает для всех инструментов |
2178 2186
2179Пример ниже заменяет вывод вызова `Bash`. Значение замены совпадает с формой вывода инструмента `Bash`:2187Пример ниже заменяет вывод вызова `Bash`. Значение замены соответствует форме вывода инструмента `Bash`:
2180 2188
2181```json theme={null}2189```json theme={null}
2182{2190{
2194```2202```
2195 2203
2196<Warning>2204<Warning>
2197 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте hook [PreToolUse](#pretooluse) вместо этого.2205 `updatedToolOutput` изменяет только то, что видит Claude. К моменту срабатывания хука инструмент уже выполнился, поэтому все записанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, например спаны инструментов OpenTelemetry и аналитические события, также фиксирует исходный вывод до запуска хука. Чтобы предотвратить или изменить вызов инструмента до его выполнения, используйте вместо этого хук [PreToolUse](#pretooluse).
2198 2206
2199 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.2207 Значение замены должно соответствовать форме вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, не соответствующее схеме вывода инструмента, игнорируется, и используется исходный вывод. Вывод MCP-инструментов передаётся без проверки схемы. Удаление сведений об ошибках, которые нужны Claude, может привести к тому, что он продолжит работу на основе ложного предположения.
2200</Warning>2208</Warning>
2201 2209
2202<h4 id="annotate-a-result-for-the-auto-mode-classifier">2210<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2203 Annotate a result for the auto mode classifier2211 Аннотирование результата для классификатора авторежима
2204</h4>2212</h4>
2205 2213
2206Верните `classifierContext` для отправки краткой заметки об результате вызова инструмента [классификатору режима auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode), а не Claude. Классификатор [никогда не получает сами результаты инструментов](/docs/ru/permission-modes#how-the-classifier-evaluates-actions), поэтому это поле — поддерживаемый способ рассказать ему что-то о том, что вернул вызов, перед тем, как он проверит более поздние действия. Поле требует Claude Code v2.1.236 или позже.2214Верните `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 или новее.
2207 2215
2208Пример ниже говорит классификатору, откуда пришел вывод запроса:2216Пример ниже сообщает классификатору, откуда взялся вывод запроса:
2209 2217
2210```json theme={null}2218```json theme={null}
2211{2219{
2216}2224}
2217```2225```
2218 2226
2219Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:2227Какой вес классификатор придаёт заметке, зависит от того, где вы настроили хук:
2220 2228
2221* **Hooks, настроенные в Claude Code**: для hooks из файлов параметров, plugins, skills и frontmatter агента классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре2229* **Хуки, настроенные в Claude Code**: для хуков из файлов настроек, плагинов, скиллов и frontmatter агентов классификатор рассматривает заметку как непроверенный контекст, предоставленный приложением. Заметка никогда не устанавливает намерение пользователя, и если в ней утверждается, что вы что-то одобрили или запросили, классификатор сверяет это утверждение с вашими собственными сообщениями в диалоге
2222* **In-process callbacks Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует hook как [callback TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один вызов, классификатор рассматривает объединенную заметку как непроверенный контекст2230* **Внутрипроцессные колбэки Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует хук как [колбэк TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время активной сессии, классификатор может учитывать переданное в заметке утверждение пользователя как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из отправленного вами сообщения, но оно никогда не снимает блокировку, которую не смогло бы снять и ваше собственное сообщение. После возобновления сессии Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда хуки из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединённую заметку как непроверенную
2223 2231
2224Claude Code применяет эти ограничения при доставке заметки:2232Claude Code применяет следующие ограничения при доставке заметки:
2225 2233
2226* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов2234* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2 000 символами и обрезает остальное. Ограничение общее для всех хуков, отвечающих на этот вызов
2227* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоне](#run-hooks-in-the-background), потому что этот ответ прибывает после того, как Claude Code записывает результат инструмента2235* **Только синхронные ответы**: Claude Code игнорирует это поле в ответе хука, который [выполняется в фоне](#run-hooks-in-the-background), поскольку такой ответ приходит после того, как Claude Code записывает результат инструмента
2228* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов2236* **Вызовы, которые классификатор не записывает**: транскрипт классификатора не включает операции только для чтения, такие как чтение файлов и поиск. Claude Code отбрасывает заметку, прикреплённую к одному из таких вызовов
2229* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод2237* **Взаимодействие с перезаписью**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе хука. Claude Code отбрасывает заметку, если эта перезапись отклонена или её заменяет перезапись другого хука. Claude Code доставляет заметку, возвращённую без перезаписи, даже когда другой хук перезаписывает вывод
2230 2238
2231<Warning>2239<Warning>
2232 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте в него ненадежный вывод инструмента или текст третьих сторон. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя об этом; не используйте поле для доставки несвязанных сообщений или потока событий.2240 Классификатор воспринимает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, в котором размещена сессия, поэтому не копируйте в него недоверенный вывод инструментов или сторонний текст. Ограничьте заметку коротким утверждением об этом конкретном вызове, например фактом о его происхождении или утверждением пользователя о нём; не используйте это поле для доставки несвязанных сообщений или потока событий.
2233</Warning>2241</Warning>
2234 2242
2235<h3 id="posttoolusefailure">2243<h3 id="posttoolusefailure">
2236 PostToolUseFailure2244 PostToolUseFailure
2237</h3>2245</h3>
2238 2246
2239Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.2247Запускается, когда инструмент, начавший выполнение, завершается сбоем: инструмент выбросил ошибку или MCP-инструмент вернул результат с ошибкой. Используйте его для записи сбоев в лог, отправки оповещений или передачи Claude корректирующей обратной связи.
2240 2248
2241Совпадает с именем инструмента, те же значения, что и PreToolUse.2249Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2242 2250
2243<Note>2251<Note>
2244 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное название инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы в проверке возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни этим событием. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).2252 Это событие не срабатывает для вызовов инструментов, отклонённых до выполнения: неизвестное имя инструмента, входные данные, не прошедшие проверку схемы или специфичную для инструмента проверку, или отказ в разрешении. Отклонения при проверке возвращаются как результаты `tool_use_error` и происходят до запуска хуков, поэтому они не вызывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении вызывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
2245</Note>2253</Note>
2246 2254
2247<h4 id="posttoolusefailure-input">2255<h4 id="posttoolusefailure-input">
2248 PostToolUseFailure input2256 Входные данные PostToolUseFailure
2249</h4>2257</h4>
2250 2258
2251Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:2259Хуки PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, а также информацию об ошибке в виде полей верхнего уровня. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может передать:
2252 2260
2253```json theme={null}2261```json theme={null}
2254{2262{
2271 2279
2272| Поле | Описание |2280| Поле | Описание |
2273| :- | :- |2281| :- | :- |
2274| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |2282| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, завершившегося сбоем |
2275| `is_interrupt` | Опциональное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этим hook; результат инструмента несет сообщение прерывания вместо этого |2283| `is_interrupt` | Необязательное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, о которой сообщил инструмент. Отмена выполняющегося инструмента не вызывает этот хук; вместо этого результат инструмента содержит сообщение о прерывании |
2276| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2284| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |
2277 2285
2278Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется по инструменту и сбою. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.2286Строка `error` обычно совпадает с текстом, который Claude получает в качестве результата неудавшегося инструмента. Её формат зависит от инструмента и сбоя. Ориентируйте хук на `tool_name`, `is_interrupt` и первую строку `Exit code N`; остальную часть строки рассматривайте как отображаемый текст, а не как стабильный формат.
2279 2287
2280* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными2288* Для Bash и PowerShell команда, которая выполнилась и завершилась, даёт первую строку `Exit code N`, а затем весь вывод команды одним блоком с чередующимися stdout и stderr
2281* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс оболочки2289* Данные события также могут содержать простое сообщение о сбое без строки с кодом выхода, когда Claude Code не смог запустить сам процесс оболочки
2282* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`2290* Claude Code обрезает длинные строки посередине вокруг маркера `... [N characters truncated] ...` и может вставлять собственные строки, например `Command timed out after 2m 0s`
2283 2291
2284<h4 id="posttoolusefailure-decision-control">2292<h4 id="posttoolusefailure-decision-control">
2285 Управление решениями PostToolUseFailure2293 Управление решениями PostToolUseFailure
2286</h4>2294</h4>
2287 2295
2288Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2296Хуки `PostToolUseFailure` могут передавать Claude контекст после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2289 2297
2290| Поле | Описание |2298| Поле | Описание |
2291| :- | :- |2299| :- | :- |
2292| `additionalContext` | Строка, добавленная в контекст Claude рядом с ошибкой. См. [Add context for Claude](#add-context-for-claude) |2300| `additionalContext` | Строка, добавляемая в контекст Claude вместе с ошибкой. См. [Добавление контекста для Claude](#add-context-for-claude) |
2293 2301
2294```json theme={null}2302```json theme={null}
2295{2303{
2304 PostToolBatch2312 PostToolBatch
2305</h3>2313</h3>
2306 2314
2307Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз для каждого инструмента, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.2315Запускается один раз после того, как разрешились все вызовы инструментов в пакете, до того как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, то есть срабатывает параллельно, когда Claude выполняет параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз с полным пакетом, поэтому это подходящее место для внедрения контекста, который зависит от набора выполненных инструментов, а не от какого-то одного инструмента. Для этого события matcher не поддерживается.
2308 2316
2309<h4 id="posttoolbatch-input">2317<h4 id="posttoolbatch-input">
2310 PostToolBatch input2318 Входные данные PostToolBatch
2311</h4>2319</h4>
2312 2320
2313Помимо [общих полей ввода](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:2321Помимо [общих входных полей](#common-input-fields), хуки PostToolBatch получают `tool_calls` — массив, описывающий каждый вызов инструмента в пакете:
2314 2322
2315```json theme={null}2323```json theme={null}
2316{2324{
2336}2344}
2337```2345```
2338 2346
2339`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков контента, ровно как инструмент выдал его. Для `Read` это означает текст с префиксом номера строки, а не необработанное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.2347`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — сериализованная строка или массив блоков содержимого, в точности как их выдал инструмент. Для `Read` это означает текст с префиксами номеров строк, а не необработанное содержимое файла. Ответы могут быть большими, поэтому разбирайте только нужные поля.
2340 2348
2341<Note>2349<Note>
2342 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передает структурированный объект `Output` инструмента, такой как `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передает сериализованное содержимое `tool_result`, которое видит модель.2350 Форма `tool_response` отличается от формы в `PostToolUse`. `PostToolUse` передаёт структурированный объект `Output` инструмента, например `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передаёт сериализованное содержимое `tool_result`, которое видит модель.
2343</Note>2351</Note>
2344 2352
2345<h4 id="posttoolbatch-decision-control">2353<h4 id="posttoolbatch-decision-control">
2346 Управление решениями PostToolBatch2354 Управление решениями PostToolBatch
2347</h4>2355</h4>
2348 2356
2349Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2357Хуки `PostToolBatch` могут внедрять контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2350 2358
2351| Поле | Описание |2359| Поле | Описание |
2352| :- | :- |2360| :- | :- |
2353| `additionalContext` | Строка контекста, внедренная один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в нее поместить и как возобновленные сеансы обрабатывают прошлые значения |2361| `additionalContext` | Строка контекста, внедряемая один раз перед следующим вызовом модели. Подробности доставки, что в неё помещать и как возобновлённые сессии обрабатывают прошлые значения, см. в разделе [Добавление контекста для Claude](#add-context-for-claude) |
2354 2362
2355```json theme={null}2363```json theme={null}
2356{2364{
2361}2369}
2362```2370```
2363 2371
2364Возврат `decision: "block"` или `continue: false` останавливает агентский цикл перед следующим вызовом модели. Сообщение блокировки поступает из JSON `reason` или `stopReason`, или из stderr при выходе 2. Вы видите его как предупреждение в транскрипте, и оно остается в разговоре, поэтому Claude видит его, когда разговор продолжается.2372Возврат `decision: "block"` или `continue: false` останавливает агентный цикл перед следующим вызовом модели. Сообщение о блокировке берётся из JSON-поля `reason` или `stopReason` либо из stderr при коде выхода 2. Вы видите его как предупреждение в транскрипте, и оно остаётся в диалоге, поэтому Claude видит его, когда диалог продолжается.
2365 2373
2366<h3 id="permissiondenied">2374<h3 id="permissiondenied">
2367 PermissionDenied2375 PermissionDenied
2368</h3>2376</h3>
2369 2377
2370Запускается, когда [режим auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отказывает вызову инструмента, включая когда он отказывает без вердикта классификатора, потому что [проверка безопасности, отдельная от режима auto, отказала в запросе классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не был проанализирован. Этот hook срабатывает только в режиме auto: он не запускается, когда вы вручную отказываете диалогу разрешений, когда hook `PreToolUse` блокирует вызов или когда совпадает правило `deny`. Используйте его для логирования отказов, корректировки конфигурации или сообщения модели, что она может повторить вызов инструмента.2378Запускается, когда [авторежим](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отклоняет вызов инструмента, в том числе когда он отклоняет вызов без вердикта классификатора, потому что [проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не удалось разобрать. Этот хук срабатывает только в авторежиме: он не запускается, когда вы вручную отклоняете диалоговое окно разрешения, когда хук `PreToolUse` блокирует вызов или когда срабатывает правило `deny`. Используйте его для записи отказов в лог, корректировки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.
2371 2379
2372Совпадает с именем инструмента, те же значения, что и PreToolUse.2380Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2373 2381
2374<h4 id="permissiondenied-input">2382<h4 id="permissiondenied-input">
2375 PermissionDenied input2383 Входные данные PermissionDenied
2376</h4>2384</h4>
2377 2385
2378Помимо [общих полей ввода](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).2386Помимо [общих входных полей](#common-input-fields), хуки PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input).
2379 2387
2380```json theme={null}2388```json theme={null}
2381{2389{
2396 2404
2397| Поле | Описание |2405| Поле | Описание |
2398| :- | :- |2406| :- | :- |
2399| `reason` | Причина отказа. Для вердикта классификатора в большинстве сеансов он называет совпадающее правило в квадратных скобках, такое как `[Data Exfiltration]`; см. [Review denials](/docs/ru/auto-mode-config#review-denials) для других форм. Для [отказа без вердикта](#permissiondenied-decision-control) он начинается с `Auto mode could not evaluate this action and is blocking it for safety`. Для отказа, потому что модель классификатора была недоступна, это фиксированный текст `Classifier unavailable` |2407| `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` |
2400 2408
2401<h4 id="permissiondenied-decision-control">2409<h4 id="permissiondenied-decision-control">
2402 Управление решениями PermissionDenied2410 Управление решениями PermissionDenied
2403</h4>2411</h4>
2404 2412
2405Hooks PermissionDenied могут сказать модели, что она может повторить отклоненный вызов инструмента. Верните объект JSON с `hookSpecificOutput.retry`, установленным на `true`:2413Хуки PermissionDenied могут сообщить модели, что она может повторить попытку отклонённого вызова инструмента. Верните JSON-объект с `hookSpecificOutput.retry`, равным `true`:
2406 2414
2407```json theme={null}2415```json theme={null}
2408{2416{
2413}2421}
2414```2422```
2415 2423
2416Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить вызов инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.2424Когда `retry` равно `true`, Claude Code добавляет в диалог сообщение, сообщающее модели, что она может повторить попытку вызова инструмента. Сам отказ Claude Code не отменяет. Если ваш хук не возвращает JSON или возвращает `retry: false`, отказ остаётся в силе, и модель получает исходное сообщение об отклонении.
2417 2425
2418Claude Code игнорирует `retry: true`, когда классификатор создал [отсутствие вердикта на действие](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от режима auto, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли позже или продолжить.2426Claude Code игнорирует `retry: true`, когда классификатор [не вынес вердикта по действию](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не удалось разобрать, или проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора. Для таких отказов Claude Code уже сообщает модели в сообщении об отклонении, следует ли повторить попытку позже или двигаться дальше.
2419 2427
2420<h3 id="notification">2428<h3 id="notification">
2421 Notification2429 Notification
2422</h3>2430</h3>
2423 2431
2424Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.2432Запускается, когда Claude Code отправляет уведомления. Сопоставляется по типу уведомления. Опустите matcher, чтобы запускать хуки для всех типов уведомлений.
2425 2433
2426Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вас оповещают, а не срабатывает ли ваш hook.2434Вы получаете эти события хуков даже при отключённых уведомлениях рабочего стола: настройка `preferredNotifChannel`, включая `notifications_disabled`, меняет только способ оповещения, но не то, запускается ли ваш хук.
2427 2435
2428| Matcher | Когда срабатывает |2436| Matcher | Когда срабатывает |
2429| :- | :- |2437| :- | :- |
2430| `permission_prompt` | Claude нуждается в вашем разрешении на использование инструмента или [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды, и подсказка ждала около шести секунд |2438| `permission_prompt` | Claude нужно, чтобы вы подтвердили использование инструмента или [сетевой запрос](/docs/ru/sandboxing#network-isolation) команды в песочнице, и запрос ожидает около шести секунд |
2431| `idle_prompt` | Claude закончил отвечать около 60 секунд назад и вы не печатали с тех пор |2439| `idle_prompt` | Claude закончил отвечать около 60 секунд назад, и с тех пор вы ничего не вводили |
2432| `auth_success` | Аутентификация завершена |2440| `auth_success` | Аутентификация завершена |
2433| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |2441| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |
2434| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |2442| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |
2435| `elicitation_complete` | Сервер MCP сообщает, что [URL-режим запроса](#elicitation-input) завершен |2443| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |
2436| `elicitation_response` | Ответ на запрос MCP отправляется обратно на сервер |2444| `elicitation_response` | Ответ на запрос данных MCP отправляется обратно на сервер |
2437| `agent_needs_input` | Фоновый сеанс начинает ждать вашего ввода, пока [agent view](/docs/ru/agent-view) открыт в терминале. Также срабатывает, когда сеанс терминала показывает вам [вопрос настройки терминала товарища команды агентов](/docs/ru/agent-teams#choose-a-display-mode) или уведомление режима auto о [расходах на запрос классификатора](/docs/ru/auto-mode-classifier-billing) и вы не печатали около шести секунд |2445| `agent_needs_input` | Фоновая сессия начинает ожидать вашего ввода, пока в терминале открыт [вид агентов](/docs/ru/agent-view). Также срабатывает, когда терминальная сессия показывает вам [вопрос участника команды агентов о настройке терминала](/docs/ru/agent-teams#choose-a-display-mode) или уведомление авторежима о [плате за запросы классификатора](/docs/ru/auto-mode-classifier-billing), и вы ничего не вводили около шести секунд |
2438| `agent_completed` | Фоновый сеанс завершается или не удается. Срабатывает только, пока [agent view](/docs/ru/agent-view) открыт в терминале |2446| `agent_completed` | Фоновая сессия завершается или завершается сбоем. Срабатывает, только пока в терминале открыт [вид агентов](/docs/ru/agent-view) |
2439| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил его: при сбросе или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, такое как добавление кредитов использования, обновление плана или переключение моделей, снова делает использование доступным, с [исключением параметра модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |2447| `quota_auto_resume_fired` | Claude Code продолжает вашу задачу после того, как лимит использования claude.ai приостановил её: в момент сброса или раньше, когда что-то, что вы делаете в Claude Code во время ожидания, например добавление кредитов использования, повышение тарифного плана или смена модели, снова делает использование доступным, с [исключением для настройки модели](/docs/ru/interactive-mode#wait-for-a-usage-limit-to-reset) |
2440| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер спал более чем около 30 минут. Claude Code ждет, пока вы нажмете `Enter`, вместо продолжения. После более короткого сна он продолжает и срабатывает `quota_auto_resume_fired` вместо этого |2448| `quota_auto_resume_stale` | Лимит использования claude.ai сбросился, пока ваш компьютер находился в спящем режиме более 30 минут. Claude Code ждёт, пока вы нажмёте `Enter`, вместо того чтобы продолжить. После более короткого сна он продолжает работу и вместо этого вызывает `quota_auto_resume_fired` |
2441| `quota_auto_resume_disabled` | Claude Code заканчивает свое ожидание лимита использования claude.ai без продолжения вашей задачи: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключен или сброс переместился более чем на 24 часа во время ожидания, которое Claude Code запустил сам, продолженная задача продолжала попадать на лимит или продолжение было заблокировано перед достижением модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` или выбираете **Don't continue automatically** |2449| `quota_auto_resume_disabled` | Claude Code завершает ожидание лимита использования claude.ai, не продолжая вашу задачу: [`autoContinueAtUsageLimit`](/docs/ru/settings-reference#autocontinueatusagelimit) отключена или сброс сместился более чем на 24 часа во время ожидания, которое Claude Code начал самостоятельно, продолженная задача продолжала упираться в лимит, или продолжение было заблокировано до того, как достигло модели. Не срабатывает, когда вы нажимаете `Esc` или `Ctrl+C` либо выбираете **Don't continue automatically** |
2442 2450
2443Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или позже.2451Для типов `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуется Claude Code v2.1.234 или новее.
2444 2452
2445В сеансах терминала `permission_prompt` для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды требует Claude Code v2.1.246 или позже.2453В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.
2446 2454
2447`agent_needs_input` для вопроса настройки терминала товарища требует Claude Code v2.1.248 или позже.2455Для `agent_needs_input` при вопросе участника команды о настройке терминала требуется Claude Code v2.1.248 или новее.
2448 2456
2449<Note>2457<Note>
2450 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:2458 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` используют те же тайминги, что и уведомления рабочего стола, поэтому в терминальных сессиях вы видите их, только когда, судя по всему, отошли от терминала:
2451 2459
2452 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте [PermissionRequest](#permissionrequest) вместо этого.2460 * Ожидайте `permission_prompt`, когда вы ничего не вводили около шести секунд. Таймер запускается при появлении запроса разрешения, и каждое нажатие клавиши откладывает его. Чтобы запускать хук сразу, когда Claude запрашивает разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).
2453 * Ожидайте `idle_prompt` около 60 секунд после завершения Claude ответа и только, если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается само по себе, один из типов `quota_auto_resume_*` срабатывает вместо этого.2461 * Ожидайте `idle_prompt` примерно через 60 секунд после того, как Claude закончит отвечать, и только если с тех пор вы ничего не вводили и ни один фоновый агент, например фоновый [субагент](/docs/ru/sub-agents), ещё не работает. Claude Code не отправляет `idle_prompt`, пока ожидает сброса лимита использования claude.ai. Когда ожидание заканчивается само по себе, вместо этого срабатывает один из типов `quota_auto_resume_*`.
2454 * Ожидайте `elicitation_dialog` для формы запроса или `elicitation_url_dialog` для запроса URL браузера один раз, когда вы не печатали около шести секунд. Оба делят один шестисекундный шлюз с `permission_prompt`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.2462 * Ожидайте `elicitation_dialog` для формы запроса данных или `elicitation_url_dialog` для запроса URL в браузере, когда вы ничего не вводили около шести секунд. Оба используют тот же шестисекундный порог, что и `permission_prompt`: таймер запускается при появлении диалогового окна, и каждое нажатие клавиши откладывает его.
2455 2463
2456 Запрос разрешения или запрос, который прибывает, пока другой диалог находится на экране, сохраняет один шестисекундный шлюз, рассчитанный с момента прибытия запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.2464 Запрос разрешения или запрос данных, поступивший, пока на экране открыто другое диалоговое окно, сохраняет тот же шестисекундный порог, отсчитываемый с момента поступления запроса. Уведомление о нём может дойти до вас, пока запрос всё ещё ожидает за открытым диалоговым окном.
2457</Note>2465</Note>
2458 2466
2459Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback `canUseTool` Agent SDK, что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:2467Claude Code иначе рассчитывает время `permission_prompt` в сессиях, где он отправляет запросы разрешений в [колбэк `canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK — именно так Claude Desktop и расширение VS Code размещают Claude Code:
2460 2468
2461* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.2469* Ожидайте `permission_prompt` примерно через шесть секунд после того, как Claude запросит разрешение. Claude Code не откладывает его, пока вы вводите текст.
2462* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.2470* Если вы или хук [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2463* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) на `1`, чтобы отключить `permission_prompt` в этих сеансах.2471* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) в `1`, чтобы отключить `permission_prompt` в таких сессиях.
2464 2472
2465До версии 2.1.233 `permission_prompt` не срабатывал в этих сеансах.2473До v2.1.233 `permission_prompt` в таких сессиях не срабатывал.
2466 2474
2467Используйте отдельные matchers для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:2475Используйте отдельные matcher, чтобы запускать разные обработчики в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения о разрешениях, когда Claude нужно подтверждение разрешения, и другое уведомление, когда Claude простаивает:
2468 2476
2469```json theme={null}2477```json theme={null}
2470{2478{
2494```2502```
2495 2503
2496<h4 id="notification-input">2504<h4 id="notification-input">
2497 Notification input2505 Входные данные Notification
2498</h4>2506</h4>
2499 2507
2500Помимо [общих полей ввода](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.2508Помимо [общих входных полей](#common-input-fields), хуки Notification получают `message` с текстом уведомления, необязательное `title` и `notification_type`, указывающее, какой тип сработал.
2501 2509
2502```json theme={null}2510```json theme={null}
2503{2511{
2511}2519}
2512```2520```
2513 2521
2514Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которое полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис.2522Хуки Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но по-прежнему выводит [`terminalSequence`](#emit-terminal-notifications), на чём основан пример уведомления рабочего стола. Хуки Notification предназначены для побочных эффектов, например пересылки уведомления во внешний сервис.
2515 2523
2516<h3 id="subagentstart">2524<h3 id="subagentstart">
2517 SubagentStart2525 SubagentStart
2518</h3>2526</h3>
2519 2527
2520Запускается, когда Claude порождает подагента с инструментом Agent, когда Claude [возобновляет подагента](/docs/ru/sub-agents#resume-subagents) и каждый раз, когда товарищ [команды агентов](/docs/ru/agent-teams) в процессе обрабатывает новое сообщение. Поддерживает matchers для фильтрации по имени типа агента. Для встроенных агентов это имя агента, такое как `general-purpose`, `Explore` или `Plan`. Для [пользовательских подагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.2528Запускается, когда Claude создаёт субагента с помощью инструмента Agent, когда Claude [возобновляет субагента](/docs/ru/sub-agents#resume-subagents), и каждый раз, когда внутрипроцессный участник [команды агентов](/docs/ru/agent-teams) обрабатывает новое сообщение. Поддерживает matcher для фильтрации по имени типа агента. Для встроенных агентов это имя агента, например `general-purpose`, `Explore` или `Plan`. Для [пользовательских субагентов](/docs/ru/sub-agents) это поле `name` из frontmatter агента, а не имя файла.
2521 2529
2522Для подагентов, поставляемых [plugin](/docs/ru/plugins/overview), тип агента — это идентификатор с областью plugin, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью plugin на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.2530Для субагентов, поставляемых [плагином](/docs/ru/plugins/overview), тип агента — это идентификатор с областью плагина, например `my-plugin:reviewer`, а не просто имя из frontmatter. Двоеточие переводит имя с областью плагина на путь регулярных выражений, поэтому для точного совпадения закрепите matcher с помощью `^` и `$`: `^my-plugin:reviewer$`.
2523 2531
2524<h4 id="subagentstart-input">2532<h4 id="subagentstart-input">
2525 SubagentStart input2533 Входные данные SubagentStart
2526</h4>2534</h4>
2527 2535
2528Помимо [общих полей ввода](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором подагента и `agent_type` с именем агента, который matcher фильтрует.2536Помимо [общих входных полей](#common-input-fields), хуки SubagentStart получают `agent_id` с уникальным идентификатором субагента и `agent_type` с именем агента, по которому фильтрует matcher.
2529 2537
2530```json theme={null}2538```json theme={null}
2531{2539{
2538}2546}
2539```2547```
2540 2548
2541Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:2549Хуки SubagentStart не могут блокировать создание субагента, но могут внедрять в него контекст. Помимо [полей вывода JSON](#json-output), доступных всем хукам, вы можете вернуть:
2542 2550
2543| Поле | Описание |2551| Поле | Описание |
2544| :- | :- |2552| :- | :- |
2545| `additionalContext` | Строка, добавленная в контекст подагента в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |2553| `additionalContext` | Строка, добавляемая в контекст субагента в начале его диалога, перед первым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
2546 2554
2547```json theme={null}2555```json theme={null}
2548{2556{
2553}2561}
2554```2562```
2555 2563
2556Когда hook запускается снова для того же подагента, Claude Code внедряет возвращенный контекст только, когда контекст подагента уже не содержит копию из более раннего запуска. Копия, внедренная при запуске, остается на месте, оставляя [кэш подсказок](/docs/ru/prompt-caching#subagents-and-the-cache) подагента нетронутым. После [автоматического сжатия](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code внедряет контекст следующего запуска снова.2564Когда хук снова запускается для того же субагента, Claude Code внедряет возвращённый контекст, только если контекст субагента ещё не содержит копию из предыдущего запуска. Копия, внедрённая при запуске, остаётся на месте, сохраняя [кэш промптов](/docs/ru/prompt-caching#subagents-and-the-cache) субагента нетронутым. После того как [автосжатие](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code снова внедряет контекст следующего запуска.
2557 2565
2558<h3 id="subagentstop">2566<h3 id="subagentstop">
2559 SubagentStop2567 SubagentStop
2560</h3>2568</h3>
2561 2569
2562Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.2570Запускается, когда субагент Claude Code закончил отвечать. Сопоставляется по типу агента, значения те же, что и для SubagentStart.
2563 2571
2564<h4 id="subagentstop-input">2572<h4 id="subagentstop-input">
2565 SubagentStop input2573 Входные данные SubagentStop
2566</h4>2574</h4>
2567 2575
2568Помимо [общих полей ввода](#common-input-fields), hooks SubagentStop получают `stop_hook_active`, `agent_id`, `agent_type`, `agent_transcript_path` и `last_assistant_message`. Поле `agent_type` — это значение, используемое для фильтрации matcher. `transcript_path` — это транскрипт основного сеанса, в то время как `agent_transcript_path` — это собственный транскрипт подагента, хранящийся в вложенной папке `subagents/`. Поле `last_assistant_message` содержит текстовое содержимое финального ответа подагента, поэтому hooks могут получить доступ к нему без анализа файла транскрипта.2576Помимо [общих входных полей](#common-input-fields), хуки 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` содержит текстовое содержимое последнего ответа субагента, поэтому хуки могут получить к нему доступ без разбора файла транскрипта.
2569 2577
2570Не каждое событие SubagentStop поступает от подагента, который Claude порождает. Claude Code также запускает внутренних агентов для некоторых своих собственных функций, таких как [предложения подсказок](/docs/ru/interactive-mode#prompt-suggestions) и [вопросы в сторону `/btw`](/docs/ru/interactive-mode#side-questions-with-%2Fbtw), и SubagentStop срабатывает, когда один из них завершается. Для этих событий `agent_type` — это имя агента, который запускает сам сеанс, такой как один, установленный с [`--agent`](/docs/ru/cli-reference#cli-flags) или параметром [`agent`](/docs/ru/settings-reference#agent), и пустая строка, когда сеанс запускается без одного.2578Не каждое событие SubagentStop исходит от субагента, созданного Claude. Claude Code также запускает внутренних агентов для некоторых собственных функций, таких как [предложения промптов](/docs/ru/interactive-mode#prompt-suggestions) и [побочные вопросы `/btw`](/docs/ru/interactive-mode#side-questions-with-%2Fbtw), и SubagentStop срабатывает, когда завершается и один из них. Для таких событий `agent_type` — это имя агента, от имени которого работает сама сессия, например заданное с помощью [`--agent`](/docs/ru/cli-reference#cli-flags) или [настройки `agent`](/docs/ru/settings-reference#agent), и пустая строка, когда сессия работает без него.
2571 2579
2572`matcher`, который называет типы агентов, не совпадает с пустым `agent_type`. Hook, чей matcher опущен, `""` или `"*"`, или является регулярным выражением, которое совпадает с пустой строкой, запускается для событий с пустым `agent_type` тоже.2580`matcher`, называющий типы агентов, не совпадает с пустым `agent_type`. Хук, у которого matcher опущен, равен `""` или `"*"` либо является регулярным выражением, совпадающим с пустой строкой, запускается и для событий с пустым `agent_type`.
2573 2581
2574На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, соответствующий `SubagentHandback`, получает как `tool_input.message`.2582В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчёт через этот инструмент перед остановкой. Тогда поле `last_assistant_message` содержит заключительный текст субагента, если он есть, который не является доставленным отчётом. Отчёт — это входное значение `message` этого вызова, которое хук `PreToolUse` или `PostToolUse`, сопоставленный с `SubagentHandback`, получает как `tool_input.message`.
2575 2583
2576Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.2584Хуки SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в разделе [Входные данные Stop](#stop-input). Оба массива относятся к родительской сессии, а не к субагенту.
2577 2585
2578```json theme={null}2586```json theme={null}
2579{2587{
2592}2600}
2593```2601```
2594 2602
2595Hooks SubagentStop используют тот же формат управления решениями, что и [hooks Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.2603Хуки SubagentStop используют тот же формат управления решениями, что и [хуки Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, равным `"SubagentStop"`, для обратной связи без ошибки, которая продолжает работу субагента. Возврат `decision: "block"` с `reason` продолжает работу субагента и доставляет `reason` субагенту в качестве следующей инструкции. Хук, который блокирует с кодом выхода 2, доставляет своё сообщение stderr тем же способом. Чтобы внедрить контекст в родительскую сессию после возврата субагента, используйте вместо этого хук [`PostToolUse`](#posttooluse) для инструмента `Agent`.
2596 2604
2597<h3 id="taskcreated">2605<h3 id="taskcreated">
2598 TaskCreated2606 TaskCreated
2599</h3>2607</h3>
2600 2608
2601Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для обеспечения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.2609Запускается, когда задача создаётся с помощью инструмента `TaskCreate`. Используйте его для соблюдения соглашений об именовании, обязательного указания описаний задач или предотвращения создания определённых задач. В [сессии без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.
2602 2610
2603Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.2611Хуки TaskCreated не поддерживают matcher и срабатывают при каждом возникновении события.
2604 2612
2605<h4 id="taskcreated-input">2613<h4 id="taskcreated-input">
2606 TaskCreated input2614 Входные данные TaskCreated
2607</h4>2615</h4>
2608 2616
2609Помимо [общих полей ввода](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2617Помимо [общих входных полей](#common-input-fields), хуки TaskCreated получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.
2610 2618
2611```json theme={null}2619```json theme={null}
2612{2620{
2625| Поле | Описание |2633| Поле | Описание |
2626| :- | :- |2634| :- | :- |
2627| `task_id` | Идентификатор создаваемой задачи |2635| `task_id` | Идентификатор создаваемой задачи |
2628| `task_subject` | Название задачи |2636| `task_subject` | Заголовок задачи |
2629| `task_description` | Подробное описание задачи. Может отсутствовать |2637| `task_description` | Подробное описание задачи. Может отсутствовать |
2630| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |2638| `teammate_name` | Имя участника команды, создающего задачу. Может отсутствовать |
2631| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2639| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2632 2640
2633<h4 id="taskcreated-decision-control">2641<h4 id="taskcreated-decision-control">
2634 Управление решениями TaskCreated2642 Управление решениями TaskCreated
2635</h4>2643</h4>
2636 2644
2637Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.2645Хук TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude в качестве ошибки инструмента. Claude Code игнорирует `continue: false` от этого события, и Claude продолжает работу.
2638 2646
2639* **Код выхода 2**: Claude Code возвращает текст stderr как сообщение.2647* **Код выхода 2**: Claude Code возвращает текст stderr в качестве сообщения.
2640* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` как сообщение.2648* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` в качестве сообщения.
2641 2649
2642Этот пример блокирует задачи, чьи названия не следуют требуемому формату:2650Этот пример блокирует задачи, заголовки которых не соответствуют требуемому формату:
2643 2651
2644```bash theme={null}2652```bash theme={null}
2645#!/bin/bash2653#!/bin/bash
2658 TaskCompleted2666 TaskCompleted
2659</h3>2667</h3>
2660 2668
2661Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ [команды агентов](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для обеспечения критериев завершения, таких как прохождение тестов или проверок lint перед закрытием задачи.2669Запускается, когда задача помечается как выполненная. Это происходит в двух ситуациях: когда любой агент явно помечает задачу как выполненную с помощью инструмента TaskUpdate или когда участник [команды агентов](/docs/ru/agent-teams) завершает свой ход с задачами в процессе выполнения. Используйте его для соблюдения критериев завершения, таких как прохождение тестов или проверок линтера, прежде чем задачу можно будет закрыть.
2662 2670
2663Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.2671Хуки TaskCompleted не поддерживают matcher и срабатывают при каждом возникновении события.
2664 2672
2665<h4 id="taskcompleted-input">2673<h4 id="taskcompleted-input">
2666 TaskCompleted input2674 Входные данные TaskCompleted
2667</h4>2675</h4>
2668 2676
2669Помимо [общих полей ввода](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2677Помимо [общих входных полей](#common-input-fields), хуки TaskCompleted получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.
2670 2678
2671```json theme={null}2679```json theme={null}
2672{2680{
2686| Поле | Описание |2694| Поле | Описание |
2687| :- | :- |2695| :- | :- |
2688| `task_id` | Идентификатор завершаемой задачи |2696| `task_id` | Идентификатор завершаемой задачи |
2689| `task_subject` | Название задачи |2697| `task_subject` | Заголовок задачи |
2690| `task_description` | Подробное описание задачи. Может отсутствовать |2698| `task_description` | Подробное описание задачи. Может отсутствовать |
2691| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |2699| `teammate_name` | Имя участника команды, завершающего задачу. Может отсутствовать |
2692| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2700| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2693 2701
2694<h4 id="taskcompleted-decision-control">2702<h4 id="taskcompleted-decision-control">
2695 Управление решениями TaskCompleted2703 Управление решениями TaskCompleted
2696</h4>2704</h4>
2697 2705
2698Hooks TaskCompleted поддерживают два способа управления завершением задачи:2706Хуки TaskCompleted поддерживают два способа управления завершением задачи:
2699 2707
2700* **Код выхода 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.2708* **Код выхода 2**: задача не помечается как выполненная, а сообщение stderr передаётся модели в качестве обратной связи.
2701* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие запустил товарищ, завершающий свой ход, полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда событие запустил инструмент `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 все еще блокирует завершение.2709* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие вызвано завершением хода участника команды, полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю. Когда событие вызвано инструментом `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 по-прежнему блокирует завершение.
2702 2710
2703Этот пример запускает тесты и блокирует завершение задачи, если они не удаются:2711Этот пример запускает тесты и блокирует завершение задачи, если они не проходят:
2704 2712
2705```bash theme={null}2713```bash theme={null}
2706#!/bin/bash2714#!/bin/bash
2720 Stop2728 Stop
2721</h3>2729</h3>
2722 2730
2723Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API запускают [StopFailure](#stopfailure) вместо этого.2731Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если
2732остановка произошла из-за прерывания пользователем. При ошибках API вместо этого
2733срабатывает [StopFailure](#stopfailure).
2724 2734
2725<Tip>2735<Tip>
2726 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.2736 Команда [`/goal`](/docs/ru/goal) — встроенный ярлык для хука Stop на основе промпта с областью действия сессии. Используйте её, когда хотите, чтобы Claude продолжал работать над достижением условия, без написания конфигурации хука.
2727</Tip>2737</Tip>
2728 2738
2729<h4 id="stop-input">2739<h4 id="stop-input">
2730 Stop input2740 Входные данные Stop
2731</h4>2741</h4>
2732 2742
2733Помимо [общих полей ввода](#common-input-fields), hooks Stop получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` имеет значение `true`, когда Claude Code уже продолжает в результате hook stop. Проверьте это значение или обработайте транскрипт, чтобы избежать блокировки на условии, которое никогда не разрешится. Claude Code применяет ограничение на 8 последовательных продолжений: после того, как hooks stop продолжили ход восемь раз подряд, Claude Code переопределяет следующий блок и заканчивает ход. Чтобы поднять ограничение, установите [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).2743Помимо [общих входных полей](#common-input-fields), хуки Stop получают `stop_hook_active`, `last_assistant_message`, `background_tasks` и `session_crons`. Поле `stop_hook_active` равно `true`, когда Claude Code уже продолжает работу в результате хука остановки. Проверяйте это значение или обрабатывайте транскрипт, чтобы избежать блокировки по условию, которое никогда не разрешится. Claude Code применяет ограничение в 8 последовательных продолжений: после того как хуки остановки продолжили ход восемь раз подряд, Claude Code переопределяет следующую блокировку и завершает ход. Чтобы повысить ограничение, задайте [`CLAUDE_CODE_STOP_HOOK_BLOCK_CAP`](/docs/ru/env-vars).
2734 2744
2735Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантирует включение финального сообщения в момент Stop на всех версиях.2745Поле `last_assistant_message` содержит текстовое содержимое последнего ответа Claude, поэтому хуки могут получить к нему доступ без разбора файла транскрипта. Для хуков, которые действуют по только что завершённому ходу, например хуков чтения вслух или уведомлений, используйте это поле, а не чтение `transcript_path`: не во всех версиях гарантируется, что файл транскрипта содержит последнее сообщение в момент Stop.
2736 2746
2737Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен в ожидании фоновой работы для его пробуждения". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.2747Массивы `background_tasks` и `session_crons` позволяют хукам отличать «сессия завершена» от «сессия приостановлена в ожидании, пока фоновая работа снова её разбудит». Оба массива присутствуют, когда реестр задач доступен, и пусты, когда ничего не выполняется и не запланировано.
2738 2748
2739Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:2749Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует следующие поля:
2740 2750
2741| Поле | Описание |2751| Поле | Описание |
2742| :- | :- |2752| :- | :- |
2743| `id` | Идентификатор задачи |2753| `id` | Идентификатор задачи |
2744| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |2754| `type` | Понятная метка типа задачи, например `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждая метка указывает, какая функция Claude Code создала задачу. Для нераспознанных типов используется необработанный дискриминант |
2745| `status` | Текущий статус задачи |2755| `status` | Текущий статус задачи |
2746| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезании |2756| `description` | Произвольное текстовое описание, ограниченное 1000 символами, с маркером `… [+N chars]` внутри строки при обрезке |
2747| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |2757| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |
2748| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |2758| `agent_type` | Имя типа субагента. Присутствует только для задач `subagent` |
2749| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |2759| `server` | Имя MCP-сервера. Присутствует только для задач `monitor` и `MCP task` |
2750| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |2760| `tool` | Имя MCP-инструмента. Присутствует только для задач `monitor` и `MCP task` |
2751| `name` | Имя workflow. Присутствует только для задач `workflow` |2761| `name` | Имя workflow. Присутствует только для задач `workflow` |
2752 2762
2753Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью сеанса, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:2763Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью действия сессии, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:
2754 2764
2755| Поле | Описание |2765| Поле | Описание |
2756| :- | :- |2766| :- | :- |
2757| `id` | Идентификатор задачи cron |2767| `id` | Идентификатор cron-задачи |
2758| `schedule` | Выражение cron, например `0 9 * * 1-5` |2768| `schedule` | Cron-выражение, например `0 9 * * 1-5` |
2759| `recurring` | `false` для одноразовых пробуждений, чье расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |2769| `recurring` | `false` для однократных пробуждений, расписание которых задаёт одно время срабатывания, `true` для задач, которые срабатывают повторно при каждом совпадении |
2760| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |2770| `prompt` | Промпт, отправляемый при срабатывании cron, ограниченный 1000 символами с тем же маркером `… [+N chars]` |
2761 2771
2762Этот пример показывает ввод Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:2772Этот пример показывает входные данные Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:
2763 2773
2764```json theme={null}2774```json theme={null}
2765{2775{
2794 Управление решениями Stop2804 Управление решениями Stop
2795</h4>2805</h4>
2796 2806
2797Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2807Хуки `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude работу. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2798 2808
2799| Поле | Описание |2809| Поле | Описание |
2800| :- | :- |2810| :- | :- |
2801| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |2811| `decision` | `"block"` не даёт Claude остановиться. Опустите, чтобы разрешить Claude остановиться |
2802| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |2812| `reason` | Обязательно, когда `decision` равно `"block"`. Сообщает Claude, почему он должен продолжить |
2803| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на ней, но в отличие от `decision: "block"`, она показывается в транскрипте как обратная связь hook, а не ошибка hook |2813| `hookSpecificOutput.additionalContext` | Обратная связь для Claude без ошибки. Диалог продолжается, чтобы Claude мог действовать на её основе, но, в отличие от `decision: "block"`, она отображается в транскрипте как обратная связь хука, а не как ошибка хука |
2804 2814
2805Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.2815Хук, который блокирует с кодом выхода 2, обрабатывается так же, как `reason`: Claude получает сообщение stderr в качестве объяснения, почему он должен продолжить.
2806 2816
2807```json theme={null}2817```json theme={null}
2808{2818{
2811}2821}
2812```2822```
2813 2823
2814Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение на 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и уведомление об ошибке hook не показывается:2824Используйте `additionalContext`, когда хук работает как задумано и даёт Claude указания, например «запусти набор тестов перед завершением». Он продолжает диалог с теми же защитами от зацикливания, что и `decision: "block"`, а именно входным полем `stop_hook_active` и ограничением в 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback`, и уведомление об ошибке хука не показывается:
2815 2825
2816```json theme={null}2826```json theme={null}
2817{2827{
2826 StopFailure2836 StopFailure
2827</h3>2837</h3>
2828 2838
2829Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.2839Запускается вместо [Stop](#stop), когда ход завершается из-за ошибки API. Claude Code игнорирует вывод и код выхода хука, за исключением [`terminalSequence`](#emit-terminal-notifications). Используйте его для записи сбоев в лог, отправки оповещений или выполнения действий по восстановлению, когда Claude не может завершить ответ из-за ограничений частоты запросов, проблем с аутентификацией или других ошибок API.
2830 2840
2831<h4 id="stopfailure-input">2841<h4 id="stopfailure-input">
2832 StopFailure input2842 Входные данные StopFailure
2833</h4>2843</h4>
2834 2844
2835Помимо [общих полей ввода](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.2845Помимо [общих входных полей](#common-input-fields), хуки StopFailure получают `error`, необязательное `error_details` и необязательное `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.
2836 2846
2837| Поле | Описание |2847| Поле | Описание |
2838| :- | :- |2848| :- | :- |
2839| `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` |2849| `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` |
2840| `error_details` | Дополнительные детали об ошибке, когда доступны |2850| `error_details` | Дополнительные сведения об ошибке, если они доступны |
2841| `last_assistant_message` | Отображаемый текст ошибки, показанный в разговоре. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит строку ошибки API, такую как `"API Error: Rate limit reached"` |2851| `last_assistant_message` | Отображаемый текст ошибки, показанный в диалоге. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит саму строку ошибки API, например `"API Error: Rate limit reached"` |
2842 2852
2843```json theme={null}2853```json theme={null}
2844{2854{
2852}2862}
2853```2863```
2854 2864
2855Hooks StopFailure не имеют управления решениями. Они запускаются только в целях уведомления и логирования.2865Хуки StopFailure не имеют управления решениями. Они запускаются только для уведомлений и логирования.
2856 2866
2857<h3 id="teammateidle">2867<h3 id="teammateidle">
2858 TeammateIdle2868 TeammateIdle
2859</h3>2869</h3>
2860 2870
2861Запускается, когда товарищ [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для обеспечения шлюзов качества перед остановкой товарища, такие как требование прохождения проверок lint или проверка существования выходных файлов.2871Запускается, когда участник [команды агентов](/docs/ru/agent-teams) собирается перейти в режим простоя после завершения своего хода. Используйте его для применения контроля качества до того, как участник команды прекратит работу, например требуя прохождения проверок линтера или проверяя наличие выходных файлов.
2862 2872
2863Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.2873Хуки TeammateIdle не поддерживают matcher и срабатывают при каждом возникновении события.
2864 2874
2865<h4 id="teammateidle-input">2875<h4 id="teammateidle-input">
2866 TeammateIdle input2876 Входные данные TeammateIdle
2867</h4>2877</h4>
2868 2878
2869Помимо [общих полей ввода](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.2879Помимо [общих входных полей](#common-input-fields), хуки TeammateIdle получают `teammate_name` и `team_name`.
2870 2880
2871```json theme={null}2881```json theme={null}
2872{2882{
2882 2892
2883| Поле | Описание |2893| Поле | Описание |
2884| :- | :- |2894| :- | :- |
2885| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |2895| `teammate_name` | Имя участника команды, который собирается перейти в режим простоя |
2886| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2896| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2887 2897
2888<h4 id="teammateidle-decision-control">2898<h4 id="teammateidle-decision-control">
2889 Управление решениями TeammateIdle2899 Управление решениями TeammateIdle
2890</h4>2900</h4>
2891 2901
2892Hooks TeammateIdle поддерживают два способа управления поведением товарища:2902Хуки TeammateIdle поддерживают два способа управления поведением участника команды:
2893 2903
2894* **Код выхода 2**: товарищ получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.2904* **Код выхода 2**: участник команды получает сообщение stderr в качестве обратной связи и продолжает работу вместо перехода в режим простоя.
2895* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю.2905* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю.
2896 2906
2897Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу перейти в режим ожидания:2907Этот пример проверяет наличие артефакта сборки, прежде чем разрешить участнику команды перейти в режим простоя:
2898 2908
2899```bash theme={null}2909```bash theme={null}
2900#!/bin/bash2910#!/bin/bash
2911 ConfigChange2921 ConfigChange
2912</h3>2922</h3>
2913 2923
2914Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений параметров, обеспечения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.2924Запускается, когда файл конфигурации изменяется во время сессии. Используйте его для аудита изменений настроек, применения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.
2915 2925
2916Claude Code запускает hooks ConfigChange, когда файл параметров, файл управляемой политики или файл skill изменяется. Для управляемой политики он запускает их только, когда `managed-settings.json` или файл в `managed-settings.d/` изменяется. Он применяет [параметры, управляемые сервером](/docs/ru/server-managed-settings) и изменения в macOS управляемые предпочтения или политику реестра Windows без запуска их. На WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет измененный файл управляемых параметров Windows на его опросе политики без запуска их.2926Claude Code запускает хуки ConfigChange, когда изменяется файл настроек, файл управляемой политики или файл скилла. Для управляемой политики он запускает их, только когда изменяется `managed-settings.json` или файл в `managed-settings.d/`. [Настройки, управляемые сервером](/docs/ru/server-managed-settings), и изменения управляемых настроек macOS или политики реестра Windows он применяет без запуска хуков. В WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет изменённый файл управляемых настроек на стороне Windows при опросе политики, не запуская хуки.
2917 2927
2918Matcher фильтрует по источнику конфигурации:2928Matcher фильтрует по источнику конфигурации:
2919 2929
2920| Matcher | Когда срабатывает |2930| Matcher | Когда срабатывает |
2921| :- | :- |2931| :- | :- |
2922| `user_settings` | `~/.claude/settings.json` изменяется |2932| `user_settings` | Изменяется `~/.claude/settings.json` |
2923| `project_settings` | `.claude/settings.json` изменяется |2933| `project_settings` | Изменяется `.claude/settings.json` |
2924| `local_settings` | `.claude/settings.local.json` изменяется |2934| `local_settings` | Изменяется `.claude/settings.local.json` |
2925| `policy_settings` | `managed-settings.json` или файл в `managed-settings.d/` изменяется |2935| `policy_settings` | Изменяется `managed-settings.json` или файл в `managed-settings.d/` |
2926| `skills` | Файл skill в `.claude/skills/` изменяется |2936| `skills` | Изменяется файл скилла в `.claude/skills/` |
2927 2937
2928Этот пример логирует все изменения конфигурации для аудита безопасности:2938Этот пример записывает в лог все изменения конфигурации для аудита безопасности:
2929 2939
2930```json theme={null}2940```json theme={null}
2931{2941{
2946```2956```
2947 2957
2948<h4 id="configchange-input">2958<h4 id="configchange-input">
2949 ConfigChange input2959 Входные данные ConfigChange
2950</h4>2960</h4>
2951 2961
2952Помимо [общих полей ввода](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.2962Помимо [общих входных полей](#common-input-fields), хуки ConfigChange получают `source` и, необязательно, `file_path`. Поле `source` указывает, какой тип конфигурации изменился, а `file_path` содержит путь к конкретному изменённому файлу.
2953 2963
2954```json theme={null}2964```json theme={null}
2955{2965{
2966 Управление решениями ConfigChange2976 Управление решениями ConfigChange
2967</h4>2977</h4>
2968 2978
2969Hooks ConfigChange могут блокировать изменения конфигурации от вступления в силу. Используйте код выхода 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к работающему сеансу.2979Хуки ConfigChange могут блокировать вступление изменений конфигурации в силу. Используйте код выхода 2 или JSON-поле `decision`, чтобы предотвратить изменение. При блокировке новые настройки не применяются к работающей сессии.
2970 2980
2971| Поле | Описание |2981| Поле | Описание |
2972| :- | :- |2982| :- | :- |
2973| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы позволить изменению |2983| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы разрешить изменение |
2974| `reason` | Принято, но никогда не показано |2984| `reason` | Принимается, но никогда не показывается |
2975 2985
2976```json theme={null}2986```json theme={null}
2977{2987{
2980}2990}
2981```2991```
2982 2992
2983Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых параметров на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда прибывают [параметры, управляемые сервером](/docs/ru/server-managed-settings) или обновляются.2993Изменения `policy_settings` нельзя заблокировать. Хуки по-прежнему срабатывают для источников `policy_settings`, когда изменяется файл управляемых настроек на компьютере, поэтому вы можете использовать их для записи этих правок в лог, но любое решение о блокировке игнорируется. Это гарантирует, что настройки, управляемые организацией, всегда вступают в силу. Claude Code не запускает хуки `ConfigChange`, когда [настройки, управляемые сервером](/docs/ru/server-managed-settings), поступают или обновляются.
2984 2994
2985Claude Code действует на решение блокировки из вывода JSON hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только записывает строку в debug log.2995Claude Code учитывает решение о блокировке из JSON-вывода хука ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения ни вам, ни Claude, независимо от того, блокируете ли вы с помощью `reason` или через stderr с кодом выхода 2. Claude Code лишь записывает строку в лог отладки.
2986 2996
2987<h3 id="cwdchanged">2997<h3 id="cwdchanged">
2988 CwdChanged2998 CwdChanged
2989</h3>2999</h3>
2990 3000
2991Запускается, когда команда оболочки в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов, специфичных для проекта, или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.3001Запускается, когда shell-команда в основном диалоге изменяет рабочий каталог, например когда Claude выполняет команду `cd`. Используйте его для реакции на смену каталога: перезагрузки переменных окружения, активации инструментальных цепочек проекта или автоматического запуска скриптов настройки. Работает в паре с [FileChanged](#filechanged) для таких инструментов, как [direnv](https://direnv.net/), которые управляют окружением для каждого каталога.
2992 3002
2993Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code их очищает.3003Хуки CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события CwdChanged, когда Claude Code их очищает.
2994 3004
2995CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.3005CwdChanged не поддерживает matcher и срабатывает при каждом возникновении события.
2996 3006
2997<h4 id="cwdchanged-input">3007<h4 id="cwdchanged-input">
2998 CwdChanged input3008 Входные данные CwdChanged
2999</h4>3009</h4>
3000 3010
3001Помимо [общих полей ввода](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.3011Помимо [общих входных полей](#common-input-fields), хуки CwdChanged получают `old_cwd` и `new_cwd`.
3002 3012
3003```json theme={null}3013```json theme={null}
3004{3014{
3012```3022```
3013 3023
3014<h4 id="cwdchanged-output">3024<h4 id="cwdchanged-output">
3015 CwdChanged output3025 Вывод CwdChanged
3016</h4>3026</h4>
3017 3027
3018Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) наблюдает:3028Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки CwdChanged могут возвращать `watchPaths`, чтобы динамически задавать, за какими путями файлов следит [FileChanged](#filechanged):
3019 3029
3020| Поле | Описание |3030| Поле | Описание |
3021| :- | :- |3031| :- | :- |
3022| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |3032| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Возврат пустого массива очищает динамический список, что типично при входе в новый каталог |
3023 3033
3024Hooks CwdChanged не имеют управления решениями. Они не могут блокировать изменение директории.3034Хуки CwdChanged не имеют управления решениями. Они не могут заблокировать смену каталога.
3025 3035
3026Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3036Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3027 3037
3028<h3 id="directoryadded">3038<h3 id="directoryadded">
3029 DirectoryAdded3039 DirectoryAdded
3030</h3>3040</h3>
3031 3041
3032Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления клиентом SDK с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например, установки его зависимостей.3042Запускается после того, как вы добавляете рабочий каталог в середине сессии командой `/add-dir` или после того, как клиент SDK добавляет его управляющим запросом `register_repo_root`. Используйте его для подготовки только что добавленного репозитория, например для установки его зависимостей.
3033 3043
3034Claude Code не срабатывает это событие, когда:3044Claude Code не вызывает это событие, когда:
3035 3045
3036* Вы передаете директорию с флагом запуска `--add-dir`; [SessionStart](#sessionstart) охватывает эти директории3046* Вы передаёте каталог с помощью флага запуска `--add-dir`; такие каталоги охватывает [SessionStart](#sessionstart)
3037* Вы добавляете директорию на вкладку Workspace `/permissions`3047* Вы добавляете каталог на вкладке Workspace в `/permissions`
3038* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной3048* Вы добавляете каталог, который уже является рабочим каталогом или находится внутри него
3039 3049
3040Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда запускается ваш hook. Команды hook сами выполняются без изоляции.3050Claude Code вызывает DirectoryAdded после обновления состояния песочницы и разрешений, поэтому инструменты в песочнице уже видят новый каталог, когда запускается ваш хук. Сами команды хуков выполняются вне песочницы.
3041 3051
3042Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоне с тайм-аутом по умолчанию 600 секунд.3052Claude Code не ждёт хук: добавление завершается немедленно, а хук выполняется в фоне со стандартным таймаутом 600 секунд.
3043 3053
3044Matcher фильтрует по тому, как была добавлена директория:3054Matcher фильтрует по способу добавления каталога:
3045 3055
3046| Matcher | Когда срабатывает |3056| Matcher | Когда срабатывает |
3047| :- | :- |3057| :- | :- |
3048| `slash_command` | Вы добавляете директорию с `/add-dir` |3058| `slash_command` | Вы добавляете каталог с помощью `/add-dir` |
3049| `register_repo_root` | Клиент SDK добавляет директорию с запросом управления `register_repo_root` |3059| `register_repo_root` | Клиент SDK добавляет каталог управляющим запросом `register_repo_root` |
3050 3060
3051<h4 id="directoryadded-input">3061<h4 id="directoryadded-input">
3052 DirectoryAdded input3062 Входные данные DirectoryAdded
3053</h4>3063</h4>
3054 3064
3055Помимо [общих полей ввода](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.3065Помимо [общих входных полей](#common-input-fields), хуки DirectoryAdded получают `directory` и `source`.
3056 3066
3057| Поле | Описание |3067| Поле | Описание |
3058| :- | :- |3068| :- | :- |
3059| `directory` | Абсолютный путь директории, которая была добавлена |3069| `directory` | Абсолютный путь к добавленному каталогу |
3060| `source` | Как была добавлена директория, `"slash_command"` для `/add-dir` или `"register_repo_root"` для запроса управления SDK |3070| `source` | Способ добавления каталога: `"slash_command"` для `/add-dir` или `"register_repo_root"` для управляющего запроса SDK |
3061 3071
3062```json theme={null}3072```json theme={null}
3063{3073{
3070}3080}
3071```3081```
3072 3082
3073Hooks DirectoryAdded не имеют управления решениями. Они не могут блокировать добавление, которое уже завершилось, когда выполняется hook. Claude Code отбрасывает поле `continue` из их вывода JSON и выводит остальное по-разному в зависимости от источника:3083Хуки DirectoryAdded не имеют управления решениями. Они не могут заблокировать добавление, которое уже завершено к моменту запуска хука. Claude Code отбрасывает поле `continue` из их JSON-вывода, а остальное обрабатывает по-разному в зависимости от источника:
3074 3084
3075* `slash_command`: Claude Code доставляет `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log3085* `slash_command`: Claude Code доставляет `systemMessage` хука Claude в качестве контекста на следующем ходе диалога, а не показывает его вам. Количество неудавшихся хуков отображается в транскрипте. Полный вывод сбоев записывается в лог отладки
3076* `register_repo_root`: Claude Code пишет вывод `systemMessage` и вывод сбоя только в debug log3086* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоев только в лог отладки
3077 3087
3078<h3 id="filechanged">3088<h3 id="filechanged">
3079 FileChanged3089 FileChanged
3080</h3>3090</h3>
3081 3091
3082Запускается, когда наблюдаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code полностью. Обычное использование — перезагрузка переменных окружения, когда изменяются файлы конфигурации проекта.3092Запускается, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путём анализа вызовов инструментов, поэтому он запускает хук независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает через `Bash`, или процесс полностью вне Claude Code. Типичное применение — перезагрузка переменных окружения при изменении файлов конфигурации проекта.
3083 3093
3084`matcher` для этого события служит двум целям:3094`matcher` для этого события выполняет две роли:
3085 3095
3086* **Построение списка наблюдения**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` наблюдает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, наблюдало бы файл буквально названный `^\.env`.3096* **Построение списка наблюдения**: значение разбивается по `|`, и каждый сегмент регистрируется как буквальное имя файла в рабочем каталоге, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны регулярных выражений здесь бесполезны: значение вроде `^\.env` будет отслеживать файл с буквальным именем `^\.env`.
3087* **Фильтрация, какие hooks запускаются**: когда наблюдаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила matcher](#matcher-patterns) против базового имени измененного файла.3097* **Фильтрация запускаемых хуков**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы хуков запускаются, по стандартным [правилам matcher](#matcher-patterns) применительно к базовому имени изменённого файла.
3088 3098
3089Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая команду `Bash` или внешний скрипт, переписывающий файл:3099Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая перезапись файла командой `Bash` или внешним скриптом:
3090 3100
3091```json theme={null}3101```json theme={null}
3092{3102{
3106}3116}
3107```3117```
3108 3118
3109Hook читает абсолютный путь измененного файла из поля `file_path` [JSON ввода](#filechanged-input) из stdin. Его охрана `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабая охрана зацикливается навсегда, потому что `perl -i` переписывает файл, даже когда он ничего не заменяет, и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:3119Хук считывает абсолютный путь изменённого файла из поля `file_path` [входных данных JSON](#filechanged-input) в stdin. Его защитная проверка `grep` ищет то же, что удаляет `perl`, — CR в конце строки, поэтому запуск после нормализации завершается, не трогая файл. Менее строгая проверка приводит к бесконечному циклу, потому что `perl -i` перезаписывает файл, даже если ничего не заменяет, а Claude Code снова запускает хук после каждой перезаписи. Сохраните этот скрипт по пути `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3110 3120
3111```bash theme={null}3121```bash theme={null}
3112#!/bin/bash3122#!/bin/bash
3116fi3126fi
3117```3127```
3118 3128
3119Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.3129Чтобы убедиться, что хук работает, попросите Claude добавить строку с CRLF в `data.csv` с помощью команды `Bash`. Claude Code запускает хук, и в итоге файл получает окончания строк LF.
3120 3130
3121Чтобы наблюдать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка наблюдения. Claude Code запускает наблюдатель только, когда что-то называет файл для наблюдения, поэтому посейте список с группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда наблюдаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым наблюдаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения, как любое другое значение, как буквальный файл с именем `*`.3131Чтобы отслеживать файлы, которые нельзя назвать заранее, возвращайте [`watchPaths`](#filechanged-output) из хука для динамического обновления списка наблюдения. Claude Code запускает наблюдатель, только когда что-то указывает файл для наблюдения, поэтому заполните список группой FileChanged, matcher которой называет хотя бы один файл, или хуком [SessionStart](#sessionstart-decision-control) либо [CwdChanged](#cwdchanged), возвращающим `watchPaths`. Matcher по-прежнему фильтрует, какие группы хуков запускаются при изменении отслеживаемого файла, поэтому для группы, обрабатывающей динамические пути, опустите matcher — тогда он совпадает с каждым отслеживаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` тоже совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения как любое другое значение — как буквальный файл с именем `*`.
3122 3132
3123Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.3133Хуки FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.
3124 3134
3125<h4 id="filechanged-input">3135<h4 id="filechanged-input">
3126 FileChanged input3136 Входные данные FileChanged
3127</h4>3137</h4>
3128 3138
3129Помимо [общих полей ввода](#common-input-fields), hooks FileChanged получают `file_path` и `event`.3139Помимо [общих входных полей](#common-input-fields), хуки FileChanged получают `file_path` и `event`.
3130 3140
3131| Поле | Описание |3141| Поле | Описание |
3132| :- | :- |3142| :- | :- |
3133| `file_path` | Абсолютный путь к файлу, который изменился |3143| `file_path` | Абсолютный путь к изменённому файлу |
3134| `event` | Что произошло: `"change"` для измененного файла, `"add"` для созданного файла или `"unlink"` для удаленного файла |3144| `event` | Что произошло: `"change"` для изменённого файла, `"add"` для созданного файла или `"unlink"` для удалённого файла |
3135 3145
3136```json theme={null}3146```json theme={null}
3137{3147{
3145```3155```
3146 3156
3147<h4 id="filechanged-output">3157<h4 id="filechanged-output">
3148 FileChanged output3158 Вывод FileChanged
3149</h4>3159</h4>
3150 3160
3151Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов наблюдаются:3161Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки FileChanged могут возвращать `watchPaths`, чтобы динамически обновлять отслеживаемые пути файлов:
3152 3162
3153| Поле | Описание |3163| Поле | Описание |
3154| :- | :- |3164| :- | :- |
3155| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для наблюдения на основе измененного файла |3165| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Используйте это, когда ваш скрипт хука обнаруживает дополнительные файлы для наблюдения на основе изменённого файла |
3156 3166
3157Hooks FileChanged не имеют управления решениями. Они не могут блокировать изменение файла от возникновения.3167Хуки FileChanged не имеют управления решениями. Они не могут предотвратить изменение файла.
3158 3168
3159Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3169Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3160 3170
3161<h3 id="worktreecreate">3171<h3 id="worktreecreate">
3162 WorktreeCreate3172 WorktreeCreate
3163</h3>3173</h3>
3164 3174
3165Запускается, когда создается worktree, будь то из `claude --worktree`, из [подагента, использующего `isolation: "worktree"`](/docs/ru/sub-agents#choose-the-subagent-scope) или для [фонового сеанса](/docs/ru/agent-view#how-file-edits-are-isolated), который Claude Code изолирует в своем собственном worktree. По умолчанию Claude Code создает изолированную рабочую копию с `git worktree`. Настройка hook WorktreeCreate заменяет это поведение git по умолчанию, позволяя вам использовать другую систему контроля версий, такую как SVN, Perforce или Mercurial.3175Запускается при создании 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.
3166 3176
3167Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.3177Поскольку хук полностью заменяет стандартное поведение, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, например `.env`, в новый worktree, сделайте это в своём скрипте хука.
3168 3178
3169Hook должен вернуть путь к созданной директории worktree. Claude Code использует этот путь как рабочую директорию для изолированного сеанса. См. [WorktreeCreate output](#worktreecreate-output) для того, как каждый тип hook возвращает путь.3179Хук должен вернуть путь к созданному каталогу worktree. Claude Code использует этот путь как рабочий каталог для изолированной сессии. О том, как каждый тип хука возвращает путь, см. в разделе [Вывод WorktreeCreate](#worktreecreate-output).
3170 3180
3171Claude Code действует на успех hook и возвращенный путь и отбрасывает `systemMessage` и `continue`.3181Claude Code учитывает успешность хука и возвращённый путь и отбрасывает `systemMessage` и `continue`.
3172 3182
3173Этот пример создает рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой собственный:3183Этот пример создаёт рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой:
3174 3184
3175```json theme={null}3185```json theme={null}
3176{3186{
3189}3199}
3190```3200```
3191 3201
3192Hook читает `name` worktree из JSON ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.3202Хук считывает `name` worktree из входных данных JSON в stdin, извлекает свежую копию в новый каталог и выводит путь к каталогу. `echo` в последней строке — это то, что Claude Code считывает как путь к worktree. Перенаправляйте любой другой вывод в stderr, чтобы он не мешал пути.
3193 3203
3194<h4 id="worktreecreate-input">3204<h4 id="worktreecreate-input">
3195 WorktreeCreate input3205 Входные данные WorktreeCreate
3196</h4>3206</h4>
3197 3207
3198Помимо [общих полей ввода](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.3208Помимо [общих входных полей](#common-input-fields), хуки WorktreeCreate получают поле `name`. Это идентификатор-слаг для нового worktree, заданный пользователем или сгенерированный автоматически, например `bold-oak-a3f2`.
3199 3209
3200```json theme={null}3210```json theme={null}
3201{3211{
3208```3218```
3209 3219
3210<h4 id="worktreecreate-output">3220<h4 id="worktreecreate-output">
3211 WorktreeCreate output3221 Вывод WorktreeCreate
3212</h4>3222</h4>
3213 3223
3214Hooks WorktreeCreate не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:3224Хуки WorktreeCreate не используют стандартную модель решений allow/block. Вместо этого результат определяется успехом или неудачей хука. Хук должен вернуть путь к созданному каталогу worktree:
3215 3225
3216* **Hooks команды** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.3226* **Командные хуки** (`type: "command"`): выведите путь последней непустой строкой stdout. Claude Code удаляет escape-последовательности ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные до вашего `echo`, игнорируются. Перенаправляйте любой другой вывод хука в stderr.
3217* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3227* **HTTP-хуки** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
3218 3228
3219Если hook не удается или не создает путь, создание worktree не удается с ошибкой.3229Если хук завершается с ошибкой или не возвращает путь, создание worktree завершается ошибкой.
3220 3230
3221Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1.3231Claude Code разрешает относительный путь относительно каталога, в котором выполнялся хук, сворачивая все сегменты `.` или `..` в нём. Если полученный путь не является каталогом, в который Claude Code может перейти, сессия выводит ошибку с указанием пути и завершается с кодом 1.
3222 3232
3223Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через символическую ссылку ниже корня репозитория, потому что символическая ссылка, зафиксированная в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.3233Claude Code отклоняет абсолютный путь, содержащий сегменты `.` или `..`, а также любой путь, проходящий через символическую ссылку ниже корня репозитория, поскольку символическая ссылка, закоммиченная в репозиторий, могла бы перенаправить worktree за его пределы. В ошибке указывается отклонённый компонент. Возвращайте нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До v2.1.216 создание worktree следовало по пути хука без этой проверки.
3224 3234
3225<h3 id="worktreeremove">3235<h3 id="worktreeremove">
3226 WorktreeRemove3236 WorktreeRemove
3227</h3>3237</h3>
3228 3238
3229Запускается, когда worktree удаляется. Это парный hook очистки для [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:3239Выполняется при удалении worktree. Это парный хук очистки для [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:
3230 3240
3231* вы выходите из сеанса `--worktree` и выбираете его удаление3241* вы выходите из сессии `--worktree` и выбираете её удаление
3232* подагент с `isolation: "worktree"` завершается3242* завершается субагент с `isolation: "worktree"`
3233* вы удаляете [фоновый сеанс](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook3243* вы удаляете [фоновую сессию](/docs/ru/agent-view#what-deleting-a-session-removes), worktree которой создал хук
3234 3244
3235Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate, свяжите его с hook WorktreeRemove для управления очисткой worktrees, которые он создает:3245Для worktree на основе git Claude Code выполняет очистку автоматически с помощью `git worktree remove`. Если вы настроили хук WorktreeCreate, добавьте к нему хук WorktreeRemove, чтобы управлять очисткой создаваемых им worktree:
3236 3246
3237* **Нет hook WorktreeRemove**: когда вы выходите из сеанса `--worktree` и выбираете удаление, Claude Code возвращается к `git worktree remove --force` на пути, который вернул ваш hook WorktreeCreate, поэтому worktree, который git узнает, удаляется. Worktree, который git не узнает, например тот, который ваш hook создал с системой контроля версий, отличной от git, остается на диске. Для того, что удаление [фонового сеанса](/docs/ru/agent-view#what-deleting-a-session-removes) делает с hook-созданным worktree, см. правила удаления agent view.3247* **Нет хука WorktreeRemove**: когда вы выходите из сессии `--worktree` и выбираете удаление, Claude Code использует как резервный вариант `git worktree remove --force` для пути, который вернул ваш хук WorktreeCreate, поэтому worktree, который распознаёт git, удаляется. Worktree, который git не распознаёт, например созданный вашим хуком с помощью системы контроля версий, отличной от git, остаётся на диске. О том, что происходит с созданным хуком worktree при удалении [фоновой сессии](/docs/ru/agent-view#what-deleting-a-session-removes), см. правила удаления в agent view.
3238* **Hook выходит 0**: worktree считается удаленным. Claude Code ничего больше не читает из hook, поэтому убедитесь, что ваш hook удалил директорию.3248* **Хук завершается с кодом 0**: worktree считается удалённым. Claude Code больше ничего не читает из хука, поэтому убедитесь, что ваш хук удалил каталог.
3239* **Hook выходит не-нулевой**: удаление не удается, если директория в `worktree_path` все еще существует после этого, и worktree остается на диске без fallback git. Hook, который удалил директорию перед выходом не-нулевой, считается удаленным. Для того, как сбой сообщается, см. [WorktreeRemove input](#worktreeremove-input).3249* **Хук завершается с ненулевым кодом**: удаление завершается ошибкой, если каталог по пути `worktree_path` после этого всё ещё существует, и worktree остаётся на диске без резервного варианта через git. Хук, удаливший каталог перед завершением с ненулевым кодом, считается выполнившим удаление. О том, как сообщается об ошибке, см. [Входные данные WorktreeRemove](#worktreeremove-input).
3240 3250
3241Claude Code никогда не удаляет ветку, принадлежащую hook-созданному worktree, потому что он знает только путь, который вернул ваш hook WorktreeCreate. Если ваш hook WorktreeCreate создает ветку, удалите ее в вашем hook WorktreeRemove.3251Claude Code никогда не удаляет ветку, принадлежащую созданному хуком worktree, поскольку ему известен только путь, который вернул ваш хук WorktreeCreate. Если ваш хук WorktreeCreate создаёт ветку, удаляйте её в хуке WorktreeRemove.
3242 3252
3243Claude Code отбрасывает [поля вывода JSON](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.3253Claude Code отбрасывает [поля JSON-вывода](#json-output) хука WorktreeRemove, такие как `systemMessage` и `continue`.
3244 3254
3245Для удаления фонового сеанса Claude Code проверяет сохраненный путь worktree перед запуском hook и отказывает пути, который является символической ссылкой или проходит через одну ниже корня репозитория. Hook запускается для worktree, который все еще содержит файлы, только когда вы подтверждаете удаление в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes); для такого worktree [`claude rm`](/docs/ru/agent-view#manage-sessions-from-the-shell) сохраняет сеанс и worktree вместо этого. До версии 2.1.216 hook запускался на сохраненном пути без этих проверок.3255При удалении фоновой сессии 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 хук выполнялся для сохранённого пути без этих проверок.
3246 3256
3247Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:3257Claude Code передаёт путь, возвращённый WorktreeCreate, как `worktree_path` во входных данных хука. Этот пример считывает этот путь и удаляет каталог:
3248 3258
3249```json theme={null}3259```json theme={null}
3250{3260{
3264```3274```
3265 3275
3266<h4 id="worktreeremove-input">3276<h4 id="worktreeremove-input">
3267 WorktreeRemove input3277 Входные данные WorktreeRemove
3268</h4>3278</h4>
3269 3279
3270Помимо [общих полей ввода](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.3280Помимо [общих полей входных данных](#common-input-fields), хуки WorktreeRemove получают поле `worktree_path` — абсолютный путь к удаляемому worktree.
3271 3281
3272```json theme={null}3282```json theme={null}
3273{3283{
3279}3289}
3280```3290```
3281 3291
3282Код выхода hook WorktreeRemove определяет результат. Когда hook выходит не-нулевой и директория в `worktree_path` все еще существует после этого, удаление не удается:3292Результат определяется кодом выхода хука WorktreeRemove. Когда хук завершается с ненулевым кодом и каталог по пути `worktree_path` после этого всё ещё существует, удаление завершается ошибкой:
3283 3293
3284* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).3294* Worktree остаётся на диске, а команда хука и stderr записываются в [отладочный лог](#debug-hooks).
3285* Если вы удаляли фоновый сеанс, сеанс остается тоже. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удалит ли удаление сеанса снова директорию в любом случае.3295* Если вы удаляли фоновую сессию, сессия тоже сохраняется. Сообщение об отказе в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как завершился хук, например `exited 1`, цитирует начало его stderr и указывает, удалит ли повторное удаление сессии каталог в любом случае.
3286 3296
3287<h3 id="precompact">3297<h3 id="precompact">
3288 PreCompact3298 PreCompact
3289</h3>3299</h3>
3290 3300
3291Запускается перед тем, как Claude Code собирается запустить операцию compact.3301Выполняется перед тем, как Claude Code собирается выполнить операцию сжатия контекста.
3292 3302
3293Значение matcher указывает, было ли сжатие запущено вручную или автоматически:3303Значение matcher указывает, было ли сжатие запущено вручную или автоматически:
3294 3304
3295| Matcher | Когда срабатывает |3305| Matcher | Когда срабатывает |
3296| :- | :- |3306| :- | :- |
3297| `manual` | `/compact` |3307| `manual` | `/compact` |
3298| `auto` | Auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3308| `auto` | Автосжатие, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |
3299 3309
3300Выйдите с кодом 2 для блокировки сжатия. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.3310Завершитесь с кодом 2, чтобы заблокировать сжатие. Для ручного `/compact` сообщение stderr показывается пользователю. Также можно заблокировать, вернув JSON с `"decision": "block"`.
3301 3311
3302Блокировка автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено проактивно перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.3312Блокировка автоматического сжатия даёт разный эффект в зависимости от того, когда она срабатывает. Если сжатие было запущено упреждающе до достижения лимита контекста, Claude Code пропускает его, и диалог продолжается без сжатия. Если сжатие было запущено для восстановления после ошибки лимита контекста, уже возвращённой API, исходная ошибка отображается, и текущий запрос завершается неудачей.
3303 3313
3304Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.3314Claude Code отбрасывает поля `systemMessage` и `continue` хука PreCompact.
3305 3315
3306<h4 id="precompact-input">3316<h4 id="precompact-input">
3307 PreCompact input3317 Входные данные PreCompact
3308</h4>3318</h4>
3309 3319
3310Помимо [общих полей ввода](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и является `null`, когда они ничего не передают. Для `auto`, `custom_instructions` — это `null`.3320Помимо [общих полей входных данных](#common-input-fields), хуки PreCompact получают `trigger` и `custom_instructions`. Для `manual` поле `custom_instructions` содержит то, что пользователь передаёт в `/compact`, и равно `null`, если он ничего не передаёт. Для `auto` поле `custom_instructions` равно `null`.
3311 3321
3312```json theme={null}3322```json theme={null}
3313{3323{
3324 PostCompact3334 PostCompact
3325</h3>3335</h3>
3326 3336
3327Запускается после завершения Claude Code операции compact. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированного резюме или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.3337Выполняется после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например записывать в лог сгенерированную сводку или обновлять внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.
3328 3338
3329Те же значения matcher применяются, как для `PreCompact`:3339Применяются те же значения matcher, что и для `PreCompact`:
3330 3340
3331| Matcher | Когда срабатывает |3341| Matcher | Когда срабатывает |
3332| :- | :- |3342| :- | :- |
3333| `manual` | После `/compact` |3343| `manual` | После `/compact` |
3334| `auto` | После auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3344| `auto` | После автосжатия, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |
3335 3345
3336<h4 id="postcompact-input">3346<h4 id="postcompact-input">
3337 PostCompact input3347 Входные данные PostCompact
3338</h4>3348</h4>
3339 3349
3340Помимо [общих полей ввода](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией compact.3350Помимо [общих полей входных данных](#common-input-fields), хуки PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку диалога, сгенерированную операцией сжатия.
3341 3351
3342```json theme={null}3352```json theme={null}
3343{3353{
3350}3360}
3351```3361```
3352 3362
3353Hooks PostCompact не имеют управления решениями. Они не могут влиять на результат сжатия, но могут выполнять последующие задачи.3363Хуки PostCompact не имеют управления решениями. Они не могут повлиять на результат сжатия, но могут выполнять последующие задачи.
3354 3364
3355<h3 id="premodelswitch">3365<h3 id="premodelswitch">
3356 PreModelSwitch3366 PreModelSwitch
3357</h3>3367</h3>
3358 3368
3359Запускается перед применением Claude Code переключения модели, которое вы или клиент запросили. Используйте это для блокировки переключения, требования подтверждения или показа того, что переключение будет стоить, перед его возникновением.3369Выполняется перед тем, как Claude Code применяет переключение модели, запрошенное вами или клиентом. Используйте его, чтобы заблокировать переключение, потребовать подтверждения или показать, во что обойдётся переключение, до того как оно произойдёт.
3360 3370
3361PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:3371PreModelSwitch требует Claude Code v2.1.251 или новее. Claude Code запускает его для следующих запросов:
3362 3372
3363* `/model <name>` и средство выбора `/model`3373* `/model <name>` и средство выбора `/model`
3364* Средство выбора модели `Option+P` или `Alt+P`3374* Средство выбора модели `Option+P` или `Alt+P`
3365* Параметр Model в `/config`3375* Настройка Model в `/config`
3366* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса3376* Включение [быстрого режима](/docs/ru/fast-mode), если это меняет модель сессии
3367* Запрос `set_model` или изменение модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)3377* Запрос `set_model` или смена модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3368 3378
3369Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает сам, такие как [автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.3379Claude Code не запускает хуки PreModelSwitch для переключений, которые он выполняет самостоятельно, например при [автоматическом переключении на резервную модель](/docs/ru/model-config#automatic-model-fallback) или восстановлении модели при возобновлении сессии. Такие изменения доходят только до [PostModelSwitch](#postmodelswitch).
3370 3380
3371Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Псевдоним, такой как `opus`, датированный ID модели и ID, специфичный для провайдера, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.3381Claude Code сравнивает matcher с каноническим именем модели, на которую переключается сессия, игнорируя суффикс `[1m]`. Псевдоним, например `opus`, идентификатор модели с датой и идентификатор конкретного провайдера, например идентификатор модели Amazon Bedrock, — все соответствуют одному каноническому имени, в которое они разрешаются, поэтому `claude-opus-5` охватывает любое написание Opus 5.
3372 3382
3373Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из его ввода, а не полагаться только на matcher.3383Когда Claude Code не может определить каноническое имя целевой модели, например для пользовательского идентификатора модели, известного только вашему [LLM-шлюзу](/docs/ru/llm-gateway), он запускает каждый хук PreModelSwitch независимо от matcher. Поэтому блокирующий хук должен проверять `to_model` из своих входных данных, а не полагаться только на matcher.
3374 3384
3375Напишите matcher как точное имя, список, разделенный `|`, такой как `claude-opus-4-6|claude-opus-5`, или регулярное выражение, такое как `.*opus.*`. Этот пример использует matcher точного имени и также проверяет `to_model` из ввода hook, поэтому он отказывает переключению на Opus 4.6, выходя с кодом 2, и позволяет любой другой цели пройти:3385Записывайте matcher как точное имя, список через `|`, например `claude-opus-4-6|claude-opus-5`, или регулярное выражение, например `.*opus.*`. Этот пример использует matcher с точным именем и также проверяет `to_model` из входных данных хука, поэтому он отклоняет переключение на Opus 4.6, завершаясь с кодом 2, и пропускает любую другую целевую модель:
3376 3386
3377<Tabs>3387<Tabs>
3378 <Tab title="macOS/Linux">3388 <Tab title="macOS/Linux">
3379 Команда проверяет `to_model` с `jq`:3389 Команда проверяет `to_model` с помощью `jq`:
3380 3390
3381 ```json theme={null}3391 ```json theme={null}
3382 {3392 {
3398 </Tab>3408 </Tab>
3399 3409
3400 <Tab title="Windows (PowerShell)">3410 <Tab title="Windows (PowerShell)">
3401 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:3411 Зарегистрируйте командный хук, который запускает скрипт через PowerShell:
3402 3412
3403 ```json theme={null}3413 ```json theme={null}
3404 {3414 {
3438 </Tab>3448 </Tab>
3439</Tabs>3449</Tabs>
3440 3450
3441Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, запущенного на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.3451Чтобы убедиться, что хук работает, выполните `/model claude-opus-4-6` из сессии, использующей другую модель. Claude Code сохраняет текущую модель и сообщает, что хук PreModelSwitch заблокировал переключение, указывая ваше сообщение в качестве причины.
3442 3452
3443<h4 id="premodelswitch-input">3453<h4 id="premodelswitch-input">
3444 PreModelSwitch input3454 Входные данные PreModelSwitch
3445</h4>3455</h4>
3446 3456
3447Помимо [общих полей ввода](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что повторная отправка разговора на новую модель стоит, поэтому hook может показать эту цифру перед переключением.3457Помимо [общих полей входных данных](#common-input-fields), хуки PreModelSwitch получают поля из этой таблицы. Последние пять описывают стоимость повторной отправки диалога новой модели, чтобы хук мог показать эту сумму до переключения.
3448 3458
3449| Поле | Тип | Описание |3459| Поле | Тип | Описание |
3450| :- | :- | :- |3460| :- | :- | :- |
3451| `from_model` | string | ID модели, на которую переключается |3461| `from_model` | string | Идентификатор модели, с которой выполняется переключение |
3452| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |3462| `to_model` | string | Идентификатор модели, на которую выполняется переключение. Matcher сравнивается с каноническим именем этой модели |
3453| `requested_model` | string или `null` | Модель, которую запрос назвал: псевдоним, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |3463| `requested_model` | string или `null` | Модель, указанная в запросе: псевдоним, например `opus`, полный идентификатор модели или `null`, если запрос был для модели по умолчанию |
3454| `source` | string | Откуда пришел запрос: `"command"` для `/model <name>`, параметра Model в `/config` или включения fast mode; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или изменения модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |3464| `source` | string | Откуда пришёл запрос: `"command"` для `/model <name>`, настройки Model в `/config` или включения быстрого режима; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или смены модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3455| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш-чтение, кэш-создание и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |3465| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет в качестве промпта: суммарно входные токены, токены чтения кэша, создания кэша и выходные токены последнего ответа в основном диалоге. `0` до первого ответа |
3456| `prompt_cache_warm` | boolean | Вероятно ли, что кэш подсказок текущей модели все еще теплый, означая, что переключение его теряет |3466| `prompt_cache_warm` | boolean | Вероятно ли, что кэш промптов текущей модели всё ещё прогрет, то есть переключение приведёт к его потере |
3457| `cache_ttl` | string | [Время жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |3467| `cache_ttl` | string | [Время жизни кэша промптов](/docs/ru/prompt-caching#cache-lifetime), запрашиваемое Claude Code для этой сессии: `"5m"` или `"1h"` |
3458| `estimated_cache_write_usd` | number | Предполагаемая стоимость в долларах США записи `context_tokens` в кэш подсказок на `to_model` по ставке `cache_ttl`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |3468| `estimated_cache_write_usd` | number | Оценочная стоимость в долларах США записи `context_tokens` в кэш промптов на `to_model` по тарифу `cache_ttl`, без учёта следующего ответа. Серверу может не потребоваться повторно кэшировать весь контекст, поэтому рассматривайте это как оценку |
3459| `pricing` | string | Как Claude Code оценил `estimated_cache_write_usd`: `"configured"` по собственным ставкам вашей организации, когда она их настроила, `"catalog"` по цене списка или `"default"`, когда `to_model` не имеет известной цены и Claude Code предположил ставку по умолчанию |3469| `pricing` | string | Как Claude Code рассчитал `estimated_cache_write_usd`: `"configured"` — по собственным тарифам вашей организации, если она их настроила, `"catalog"` — по прейскурантной цене, или `"default"`, если для `to_model` нет известной цены и Claude Code использовал тариф по умолчанию |
3460 3470
3461Этот пример показывает ввод для `/model opus` в сеансе, запущенном на Sonnet 5:3471Этот пример показывает входные данные для `/model opus` в сессии, использующей Sonnet 5:
3462 3472
3463```json theme={null}3473```json theme={null}
3464{3474{
3482 Управление решениями PreModelSwitch3492 Управление решениями PreModelSwitch
3483</h4>3493</h4>
3484 3494
3485Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.3495Хуки `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или разрешить его выполнение. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.
3486 3496
3487Для более тонкого управления, верните `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как на [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. Таблица ниже описывает оба поля:3497Для более тонкого управления возвращайте `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как в [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. В таблице ниже описаны оба поля:
3488 3498
3489| Поле | Описание |3499| Поле | Описание |
3490| :- | :- |3500| :- | :- |
3491| `permissionDecision` | `"allow"` продолжает и пропускает [подтверждение, которое Claude Code показывает, пока кэш подсказок теплый](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` подсказывает пользователю подтвердить его |3501| `permissionDecision` | `"allow"` выполняет переключение и пропускает [подтверждение, которое Claude Code показывает, пока кэш промптов прогрет](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` запрашивает у пользователя подтверждение |
3492| `permissionDecisionReason` | Для `"deny"`, показано пользователю как причина блокировки переключения или возвращено как ошибка для запроса `set_model`. Для `"ask"`, показано в подсказке подтверждения. Игнорируется для `"allow"` |3502| `permissionDecisionReason` | Для `"deny"` показывается пользователю как причина блокировки переключения или возвращается как ошибка для запроса `set_model`. Для `"ask"` показывается в запросе подтверждения. Игнорируется для `"allow"` |
3493 3503
3494Только `/model` в интерактивном сеансе может показать подсказку `"ask"`. На каждой другой поверхности, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.3504Только `/model` в интерактивной сессии может показать запрос `"ask"`. Во всех остальных интерфейсах, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.
3495 3505
3496Этот пример просит пользователя подтвердить и цитирует количество токенов из `context_tokens`:3506Этот пример просит пользователя подтвердить переключение и приводит количество токенов из `context_tokens`:
3497 3507
3498```json theme={null}3508```json theme={null}
3499{3509{
3505}3515}
3506```3516```
3507 3517
3508Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет `deny` > `ask` > `allow`.3518Когда несколько хуков PreModelSwitch возвращают разные решения, приоритет таков: `deny` > `ask` > `allow`.
3509 3519
3510Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета о затратах может вернуть `{"systemMessage": "..."}` и выйти 0.3520Claude Code показывает пользователю любое `systemMessage`, которое возвращает ваш хук, независимо от решения, поэтому хук для отчёта о стоимости может вернуть `{"systemMessage": "..."}` и завершиться с кодом 0.
3511 3521
3512Hook PreModelSwitch, который не отвечает перед своим тайм-аутом, блокирует переключение. На [PreToolUse](#timeouts), в отличие от этого, hook команды с истекшим временем позволяет вызову инструмента продолжить. Тайм-аут по умолчанию для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандарты `prompt` и `agent` не применяются.3522Хук PreModelSwitch, который не отвечает до истечения таймаута, блокирует переключение. В [PreToolUse](#timeouts), напротив, командный хук с истёкшим таймаутом позволяет вызову инструмента продолжиться. Таймаут по умолчанию для этого события — 30 секунд. `PreModelSwitch` запускает только хуки `command`, `http` и `mcp_tool`, поэтому значения по умолчанию для `prompt` и `agent` не применяются.
3513 3523
3514Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).3524Хук, который завершается с кодом, отличным от 0 или 2, и не выводит JSON-решения, не блокирует переключение: Claude Code показывает его stderr и применяет переключение, как описано в разделе [Другие коды выхода](#other-exit-codes).
3515 3525
3516<h3 id="postmodelswitch">3526<h3 id="postmodelswitch">
3517 PostModelSwitch3527 PostModelSwitch
3518</h3>3528</h3>
3519 3529
3520Запускается после изменения модели сеанса. Используйте это для предоставления руководства, специфичного для модели, без редактирования каждого CLAUDE.md, например организационной инструкции, которая применяется на определенных моделях.3530Выполняется после смены модели сессии. Используйте его, чтобы давать Claude указания, специфичные для модели, без редактирования каждого CLAUDE.md, например инструкцию для всей организации, которая применяется к определённым моделям.
3521 3531
3522PostModelSwitch требует Claude Code v2.1.251 или позже. Он не может блокировать, потому что модель уже изменилась. Claude Code запускает hooks PostModelSwitch после любого из этих изменений:3532PostModelSwitch требует Claude Code v2.1.251 или новее. Он не может блокировать, поскольку модель уже сменилась. Claude Code запускает хуки PostModelSwitch после любого из следующих изменений:
3523 3533
3524* Переключение, которое вы или клиент запросили3534* Переключение, запрошенное вами или клиентом
3525* [Автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback), который изменяет модель сеанса3535* [Автоматическое переключение на резервную модель](/docs/ru/model-config#automatic-model-fallback), которое меняет модель сессии
3526* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана3536* Настройка, например [`opusplan`](/docs/ru/model-config#opusplan-model-setting), при входе в режим планирования или выходе из него
3527* Claude Code восстанавливает модель при возобновлении сеанса3537* Восстановление модели Claude Code при возобновлении сессии
3528 3538
3529Claude Code не запускает hooks PostModelSwitch, когда модель из [цепочки fallback модели](/docs/ru/model-config#fallback-model-chains) служит ходу, потому что эта замена длится один ход и оставляет модель сеанса неизменной.3539Claude Code не запускает хуки PostModelSwitch, когда ход обслуживает модель из [цепочки резервных моделей](/docs/ru/model-config#fallback-model-chains), поскольку такая замена длится один ход и оставляет модель сессии неизменной.
3530 3540
3531Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.3541Matcher подчиняется тем же правилам, что и в [PreModelSwitch](#premodelswitch): Claude Code сравнивает его с каноническим именем модели, на которую переключилась сессия.
3532 3542
3533Этот пример добавляет руководство, когда модель сеанса изменяется на любую модель Opus:3543Этот пример добавляет указания всякий раз, когда модель сессии меняется на любую модель Opus:
3534 3544
3535```json theme={null}3545```json theme={null}
3536{3546{
3550}3560}
3551```3561```
3552 3562
3553Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, запущенного на другой модели, например запустите `/model opus` из сеанса Sonnet, затем попросите Claude, какое руководство у него есть о текущей модели.3563Чтобы убедиться, что хук работает, переключитесь на модель Opus из сессии, использующей другую модель, например выполните `/model opus` из сессии Sonnet, а затем спросите Claude, какие у него есть указания относительно текущей модели.
3554 3564
3555<h4 id="postmodelswitch-input">3565<h4 id="postmodelswitch-input">
3556 PostModelSwitch input3566 Входные данные PostModelSwitch
3557</h4>3567</h4>
3558 3568
3559Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал сам, и `"resume"` для модели, восстановленной при возобновлении сеанса.3569Хуки PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), при этом `hook_event_name` имеет значение `"PostModelSwitch"`, а для `source` есть ещё два значения: `"auto"` для автоматического переключения на резервную модель или другого изменения, которое Claude Code выполнил самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сессии.
3560 3570
3561`requested_model` — это `null`, когда `source` — это `"auto"`. Когда `source` — это `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.3571`requested_model` равно `null`, когда `source` равно `"auto"`. Когда `source` равно `"resume"`, это сохранённая настройка модели, которую восстановил Claude Code.
3562 3572
3563<h4 id="postmodelswitch-decision-control">3573<h4 id="postmodelswitch-decision-control">
3564 Управление решениями PostModelSwitch3574 Управление решениями PostModelSwitch
3565</h4>3575</h4>
3566 3576
3567Claude Code берет ваш [простой текст stdout](#exit-code-0) hook при выходе 0 или `additionalContext` из вывода JSON и доставляет его Claude со следующим запросом после переключения. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:3577Claude Code берёт [простой текстовый stdout](#exit-code-0) вашего хука при коде выхода 0 или `additionalContext` из JSON-вывода и передаёт его Claude со следующим запросом после переключения. Помимо [полей JSON-вывода](#json-output), доступных всем хукам, вы можете вернуть:
3568 3578
3569| Поле | Описание |3579| Поле | Описание |
3570| :- | :- |3580| :- | :- |
3571| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |3581| `additionalContext` | Строка, добавляемая в контекст Claude со следующим запросом. См. [Добавление контекста для Claude](#add-context-for-claude) |
3572 3582
3573Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для переключения последней цели модели.3583Если хук не завершился в течение пяти секунд после отправки следующего промпта, Claude Code отправляет этот запрос без вывода и вместо этого прикрепляет его к последующему запросу. Если модель меняется несколько раз до следующего запроса, Claude Code передаёт только вывод для целевой модели последнего переключения.
3574 3584
3575<h3 id="sessionend">3585<h3 id="sessionend">
3576 SessionEnd3586 SessionEnd
3577</h3>3587</h3>
3578 3588
3579Запускается, когда сеанс Claude Code заканчивается. Полезно для задач очистки, логирования статистики сеанса или сохранения состояния сеанса. Поддерживает matchers для фильтрации по причине выхода.3589Выполняется при завершении сессии Claude Code. Полезен для задач очистки, записи в лог статистики
3590сессии или сохранения состояния сессии. Поддерживает matcher для фильтрации по причине выхода.
3580 3591
3581Поле `reason` в ввод hook указывает, почему сеанс закончился:3592Поле `reason` во входных данных хука указывает, почему завершилась сессия:
3582 3593
3583| Причина | Описание |3594| Причина | Описание |
3584| :- | :- |3595| :- | :- |
3585| `clear` | Сеанс очищен с помощью команды `/clear` |3596| `clear` | Сессия очищена командой `/clear` |
3586| `resume` | Сеанс переключен через интерактивный `/resume` |3597| `resume` | Сессия переключена через интерактивную `/resume` |
3587| `logout` | Пользователь вышел |3598| `logout` | Пользователь вышел из системы |
3588| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |3599| `prompt_input_exit` | Пользователь вышел, когда поле ввода промпта было видимо |
3589| `other` | Другие причины выхода |3600| `other` | Другие причины выхода |
3590| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |3601| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code его не отправляет. Уберите его из matcher ваших `SessionEnd` |
3591 3602
3592<h4 id="sessionend-input">3603<h4 id="sessionend-input">
3593 SessionEnd input3604 Входные данные SessionEnd
3594</h4>3605</h4>
3595 3606
3596Помимо [общих полей ввода](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. [таблицу причин](#sessionend) выше для всех значений.3607Помимо [общих полей входных данных](#common-input-fields), хуки SessionEnd получают поле `reason`, указывающее, почему завершилась сессия. Все значения см. в [таблице причин](#sessionend) выше.
3597 3608
3598```json theme={null}3609```json theme={null}
3599{3610{
3605}3616}
3606```3617```
3607 3618
3608Hooks SessionEnd не имеют управления решениями. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage`.3619Хуки SessionEnd не имеют управления решениями. Они не могут заблокировать завершение сессии, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage`.
3609 3620
3610Hooks SessionEnd имеют тайм-аут по умолчанию 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:3621Хуки SessionEnd имеют таймаут по умолчанию 1,5 секунды. Он применяется, когда вы выходите, выполняете `/clear` или переключаете сессии с помощью интерактивной `/resume`. Дать хуку больше времени можно двумя способами:
3611 3622
3612* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` per-hook в ваших файлах параметров, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандарт. Тайм-ауты, установленные на hooks, предоставленные plugin, не повышают бюджет.3623* **`timeout` для отдельного хука**: задайте `timeout` в конфигурации этого хука. Общий лимит времени автоматически повышается до наибольшего значения `timeout` среди хуков в ваших файлах настроек, но не более 60 секунд. Если вы повышаете лимит таким образом, хук без собственного `timeout` по-прежнему сохраняет значение по умолчанию. Таймауты, заданные для хуков из плагинов, не повышают лимит.
3613* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится тайм-аутом для каждого hook без своего собственного `timeout`.3624* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: задайте эту переменную окружения в миллисекундах, чтобы явно переопределить лимит. Заданное значение также становится таймаутом для каждого хука без собственного `timeout`.
3614 3625
3615Этот пример устанавливает бюджет на 5 секунд:3626Этот пример устанавливает лимит в 5 секунд:
3616 3627
3617```bash theme={null}3628```bash theme={null}
3618CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3629CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3619```3630```
3620 3631
3621До версии 2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышал только общий бюджет, и hook без своего собственного `timeout` все еще отменялся через 1.5 секунды.3632До v2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышала только общий лимит, а хук без собственного `timeout` всё равно отменялся через 1,5 секунды.
3622 3633
3623<h3 id="elicitation">3634<h3 id="elicitation">
3624 Elicitation3635 Elicitation
3625</h3>3636</h3>
3626 3637
3627Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.3638Выполняется, когда MCP-сервер запрашивает ввод пользователя во время выполнения задачи. По умолчанию Claude Code показывает интерактивное диалоговое окно для ответа пользователя. Хуки могут перехватить этот запрос и ответить программно, полностью пропустив диалоговое окно.
3628 3639
3629Поле matcher совпадает с именем сервера MCP.3640Поле matcher сопоставляется с именем MCP-сервера.
3630 3641
3631<h4 id="elicitation-input">3642<h4 id="elicitation-input">
3632 Elicitation input3643 Входные данные Elicitation
3633</h4>3644</h4>
3634 3645
3635Помимо [общих полей ввода](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные поля `mode`, `url`, `elicitation_id` и `requested_schema`.3646Помимо [общих полей входных данных](#common-input-fields), хуки Elicitation получают поля `mcp_server_name`, `message` и необязательные поля `mode`, `url`, `elicitation_id` и `requested_schema`.
3636 3647
3637Для режима формы elicitation, наиболее распространенный случай:3648Для elicitation в режиме формы, наиболее распространённого случая:
3638 3649
3639```json theme={null}3650```json theme={null}
3640{3651{
3654}3665}
3655```3666```
3656 3667
3657Для URL-режима elicitation, используемого для аутентификации на основе браузера:3668Для elicitation в режиме URL, используемого для аутентификации через браузер:
3658 3669
3659```json theme={null}3670```json theme={null}
3660{3671{
3670```3681```
3671 3682
3672<h4 id="elicitation-output">3683<h4 id="elicitation-output">
3673 Elicitation output3684 Вывод Elicitation
3674</h4>3685</h4>
3675 3686
3676Чтобы ответить программно без показа диалога, верните объект JSON с `hookSpecificOutput`:3687Чтобы ответить программно без показа диалогового окна, верните JSON-объект с `hookSpecificOutput`:
3677 3688
3678```json theme={null}3689```json theme={null}
3679{3690{
3689 3700
3690| Поле | Значения | Описание |3701| Поле | Значения | Описание |
3691| :- | :- | :- |3702| :- | :- | :- |
3692| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |3703| `action` | `accept`, `decline`, `cancel` | Принять, отклонить или отменить запрос |
3693| `content` | object | Значения полей формы для отправки. Используется только, когда `action` — это `accept` |3704| `content` | object | Значения полей формы для отправки. Используется только когда `action` равно `accept` |
3694 3705
3695Код выхода 2 отклоняет elicitation. Claude Code не показывает ваше сообщение stderr нигде.3706Код выхода 2 отклоняет elicitation. Claude Code нигде не показывает ваше сообщение stderr.
3696 3707
3697Claude Code действует на `hookSpecificOutput` из вывода JSON hook Elicitation и отбрасывает `systemMessage` и `continue`.3708Claude Code использует `hookSpecificOutput` из JSON-вывода хука Elicitation и отбрасывает `systemMessage` и `continue`.
3698 3709
3699<h3 id="elicitationresult">3710<h3 id="elicitationresult">
3700 ElicitationResult3711 ElicitationResult
3701</h3>3712</h3>
3702 3713
3703Запускается после того, как пользователь отвечает на запрос MCP elicitation. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.3714Выполняется после того, как пользователь отвечает на elicitation MCP. Хуки могут наблюдать, изменять или блокировать ответ до его отправки обратно MCP-серверу.
3704 3715
3705Поле matcher совпадает с именем сервера MCP.3716Поле matcher сопоставляется с именем MCP-сервера.
3706 3717
3707<h4 id="elicitationresult-input">3718<h4 id="elicitationresult-input">
3708 ElicitationResult input3719 Входные данные ElicitationResult
3709</h4>3720</h4>
3710 3721
3711Помимо [общих полей ввода](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные поля `mode`, `elicitation_id` и `content`.3722Помимо [общих полей входных данных](#common-input-fields), хуки ElicitationResult получают поля `mcp_server_name`, `action` и необязательные поля `mode`, `elicitation_id` и `content`.
3712 3723
3713```json theme={null}3724```json theme={null}
3714{3725{
3725```3736```
3726 3737
3727<h4 id="elicitationresult-output">3738<h4 id="elicitationresult-output">
3728 ElicitationResult output3739 Вывод ElicitationResult
3729</h4>3740</h4>
3730 3741
3731Чтобы переопределить ответ пользователя, верните объект JSON с `hookSpecificOutput`:3742Чтобы переопределить ответ пользователя, верните JSON-объект с `hookSpecificOutput`:
3732 3743
3733```json theme={null}3744```json theme={null}
3734{3745{
3743| Поле | Значения | Описание |3754| Поле | Значения | Описание |
3744| :- | :- | :- |3755| :- | :- | :- |
3745| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3756| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |
3746| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` — это `accept` |3757| `content` | object | Переопределяет значения полей формы. Имеет смысл только когда `action` равно `accept` |
3747 3758
3748Код выхода 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.3759Код выхода 2 блокирует ответ, меняя фактическое действие на `decline`. Claude Code нигде не показывает ваше сообщение stderr.
3749 3760
3750Claude Code действует на `hookSpecificOutput` из вывода JSON hook ElicitationResult и отбрасывает `systemMessage` и `continue`.3761Claude Code использует `hookSpecificOutput` из JSON-вывода хука ElicitationResult и отбрасывает `systemMessage` и `continue`.
3751 3762
3752<h2 id="prompt-based-hooks">3763<h2 id="prompt-based-hooks">
3753 Prompt-based hooks3764 Prompt-based hooks