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` таймаут по умолчанию составляет 30 секунд для типов `command`, `http` и `mcp_tool` — меньше, чем 600 секунд по умолчанию для этих типов в большинстве других событий. Поскольку этот хук выполняется перед каждым промптом и блокирует обработку моделью до своего завершения, зависший хук останавливает сессию. Если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1410 1412
1411Помимо hook команды, который вы запускаете с [`async: true`](#run-hooks-in-the-background), hook `UserPromptSubmit` команды, HTTP или MCP tool, который достигает своего тайм-аута, отменяется и его вывод, включая любой `additionalContext`, отбрасывается. Подсказка все еще достигает Claude без этого контекста. Транскрипт показывает уведомление с названием hook, тайм-аутом, который сработал, и что вывод был отброшен.1413За исключением command-хука, запущенного с [`async: true`](#run-hooks-in-the-background), command-, HTTP- или MCP-хук `UserPromptSubmit`, достигший таймаута, отменяется, а его вывод, включая любой `additionalContext`, отбрасывается. Промпт всё равно доходит до Claude, но без этого контекста. В транскрипте отображается уведомление с именем хука, сработавшим таймаутом и указанием на то, что вывод был отброшен.
1412 1414
1413[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, который достигает своего тайм-аута, блокирует подсказку сообщением с названием hook и тайм-аутом, потому что callback там может действовать как политический шлюз, который не должен отказывать открыто. Сеанс продолжается. До версии 2.1.208 тайм-аут callback на этом событии заканчивал ход с ошибкой выполнения.1415[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `UserPromptSubmit`, достигший таймаута, блокирует промпт с сообщением, в котором указаны хук и таймаут, поскольку callback в этом месте может выступать шлюзом политики, который не должен при сбое пропускать запросы. Сессия продолжается. До v2.1.208 таймаут callback для этого события завершал ход с ошибкой выполнения.
1414 1416
1415<h4 id="userpromptsubmit-input">1417<h4 id="userpromptsubmit-input">
1416 UserPromptSubmit input1418 Входные данные UserPromptSubmit
1417</h4>1419</h4>
1418 1420
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 анализирует подсказку.1421Помимо [общих входных полей](#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 1422
1421Hooks UserPromptSubmit также получают `session_title`, когда сеанс имеет пользовательское название, с тем же значением, что и [поле SessionStart `session_title`](#sessionstart-input).1423Хуки UserPromptSubmit также получают `session_title`, когда у сессии есть пользовательское название, с тем же значением, что и [поле `session_title` в SessionStart](#sessionstart-input).
1422 1424
1423```json theme={null}1425```json theme={null}
1424{1426{
1435 Управление решениями UserPromptSubmit1437 Управление решениями UserPromptSubmit
1436</h4>1438</h4>
1437 1439
1438Hooks `UserPromptSubmit` могут управлять тем, обрабатывается ли подсказка пользователя, и добавлять контекст. Все [поля вывода JSON](#json-output) доступны.1440Хуки `UserPromptSubmit` могут управлять тем, обрабатывается ли пользовательский промпт, и добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1439 1441
1440Есть два способа добавить контекст к разговору при коде выхода 0:1442Есть два способа добавить контекст в диалог при коде выхода 0:
1441 1443
1442* **Простой текст stdout**: Claude Code добавляет stdout, который он [рассматривает как простой текст](#exit-code-0), в контекст Claude1444* **stdout в виде обычного текста**: Claude Code добавляет в контекст Claude stdout, который он [обрабатывает как обычный текст](#exit-code-0)
1443* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст1445* **JSON с `additionalContext`**: используйте формат JSON ниже для большего контроля. Поле `additionalContext` добавляется как контекст
1444 1446
1445Ни один канал не создает видимую запись в транскрипте. Простой stdout и значение `additionalContext` каждый вводятся как системное напоминание, которое начинается с имени hook; Claude читает оба. Чтобы подтвердить доставку, проверьте [debug log](#debug-hooks).1447Ни один из каналов не создаёт видимой записи в транскрипте. Обычный stdout и значение `additionalContext` внедряются каждое как системное напоминание, начинающееся с имени хука; Claude читает оба. Чтобы подтвердить доставку, проверьте [отладочный лог](#debug-hooks).
1446 1448
1447Чтобы заблокировать подсказку, верните объект JSON с `decision`, установленным на `"block"`:1449Чтобы заблокировать промпт, верните объект JSON с `decision`, равным `"block"`:
1448 1450
1449| Поле | Описание |1451| Поле | Описание |
1450| :- | :- |1452| :- | :- |
1451| `decision` | `"block"` останавливает подсказку перед тем, как она достигнет Claude. Опустите, чтобы позволить подсказке продолжить |1453| `decision` | `"block"` останавливает промпт до того, как он дойдёт до Claude. Не указывайте, чтобы разрешить промпту пройти |
1452| `reason` | Показано пользователю, когда `decision` имеет значение `"block"`. Не добавляется в контекст |1454| `reason` | Показывается пользователю, когда `decision` равно `"block"`. Не добавляется в контекст |
1453| `additionalContext` | Строка, добавленная в контекст Claude рядом с отправленной подсказкой. См. [Add context for Claude](#add-context-for-claude) |1455| `additionalContext` | Строка, добавляемая в контекст Claude вместе с отправленным промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1454| `sessionTitle` | Устанавливает название сеанса. Используйте для автоматического именования сеансов на основе содержания подсказки |1456| `sessionTitle` | Задаёт название сессии. Используйте для автоматического именования сессий на основе содержимого промпта |
1455| `suppressOriginalPrompt` | Если `true`, когда hook блокирует подсказку, оставляет текст подсказки вне сообщения блокировки. См. [What a blocked prompt leaves behind](#what-a-blocked-prompt-leaves-behind) |1457| `suppressOriginalPrompt` | Если `true`, когда хук блокирует промпт, текст промпта не включается в сообщение о блокировке. См. [Что остаётся после заблокированного промпта](#what-a-blocked-prompt-leaves-behind) |
1456 1458
1457Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю, и оно не добавляется в контекст.1459Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr, и он не добавляется в контекст.
1458 1460
1459```json theme={null}1461```json theme={null}
1460{1462{
1470```1472```
1471 1473
1472<h4 id="what-a-blocked-prompt-leaves-behind">1474<h4 id="what-a-blocked-prompt-leaves-behind">
1473 Что оставляет после себя заблокированная подсказка1475 Что остаётся после заблокированного промпта
1474</h4>1476</h4>
1475 1477
1476Заблокированная подсказка никогда не достигает Claude, но ее текст не удаляется везде. По умолчанию сообщение блокировки, показанное пользователю, заканчивается на `Original prompt:`, за которым следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сеанса на диск. Чтобы оставить текст вне сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает, блокирует ли hook с `decision: "block"` или выходом 2. Hook выхода 2, который не выводит JSON, всегда получает текст подсказки в своем сообщении блокировки.1478Заблокированный промпт никогда не доходит до Claude, но его текст удаляется не везде. По умолчанию сообщение о блокировке, показываемое пользователю, заканчивается строкой `Original prompt:`, за которой следует отправленный текст, и Claude Code записывает это сообщение в файл транскрипта сессии на диске. Чтобы исключить текст из сообщения, выведите JSON с `"suppressOriginalPrompt": true` внутри `hookSpecificOutput`. Это работает независимо от того, блокирует ли хук с помощью `decision: "block"` или кодом выхода 2. У хука с кодом выхода 2, который не выводит JSON, текст промпта всегда попадает в сообщение о блокировке.
1477 1479
1478`suppressOriginalPrompt` изменяет только сообщение блокировки. Отправленный текст все еще может появляться в локальных файлах, таких как транскрипт сеанса и история подсказок, поэтому блокирующий hook не является способом держать секрет вне диска. Чтобы ограничить или удалить эти файлы, см. [Plaintext storage](/docs/ru/claude-directory#plaintext-storage) и [Clear local data](/docs/ru/claude-directory#clear-local-data).1480`suppressOriginalPrompt` изменяет только сообщение о блокировке. Отправленный текст всё равно может появиться в локальных файлах, таких как транскрипт сессии и история промптов, поэтому блокирующий хук не является способом не допустить попадания секрета на диск. Чтобы ограничить или удалить эти файлы, см. [Хранение в открытом виде](/docs/ru/claude-directory#plaintext-storage) и [Очистка локальных данных](/docs/ru/claude-directory#clear-local-data).
1479 1481
1480<h3 id="userpromptexpansion">1482<h3 id="userpromptexpansion">
1481 UserPromptExpansion1483 UserPromptExpansion
1482</h3>1484</h3>
1483 1485
1484Запускается, когда команда, введенная пользователем, расширяется в подсказку перед достижением Claude. Используйте это для блокировки определенных команд от прямого вызова, внедрения контекста для определенного skill или логирования того, какие команды вызывают пользователи. Например, hook, соответствующий `deploy`, может заблокировать `/deploy`, если отсутствует файл одобрения, или hook, соответствующий skill проверки, может добавить контрольный список проверки команды как `additionalContext`.1486Выполняется, когда введённая пользователем команда разворачивается в промпт до того, как дойти до Claude. Используйте его, чтобы запретить прямой вызов определённых команд, внедрить контекст для конкретного скилла или логировать, какие команды вызывают пользователи. Например, хук с matcher `deploy` может блокировать `/deploy`, если нет файла подтверждения, а хук, соответствующий скиллу ревью, может добавлять чек-лист ревью команды как `additionalContext`.
1485 1487
1486Это событие охватывает путь, который `PreToolUse` не охватывает: hook `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только, когда Claude вызывает инструмент, но ввод `/skillname` напрямую обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.1488Это событие покрывает путь, который не покрывает `PreToolUse`: хук `PreToolUse`, соответствующий инструменту `Skill`, срабатывает только когда Claude вызывает этот инструмент, но прямой ввод `/skillname` обходит `PreToolUse`. `UserPromptExpansion` срабатывает на этом прямом пути.
1487 1489
1488Совпадает с `command_name`. Оставьте matcher пустым, чтобы срабатывать на каждой команде типа подсказки.1490Сопоставляется по `command_name`. Оставьте matcher пустым, чтобы срабатывать для каждой команды, разворачивающейся в промпт.
1489 1491
1490<h4 id="userpromptexpansion-input">1492<h4 id="userpromptexpansion-input">
1491 UserPromptExpansion input1493 Входные данные UserPromptExpansion
1492</h4>1494</h4>
1493 1495
1494Помимо [общих полей ввода](#common-input-fields), hooks UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` — это `slash_command` для skill и пользовательских команд или `mcp_prompt` для подсказок MCP сервера.1496Помимо [общих входных полей](#common-input-fields), хуки UserPromptExpansion получают `expansion_type`, `command_name`, `command_args`, `command_source` и исходную строку `prompt`. Поле `expansion_type` равно `slash_command` для скиллов и пользовательских команд или `mcp_prompt` для промптов MCP-серверов.
1495 1497
1496```json theme={null}1498```json theme={null}
1497{1499{
1512 Управление решениями UserPromptExpansion1514 Управление решениями UserPromptExpansion
1513</h4>1515</h4>
1514 1516
1515Hooks `UserPromptExpansion` могут блокировать расширение или добавлять контекст. Все [поля вывода JSON](#json-output) доступны.1517Хуки `UserPromptExpansion` могут блокировать развёртывание или добавлять контекст. Доступны все [поля вывода JSON](#json-output).
1516 1518
1517| Поле | Описание |1519| Поле | Описание |
1518| :- | :- |1520| :- | :- |
1519| `decision` | `"block"` предотвращает расширение команды. Опустите, чтобы позволить ей продолжить |1521| `decision` | `"block"` не даёт команде развернуться. Не указывайте, чтобы разрешить продолжение |
1520| `reason` | Показано пользователю, когда `decision` — это `"block"` |1522| `reason` | Показывается пользователю, когда `decision` равно `"block"` |
1521| `additionalContext` | Строка, добавленная в контекст Claude рядом с развернутой подсказкой. См. [Add context for Claude](#add-context-for-claude) |1523| `additionalContext` | Строка, добавляемая в контекст Claude вместе с развёрнутым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
1522 1524
1523Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: сообщение блокировки показывает текст stderr пользователю.1525Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `reason`: сообщение о блокировке показывает пользователю текст из stderr.
1524 1526
1525```json theme={null}1527```json theme={null}
1526{1528{
1537 MessageDisplay1539 MessageDisplay
1538</h3>1540</h3>
1539 1541
1540Запускается, пока сообщение помощника транслируется на экран. Claude Code отображает сообщение порциями: каждый раз, когда партия новых завершенных строк готова к отрисовке, hook выполняется один раз с этими строками и Claude Code отображает текст замены hook на их месте. Длинное сообщение создает несколько вызовов; короткое сообщение может создать только один.1542Выполняется, пока сообщение ассистента потоково выводится на экран. Claude Code отображает сообщение частями: каждый раз, когда пакет только что завершённых строк готов к отрисовке, хук выполняется один раз с этими строками, и Claude Code отображает на их месте текст-замену, возвращённый хуком. Длинное сообщение порождает несколько вызовов; короткое может породить только один.
1541 1543
1542Используйте MessageDisplay для:1544Используйте MessageDisplay, чтобы:
1543 1545
1544* удаления markdown для минимального отображения1546* удалять разметку markdown для минималистичного отображения
1545* преобразования текста, который приложение Agent SDK показывает своим пользователям1547* преобразовывать текст, который приложение на Agent SDK показывает своим пользователям
1546* редактирования ключей API или внутренних имен хостов из ответов Claude1548* скрывать API-ключи или внутренние имена хостов в ответах Claude
1547 1549
1548Claude Code удерживает каждую партию до возврата вашего hook, поэтому держите hook быстрым. Если hook не удается или истекает время ожидания, Claude Code отображает исходный текст. Тайм-аут по умолчанию для этого события — 10 секунд; если вашему hook нужно больше времени, установите поле `timeout` в записи hook.1550Claude Code удерживает каждый пакет, пока ваш хук не вернёт результат, поэтому хук должен работать быстро. Если хук завершается ошибкой или по таймауту, Claude Code отображает исходный текст. Таймаут по умолчанию для этого события — 10 секунд; если вашему хуку нужно больше времени, задайте поле `timeout` в записи хука.
1549 1551
1550MessageDisplay только для отображения: текст замены изменяет только то, что отображается на экране. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, и подробный режим показывает исходный. Hook получает только текст сообщения помощника, поэтому результаты инструментов и текст, который вы вводите, отображаются без изменений.1552MessageDisplay влияет только на отображение: текст-замена меняет лишь то, что выводится на экран. Транскрипт и то, что видит Claude, сохраняют исходный текст, поэтому Claude никогда не видит замену, а подробный режим показывает оригинал. Хук получает только текст сообщений ассистента, поэтому результаты инструментов и вводимый вами текст отображаются без изменений.
1551 1553
1552MessageDisplay не поддерживает matchers и срабатывает для каждого сообщения помощника, которое потоком выводит текст; сообщения без текста, такие как ответы только с вызовом инструмента, не запускают его.1554MessageDisplay не поддерживает matcher и срабатывает для каждого сообщения ассистента, выводящего текст потоком; сообщения без текста, например ответы, содержащие только вызовы инструментов, его не вызывают.
1553 1555
1554В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз для каждого сообщения помощника вместо один раз для каждой партии строк. Один вызов прибывает после завершения сообщения и несет полный текст сообщения: `index` — это `0`, `final` — это `true`, и `delta` содержит все сообщение. Hook, который собирает текст `delta` для каждого сообщения, получает одинаковый общий текст в обоих режимах.1556В неинтерактивных запусках, включая запросы Agent SDK и `claude -p`, MessageDisplay выполняется один раз на сообщение ассистента, а не один раз на пакет строк. Единственный вызов приходит после завершения сообщения и содержит полный текст сообщения: `index` равно `0`, `final` равно `true`, а `delta` содержит всё сообщение. Хук, собирающий текст `delta` для каждого сообщения, получает одинаковый итоговый текст в обоих режимах.
1555 1557
1556<h4 id="messagedisplay-input">1558<h4 id="messagedisplay-input">
1557 MessageDisplay input1559 Входные данные MessageDisplay
1558</h4>1560</h4>
1559 1561
1560Помимо [общих полей ввода](#common-input-fields), hooks MessageDisplay получают идентификаторы для хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы партий зависят от того, как потоком выводится текст, поэтому используйте `index` и `final` для отслеживания прогресса через сообщение, а не ожидайте, что строки будут сгруппированы определенным образом.1562Помимо [общих входных полей](#common-input-fields), хуки MessageDisplay получают идентификаторы хода и сообщения, позицию этого вызова в сообщении и новый текст в `delta`. Границы пакетов зависят от того, как текст поступает потоком, поэтому используйте `index` и `final` для отслеживания прогресса по сообщению, а не рассчитывайте на определённую группировку строк.
1561 1563
1562| Поле | Описание |1564| Поле | Описание |
1563| :- | :- |1565| :- | :- |
1564| `turn_id` | UUID текущего хода |1566| `turn_id` | UUID текущего хода |
1565| `message_id` | UUID сообщения помощника, которое отображается. Стабилен для каждой партии одного сообщения. Это не API `msg_…` id, поэтому его нельзя коррелировать с id сообщений транскрипта |1567| `message_id` | UUID отображаемого сообщения ассистента. Неизменен во всех пакетах одного сообщения. Это не идентификатор API `msg_…`, поэтому его нельзя сопоставить с идентификаторами сообщений в транскрипте |
1566| `index` | Индекс этой партии в сообщении, начиная с нуля |1568| `index` | Индекс этого пакета в сообщении, начиная с нуля |
1567| `final` | `true` на последней партии сообщения. Каждое сообщение имеет ровно одну финальную партию |1569| `final` | `true` для последнего пакета сообщения. У каждого сообщения ровно один последний пакет |
1568| `delta` | Новые завершенные строки с момента предыдущей партии, включая завершающие новые строки. Всегда целые строки, кроме финальной партии, которая может заканчиваться в середине строки. В интерактивных запусках delta финальной партии пуста, когда сообщение заканчивается на новой строке, поэтому рассматривайте `final`, а не непустой delta, как сигнал конца сообщения. В запусках Agent SDK и `claude -p` один вызов несет все сообщение |1570| `delta` | Строки, завершённые после предыдущего пакета, включая завершающие символы новой строки. Всегда целые строки, кроме последнего пакета, который может закончиться посреди строки. В интерактивных запусках delta последнего пакета пуста, если сообщение заканчивается символом новой строки, поэтому считайте сигналом конца сообщения `final`, а не непустую delta. В запусках Agent SDK и `claude -p` единственный вызов содержит всё сообщение |
1569 1571
1570```json theme={null}1572```json theme={null}
1571{1573{
1582```1584```
1583 1585
1584<h4 id="messagedisplay-output">1586<h4 id="messagedisplay-output">
1585 MessageDisplay output1587 Вывод MessageDisplay
1586</h4>1588</h4>
1587 1589
1588Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks MessageDisplay могут вернуть `displayContent` для замены delta на экране:1590Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки MessageDisplay могут возвращать `displayContent`, чтобы заменить delta на экране:
1589 1591
1590| Поле | Описание |1592| Поле | Описание |
1591| :- | :- |1593| :- | :- |
1592| `displayContent` | Текст, отображаемый вместо delta. Опустите, чтобы отобразить исходный |1594| `displayContent` | Текст, отображаемый вместо delta. Не указывайте, чтобы отобразить оригинал |
1593 1595
1594Hooks MessageDisplay не имеют управления решениями. Они не могут блокировать сообщение или изменять то, что хранится в транскрипте или отправляется Claude. Claude Code действует на `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.1596У хуков MessageDisplay нет управления решениями. Они не могут блокировать сообщение или изменять то, что сохраняется в транскрипте или отправляется Claude. Claude Code учитывает `displayContent` из их вывода JSON и отбрасывает `systemMessage` и `continue`.
1595 1597
1596Этот пример удаляет форматирование markdown из ответов Claude для отображения простого текста. Скрипт читает каждую партию из stdin, удаляет маркеры жирного шрифта и встроенные обратные кавычки кода из `delta` и возвращает результат как `displayContent`.1598В этом примере из ответов Claude удаляется форматирование markdown для отображения в виде обычного текста. Скрипт читает каждый пакет из stdin, удаляет маркеры жирного шрифта и обратные кавычки встроенного кода из `delta` и возвращает результат как `displayContent`.
1597 1599
1598<Tabs>1600<Tabs>
1599 <Tab title="macOS/Linux">1601 <Tab title="macOS/Linux">
1600 Зарегистрируйте hook команды для события в файле параметров:1602 Зарегистрируйте command-хук для события в файле настроек:
1601 1603
1602 ```json theme={null}1604 ```json theme={null}
1603 {1605 {
1626 </Tab>1628 </Tab>
1627 1629
1628 <Tab title="Windows (PowerShell)">1630 <Tab title="Windows (PowerShell)">
1629 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:1631 Зарегистрируйте command-хук, который запускает скрипт через PowerShell:
1630 1632
1631 ```json theme={null}1633 ```json theme={null}
1632 {1634 {
1652 }1654 }
1653 ```1655 ```
1654 1656
1655 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, поэтому hook запускается быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell запускать локальный файл скрипта.1657 Флаг `-NoProfile` пропускает загрузку вашего профиля PowerShell, чтобы хук запускался быстро, а `-ExecutionPolicy Bypass` позволяет PowerShell выполнить локальный файл скрипта.
1656 1658
1657 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:1659 Сохраните этот скрипт в `.claude/hooks/plain-display.ps1` в вашем проекте:
1658 1660
1669 </Tab>1671 </Tab>
1670</Tabs>1672</Tabs>
1671 1673
1672Партии без markdown проходят без изменений. Если скрипт не удается, например, потому что `jq` отсутствует, Claude Code отображает исходный текст и отмечает сбой только в [debug output](#debug-hooks), а не в сеансе.1674Пакеты без markdown проходят без изменений. Если скрипт завершается ошибкой, например из-за отсутствия `jq`, Claude Code отображает исходный текст и отмечает сбой только в [отладочном выводе](#debug-hooks), а не в сессии.
1673 1675
1674<h3 id="pretooluse">1676<h3 id="pretooluse">
1675 PreToolUse1677 PreToolUse
1676</h3>1678</h3>
1677 1679
1678Запускается после того, как Claude создает параметры инструмента и перед обработкой вызова инструмента. Совпадает с любым именем инструмента, кроме `EndConversation`: встроенные инструменты, такие как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, и любые [имена инструментов MCP](#match-mcp-tools).1680Выполняется после того, как Claude создаёт параметры инструмента, и до обработки вызова инструмента. Сопоставляется с любым именем инструмента, кроме `EndConversation`: встроенными инструментами, такими как `Bash`, `PowerShell`, `Edit`, `Write`, `Read`, `Glob`, `Grep`, `Agent`, `Workflow`, `WebFetch`, `WebSearch`, `AskUserQuestion` и `ExitPlanMode`, а также любыми [именами MCP-инструментов](#match-mcp-tools).
1679 1681
1680Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged) вместо соответствия инструментам редактирования файлов по названию. В отличие от PreToolUse, Claude Code запускает hooks FileChanged после изменения и они не имеют управления решениями, поэтому они не могут блокировать запись.1682Чтобы запускать хук при изменении определённого файла на диске, кто бы его ни записал, используйте [FileChanged](#filechanged) вместо сопоставления инструментов редактирования файлов по имени. В отличие от PreToolUse, Claude Code запускает хуки FileChanged после изменения, и у них нет управления решениями, поэтому они не могут блокировать запись.
1681 1683
1682<Warning>1684<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) вместо этого.1685 PreToolUse выполняется только когда Claude вызывает инструмент. Файлы, на которые вы [ссылаетесь через `@` в промпте](/docs/ru/common-workflows#reference-files-and-directories), добавляются без какого-либо вызова инструмента: Claude Code вставляет их содержимое при построении промпта, поэтому для них не срабатывает ни один хук PreToolUse, включая хуки, соответствующие `Read`. Чтобы заблокировать определённые пути для ссылок через `@`, используйте вместо этого [правило запрета `Read`](/docs/ru/permissions#read-and-edit).
1684 1686
1685 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).1687 PreToolUse также не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
1686</Warning>1688</Warning>
1687 1689
1688Используйте [управление решениями PreToolUse](#pretooluse-decision-control) для разрешения, отказа, запроса или отложения вызова инструмента.1690Используйте [управление решениями PreToolUse](#pretooluse-decision-control), чтобы разрешить, запретить, запросить подтверждение или отложить вызов инструмента.
1689 1691
1690[Agent SDK callback hook](/docs/ru/agent-sdk/hooks) на `PreToolUse`, который превышает свой тайм-аут, блокирует вызов инструмента, и Claude получает результат ошибки с названием тайм-аута. Явный отказ, возвращенный другим hook, все еще имеет приоритет.1692[Callback-хук Agent SDK](/docs/ru/agent-sdk/hooks) на `PreToolUse`, превысивший таймаут, блокирует вызов инструмента, и Claude получает результат с ошибкой, указывающей на таймаут. Явный запрет, возвращённый другим хуком, по-прежнему имеет приоритет.
1691 1693
1692<h4 id="pretooluse-input">1694<h4 id="pretooluse-input">
1693 PreToolUse input1695 Входные данные PreToolUse
1694</h4>1696</h4>
1695 1697
1696Помимо [общих полей ввода](#common-input-fields), hooks PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.1698Помимо [общих входных полей](#common-input-fields), хуки PreToolUse получают `tool_name`, `tool_input` и `tool_use_id`.
1697 1699
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 или позже.1700Для [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 1701
1700Для инструментов файлов `Write`, `Edit` и `Read`, `tool_input.file_path` всегда абсолютен:1702Для файловых инструментов `Write`, `Edit` и `Read` значение `tool_input.file_path` всегда абсолютное:
1701 1703
1702* Claude Code расширяет `~` и относительные пути перед запуском hooks, поэтому hook, который совпадает с путями, не может быть обойден через `~` или относительное написание одного пути1704* Claude Code раскрывает `~` и относительные пути до запуска хуков, поэтому хук, сопоставляющий пути, нельзя обойти через `~` или относительную запись того же пути
1703* На Windows путь прибывает с разделителями обратной косой черты, даже когда ваш hook выполняется под Git Bash, где `$PWD` выглядит как `/c/project`1705* В Windows путь приходит с разделителями-обратными слешами, даже если ваш хук работает в Git Bash, где `$PWD` выглядит как `/c/project`
1704* Сравнение, написанное с прямыми косыми чертами, такое как проверка `/src/`, никогда не совпадает с путем обратной косой черты, и вызов инструмента продолжается, как если бы hook не имел ничего для блокировки1706* Сравнение, записанное с прямыми слешами, например проверка `/src/`, никогда не совпадёт с путём с обратными слешами, и вызов инструмента пройдёт так, будто хуку нечего блокировать
1705* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, затем совпадайте с сегментом пути, такой как `/src/`, а не якорем с `^`, так как путь абсолютен1707* Нормализуйте разделители перед сравнением: `FILE_PATH="${FILE_PATH//\\//}"` в Bash или `file_path.replace("\\", "/")` в Python, а затем сопоставляйте сегмент пути, например `/src/`, а не привязывайтесь к началу через `^`, поскольку путь абсолютный
1706 1708
1707Вызов `Write` на Windows доставляет:1709Вызов `Write` в Windows передаёт:
1708 1710
1709```json theme={null}1711```json theme={null}
1710{1712{
1726 Bash1728 Bash
1727</h5>1729</h5>
1728 1730
1729Выполняет команды оболочки.1731Выполняет shell-команды.
1730 1732
1731| Поле | Тип | Пример | Описание |1733| Поле | Тип | Пример | Описание |
1732| :- | :- | :- | :- |1734| :- | :- | :- | :- |
1733| `command` | string | `"npm test"` | Команда оболочки для выполнения |1735| `command` | string | `"npm test"` | Shell-команда для выполнения |
1734| `description` | string | `"Run test suite"` | Опциональное описание того, что делает команда |1736| `description` | string | `"Run test suite"` | Необязательное описание того, что делает команда |
1735| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |1737| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах. Значения выше [максимума](/docs/ru/tools-reference#bash-tool-behavior) уменьшаются до максимума, а не отклоняются |
1736| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1738| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1737 1739
1738Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записать, что изменилось. Он записывает изменения в каждом режиме разрешений, когда параметр [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; запись этого параметра говорит, какие файлы могут его установить. В противном случае он записывает их только в режиме auto и режиме `bypassPermissions`, и только когда Claude Code направляет Claude на редактирование файлов через Bash. Установите `bashEditDiffEnabled` на `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не несут diff.1740Когда команда Bash изменяет файлы в репозитории Git, Claude Code может записывать, что изменилось. Изменения записываются во всех режимах разрешений, когда настройка [`bashEditDiffEnabled`](/docs/ru/settings-reference#basheditdiffenabled) включает запись; в описании этой настройки указано, в каких файлах её можно задать. В противном случае изменения записываются только в авторежиме и режиме `bypassPermissions`, и только когда Claude Code поручает Claude редактировать файлы через Bash. Установите `bashEditDiffEnabled` в `false`, чтобы отключить запись. Фоновые команды и команды только для чтения не содержат diff.
1739 1741
1740Ваш [hook PostToolUse](#posttooluse) затем получает измененные файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории, пока выполнялась команда. Файлы, которые Git игнорирует, и файлы в подмодулях не указаны. Требует Claude Code v2.1.269 или позже.1742Затем ваш [хук PostToolUse](#posttooluse) получает изменённые файлы в `tool_response.bashEditDiff`. Список охватывает то, что изменилось в репозитории за время выполнения команды. Файлы, которые Git игнорирует, и файлы в подмодулях не включаются. Требуется Claude Code v2.1.269 или новее.
1741 1743
1742<Note>1744<Note>
1743 Список — это лучшее усилие и в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который другой процесс изменил одновременно, или остановиться на его пределах размера. Форма поля может измениться. Используйте список для поиска того, что нужно проверить, а не для обеспечения политики.1745 Список формируется по принципу «насколько возможно» и доступен в публичной бета-версии. Claude Code может пропустить изменение, включить файл, который одновременно изменил другой процесс, или остановиться на своих ограничениях размера. Структура поля может измениться. Используйте список, чтобы найти, что проверить, а не для применения политики.
1744</Note>1746</Note>
1745 1747
1746`changedFiles` и `files` перечисляют то, что изменила команда; остальные поля говорят, насколько полон и надежен этот список.1748`changedFiles` и `files` перечисляют, что изменила команда; остальные поля показывают, насколько этот список полон и надёжен.
1747 1749
1748| Поле | Тип | Пример | Описание |1750| Поле | Тип | Пример | Описание |
1749| :- | :- | :- | :- |1751| :- | :- | :- | :- |
1750| `changedFiles` | array | `["/path/to/src/app.ts"]` | Абсолютные пути файлов, которые изменила команда, максимум 200. Присутствует, когда `files` содержит diff или `moreFiles` выше нуля |1752| `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` для файла, который команда добавила или удалила |1753| `files` | array | `[{"filePath": "/path/to/src/app.ts", "hunks": [...]}]` | Diff до 5 изменённых файлов для отображения. `created` или `deleted` равно `true` для файла, который команда добавила или удалила |
1752| `moreFiles` | number | `2` | Количество измененных файлов без diff в `files` |1754| `moreFiles` | number | `2` | Количество изменённых файлов без diff в `files` |
1753| `unavailable` | boolean | `true` | Установлено, когда diff неполный или не мог быть взят |1755| `unavailable` | boolean | `true` | Устанавливается, когда diff неполон или его не удалось получить |
1754| `skipped` | boolean | `true` | Установлено для команды Git, которая перемещает рабочее дерево, такой как `git checkout` или `git stash`, поэтому Claude Code не берет diff |1756| `skipped` | boolean | `true` | Устанавливается для команды Git, перемещающей рабочее дерево, например `git checkout` или `git stash`, поэтому Claude Code не получает diff |
1755| `shared` | boolean | `true` | Установлено, когда другой вызов инструмента Bash, такой как вызов подагента, выполнялся в том же репозитории одновременно, поэтому некоторые перечисленные изменения могут быть этой командой |1757| `shared` | boolean | `true` | Устанавливается, когда другой вызов инструмента Bash, например субагента, выполнялся в том же репозитории в то же время, поэтому некоторые перечисленные изменения могут принадлежать той команде |
1756 1758
1757<a id="powershell" />1759<a id="powershell" />
1758 1760
1760 PowerShell1762 PowerShell
1761</h5>1763</h5>
1762 1764
1763Выполняет команды PowerShell. См. [инструмент PowerShell](/docs/ru/tools-reference#powershell-tool) для доступности по платформе.1765Выполняет команды PowerShell. Доступность по платформам см. в разделе об [инструменте PowerShell](/docs/ru/tools-reference#powershell-tool).
1764 1766
1765Поля совпадают с инструментом Bash, со строкой команды в `command`:1767Поля совпадают с инструментом Bash, строка команды — в `command`:
1766 1768
1767| Поле | Тип | Пример | Описание |1769| Поле | Тип | Пример | Описание |
1768| :- | :- | :- | :- |1770| :- | :- | :- | :- |
1769| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |1771| `command` | string | `"Get-ChildItem -Recurse"` | Команда PowerShell для выполнения |
1770| `description` | string | `"List files recursively"` | Опциональное описание того, что делает команда |1772| `description` | string | `"List files recursively"` | Необязательное описание того, что делает команда |
1771| `timeout` | number | `120000` | Опциональный тайм-аут в миллисекундах |1773| `timeout` | number | `120000` | Необязательный таймаут в миллисекундах |
1772| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |1774| `run_in_background` | boolean | `false` | Выполнять ли команду в фоне |
1773 1775
1774Совпадайте с `Bash|PowerShell` в hooks, которые проверяют команды оболочки, поэтому они охватывают оба инструмента:1776В хуках, проверяющих shell-команды, используйте matcher `Bash|PowerShell`, чтобы охватить оба инструмента:
1775 1777
1776* На Windows, везде, где включен инструмент PowerShell, Claude рассматривает PowerShell как основную оболочку и маршрутизирует команды оболочки через него.1778* В Windows, где бы ни был включён инструмент PowerShell, Claude считает PowerShell основной оболочкой и направляет через неё shell-команды.
1777* На Windows без Git Bash инструмент включен автоматически, и Claude Code не регистрирует инструмент Bash вообще.1779* В Windows без Git Bash инструмент включается автоматически, а Claude Code вообще не регистрирует инструмент Bash.
1778* Hook, который совпадает только с `Bash`, никогда не срабатывает там.1780* Хук, соответствующий только `Bash`, там никогда не срабатывает.
1779 1781
1780<h5 id="write">1782<h5 id="write">
1781 Write1783 Write
1782</h5>1784</h5>
1783 1785
1784Создает или перезаписывает файл.1786Создаёт или перезаписывает файл.
1785 1787
1786| Поле | Тип | Пример | Описание |1788| Поле | Тип | Пример | Описание |
1787| :- | :- | :- | :- |1789| :- | :- | :- | :- |
1810| Поле | Тип | Пример | Описание |1812| Поле | Тип | Пример | Описание |
1811| :- | :- | :- | :- |1813| :- | :- | :- | :- |
1812| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |1814| `file_path` | string | `"/path/to/file.txt"` | Абсолютный путь к файлу для чтения |
1813| `offset` | number | `10` | Опциональный номер строки для начала чтения |1815| `offset` | number | `10` | Необязательный номер строки, с которой начать чтение |
1814| `limit` | number | `50` | Опциональное количество строк для чтения |1816| `limit` | number | `50` | Необязательное количество строк для чтения |
1815 1817
1816<h5 id="glob">1818<h5 id="glob">
1817 Glob1819 Glob
1818</h5>1820</h5>
1819 1821
1820Находит файлы, соответствующие шаблону glob.1822Находит файлы, соответствующие glob-шаблону.
1821 1823
1822| Поле | Тип | Пример | Описание |1824| Поле | Тип | Пример | Описание |
1823| :- | :- | :- | :- |1825| :- | :- | :- | :- |
1824| `pattern` | string | `"**/*.ts"` | Шаблон glob для соответствия файлам |1826| `pattern` | string | `"**/*.ts"` | Glob-шаблон для сопоставления файлов |
1825| `path` | string | `"/path/to/dir"` | Опциональная директория для поиска. По умолчанию текущая рабочая директория |1827| `path` | string | `"/path/to/dir"` | Необязательный каталог для поиска. По умолчанию — текущий рабочий каталог |
1826 1828
1827<h5 id="grep">1829<h5 id="grep">
1828 Grep1830 Grep
1829</h5>1831</h5>
1830 1832
1831Ищет содержимое файлов с помощью регулярных выражений.1833Ищет по содержимому файлов с помощью регулярных выражений.
1832 1834
1833| Поле | Тип | Пример | Описание |1835| Поле | Тип | Пример | Описание |
1834| :- | :- | :- | :- |1836| :- | :- | :- | :- |
1835| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |1837| `pattern` | string | `"TODO.*fix"` | Шаблон регулярного выражения для поиска |
1836| `path` | string | `"/path/to/dir"` | Опциональный файл или директория для поиска |1838| `path` | string | `"/path/to/dir"` | Необязательный файл или каталог для поиска |
1837| `glob` | string | `"*.ts"` | Опциональный шаблон glob для фильтрации файлов |1839| `glob` | string | `"*.ts"` | Необязательный glob-шаблон для фильтрации файлов |
1838| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |1840| `output_mode` | string | `"content"` | `"content"`, `"files_with_matches"` или `"count"`. По умолчанию `"files_with_matches"` |
1839| `-i` | boolean | `true` | Поиск без учета регистра |1841| `-i` | boolean | `true` | Поиск без учёта регистра |
1840| `multiline` | boolean | `false` | Включить многострочное соответствие |1842| `multiline` | boolean | `false` | Включить многострочное сопоставление |
1841 1843
1842<h5 id="webfetch">1844<h5 id="webfetch">
1843 WebFetch1845 WebFetch
1844</h5>1846</h5>
1845 1847
1846Получает и обрабатывает веб-контент.1848Загружает и обрабатывает веб-контент.
1847 1849
1848| Поле | Тип | Пример | Описание |1850| Поле | Тип | Пример | Описание |
1849| :- | :- | :- | :- |1851| :- | :- | :- | :- |
1850| `url` | string | `"https://example.com/api"` | URL для получения контента |1852| `url` | string | `"https://example.com/api"` | URL, с которого загружается контент |
1851| `prompt` | string | `"Extract the API endpoints"` | Подсказка для запуска на полученном контенте |1853| `prompt` | string | `"Extract the API endpoints"` | Промпт, применяемый к загруженному контенту |
1852 1854
1853<h5 id="websearch">1855<h5 id="websearch">
1854 WebSearch1856 WebSearch
1855</h5>1857</h5>
1856 1858
1857Ищет в веб.1859Выполняет поиск в интернете.
1858 1860
1859| Поле | Тип | Пример | Описание |1861| Поле | Тип | Пример | Описание |
1860| :- | :- | :- | :- |1862| :- | :- | :- | :- |
1861| `query` | string | `"react hooks best practices"` | Поисковый запрос |1863| `query` | string | `"react hooks best practices"` | Поисковый запрос |
1862| `allowed_domains` | array | `["docs.example.com"]` | Опциональный: включить результаты только с этих доменов |1864| `allowed_domains` | array | `["docs.example.com"]` | Необязательно: включать результаты только с этих доменов |
1863| `blocked_domains` | array | `["spam.example.com"]` | Опциональный: исключить результаты с этих доменов |1865| `blocked_domains` | array | `["spam.example.com"]` | Необязательно: исключать результаты с этих доменов |
1864 1866
1865<h5 id="agent">1867<h5 id="agent">
1866 Agent1868 Agent
1867</h5>1869</h5>
1868 1870
1869Порождает [подагента](/docs/ru/sub-agents).1871Запускает [субагента](/docs/ru/sub-agents).
1870 1872
1871| Поле | Тип | Пример | Описание |1873| Поле | Тип | Пример | Описание |
1872| :- | :- | :- | :- |1874| :- | :- | :- | :- |
1873| `prompt` | string | `"Find all API endpoints"` | Задача для выполнения агентом |1875| `prompt` | string | `"Find all API endpoints"` | Задача, которую должен выполнить агент |
1874| `description` | string | `"Find API endpoints"` | Краткое описание задачи |1876| `description` | string | `"Find API endpoints"` | Краткое описание задачи |
1875| `subagent_type` | string | `"Explore"` | Тип специализированного агента для использования |1877| `subagent_type` | string | `"Explore"` | Тип используемого специализированного агента |
1876| `model` | string | `"sonnet"` | Опциональный псевдоним модели для переопределения по умолчанию |1878| `model` | string | `"sonnet"` | Необязательный псевдоним модели для переопределения модели по умолчанию |
1877 1879
1878Когда вызов Agent переднего плана завершается, ваш [hook PostToolUse](#posttooluse) получает результат подагента и телеметрию запуска в `tool_response`. Прочитайте эти поля для проверки запуска; для сводок токенов и затрат по подагентам используйте [счетчики токенов и затрат](/docs/ru/monitoring-usage#token-counter), отфильтрованные по `query_source` `"subagent"`, так как `totalTokens` и `usage` охватывают только финальный запрос:1880Когда вызов Agent на переднем плане завершается, ваш [хук PostToolUse](#posttooluse) получает результат субагента и телеметрию запуска в `tool_response`. Читайте эти поля для анализа запуска; для сводных данных по токенам и стоимости по всем субагентам используйте [счётчики токенов и стоимости](/docs/ru/monitoring-usage#token-counter) с фильтром `query_source` `"subagent"`, поскольку `totalTokens` и `usage` охватывают только последний запрос:
1879 1881
1880| Поле | Тип | Пример | Описание |1882| Поле | Тип | Пример | Описание |
1881| :- | :- | :- | :- |1883| :- | :- | :- | :- |
1882| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. По умолчанию субагенты работают в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |1884| `status` | string | `"completed"` | `"completed"` для субагентов на переднем плане, `"async_launched"` для фоновых субагентов. По умолчанию субагенты выполняются в фоне, поэтому вызов Agent без `run_in_background` также даёт `"async_launched"` |
1883| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор для запуска подагента |1885| `agentId` | string | `"a4d2c8f1e0b3a297"` | Идентификатор запуска субагента |
1884| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Финальные текстовые блоки подагента или, для подагента, чей отчет проходит через `SubagentHandback`, краткая заметка об этом hand-back на их месте |1886| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Итоговые текстовые блоки субагента или, для субагента, чей отчёт передаётся через `SubagentHandback`, вместо них краткая заметка об этой передаче |
1885| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, на которой подагент начал, которая может отличаться от запрошенной модели |1887| `resolvedModel` | string | `"claude-sonnet-4-5"` | Модель, с которой субагент начал работу; может отличаться от запрошенной |
1886| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Модели, используемые по порядку, с последовательными повторениями свернутыми; установлено только, когда модель была переключена во время запуска. Требует Claude Code v2.1.212 или позже |1888| `modelsUsed` | array | `["claude-sonnet-4-5", "claude-haiku-4-5"]` | Использованные модели по порядку, с объединением последовательных повторов; задаётся только если модель была заменена во время запуска. Требуется Claude Code v2.1.212 или новее |
1887| `totalTokens` | number | `12450` | Количество токенов из финального API запроса подагента: входные, выходные и кэшированные токены в сумме. Это не общее количество по всему запуску |1889| `totalTokens` | number | `12450` | Количество токенов последнего запроса API субагента: входные, выходные и токены кэша вместе. Это не итог за весь запуск |
1888| `totalDurationMs` | number | `48211` | Настоящее время запуска подагента |1890| `totalDurationMs` | number | `48211` | Реальная длительность запуска субагента |
1889| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, которые сделал подагент |1891| `totalToolUseCount` | number | `7` | Количество вызовов инструментов, сделанных субагентом |
1890| `usage` | object | `{"input_tokens": 8320, ...}` | Разбор токенов по типам финального API запроса: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1892| `usage` | object | `{"input_tokens": 8320, ...}` | Разбивка токенов последнего запроса API по типам: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1891 1893
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`.1894В 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 1895
1894Для подагентов фона инструмент возвращается, когда задача переходит в фон, поэтому `tool_response` не несет полей использования: запуск фона возвращается немедленно, и задача переднего плана, которую Claude Code переводит в фон во время запуска, возвращается при этом переходе. Он имеет `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.1896Для фоновых субагентов инструмент возвращает результат, когда задача переходит в фон, поэтому `tool_response` не содержит полей использования: фоновый запуск возвращается сразу, а задача на переднем плане, которую Claude Code переводит в фон во время выполнения, возвращается в момент этого перехода. Ответ содержит `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` и `resolvedModel`.
1895 1897
1896На ответе `completed`, `resolvedModel` называет модель, на которой подагент начал, которая может отличаться от значения `model` в `tool_input`, такой как когда `availableModels` или другое переопределение применяется. На ответе `async_launched`, `resolvedModel` называет модель в использовании, когда агент перешел в фон, поэтому переключение, которое произошло перед переводом в фон, отражается там. `modelsUsed` и поведение `resolvedModel` во время перевода в фон требуют Claude Code v2.1.212 или позже.1898В ответе `completed` поле `resolvedModel` указывает модель, с которой начал субагент; она может отличаться от значения `model` в `tool_input`, например когда применяется `availableModels` или другое переопределение. В ответе `async_launched` поле `resolvedModel` указывает модель, использовавшуюся в момент перехода агента в фон, поэтому замена, произошедшая до перевода в фон, в нём отражается. Для `modelsUsed` и поведения `resolvedModel` на момент перевода в фон требуется Claude Code v2.1.212 или новее.
1897 1899
1898<a id="askuserquestion" />1900<a id="askuserquestion" />
1899 1901
1901 AskUserQuestion1903 AskUserQuestion
1902</h5>1904</h5>
1903 1905
1904Задает пользователю один-четыре вопроса с множественным выбором.1906Задаёт пользователю от одного до четырёх вопросов с вариантами ответа.
1905 1907
1906| Поле | Тип | Пример | Описание |1908| Поле | Тип | Пример | Описание |
1907| :- | :- | :- | :- |1909| :- | :- | :- | :- |
1908| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для представления, каждый с строкой `question`, коротким `header`, массивом `options` и опциональным флагом `multiSelect` |1910| `questions` | array | `[{"question": "Which framework?", "header": "Framework", "options": [{"label": "React"}], "multiSelect": false}]` | Вопросы для показа, каждый со строкой `question`, коротким `header`, массивом `options` и необязательным флагом `multiSelect` |
1909| `answers` | object | `{"Which framework?": "React"}` | Опциональный. Отображает текст вопроса на выбранный ярлык опции. Ответы с множественным выбором объединяют ярлыки запятыми. Claude не устанавливает это поле; предоставьте его через `updatedInput` для программного ответа |1911| `answers` | object | `{"Which framework?": "React"}` | Необязательно. Сопоставляет текст вопроса с меткой выбранного варианта. В ответах с множественным выбором метки объединяются через запятую. Claude не задаёт это поле; передайте его через `updatedInput`, чтобы ответить программно |
1910 1912
1911<h5 id="exitplanmode">1913<h5 id="exitplanmode">
1912 ExitPlanMode1914 ExitPlanMode
1913</h5>1915</h5>
1914 1916
1915Представляет план и просит пользователя одобрить его перед тем, как Claude покидает [режим плана](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диск перед вызовом инструмента, поэтому буквальный `tool_input` из модели обычно пуст. Claude Code вводит содержимое плана и путь к файлу перед передачей ввода в hooks.1917Представляет план и просит пользователя утвердить его, прежде чем Claude выйдет из [режима планирования](/docs/ru/permission-modes#analyze-before-you-edit-with-plan-mode). Claude записывает план в файл на диске перед вызовом инструмента, поэтому буквальный `tool_input` от модели обычно пуст. Claude Code внедряет содержимое плана и путь к файлу перед передачей входных данных хукам.
1916 1918
1917| Поле | Тип | Пример | Описание |1919| Поле | Тип | Пример | Описание |
1918| :- | :- | :- | :- |1920| :- | :- | :- | :- |
1919| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Введено из файла плана на диске |1921| `plan` | string | `"## Refactor auth\n1. Extract..."` | Содержимое плана в Markdown. Внедряется из файла плана на диске |
1920| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Введено |1922| `planFilePath` | string | `"/Users/.../plans/refactor-auth.md"` | Путь к файлу плана. Внедряется |
1921| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устарело. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно несло разрешения на основе подсказок, которые Claude запросил для реализации плана |1923| `allowedPrompts` | array | `[{"tool": "Bash", "prompt": "run tests"}]` | Устаревшее. Claude Code принимает поле, но игнорирует его. До v2.1.205 оно содержало разрешения на основе промптов, которые Claude запрашивал для реализации плана |
1922 1924
1923В `PostToolUse`, `tool_response` является объектом с полями `plan` и `filePath`, содержащими одобренный план, плюс внутренние флаги статуса. Прочитайте `tool_response.plan` для содержимого плана, а не перечитывайте файл с диска.1925В `PostToolUse` поле `tool_response` — это объект с полями `plan` и `filePath`, содержащими утверждённый план, а также внутренними флагами состояния. Читайте `tool_response.plan` для получения содержимого плана, а не перечитывайте файл с диска.
1924 1926
1925<h4 id="pretooluse-decision-control">1927<h4 id="pretooluse-decision-control">
1926 Управление решениями PreToolUse1928 Управление решениями PreToolUse
1927</h4>1929</h4>
1928 1930
1929Hooks `PreToolUse` могут управлять тем, продолжается ли вызов инструмента. В отличие от других hooks, которые используют поле `decision` верхнего уровня, PreToolUse возвращает свое решение внутри объекта `hookSpecificOutput`. Это дает ему более богатый контроль: четыре результата (разрешить, отказать, спросить или отложить) плюс возможность изменить ввод инструмента перед выполнением.1931Хуки `PreToolUse` могут управлять тем, выполняется ли вызов инструмента. В отличие от других хуков, использующих поле `decision` верхнего уровня, PreToolUse возвращает своё решение внутри объекта `hookSpecificOutput`. Это даёт ему более широкие возможности управления: четыре исхода (разрешить, запретить, запросить подтверждение или отложить) и возможность изменить входные данные инструмента перед выполнением.
1930 1932
1931| Поле | Описание |1933| Поле | Описание |
1932| :- | :- |1934| :- | :- |
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 |1935| `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) только |1936| `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"`, игнорируется |1937| `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) |1938| `additionalContext` | Строка, добавляемая в контекст Claude вместе с результатом инструмента. Игнорируется, когда `permissionDecision` равно `"defer"`. См. [Добавление контекста для Claude](#add-context-for-claude) |
1937 1939
1938Когда несколько hooks PreToolUse возвращают разные решения, приоритет `deny` > `defer` > `ask` > `allow`.1940Когда несколько хуков PreToolUse возвращают разные решения, приоритет таков: `deny` > `defer` > `ask` > `allow`.
1939 1941
1940Hook, который блокирует выходом 2, маршрутизируется так же, как `"deny"`: Claude видит сообщение stderr как причину отказа.1942Хук, блокирующий с кодом выхода 2, обрабатывается так же, как `"deny"`: Claude видит сообщение из stderr как причину запрета.
1941 1943
1942Когда hook возвращает `"ask"`, подсказка разрешения, отображаемая пользователю, включает ярлык, определяющий, откуда пришел hook: `[settings]` для hook из любого файла параметров или frontmatter агента, `[plugin:<name>]` для hook plugin или `[skill]` для hook из frontmatter skill. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.1944Когда хук возвращает `"ask"`, запрос разрешения, показываемый пользователю, содержит метку, указывающую, откуда взялся хук: `[settings]` для хука из любого файла настроек или из frontmatter агента, `[plugin:<name>]` для хука плагина или `[skill]` для хука из frontmatter скилла. Это помогает пользователям понять, какой источник конфигурации запрашивает подтверждение.
1943 1945
1944`"ask"` hook также принуждает подсказку разрешения в [режиме auto](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор все еще может отказать вызов инструмента, но не может одобрить вызов молча. До версии 2.1.211 классификатор мог одобрить команду Bash, выполняющуюся вне [sandbox](/docs/ru/sandboxing), без показа подсказки, которую запросил hook; классификатор все еще применял свои собственные правила безопасности к этой команде, и отказ hook `"deny"` всегда соблюдался.1946`"ask"` от хука также принудительно вызывает запрос разрешения в [авторежиме](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode): классификатор по-прежнему может запретить вызов инструмента, но не может молча его одобрить. До v2.1.211 классификатор мог одобрить команду Bash, выполняемую вне [песочницы](/docs/ru/sandboxing), не показывая запрошенный хуком запрос; при этом классификатор всё равно применял к этой команде собственные правила безопасности, а `"deny"` от хука всегда соблюдался.
1945 1947
1946```json theme={null}1948```json theme={null}
1947{1949{
1959 1961
1960<span id="allow-with-updatedinput" />1962<span id="allow-with-updatedinput" />
1961 1963
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), отображающий текст каждого вопроса на выбранный ярлык опции.1964В [неинтерактивном режиме](/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 1965
1964Начиная с v2.1.199, инструмент MCP, сервер которого отмечает его с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), более строг: hook не может пропустить его подсказку одобрения с `"allow"`, с или без `updatedInput`, потому что Claude Code не может подтвердить, что hook собрал взаимодействие, которое нужно инструменту.1966MCP-инструмент, который его сервер помечает с помощью [`_meta["anthropic/requiresUserInteraction"]`](/docs/ru/mcp#require-approval-for-a-specific-tool), строже: хук не может пропустить его запрос подтверждения с помощью `"allow"`, с `updatedInput` или без него, потому что Claude Code не может убедиться, что хук получил необходимое инструменту взаимодействие.
1965 1967
1966<Note>1968<Note>
1967 PreToolUse ранее использовал поля `decision` и `reason` верхнего уровня, но они устарели для этого события. Используйте `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason` вместо этого. Устаревшие значения `"approve"` и `"block"` отображаются на `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, продолжают использовать `decision` и `reason` верхнего уровня как их текущий формат.1969 Ранее PreToolUse использовал поля `decision` и `reason` верхнего уровня, но для этого события они объявлены устаревшими. Используйте вместо них `hookSpecificOutput.permissionDecision` и `hookSpecificOutput.permissionDecisionReason`. Устаревшие значения `"approve"` и `"block"` соответствуют `"allow"` и `"deny"` соответственно. Другие события, такие как PostToolUse и Stop, по-прежнему используют поля `decision` и `reason` верхнего уровня в качестве текущего формата.
1968</Note>1970</Note>
1969 1971
1970<h4 id="defer-a-tool-call-for-later">1972<h4 id="defer-a-tool-call-for-later">
1971 Defer a tool call for later1973 Отложить вызов инструмента
1972</h4>1974</h4>
1973 1975
1974`"defer"` предназначен для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, такие как приложение Agent SDK или пользовательский UI, построенный на основе Claude Code. Это позволяет этому вызывающему процессу приостановить Claude при вызове инструмента, собрать ввод через его собственный интерфейс и возобновить, где он остановился. Claude Code соблюдает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сеансах он регистрирует предупреждение и игнорирует результат hook.1976`"defer"` предназначено для интеграций, которые запускают `claude -p` как подпроцесс и читают его вывод JSON, например приложения на Agent SDK или пользовательского интерфейса, построенного поверх Claude Code. Оно позволяет вызывающему процессу приостановить Claude на вызове инструмента, получить ввод через собственный интерфейс и продолжить с того же места. Claude Code учитывает это значение только в [неинтерактивном режиме](/docs/ru/headless) с флагом `-p`. В интерактивных сессиях он записывает в лог предупреждение и игнорирует результат хука.
1975 1977
1976Инструмент `AskUserQuestion` — типичный случай: Claude хочет что-то спросить у пользователя, но нет терминала для ответа. Запуск `-p` предлагает `AskUserQuestion` только, когда он имеет [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), такой как инструмент MCP, который вы передаете с `--permission-prompt-tool`, поэтому запустите запуск с одним. Круговой путь работает так:1978Типичный случай — инструмент `AskUserQuestion`: Claude хочет что-то спросить у пользователя, но терминала для ответа нет. Запуск с `-p` предлагает `AskUserQuestion`, только если у него есть [хост разрешений](/docs/ru/headless#turn-off-permission-prompts-in-unattended-runs), например MCP-инструмент, переданный через `--permission-prompt-tool`, поэтому запускайте с ним. Цикл работает так:
1977 1979
19781. Claude вызывает `AskUserQuestion`. Срабатывает hook `PreToolUse`.19801. Claude вызывает `AskUserQuestion`. Срабатывает хук `PreToolUse`.
19792. Hook возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс выходит с `stop_reason: "tool_deferred"` и сохраненным вызовом инструмента в транскрипте.19812. Хук возвращает `permissionDecision: "defer"`. Инструмент не выполняется. Процесс завершается с `stop_reason: "tool_deferred"`, а ожидающий вызов инструмента сохраняется в транскрипте.
19803. Вызывающий процесс читает `deferred_tool_use` из результата SDK, выводит вопрос в своем собственном UI и ждет ответа.19823. Вызывающий процесс читает `deferred_tool_use` из результата SDK, показывает вопрос в своём интерфейсе и ждёт ответа.
19814. Вызывающий процесс запускает `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента срабатывает `PreToolUse` снова.19834. Вызывающий процесс выполняет `claude -p --resume <session-id>` с тем же хостом разрешений. Тот же вызов инструмента снова запускает `PreToolUse`.
19825. Hook возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется и Claude продолжает.19845. Хук возвращает `permissionDecision: "allow"` с ответом в `updatedInput`. Инструмент выполняется, и Claude продолжает работу.
1983 1985
1984Поле `deferred_tool_use` несет `id`, `name` и `input` инструмента. `input` — это параметры, которые Claude сгенерировал для вызова инструмента, захваченные перед выполнением:1986Поле `deferred_tool_use` содержит `id`, `name` и `input` инструмента. `input` — это параметры, сгенерированные Claude для вызова инструмента и зафиксированные до выполнения:
1985 1987
1986```json theme={null}1988```json theme={null}
1987{1989{
1997}1999}
1998```2000```
1999 2001
2000Нет тайм-аута или лимита повторных попыток. Сеанс остается на диске до возобновления, подлежит [правилам очистки](/docs/ru/claude-directory#cleaned-up-automatically) сметания удержания [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которое удаляет файлы сеанса через 30 дней по умолчанию. Если ответ не готов при возобновлении, hook может вернуть `"defer"` снова и процесс выходит так же. Вызывающий процесс управляет тем, когда разорвать цикл, в конечном итоге возвращая `"allow"` или `"deny"` из hook.2002Ограничений по таймауту или количеству повторных попыток нет. Сессия остаётся на диске, пока вы её не возобновите, с учётом очистки по сроку хранения [`cleanupPeriodDays`](/docs/ru/settings-reference#cleanupperioddays), которая по умолчанию удаляет файлы сессий через 30 дней согласно [правилам очистки по сроку хранения](/docs/ru/claude-directory#cleaned-up-automatically). Если ответ не готов к моменту возобновления, хук может снова вернуть `"defer"`, и процесс завершится так же. Вызывающий процесс сам решает, когда выйти из цикла, в итоге возвращая из хука `"allow"` или `"deny"`.
2001 2003
2002`"defer"` работает только, когда Claude делает один вызов инструмента в ходе. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением и инструмент проходит через нормальный поток разрешений. Ограничение существует, потому что возобновление может повторно запустить только один инструмент: нет способа отложить один вызов из партии без оставления других неразрешенными.2004`"defer"` работает, только когда Claude делает в ходе один вызов инструмента. Если Claude делает несколько вызовов инструментов одновременно, `"defer"` игнорируется с предупреждением, и инструмент проходит обычный процесс проверки разрешений. Это ограничение существует потому, что при возобновлении можно повторно выполнить только один инструмент: нельзя отложить один вызов из пакета, не оставив остальные неразрешёнными.
2003 2005
2004Если отложенный инструмент больше не доступен при возобновлении, процесс выходит с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` перед срабатыванием hook. Это происходит, когда сервер MCP, который предоставил инструмент, не подключен для возобновленного сеанса. Полезная нагрузка `deferred_tool_use` все еще включена, поэтому вы можете определить, какой инструмент исчез.2006Если отложенный инструмент при возобновлении больше недоступен, процесс завершается с `stop_reason: "tool_deferred_unavailable"` и `is_error: true` до срабатывания хука. Это происходит, когда MCP-сервер, предоставлявший инструмент, не подключён в возобновлённой сессии. Данные `deferred_tool_use` всё равно включаются, чтобы вы могли определить, какой инструмент пропал.
2005 2007
2006<Note>2008<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 или позже.2009 Чтобы возобновить отложенную сессию в режиме планирования, передайте [`--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 2010
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).2011 При возобновлении с `-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>2012</Note>
2011 2013
2012<h3 id="permissionrequest">2014<h3 id="permissionrequest">
2013 PermissionRequest2015 PermissionRequest
2014</h3>2016</h3>
2015 2017
2016Запускается, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не возвращает решение, он запрещает вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [callback `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется решение того, кто решит первым.2018Выполняется, когда Claude Code собирается запросить у вас разрешение на использование инструмента. В сессиях, которые не могут показать запрос, например у фоновых субагентов в [неинтерактивном режиме](/docs/ru/headless), Claude Code всё равно запускает эти хуки, и если ни один хук не вернёт решение, он запрещает вызов инструмента. Для вызова, который доходит до `--permission-prompt-tool` или [callback `canUseTool`](/docs/ru/agent-sdk/permissions) в Agent SDK, хуки выполняются параллельно с вашим хостом, и применяется то решение, которое принято первым.
2017Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.2019Используйте [управление решениями PermissionRequest](#permissionrequest-decision-control), чтобы разрешать или запрещать от имени пользователя.
2018 2020
2019Используйте это событие, когда вам нужен сигнал в момент, когда Claude просит разрешение на использование инструмента. Claude Code запускает hook [Notification](#notification) с типом `permission_prompt` только после того, как подсказка ждала около шести секунд.2021Используйте это событие, когда нужен сигнал в момент, когда Claude запрашивает разрешение на использование инструмента. Claude Code запускает хук [Notification](#notification) с типом `permission_prompt` только после того, как запрос прождёт около шести секунд.
2020 2022
2021Claude Code не запускает hooks PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды. Чтобы получить сигнал для этой подсказки, используйте тип уведомления `permission_prompt`.2023Claude Code не запускает хуки PermissionRequest для [сетевого запроса](/docs/ru/sandboxing#network-isolation) команды, выполняемой в песочнице. Чтобы получить сигнал для такого запроса, используйте тип уведомления `permission_prompt`.
2022 2024
2023Совпадает с именем инструмента, те же значения, что и PreToolUse.2025Сопоставляется по имени инструмента, с теми же значениями, что и PreToolUse.
2024 2026
2025<h4 id="permissionrequest-input">2027<h4 id="permissionrequest-input">
2026 PermissionRequest input2028 Входные данные PermissionRequest
2027</h4>2029</h4>
2028 2030
2029Hooks PermissionRequest получают поля `tool_name` и `tool_input`, как hooks PreToolUse, но без `tool_use_id`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Опциональный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, такие как добавление правила разрешения или изменение режима разрешений.2031Хуки PermissionRequest получают поля `tool_name` и `tool_input`, как хуки PreToolUse, но без `tool_use_id`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Необязательный массив `permission_suggestions` содержит [обновления разрешений](#permission-update-entries), которые Claude Code предлагает для этого запроса, например добавление правила разрешения или смену режима разрешений.
2030 2032
2031Массив `permission_suggestions` не является точным списком опций, которые вы видите, потому что каждый диалог разрешений строит свои собственные опции. Некоторые диалоги, такие как для редактирования файлов, вообще не читают массив и получают свои опции из самого запроса. Диалог, который читает его, все еще может скрыть опцию, чье предложение остается в массиве, например, когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает опции сохранения правил. Он также может предложить опции, которые не имеют записи предложения, такие как [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), которая изменяет режим разрешений напрямую, а не через обновление разрешений.2033Массив `permission_suggestions` не является точным списком вариантов, которые вы видите, поскольку каждое диалоговое окно разрешений формирует собственные варианты. Некоторые диалоговые окна, например для редактирования файлов, вообще не читают этот массив и выводят варианты из самого запроса. Диалоговое окно, которое его читает, всё равно может скрыть вариант, предложение для которого остаётся в массиве, например когда [`allowManagedPermissionRulesOnly`](/docs/ru/settings-reference#allowmanagedpermissionrulesonly) скрывает варианты сохранения правил. Оно также может предлагать варианты без соответствующей записи, например [**Yes, and switch to auto mode**](/docs/ru/permission-modes#switch-permission-modes), который меняет режим разрешений напрямую, а не через обновление разрешений.
2032 2034
2033Hooks PreToolUse запускаются перед каждым вызовом инструмента, независимо от того, нужно ли ему разрешение. Hooks PermissionRequest запускаются только, когда Claude Code собирается попросить у вас разрешение, или когда он в противном случае автоматически отказал бы вызову, который не может подсказать. Ни одно событие не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).2035Хуки PreToolUse выполняются перед каждым вызовом инструмента, независимо от того, нужно ли для него разрешение. Хуки PermissionRequest выполняются только когда Claude Code собирается запросить у вас разрешение или когда он иначе автоматически запретил бы вызов, который не может показать запрос. Ни одно из этих событий не срабатывает для [`EndConversation`](/docs/ru/tools-reference#endconversation-tool-behavior).
2034 2036
2035```json theme={null}2037```json theme={null}
2036{2038{
2059 Управление решениями PermissionRequest2061 Управление решениями PermissionRequest
2060</h4>2062</h4>
2061 2063
2062Hooks `PermissionRequest` могут разрешить или отказать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть объект `decision` с этими полями, специфичными для события:2064Хуки `PermissionRequest` могут разрешать или запрещать запросы разрешений. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может вернуть объект `decision` со следующими полями, специфичными для события:
2063 2065
2064| Поле | Описание |2066| Поле | Описание |
2065| :- | :- |2067| :- | :- |
2066| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отказывает. [Правила отказа и запроса](/docs/ru/permissions#manage-permissions) все еще оцениваются, поэтому hook, возвращающий `"allow"`, не переопределяет соответствующее правило отказа |2068| `behavior` | `"allow"` предоставляет разрешение, `"deny"` отклоняет его. [Правила запрета и запроса подтверждения](/docs/ru/permissions#manage-permissions) всё равно применяются, поэтому хук, возвращающий `"allow"`, не переопределяет соответствующее правило запрета |
2067| `updatedInput` | Для `"allow"` только: изменяет параметры ввода инструмента перед выполнением. Заменяет весь объект ввода, поэтому включите неизмененные поля рядом с измененными. Измененный ввод повторно оценивается против правил отказа и запроса |2069| `updatedInput` | Только для `"allow"`: изменяет входные параметры инструмента перед выполнением. Заменяет весь объект входных данных, поэтому включайте неизменённые поля вместе с изменёнными. Изменённые входные данные повторно проверяются по правилам запрета и запроса подтверждения |
2068| `updatedPermissions` | Для `"allow"` только: массив [записей обновления разрешений](#permission-update-entries) для применения, такие как добавление правила разрешения или изменение режима разрешений сеанса |2070| `updatedPermissions` | Только для `"allow"`: массив [записей обновления разрешений](#permission-update-entries) для применения, например добавление правила разрешения или смена режима разрешений сессии |
2069| `message` | Для `"deny"` только: говорит Claude, почему разрешение было отказано |2071| `message` | Только для `"deny"`: сообщает Claude, почему в разрешении отказано |
2070| `interrupt` | Для `"deny"` только: если `true`, останавливает Claude |2072| `interrupt` | Только для `"deny"`: если `true`, останавливает Claude |
2071 2073
2072Hook, который выходит 2 без объекта `decision`, оставляет поток разрешений неизменным, и его stderr отбрасывается. Только объект `decision` может предоставить или отказать запрос.2074Хук, завершившийся с кодом выхода 2 без объекта `decision`, оставляет процесс проверки разрешений без изменений, а его stderr отбрасывается. Предоставить или отклонить запрос может только объект `decision`.
2073 2075
2074```json theme={null}2076```json theme={null}
2075{2077{
2086```2088```
2087 2089
2088<h4 id="permission-update-entries">2090<h4 id="permission-update-entries">
2089 Permission update entries2091 Записи обновления разрешений
2090</h4>2092</h4>
2091 2093
2092Поле вывода `updatedPermissions` и поле ввода [`permission_suggestions`](#permissionrequest-input) оба используют один и тот же массив объектов записей. Каждая запись имеет `type`, который определяет ее другие поля, и `destination`, который управляет тем, где записывается изменение.2094Поле вывода `updatedPermissions` и [входное поле `permission_suggestions`](#permissionrequest-input) используют один и тот же массив объектов-записей. У каждой записи есть `type`, определяющий её остальные поля, и `destination`, управляющий тем, куда записывается изменение.
2093 2095
2094| `type` | Поля | Эффект |2096| `type` | Поля | Действие |
2095| :- | :- | :- |2097| :- | :- | :- |
2096| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешения. `rules` — это массив объектов `{toolName, ruleContent?}`. Опустите `ruleContent` для совпадения со всем инструментом. `behavior` — это `"allow"`, `"deny"` или `"ask"` |2098| `addRules` | `rules`, `behavior`, `destination` | Добавляет правила разрешений. `rules` — массив объектов `{toolName, ruleContent?}`. Не указывайте `ruleContent`, чтобы охватить весь инструмент. `behavior` — `"allow"`, `"deny"` или `"ask"` |
2097| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила данного `behavior` в `destination` предоставленными `rules` |2099| `replaceRules` | `rules`, `behavior`, `destination` | Заменяет все правила заданного `behavior` в `destination` переданными `rules` |
2098| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила данного `behavior` |2100| `removeRules` | `rules`, `behavior`, `destination` | Удаляет соответствующие правила заданного `behavior` |
2099| `setMode` | `mode`, `destination` | Изменяет режим разрешений. Допустимые режимы — `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Псевдоним `manual` требует Claude Code v2.1.200 или позже |2101| `setMode` | `mode`, `destination` | Меняет режим разрешений. Допустимые режимы: `default`, `auto`, `acceptEdits`, `dontAsk`, `bypassPermissions`, `plan` и `manual` как псевдоним для `default`. Для псевдонима `manual` требуется Claude Code v2.1.200 или новее |
2100| `addDirectories` | `directories`, `destination` | Добавляет рабочие директории. `directories` — это массив строк путей |2102| `addDirectories` | `directories`, `destination` | Добавляет рабочие каталоги. `directories` — массив строк путей |
2101| `removeDirectories` | `directories`, `destination` | Удаляет рабочие директории |2103| `removeDirectories` | `directories`, `destination` | Удаляет рабочие каталоги |
2102 2104
2103<Note>2105<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).2106 `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 2107
2106 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.2108 `bypassPermissions` никогда не сохраняется как `defaultMode` независимо от `destination`.
2107</Note>2109</Note>
2108 2110
2109Поле `destination` на каждой записи определяет, остается ли изменение в памяти или сохраняется в файл параметров.2111Поле `destination` в каждой записи определяет, остаётся ли изменение в памяти или сохраняется в файл настроек.
2110 2112
2111| `destination` | Записывает в |2113| `destination` | Куда записывается |
2112| :- | :- |2114| :- | :- |
2113| `session` | только в памяти, отбрасывается при завершении сеанса |2115| `session` | только в памяти, отбрасывается при завершении сессии |
2114| `localSettings` | `.claude/settings.local.json` |2116| `localSettings` | `.claude/settings.local.json` |
2115| `projectSettings` | `.claude/settings.json` |2117| `projectSettings` | `.claude/settings.json` |
2116| `userSettings` | `~/.claude/settings.json` |2118| `userSettings` | `~/.claude/settings.json` |
2117 2119
2118Hook может повторить одно из `permission_suggestions`, которые он получил, как свой собственный вывод `updatedPermissions`.2120Хук может вернуть одно из полученных `permission_suggestions` в качестве собственного вывода `updatedPermissions`.
2119 2121
2120<h3 id="posttooluse">2122<h3 id="posttooluse">
2121 PostToolUse2123 PostToolUse
2123 2125
2124Запускается сразу после успешного завершения инструмента.2126Запускается сразу после успешного завершения инструмента.
2125 2127
2126Совпадает с именем инструмента, те же значения, что и PreToolUse.2128Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2127 2129
2128Совпадайте более широко, когда имя инструмента не является правильным фильтром:2130Используйте более широкое сопоставление, когда имя инструмента не подходит в качестве фильтра:
2129 2131
2130* Чтобы запустить hook после завершения любого инструмента успешно, опустите `matcher` или установите его на `"*"`. Ваш hook затем может обнаружить, что изменилось сам, например, запустив `git status --porcelain`, который также перечисляет неотслеживаемые файлы, которые `git diff` пропускает. Для вызовов инструментов, которые не удаются, добавьте тот же hook под [PostToolUseFailure](#posttoolusefailure).2132* Чтобы запускать хук после успешного завершения любого инструмента, опустите `matcher` или задайте ему значение `"*"`. Тогда ваш хук сможет сам определить, что изменилось, например выполнив `git status --porcelain`, который также показывает неотслеживаемые файлы, пропускаемые `git diff`. Для вызовов инструментов, завершившихся сбоем, добавьте тот же хук в [PostToolUseFailure](#posttoolusefailure).
2131* Чтобы запустить hook, когда определенный файл изменяется на диске, независимо от того, что его написало, используйте [FileChanged](#filechanged). Claude Code не запускает hook `PostToolUse`, соответствующий `Edit|Write`, когда команда `Bash` или процесс вне Claude Code переписывает тот же файл.2133* Чтобы запускать хук при изменении определённого файла на диске, независимо от того, что его записало, используйте [FileChanged](#filechanged). Claude Code не запускает хук `PostToolUse`, сопоставленный с `Edit|Write`, когда тот же файл перезаписывает команда `Bash` или процесс вне Claude Code.
2132 2134
2133<h4 id="posttooluse-input">2135<h4 id="posttooluse-input">
2134 PostToolUse input2136 Входные данные PostToolUse
2135</h4>2137</h4>
2136 2138
2137Hooks `PostToolUse` срабатывают после того, как инструмент уже выполнился успешно. Ввод включает как `tool_input`, аргументы, отправленные инструменту, так и `tool_response`, результат, который он вернул. Точная схема для обоих зависит от инструмента. Пути инструментов файлов `tool_input` прибывают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с собственными разделителями платформы, поэтому обратные косые черты на Windows. Для инструмента MCP ввод также несет объект [`mcp_server`](#pretooluse-input).2139Хуки `PostToolUse` срабатывают после того, как инструмент уже успешно выполнился. Входные данные включают как `tool_input` — аргументы, переданные инструменту, так и `tool_response` — возвращённый им результат. Точная схема обоих зависит от инструмента. Пути в `tool_input` файловых инструментов поступают в том же формате, что и для [PreToolUse](#pretooluse-input): всегда абсолютные, с нативными разделителями платформы, то есть с обратными слешами в Windows. Для MCP-инструмента входные данные также содержат объект [`mcp_server`](#pretooluse-input).
2138 2140
2139```json theme={null}2141```json theme={null}
2140{2142{
2159 2161
2160| Поле | Описание |2162| Поле | Описание |
2161| :- | :- |2163| :- | :- |
2162| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2164| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |
2163 2165
2164<h4 id="posttooluse-decision-control">2166<h4 id="posttooluse-decision-control">
2165 Управление решениями PostToolUse2167 Управление решениями PostToolUse
2166</h4>2168</h4>
2167 2169
2168Hooks `PostToolUse` могут предоставить обратную связь Claude после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2170Хуки `PostToolUse` могут передавать Claude обратную связь после выполнения инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2169 2171
2170| Поле | Описание |2172| Поле | Описание |
2171| :- | :- |2173| :- | :- |
2172| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude все еще видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |2174| `decision` | `"block"` добавляет `reason` рядом с результатом инструмента. Claude по-прежнему видит исходный вывод; чтобы заменить его, используйте `updatedToolOutput` |
2173| `reason` | Объяснение, показанное Claude, когда `decision` — это `"block"` |2175| `reason` | Пояснение, показываемое Claude, когда `decision` равно `"block"` |
2174| `additionalContext` | Строка, добавленная в контекст Claude рядом с результатом инструмента. См. [Add context for Claude](#add-context-for-claude) |2176| `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 или позже |2177| `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. Значение должно совпадать с формой вывода инструмента |2178| `updatedToolOutput` | Заменяет вывод инструмента указанным значением перед отправкой Claude. Значение должно соответствовать форме вывода инструмента |
2177| `updatedMCPToolOutput` | Заменяет вывод для [инструментов MCP](#match-mcp-tools) только. Предпочитайте `updatedToolOutput`, который работает для всех инструментов |2179| `updatedMCPToolOutput` | Заменяет вывод только для [MCP-инструментов](#match-mcp-tools). Предпочтительнее использовать `updatedToolOutput`, который работает для всех инструментов |
2178 2180
2179Пример ниже заменяет вывод вызова `Bash`. Значение замены совпадает с формой вывода инструмента `Bash`:2181Пример ниже заменяет вывод вызова `Bash`. Значение замены соответствует форме вывода инструмента `Bash`:
2180 2182
2181```json theme={null}2183```json theme={null}
2182{2184{
2194```2196```
2195 2197
2196<Warning>2198<Warning>
2197 `updatedToolOutput` только изменяет то, что видит Claude. Инструмент уже выполнился к моменту срабатывания hook, поэтому любые написанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, такая как spans инструментов OpenTelemetry и события аналитики, также захватывает исходный вывод перед выполнением hook. Чтобы предотвратить или изменить вызов инструмента перед его выполнением, используйте hook [PreToolUse](#pretooluse) вместо этого.2199 `updatedToolOutput` изменяет только то, что видит Claude. К моменту срабатывания хука инструмент уже выполнился, поэтому все записанные файлы, выполненные команды или отправленные сетевые запросы уже вступили в силу. Телеметрия, например спаны инструментов OpenTelemetry и аналитические события, также фиксирует исходный вывод до запуска хука. Чтобы предотвратить или изменить вызов инструмента до его выполнения, используйте вместо этого хук [PreToolUse](#pretooluse).
2198 2200
2199 Значение замены должно совпадать с формой вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, которое не совпадает со схемой вывода инструмента, игнорируется и используется исходный вывод. Вывод инструмента MCP передается без проверки схемы. Удаление деталей ошибок, которые нужны Claude, может привести к тому, что он продолжит с ложным предположением.2201 Значение замены должно соответствовать форме вывода инструмента. Встроенные инструменты возвращают структурированные объекты, а не простые строки. Например, `Bash` возвращает объект с полями `stdout`, `stderr`, `interrupted` и `isImage`. Для встроенных инструментов значение, не соответствующее схеме вывода инструмента, игнорируется, и используется исходный вывод. Вывод MCP-инструментов передаётся без проверки схемы. Удаление сведений об ошибках, которые нужны Claude, может привести к тому, что он продолжит работу на основе ложного предположения.
2200</Warning>2202</Warning>
2201 2203
2202<h4 id="annotate-a-result-for-the-auto-mode-classifier">2204<h4 id="annotate-a-result-for-the-auto-mode-classifier">
2203 Annotate a result for the auto mode classifier2205 Аннотирование результата для классификатора авторежима
2204</h4>2206</h4>
2205 2207
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 или позже.2208Верните `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 2209
2208Пример ниже говорит классификатору, откуда пришел вывод запроса:2210Пример ниже сообщает классификатору, откуда взялся вывод запроса:
2209 2211
2210```json theme={null}2212```json theme={null}
2211{2213{
2216}2218}
2217```2219```
2218 2220
2219Сколько веса классификатор дает заметке, зависит от того, где вы настроили hook:2221Какой вес классификатор придаёт заметке, зависит от того, где вы настроили хук:
2220 2222
2221* **Hooks, настроенные в Claude Code**: для hooks из файлов параметров, plugins, skills и frontmatter агента классификатор рассматривает заметку как непроверенный, предоставленный приложением контекст. Заметка никогда не устанавливает намерение пользователя, и если она утверждает, что вы одобрили или запросили что-то, классификатор проверяет это утверждение против ваших собственных сообщений в разговоре2223* **Хуки, настроенные в Claude Code**: для хуков из файлов настроек, плагинов, скиллов и frontmatter агентов классификатор рассматривает заметку как непроверенный контекст, предоставленный приложением. Заметка никогда не устанавливает намерение пользователя, и если в ней утверждается, что вы что-то одобрили или запросили, классификатор сверяет это утверждение с вашими собственными сообщениями в диалоге
2222* **In-process callbacks Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует hook как [callback TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время живого сеанса, классификатор может взвесить утверждение пользователя, переданное в заметке, как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из сообщения, которое вы отправляете, но оно никогда не снимает блокировку, которую ваше собственное сообщение не могло бы снять. После возобновления сеанса Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда hooks из обеих групп аннотируют один вызов, классификатор рассматривает объединенную заметку как непроверенный контекст2224* **Внутрипроцессные колбэки Agent SDK**: когда приложение, встраивающее Claude Code, регистрирует хук как [колбэк TypeScript SDK](/docs/ru/agent-sdk/hooks) и возвращает заметку во время активной сессии, классификатор может учитывать переданное в заметке утверждение пользователя как намерение пользователя. Такое утверждение может удовлетворить требование согласия, которое классификатор принял бы из отправленного вами сообщения, но оно никогда не снимает блокировку, которую не смогло бы снять и ваше собственное сообщение. После возобновления сессии Claude Code рассматривает восстановленные заметки как непроверенный контекст. Когда хуки из обеих групп аннотируют один и тот же вызов, классификатор рассматривает объединённую заметку как непроверенную
2223 2225
2224Claude Code применяет эти ограничения при доставке заметки:2226Claude Code применяет следующие ограничения при доставке заметки:
2225 2227
2226* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2000 символами и усекает остальное. Ограничение делится между каждым hook, который отвечает на этот вызов2228* **Длина**: Claude Code ограничивает заметки для одного вызова инструмента 2 000 символами и обрезает остальное. Ограничение общее для всех хуков, отвечающих на этот вызов
2227* **Только синхронные ответы**: Claude Code игнорирует поле в ответе hook, который [выполняется в фоне](#run-hooks-in-the-background), потому что этот ответ прибывает после того, как Claude Code записывает результат инструмента2229* **Только синхронные ответы**: Claude Code игнорирует это поле в ответе хука, который [выполняется в фоне](#run-hooks-in-the-background), поскольку такой ответ приходит после того, как Claude Code записывает результат инструмента
2228* **Вызовы, которые классификатор не записывает**: транскрипт классификатора опускает поиски только для чтения, такие как чтение файлов и поиски. Claude Code отбрасывает заметку, прикрепленную к одному из этих вызовов2230* **Вызовы, которые классификатор не записывает**: транскрипт классификатора не включает операции только для чтения, такие как чтение файлов и поиск. Claude Code отбрасывает заметку, прикреплённую к одному из таких вызовов
2229* **Взаимодействие с переписыванием**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе hook. Claude Code отбрасывает заметку, если это переписывание отклонено или переписывание другого hook заменяет его. Claude Code доставляет заметку, которую вы возвращаете без переписывания, даже когда другой hook переписывает вывод2231* **Взаимодействие с перезаписью**: когда заметка описывает вывод, который вы заменяете с помощью `updatedToolOutput`, верните оба поля в одном ответе хука. Claude Code отбрасывает заметку, если эта перезапись отклонена или её заменяет перезапись другого хука. Claude Code доставляет заметку, возвращённую без перезаписи, даже когда другой хук перезаписывает вывод
2230 2232
2231<Warning>2233<Warning>
2232 Классификатор читает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, размещающего сеанс, поэтому не копируйте в него ненадежный вывод инструмента или текст третьих сторон. Держите заметку к краткому утверждению об этом одном вызове, такому как факт о его происхождении или утверждение пользователя об этом; не используйте поле для доставки несвязанных сообщений или потока событий.2234 Классификатор воспринимает содержимое, которое вы помещаете в `classifierContext`, как информацию от приложения, в котором размещена сессия, поэтому не копируйте в него недоверенный вывод инструментов или сторонний текст. Ограничьте заметку коротким утверждением об этом конкретном вызове, например фактом о его происхождении или утверждением пользователя о нём; не используйте это поле для доставки несвязанных сообщений или потока событий.
2233</Warning>2235</Warning>
2234 2236
2235<h3 id="posttoolusefailure">2237<h3 id="posttoolusefailure">
2236 PostToolUseFailure2238 PostToolUseFailure
2237</h3>2239</h3>
2238 2240
2239Запускается, когда инструмент, который начал выполняться, не удается: инструмент выбросил ошибку или инструмент MCP вернул результат ошибки. Используйте это для логирования сбоев, отправки оповещений или предоставления исправляющей обратной связи Claude.2241Запускается, когда инструмент, начавший выполнение, завершается сбоем: инструмент выбросил ошибку или MCP-инструмент вернул результат с ошибкой. Используйте его для записи сбоев в лог, отправки оповещений или передачи Claude корректирующей обратной связи.
2240 2242
2241Совпадает с именем инструмента, те же значения, что и PreToolUse.2243Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2242 2244
2243<Note>2245<Note>
2244 Это событие не срабатывает для вызовов инструментов, отклоненных перед выполнением: неизвестное название инструмента, ввод, который не проходит проверку схемы или инструмента, или отказ в разрешении. Отказы в проверке возвращаются как результаты `tool_use_error` и происходят перед выполнением hooks, поэтому они не срабатывают ни `PreToolUse`, ни этим событием. Отказы в разрешении срабатывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).2246 Это событие не срабатывает для вызовов инструментов, отклонённых до выполнения: неизвестное имя инструмента, входные данные, не прошедшие проверку схемы или специфичную для инструмента проверку, или отказ в разрешении. Отклонения при проверке возвращаются как результаты `tool_use_error` и происходят до запуска хуков, поэтому они не вызывают ни `PreToolUse`, ни `PostToolUseFailure`. Отказы в разрешении вызывают `PreToolUse`, но не это событие; см. [PermissionDenied](#permissiondenied).
2245</Note>2247</Note>
2246 2248
2247<h4 id="posttoolusefailure-input">2249<h4 id="posttoolusefailure-input">
2248 PostToolUseFailure input2250 Входные данные PostToolUseFailure
2249</h4>2251</h4>
2250 2252
2251Hooks PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, вместе с информацией об ошибке как полями верхнего уровня. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может доставить:2253Хуки PostToolUseFailure получают те же поля `tool_name` и `tool_input`, что и PostToolUse, а также информацию об ошибке в виде полей верхнего уровня. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input). Например, неудачная команда `npm test` может передать:
2252 2254
2253```json theme={null}2255```json theme={null}
2254{2256{
2271 2273
2272| Поле | Описание |2274| Поле | Описание |
2273| :- | :- |2275| :- | :- |
2274| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, который не удался |2276| `error` | Строка, описывающая, что пошло не так. Формат зависит от инструмента, завершившегося сбоем |
2275| `is_interrupt` | Опциональное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, которую сообщил инструмент. Отмена выполняющегося инструмента не срабатывает этим hook; результат инструмента несет сообщение прерывания вместо этого |2277| `is_interrupt` | Необязательное логическое значение. True, когда сбой достиг Claude Code как прерывание, а не как ошибка, о которой сообщил инструмент. Отмена выполняющегося инструмента не вызывает этот хук; вместо этого результат инструмента содержит сообщение о прерывании |
2276| `duration_ms` | Опциональный. Время выполнения инструмента в миллисекундах. Исключает время, потраченное на подсказки разрешений и hooks PreToolUse |2278| `duration_ms` | Необязательное. Время выполнения инструмента в миллисекундах. Не включает время, проведённое в запросах разрешений и хуках PreToolUse |
2277 2279
2278Строка `error` обычно является тем же текстом, который Claude получает как результат неудачного инструмента. Его формат варьируется по инструменту и сбою. Ключ вашего hook на `tool_name`, `is_interrupt` и первой строке `Exit code N`; рассматривайте остальную строку как текст отображения, а не стабильный формат.2280Строка `error` обычно совпадает с текстом, который Claude получает в качестве результата неудавшегося инструмента. Её формат зависит от инструмента и сбоя. Ориентируйте хук на `tool_name`, `is_interrupt` и первую строку `Exit code N`; остальную часть строки рассматривайте как отображаемый текст, а не как стабильный формат.
2279 2281
2280* Для Bash и PowerShell команда, которая выполнилась и вышла, создает первую строку `Exit code N`, затем любой вывод, который команда создала, как один блок с stdout и stderr перемешанными2282* Для Bash и PowerShell команда, которая выполнилась и завершилась, даёт первую строку `Exit code N`, а затем весь вывод команды одним блоком с чередующимися stdout и stderr
2281* Полезная нагрузка также может нести сообщение об ошибке без строки кода выхода, когда Claude Code не мог запустить сам процесс оболочки2283* Данные события также могут содержать простое сообщение о сбое без строки с кодом выхода, когда Claude Code не смог запустить сам процесс оболочки
2282* Claude Code усекает длинные строки в середине вокруг маркера `... [N characters truncated] ...` и может вставлять свои собственные строки, такие как `Command timed out after 2m 0s`2284* Claude Code обрезает длинные строки посередине вокруг маркера `... [N characters truncated] ...` и может вставлять собственные строки, например `Command timed out after 2m 0s`
2283 2285
2284<h4 id="posttoolusefailure-decision-control">2286<h4 id="posttoolusefailure-decision-control">
2285 Управление решениями PostToolUseFailure2287 Управление решениями PostToolUseFailure
2286</h4>2288</h4>
2287 2289
2288Hooks `PostToolUseFailure` могут предоставить контекст Claude после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2290Хуки `PostToolUseFailure` могут передавать Claude контекст после сбоя инструмента. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2289 2291
2290| Поле | Описание |2292| Поле | Описание |
2291| :- | :- |2293| :- | :- |
2292| `additionalContext` | Строка, добавленная в контекст Claude рядом с ошибкой. См. [Add context for Claude](#add-context-for-claude) |2294| `additionalContext` | Строка, добавляемая в контекст Claude вместе с ошибкой. См. [Добавление контекста для Claude](#add-context-for-claude) |
2293 2295
2294```json theme={null}2296```json theme={null}
2295{2297{
2304 PostToolBatch2306 PostToolBatch
2305</h3>2307</h3>
2306 2308
2307Запускается один раз после того, как каждый вызов инструмента в партии разрешится, перед отправкой Claude Code следующего запроса модели. `PostToolUse` срабатывает один раз для каждого инструмента, что означает, что он срабатывает одновременно, когда Claude делает параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз со всей партией, поэтому это правильное место для внедрения контекста, который зависит от набора инструментов, которые выполнились, а не от любого одного инструмента. Нет matcher для этого события.2309Запускается один раз после того, как разрешились все вызовы инструментов в пакете, до того как Claude Code отправит следующий запрос модели. `PostToolUse` срабатывает один раз для каждого инструмента, то есть срабатывает параллельно, когда Claude выполняет параллельные вызовы инструментов. `PostToolBatch` срабатывает ровно один раз с полным пакетом, поэтому это подходящее место для внедрения контекста, который зависит от набора выполненных инструментов, а не от какого-то одного инструмента. Для этого события matcher не поддерживается.
2308 2310
2309<h4 id="posttoolbatch-input">2311<h4 id="posttoolbatch-input">
2310 PostToolBatch input2312 Входные данные PostToolBatch
2311</h4>2313</h4>
2312 2314
2313Помимо [общих полей ввода](#common-input-fields), hooks PostToolBatch получают `tool_calls`, массив, описывающий каждый вызов инструмента в партии:2315Помимо [общих входных полей](#common-input-fields), хуки PostToolBatch получают `tool_calls` — массив, описывающий каждый вызов инструмента в пакете:
2314 2316
2315```json theme={null}2317```json theme={null}
2316{2318{
2336}2338}
2337```2339```
2338 2340
2339`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — это сериализованная строка или массив блоков контента, ровно как инструмент выдал его. Для `Read` это означает текст с префиксом номера строки, а не необработанное содержимое файла. Ответы могут быть большими, поэтому анализируйте только нужные вам поля.2341`tool_response` содержит то же содержимое, которое модель получает в соответствующем блоке `tool_result`. Значение — сериализованная строка или массив блоков содержимого, в точности как их выдал инструмент. Для `Read` это означает текст с префиксами номеров строк, а не необработанное содержимое файла. Ответы могут быть большими, поэтому разбирайте только нужные поля.
2340 2342
2341<Note>2343<Note>
2342 Форма `tool_response` отличается от `PostToolUse`. `PostToolUse` передает структурированный объект `Output` инструмента, такой как `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передает сериализованное содержимое `tool_result`, которое видит модель.2344 Форма `tool_response` отличается от формы в `PostToolUse`. `PostToolUse` передаёт структурированный объект `Output` инструмента, например `{filePath: "...", type: "create"}` для `Write`; `PostToolBatch` передаёт сериализованное содержимое `tool_result`, которое видит модель.
2343</Note>2345</Note>
2344 2346
2345<h4 id="posttoolbatch-decision-control">2347<h4 id="posttoolbatch-decision-control">
2346 Управление решениями PostToolBatch2348 Управление решениями PostToolBatch
2347</h4>2349</h4>
2348 2350
2349Hooks `PostToolBatch` могут внедрить контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2351Хуки `PostToolBatch` могут внедрять контекст для Claude. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2350 2352
2351| Поле | Описание |2353| Поле | Описание |
2352| :- | :- |2354| :- | :- |
2353| `additionalContext` | Строка контекста, внедренная один раз перед следующим вызовом модели. См. [Add context for Claude](#add-context-for-claude) для деталей доставки, что в нее поместить и как возобновленные сеансы обрабатывают прошлые значения |2355| `additionalContext` | Строка контекста, внедряемая один раз перед следующим вызовом модели. Подробности доставки, что в неё помещать и как возобновлённые сессии обрабатывают прошлые значения, см. в разделе [Добавление контекста для Claude](#add-context-for-claude) |
2354 2356
2355```json theme={null}2357```json theme={null}
2356{2358{
2361}2363}
2362```2364```
2363 2365
2364Возврат `decision: "block"` или `continue: false` останавливает агентский цикл перед следующим вызовом модели. Сообщение блокировки поступает из JSON `reason` или `stopReason`, или из stderr при выходе 2. Вы видите его как предупреждение в транскрипте, и оно остается в разговоре, поэтому Claude видит его, когда разговор продолжается.2366Возврат `decision: "block"` или `continue: false` останавливает агентный цикл перед следующим вызовом модели. Сообщение о блокировке берётся из JSON-поля `reason` или `stopReason` либо из stderr при коде выхода 2. Вы видите его как предупреждение в транскрипте, и оно остаётся в диалоге, поэтому Claude видит его, когда диалог продолжается.
2365 2367
2366<h3 id="permissiondenied">2368<h3 id="permissiondenied">
2367 PermissionDenied2369 PermissionDenied
2368</h3>2370</h3>
2369 2371
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`. Используйте его для логирования отказов, корректировки конфигурации или сообщения модели, что она может повторить вызов инструмента.2372Запускается, когда [авторежим](/docs/ru/permission-modes#eliminate-prompts-with-auto-mode) отклоняет вызов инструмента, в том числе когда он отклоняет вызов без вердикта классификатора, потому что [проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action) или его ответ не удалось разобрать. Этот хук срабатывает только в авторежиме: он не запускается, когда вы вручную отклоняете диалоговое окно разрешения, когда хук `PreToolUse` блокирует вызов или когда срабатывает правило `deny`. Используйте его для записи отказов в лог, корректировки конфигурации или сообщения модели, что она может повторить попытку вызова инструмента.
2371 2373
2372Совпадает с именем инструмента, те же значения, что и PreToolUse.2374Сопоставляется по имени инструмента, значения те же, что и для PreToolUse.
2373 2375
2374<h4 id="permissiondenied-input">2376<h4 id="permissiondenied-input">
2375 PermissionDenied input2377 Входные данные PermissionDenied
2376</h4>2378</h4>
2377 2379
2378Помимо [общих полей ввода](#common-input-fields), hooks PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для инструмента MCP они также получают объект [`mcp_server`](#pretooluse-input).2380Помимо [общих входных полей](#common-input-fields), хуки PermissionDenied получают `tool_name`, `tool_input`, `tool_use_id` и `reason`. Для MCP-инструмента они также получают объект [`mcp_server`](#pretooluse-input).
2379 2381
2380```json theme={null}2382```json theme={null}
2381{2383{
2396 2398
2397| Поле | Описание |2399| Поле | Описание |
2398| :- | :- |2400| :- | :- |
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` |2401| `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 2402
2401<h4 id="permissiondenied-decision-control">2403<h4 id="permissiondenied-decision-control">
2402 Управление решениями PermissionDenied2404 Управление решениями PermissionDenied
2403</h4>2405</h4>
2404 2406
2405Hooks PermissionDenied могут сказать модели, что она может повторить отклоненный вызов инструмента. Верните объект JSON с `hookSpecificOutput.retry`, установленным на `true`:2407Хуки PermissionDenied могут сообщить модели, что она может повторить попытку отклонённого вызова инструмента. Верните JSON-объект с `hookSpecificOutput.retry`, равным `true`:
2406 2408
2407```json theme={null}2409```json theme={null}
2408{2410{
2413}2415}
2414```2416```
2415 2417
2416Когда `retry` имеет значение `true`, Claude Code добавляет сообщение в разговор, говорящее модели, что она может повторить вызов инструмента. Claude Code не отменяет сам отказ. Если ваш hook не возвращает JSON или возвращает `retry: false`, отказ остается и модель получает исходное сообщение отказа.2418Когда `retry` равно `true`, Claude Code добавляет в диалог сообщение, сообщающее модели, что она может повторить попытку вызова инструмента. Сам отказ Claude Code не отменяет. Если ваш хук не возвращает JSON или возвращает `retry: false`, отказ остаётся в силе, и модель получает исходное сообщение об отклонении.
2417 2419
2418Claude Code игнорирует `retry: true`, когда классификатор создал [отсутствие вердикта на действие](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не был проанализирован или проверка безопасности, отдельная от режима auto, отказала в запросе классификатора. Для этих отказов Claude Code уже говорит модели в сообщении отказа, повторить ли позже или продолжить.2420Claude Code игнорирует `retry: true`, когда классификатор [не вынес вердикта по действию](/docs/ru/errors#auto-mode-cannot-determine-the-safety-of-an-action): его ответ не удалось разобрать, или проверка безопасности, отдельная от авторежима, отклонила собственный запрос классификатора. Для таких отказов Claude Code уже сообщает модели в сообщении об отклонении, следует ли повторить попытку позже или двигаться дальше.
2419 2421
2420<h3 id="notification">2422<h3 id="notification">
2421 Notification2423 Notification
2422</h3>2424</h3>
2423 2425
2424Запускается, когда Claude Code отправляет уведомления. Совпадает с типом уведомления. Опустите matcher для запуска hooks для всех типов уведомлений.2426Запускается, когда Claude Code отправляет уведомления. Сопоставляется по типу уведомления. Опустите matcher, чтобы запускать хуки для всех типов уведомлений.
2425 2427
2426Вы получаете эти события hook даже с отключенными уведомлениями рабочего стола: параметр `preferredNotifChannel`, включая `notifications_disabled`, изменяет только то, как вас оповещают, а не срабатывает ли ваш hook.2428Вы получаете эти события хуков даже при отключённых уведомлениях рабочего стола: настройка `preferredNotifChannel`, включая `notifications_disabled`, меняет только способ оповещения, но не то, запускается ли ваш хук.
2427 2429
2428| Matcher | Когда срабатывает |2430| Matcher | Когда срабатывает |
2429| :- | :- |2431| :- | :- |
2430| `permission_prompt` | Claude нуждается в вашем разрешении на использование инструмента или [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды, и подсказка ждала около шести секунд |2432| `permission_prompt` | Claude нужно, чтобы вы подтвердили использование инструмента или [сетевой запрос](/docs/ru/sandboxing#network-isolation) команды в песочнице, и запрос ожидает около шести секунд |
2431| `idle_prompt` | Claude закончил отвечать около 60 секунд назад и вы не печатали с тех пор |2433| `idle_prompt` | Claude закончил отвечать около 60 секунд назад, и с тех пор вы ничего не вводили |
2432| `auth_success` | Аутентификация завершена |2434| `auth_success` | Аутентификация завершена |
2433| `elicitation_dialog` | Сервер MCP открывает форму запроса и вы не печатали около шести секунд |2435| `elicitation_dialog` | MCP-сервер открывает форму запроса данных, и вы ничего не вводили около шести секунд |
2434| `elicitation_url_dialog` | Сервер MCP просит вас открыть URL браузера и вы не печатали около шести секунд |2436| `elicitation_url_dialog` | MCP-сервер просит вас открыть URL в браузере, и вы ничего не вводили около шести секунд |
2435| `elicitation_complete` | Сервер MCP сообщает, что [URL-режим запроса](#elicitation-input) завершен |2437| `elicitation_complete` | MCP-сервер сообщает, что [запрос данных в режиме URL](#elicitation-input) завершён |
2436| `elicitation_response` | Ответ на запрос MCP отправляется обратно на сервер |2438| `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) и вы не печатали около шести секунд |2439| `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) открыт в терминале |2440| `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) |2441| `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` вместо этого |2442| `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** |2443| `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 2444
2443Типы `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуют Claude Code v2.1.234 или позже.2445Для типов `quota_auto_resume_fired`, `quota_auto_resume_stale` и `quota_auto_resume_disabled` требуется Claude Code v2.1.234 или новее.
2444 2446
2445В сеансах терминала `permission_prompt` для [сетевого запроса](/docs/ru/sandboxing#network-isolation) изолированной команды требует Claude Code v2.1.246 или позже.2447В терминальных сессиях для `permission_prompt` при сетевом запросе команды в песочнице требуется Claude Code v2.1.246 или новее.
2446 2448
2447`agent_needs_input` для вопроса настройки терминала товарища требует Claude Code v2.1.248 или позже.2449Для `agent_needs_input` при вопросе участника команды о настройке терминала требуется Claude Code v2.1.248 или новее.
2448 2450
2449<Note>2451<Note>
2450 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` делят свое время с уведомлениями рабочего стола, поэтому в сеансах терминала вы видите их только, когда вы кажетесь отсутствующим от терминала:2452 Типы `permission_prompt`, `idle_prompt`, `elicitation_dialog` и `elicitation_url_dialog` используют те же тайминги, что и уведомления рабочего стола, поэтому в терминальных сессиях вы видите их, только когда, судя по всему, отошли от терминала:
2451 2453
2452 * Ожидайте `permission_prompt` один раз, когда вы не печатали около шести секунд. Таймер начинается, когда появляется подсказка разрешения, и каждый нажатие клавиши откладывает его. Чтобы запустить hook немедленно, когда Claude просит разрешение на использование инструмента, используйте [PermissionRequest](#permissionrequest) вместо этого.2454 * Ожидайте `permission_prompt`, когда вы ничего не вводили около шести секунд. Таймер запускается при появлении запроса разрешения, и каждое нажатие клавиши откладывает его. Чтобы запускать хук сразу, когда Claude запрашивает разрешение на использование инструмента, используйте вместо этого [PermissionRequest](#permissionrequest).
2453 * Ожидайте `idle_prompt` около 60 секунд после завершения Claude ответа и только, если вы не печатали с тех пор. Claude Code не отправляет `idle_prompt`, пока ждет сброса лимита использования claude.ai. Когда ожидание заканчивается само по себе, один из типов `quota_auto_resume_*` срабатывает вместо этого.2455 * Ожидайте `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`: таймер начинается, когда появляется диалог, и каждый нажатие клавиши откладывает его.2456 * Ожидайте `elicitation_dialog` для формы запроса данных или `elicitation_url_dialog` для запроса URL в браузере, когда вы ничего не вводили около шести секунд. Оба используют тот же шестисекундный порог, что и `permission_prompt`: таймер запускается при появлении диалогового окна, и каждое нажатие клавиши откладывает его.
2455 2457
2456 Запрос разрешения или запрос, который прибывает, пока другой диалог находится на экране, сохраняет один шестисекундный шлюз, рассчитанный с момента прибытия запроса. Его уведомление может достичь вас, пока запрос все еще ждет позади открытого диалога.2458 Запрос разрешения или запрос данных, поступивший, пока на экране открыто другое диалоговое окно, сохраняет тот же шестисекундный порог, отсчитываемый с момента поступления запроса. Уведомление о нём может дойти до вас, пока запрос всё ещё ожидает за открытым диалоговым окном.
2457</Note>2459</Note>
2458 2460
2459Claude Code рассчитывает `permission_prompt` по-другому в сеансах, где он отправляет запросы разрешений на callback `canUseTool` Agent SDK, что является тем, как Claude Desktop и расширение VS Code размещают Claude Code:2461Claude Code иначе рассчитывает время `permission_prompt` в сессиях, где он отправляет запросы разрешений в [колбэк `canUseTool`](/docs/ru/agent-sdk/user-input) Agent SDK — именно так Claude Desktop и расширение VS Code размещают Claude Code:
2460 2462
2461* Ожидайте `permission_prompt` около шести секунд после того, как Claude просит разрешение. Claude Code не откладывает его, пока вы печатаете.2463* Ожидайте `permission_prompt` примерно через шесть секунд после того, как Claude запросит разрешение. Claude Code не откладывает его, пока вы вводите текст.
2462* Если вы или hook [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.2464* Если вы или хук [PermissionRequest](#permissionrequest) ответите раньше, Claude Code не запускает `permission_prompt`.
2463* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) на `1`, чтобы отключить `permission_prompt` в этих сеансах.2465* Установите [`CLAUDE_CODE_DISABLE_PERMISSION_PROMPT_NOTIFY_HOOKS`](/docs/ru/env-vars) в `1`, чтобы отключить `permission_prompt` в таких сессиях.
2464 2466
2465До версии 2.1.233 `permission_prompt` не срабатывал в этих сеансах.2467До v2.1.233 `permission_prompt` в таких сессиях не срабатывал.
2466 2468
2467Используйте отдельные matchers для запуска разных обработчиков в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения, специфичный для разрешения, когда Claude нуждается в одобрении разрешения, и другое уведомление, когда Claude был неактивен:2469Используйте отдельные matcher, чтобы запускать разные обработчики в зависимости от типа уведомления. Эта конфигурация запускает скрипт оповещения о разрешениях, когда Claude нужно подтверждение разрешения, и другое уведомление, когда Claude простаивает:
2468 2470
2469```json theme={null}2471```json theme={null}
2470{2472{
2494```2496```
2495 2497
2496<h4 id="notification-input">2498<h4 id="notification-input">
2497 Notification input2499 Входные данные Notification
2498</h4>2500</h4>
2499 2501
2500Помимо [общих полей ввода](#common-input-fields), hooks Notification получают `message` с текстом уведомления, опциональный `title` и `notification_type`, указывающий, какой тип срабатывает.2502Помимо [общих входных полей](#common-input-fields), хуки Notification получают `message` с текстом уведомления, необязательное `title` и `notification_type`, указывающее, какой тип сработал.
2501 2503
2502```json theme={null}2504```json theme={null}
2503{2505{
2511}2513}
2512```2514```
2513 2515
2514Hooks Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но все еще выдает [`terminalSequence`](#emit-terminal-notifications), на которое полагается пример уведомления рабочего стола. Hooks Notification предназначены для побочных эффектов, таких как пересылка уведомления во внешний сервис.2516Хуки Notification не могут блокировать или изменять уведомления. Claude Code отбрасывает их поля `systemMessage` и `continue`, но по-прежнему выводит [`terminalSequence`](#emit-terminal-notifications), на чём основан пример уведомления рабочего стола. Хуки Notification предназначены для побочных эффектов, например пересылки уведомления во внешний сервис.
2515 2517
2516<h3 id="subagentstart">2518<h3 id="subagentstart">
2517 SubagentStart2519 SubagentStart
2518</h3>2520</h3>
2519 2521
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 агента, а не имя файла.2522Запускается, когда 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 2523
2522Для подагентов, поставляемых [plugin](/docs/ru/plugins/overview), тип агента — это идентификатор с областью plugin, такой как `my-plugin:reviewer`, а не голое имя frontmatter. Двоеточие помещает имя с областью plugin на путь регулярного выражения, поэтому якорьте matcher с `^` и `$` для точного совпадения: `^my-plugin:reviewer$`.2524Для субагентов, поставляемых [плагином](/docs/ru/plugins/overview), тип агента — это идентификатор с областью плагина, например `my-plugin:reviewer`, а не просто имя из frontmatter. Двоеточие переводит имя с областью плагина на путь регулярных выражений, поэтому для точного совпадения закрепите matcher с помощью `^` и `$`: `^my-plugin:reviewer$`.
2523 2525
2524<h4 id="subagentstart-input">2526<h4 id="subagentstart-input">
2525 SubagentStart input2527 Входные данные SubagentStart
2526</h4>2528</h4>
2527 2529
2528Помимо [общих полей ввода](#common-input-fields), hooks SubagentStart получают `agent_id` с уникальным идентификатором подагента и `agent_type` с именем агента, который matcher фильтрует.2530Помимо [общих входных полей](#common-input-fields), хуки SubagentStart получают `agent_id` с уникальным идентификатором субагента и `agent_type` с именем агента, по которому фильтрует matcher.
2529 2531
2530```json theme={null}2532```json theme={null}
2531{2533{
2538}2540}
2539```2541```
2540 2542
2541Hooks SubagentStart не могут блокировать создание подагента, но они могут внедрить контекст в подагента. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:2543Хуки SubagentStart не могут блокировать создание субагента, но могут внедрять в него контекст. Помимо [полей вывода JSON](#json-output), доступных всем хукам, вы можете вернуть:
2542 2544
2543| Поле | Описание |2545| Поле | Описание |
2544| :- | :- |2546| :- | :- |
2545| `additionalContext` | Строка, добавленная в контекст подагента в начале его разговора, перед его первой подсказкой. См. [Add context for Claude](#add-context-for-claude) |2547| `additionalContext` | Строка, добавляемая в контекст субагента в начале его диалога, перед первым промптом. См. [Добавление контекста для Claude](#add-context-for-claude) |
2546 2548
2547```json theme={null}2549```json theme={null}
2548{2550{
2553}2555}
2554```2556```
2555 2557
2556Когда hook запускается снова для того же подагента, Claude Code внедряет возвращенный контекст только, когда контекст подагента уже не содержит копию из более раннего запуска. Копия, внедренная при запуске, остается на месте, оставляя [кэш подсказок](/docs/ru/prompt-caching#subagents-and-the-cache) подагента нетронутым. После [автоматического сжатия](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code внедряет контекст следующего запуска снова.2558Когда хук снова запускается для того же субагента, Claude Code внедряет возвращённый контекст, только если контекст субагента ещё не содержит копию из предыдущего запуска. Копия, внедрённая при запуске, остаётся на месте, сохраняя [кэш промптов](/docs/ru/prompt-caching#subagents-and-the-cache) субагента нетронутым. После того как [автосжатие](/docs/ru/sub-agents#auto-compaction) отбрасывает эту копию, Claude Code снова внедряет контекст следующего запуска.
2557 2559
2558<h3 id="subagentstop">2560<h3 id="subagentstop">
2559 SubagentStop2561 SubagentStop
2560</h3>2562</h3>
2561 2563
2562Запускается, когда подагент Claude Code закончил отвечать. Совпадает с типом агента, те же значения, что и SubagentStart.2564Запускается, когда субагент Claude Code закончил отвечать. Сопоставляется по типу агента, значения те же, что и для SubagentStart.
2563 2565
2564<h4 id="subagentstop-input">2566<h4 id="subagentstop-input">
2565 SubagentStop input2567 Входные данные SubagentStop
2566</h4>2568</h4>
2567 2569
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 могут получить доступ к нему без анализа файла транскрипта.2570Помимо [общих входных полей](#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 2571
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), и пустая строка, когда сеанс запускается без одного.2572Не каждое событие 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 2573
2572`matcher`, который называет типы агентов, не совпадает с пустым `agent_type`. Hook, чей matcher опущен, `""` или `"*"`, или является регулярным выражением, которое совпадает с пустой строкой, запускается для событий с пустым `agent_type` тоже.2574`matcher`, называющий типы агентов, не совпадает с пустым `agent_type`. Хук, у которого matcher опущен, равен `""` или `"*"` либо является регулярным выражением, совпадающим с пустой строкой, запускается и для событий с пустым `agent_type`.
2573 2575
2574На Claude Code v2.1.271 или позже подагент, который выполняется с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчет через этот инструмент перед остановкой. Поле `last_assistant_message` затем содержит закрывающий текст подагента, если есть, который не является доставленным отчетом. Отчет — это ввод `message` этого вызова, который hook `PreToolUse` или `PostToolUse`, соответствующий `SubagentHandback`, получает как `tool_input.message`.2576В Claude Code v2.1.271 или новее субагент, работающий с инструментом [`SubagentHandback`](/docs/ru/tools-reference), доставляет свой отчёт через этот инструмент перед остановкой. Тогда поле `last_assistant_message` содержит заключительный текст субагента, если он есть, который не является доставленным отчётом. Отчёт — это входное значение `message` этого вызова, которое хук `PreToolUse` или `PostToolUse`, сопоставленный с `SubagentHandback`, получает как `tool_input.message`.
2575 2577
2576Hooks SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в [Stop input](#stop-input). Оба массива ограничены родительским сеансом, а не подагентом.2578Хуки SubagentStop также получают массивы `background_tasks` и `session_crons`, описанные в разделе [Входные данные Stop](#stop-input). Оба массива относятся к родительской сессии, а не к субагенту.
2577 2579
2578```json theme={null}2580```json theme={null}
2579{2581{
2592}2594}
2593```2595```
2594 2596
2595Hooks SubagentStop используют тот же формат управления решениями, что и [hooks Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, установленным на `"SubagentStop"`, для обратной связи без ошибок, которая держит подагента работающим. Возврат `decision: "block"` с `reason` держит подагента работающим и доставляет `reason` подагенту как его следующую инструкцию. Hook, который блокирует выходом 2, доставляет его сообщение stderr так же. Чтобы внедрить контекст в родительский сеанс после возврата подагента, используйте hook [`PostToolUse`](#posttooluse) на инструменте `Agent` вместо этого.2597Хуки SubagentStop используют тот же формат управления решениями, что и [хуки Stop](#stop-decision-control), включая `hookSpecificOutput.additionalContext` с `hookEventName`, равным `"SubagentStop"`, для обратной связи без ошибки, которая продолжает работу субагента. Возврат `decision: "block"` с `reason` продолжает работу субагента и доставляет `reason` субагенту в качестве следующей инструкции. Хук, который блокирует с кодом выхода 2, доставляет своё сообщение stderr тем же способом. Чтобы внедрить контекст в родительскую сессию после возврата субагента, используйте вместо этого хук [`PostToolUse`](#posttooluse) для инструмента `Agent`.
2596 2598
2597<h3 id="taskcreated">2599<h3 id="taskcreated">
2598 TaskCreated2600 TaskCreated
2599</h3>2601</h3>
2600 2602
2601Запускается, когда задача создается через инструмент `TaskCreate`. Используйте это для обеспечения соглашений об именовании, требования описаний задач или предотвращения создания определенных задач. В [сеансе без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.2603Запускается, когда задача создаётся с помощью инструмента `TaskCreate`. Используйте его для соблюдения соглашений об именовании, обязательного указания описаний задач или предотвращения создания определённых задач. В [сессии без инструментов Task](/docs/ru/tools-reference#task-tool-availability) это событие не срабатывает.
2602 2604
2603Hooks TaskCreated не поддерживают matchers и срабатывают при каждом возникновении.2605Хуки TaskCreated не поддерживают matcher и срабатывают при каждом возникновении события.
2604 2606
2605<h4 id="taskcreated-input">2607<h4 id="taskcreated-input">
2606 TaskCreated input2608 Входные данные TaskCreated
2607</h4>2609</h4>
2608 2610
2609Помимо [общих полей ввода](#common-input-fields), hooks TaskCreated получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2611Помимо [общих входных полей](#common-input-fields), хуки TaskCreated получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.
2610 2612
2611```json theme={null}2613```json theme={null}
2612{2614{
2625| Поле | Описание |2627| Поле | Описание |
2626| :- | :- |2628| :- | :- |
2627| `task_id` | Идентификатор создаваемой задачи |2629| `task_id` | Идентификатор создаваемой задачи |
2628| `task_subject` | Название задачи |2630| `task_subject` | Заголовок задачи |
2629| `task_description` | Подробное описание задачи. Может отсутствовать |2631| `task_description` | Подробное описание задачи. Может отсутствовать |
2630| `teammate_name` | Имя товарища, создающего задачу. Может отсутствовать |2632| `teammate_name` | Имя участника команды, создающего задачу. Может отсутствовать |
2631| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2633| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2632 2634
2633<h4 id="taskcreated-decision-control">2635<h4 id="taskcreated-decision-control">
2634 Управление решениями TaskCreated2636 Управление решениями TaskCreated
2635</h4>2637</h4>
2636 2638
2637Hook TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude как ошибку инструмента. Claude Code игнорирует `continue: false` из этого события и Claude продолжает работать.2639Хук TaskCreated может заблокировать создание двумя способами. В любом случае Claude Code удаляет задачу и возвращает ваше сообщение Claude в качестве ошибки инструмента. Claude Code игнорирует `continue: false` от этого события, и Claude продолжает работу.
2638 2640
2639* **Код выхода 2**: Claude Code возвращает текст stderr как сообщение.2641* **Код выхода 2**: Claude Code возвращает текст stderr в качестве сообщения.
2640* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` как сообщение.2642* **JSON `{"decision": "block", "reason": "..."}`**: Claude Code возвращает `reason` в качестве сообщения.
2641 2643
2642Этот пример блокирует задачи, чьи названия не следуют требуемому формату:2644Этот пример блокирует задачи, заголовки которых не соответствуют требуемому формату:
2643 2645
2644```bash theme={null}2646```bash theme={null}
2645#!/bin/bash2647#!/bin/bash
2658 TaskCompleted2660 TaskCompleted
2659</h3>2661</h3>
2660 2662
2661Запускается, когда задача отмечается как завершенная. Это срабатывает в двух ситуациях: когда любой агент явно отмечает задачу как завершенную через инструмент TaskUpdate или когда товарищ [команды агентов](/docs/ru/agent-teams) завершает свой ход с выполняющимися задачами. Используйте это для обеспечения критериев завершения, таких как прохождение тестов или проверок lint перед закрытием задачи.2663Запускается, когда задача помечается как выполненная. Это происходит в двух ситуациях: когда любой агент явно помечает задачу как выполненную с помощью инструмента TaskUpdate или когда участник [команды агентов](/docs/ru/agent-teams) завершает свой ход с задачами в процессе выполнения. Используйте его для соблюдения критериев завершения, таких как прохождение тестов или проверок линтера, прежде чем задачу можно будет закрыть.
2662 2664
2663Hooks TaskCompleted не поддерживают matchers и срабатывают при каждом возникновении.2665Хуки TaskCompleted не поддерживают matcher и срабатывают при каждом возникновении события.
2664 2666
2665<h4 id="taskcompleted-input">2667<h4 id="taskcompleted-input">
2666 TaskCompleted input2668 Входные данные TaskCompleted
2667</h4>2669</h4>
2668 2670
2669Помимо [общих полей ввода](#common-input-fields), hooks TaskCompleted получают `task_id`, `task_subject` и опционально `task_description`, `teammate_name` и `team_name`.2671Помимо [общих входных полей](#common-input-fields), хуки TaskCompleted получают `task_id`, `task_subject` и, необязательно, `task_description`, `teammate_name` и `team_name`.
2670 2672
2671```json theme={null}2673```json theme={null}
2672{2674{
2686| Поле | Описание |2688| Поле | Описание |
2687| :- | :- |2689| :- | :- |
2688| `task_id` | Идентификатор завершаемой задачи |2690| `task_id` | Идентификатор завершаемой задачи |
2689| `task_subject` | Название задачи |2691| `task_subject` | Заголовок задачи |
2690| `task_description` | Подробное описание задачи. Может отсутствовать |2692| `task_description` | Подробное описание задачи. Может отсутствовать |
2691| `teammate_name` | Имя товарища, завершающего задачу. Может отсутствовать |2693| `teammate_name` | Имя участника команды, завершающего задачу. Может отсутствовать |
2692| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2694| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2693 2695
2694<h4 id="taskcompleted-decision-control">2696<h4 id="taskcompleted-decision-control">
2695 Управление решениями TaskCompleted2697 Управление решениями TaskCompleted
2696</h4>2698</h4>
2697 2699
2698Hooks TaskCompleted поддерживают два способа управления завершением задачи:2700Хуки TaskCompleted поддерживают два способа управления завершением задачи:
2699 2701
2700* **Код выхода 2**: задача не отмечается как завершенная и сообщение stderr передается обратно модели как обратная связь.2702* **Код выхода 2**: задача не помечается как выполненная, а сообщение stderr передаётся модели в качестве обратной связи.
2701* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие запустил товарищ, завершающий свой ход, полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю. Когда событие запустил инструмент `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 все еще блокирует завершение.2703* **JSON `{"continue": false, "stopReason": "..."}`**: когда событие вызвано завершением хода участника команды, полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю. Когда событие вызвано инструментом `TaskUpdate`, Claude Code игнорирует `continue: false`; код выхода 2 по-прежнему блокирует завершение.
2702 2704
2703Этот пример запускает тесты и блокирует завершение задачи, если они не удаются:2705Этот пример запускает тесты и блокирует завершение задачи, если они не проходят:
2704 2706
2705```bash theme={null}2707```bash theme={null}
2706#!/bin/bash2708#!/bin/bash
2720 Stop2722 Stop
2721</h3>2723</h3>
2722 2724
2723Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если остановка произошла из-за прерывания пользователем. Ошибки API запускают [StopFailure](#stopfailure) вместо этого.2725Запускается, когда основной агент Claude Code закончил отвечать. Не запускается, если
2726остановка произошла из-за прерывания пользователем. При ошибках API вместо этого
2727срабатывает [StopFailure](#stopfailure).
2724 2728
2725<Tip>2729<Tip>
2726 Команда [`/goal`](/docs/ru/goal) — это встроенный ярлык для hook Stop с областью сеанса на основе подсказки. Используйте его, когда вы хотите, чтобы Claude продолжал работать над условием без написания конфигурации hook.2730 Команда [`/goal`](/docs/ru/goal) — встроенный ярлык для хука Stop на основе промпта с областью действия сессии. Используйте её, когда хотите, чтобы Claude продолжал работать над достижением условия, без написания конфигурации хука.
2727</Tip>2731</Tip>
2728 2732
2729<h4 id="stop-input">2733<h4 id="stop-input">
2730 Stop input2734 Входные данные Stop
2731</h4>2735</h4>
2732 2736
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).2737Помимо [общих входных полей](#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 2738
2735Поле `last_assistant_message` содержит текстовое содержимое финального ответа Claude, поэтому hooks могут получить доступ к нему без анализа файла транскрипта. Для hooks, которые действуют на только что завершенный ход, такие как hooks чтения вслух или уведомления, используйте это поле, а не читайте `transcript_path`: файл транскрипта не гарантирует включение финального сообщения в момент Stop на всех версиях.2739Поле `last_assistant_message` содержит текстовое содержимое последнего ответа Claude, поэтому хуки могут получить к нему доступ без разбора файла транскрипта. Для хуков, которые действуют по только что завершённому ходу, например хуков чтения вслух или уведомлений, используйте это поле, а не чтение `transcript_path`: не во всех версиях гарантируется, что файл транскрипта содержит последнее сообщение в момент Stop.
2736 2740
2737Массивы `background_tasks` и `session_crons` позволяют hooks различать "сеанс завершен" от "сеанс приостановлен в ожидании фоновой работы для его пробуждения". Оба массива присутствуют, когда реестр задач доступен и пусты, когда ничего не выполняется или не запланировано.2741Массивы `background_tasks` и `session_crons` позволяют хукам отличать «сессия завершена» от «сессия приостановлена в ожидании, пока фоновая работа снова её разбудит». Оба массива присутствуют, когда реестр задач доступен, и пусты, когда ничего не выполняется и не запланировано.
2738 2742
2739Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует эти поля:2743Каждая запись в `background_tasks` описывает одну выполняющуюся задачу и использует следующие поля:
2740 2744
2741| Поле | Описание |2745| Поле | Описание |
2742| :- | :- |2746| :- | :- |
2743| `id` | Идентификатор задачи |2747| `id` | Идентификатор задачи |
2744| `type` | Дружественный ярлык типа задачи, такой как `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждый ярлык определяет, какая функция Claude Code создала задачу. Возвращается к необработанному дискриминанту для неизвестных типов |2748| `type` | Понятная метка типа задачи, например `shell`, `subagent`, `monitor`, `workflow`, `teammate`, `cloud session` или `MCP task`. Каждая метка указывает, какая функция Claude Code создала задачу. Для нераспознанных типов используется необработанный дискриминант |
2745| `status` | Текущий статус задачи |2749| `status` | Текущий статус задачи |
2746| `description` | Описание в свободной форме, ограниченное 1000 символами с маркером `… [+N chars]` в строке при обрезании |2750| `description` | Произвольное текстовое описание, ограниченное 1000 символами, с маркером `… [+N chars]` внутри строки при обрезке |
2747| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |2751| `command` | Командная строка оболочки, ограниченная 1000 символами. Присутствует только для задач `shell` |
2748| `agent_type` | Имя типа подагента. Присутствует только для задач `subagent` |2752| `agent_type` | Имя типа субагента. Присутствует только для задач `subagent` |
2749| `server` | Имя сервера MCP. Присутствует только для задач `monitor` и `MCP task` |2753| `server` | Имя MCP-сервера. Присутствует только для задач `monitor` и `MCP task` |
2750| `tool` | Имя инструмента MCP. Присутствует только для задач `monitor` и `MCP task` |2754| `tool` | Имя MCP-инструмента. Присутствует только для задач `monitor` и `MCP task` |
2751| `name` | Имя workflow. Присутствует только для задач `workflow` |2755| `name` | Имя workflow. Присутствует только для задач `workflow` |
2752 2756
2753Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью сеанса, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:2757Каждая запись в `session_crons` описывает одно запланированное пробуждение с областью действия сессии, полученное из `CronCreate`, `ScheduleWakeup` и `/loop`:
2754 2758
2755| Поле | Описание |2759| Поле | Описание |
2756| :- | :- |2760| :- | :- |
2757| `id` | Идентификатор задачи cron |2761| `id` | Идентификатор cron-задачи |
2758| `schedule` | Выражение cron, например `0 9 * * 1-5` |2762| `schedule` | Cron-выражение, например `0 9 * * 1-5` |
2759| `recurring` | `false` для одноразовых пробуждений, чье расписание кодирует одно время срабатывания, `true` для задач, которые повторно срабатывают при каждом совпадении |2763| `recurring` | `false` для однократных пробуждений, расписание которых задаёт одно время срабатывания, `true` для задач, которые срабатывают повторно при каждом совпадении |
2760| `prompt` | Подсказка, отправленная при срабатывании cron, ограниченная 1000 символами с тем же маркером `… [+N chars]` |2764| `prompt` | Промпт, отправляемый при срабатывании cron, ограниченный 1000 символами с тем же маркером `… [+N chars]` |
2761 2765
2762Этот пример показывает ввод Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:2766Этот пример показывает входные данные Stop с одной выполняющейся задачей оболочки и одним повторяющимся cron:
2763 2767
2764```json theme={null}2768```json theme={null}
2765{2769{
2794 Управление решениями Stop2798 Управление решениями Stop
2795</h4>2799</h4>
2796 2800
2797Hooks `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude. Помимо [полей вывода JSON](#json-output), доступных всем hooks, ваш скрипт hook может вернуть эти поля, специфичные для события:2801Хуки `Stop` и `SubagentStop` могут управлять тем, продолжает ли Claude работу. Помимо [полей вывода JSON](#json-output), доступных всем хукам, ваш скрипт хука может возвращать следующие поля, специфичные для события:
2798 2802
2799| Поле | Описание |2803| Поле | Описание |
2800| :- | :- |2804| :- | :- |
2801| `decision` | `"block"` предотвращает остановку Claude. Опустите, чтобы позволить Claude остановиться |2805| `decision` | `"block"` не даёт Claude остановиться. Опустите, чтобы разрешить Claude остановиться |
2802| `reason` | Требуется, когда `decision` имеет значение `"block"`. Говорит Claude, почему он должен продолжить |2806| `reason` | Обязательно, когда `decision` равно `"block"`. Сообщает Claude, почему он должен продолжить |
2803| `hookSpecificOutput.additionalContext` | Обратная связь без ошибок для Claude. Разговор продолжается, чтобы Claude мог действовать на ней, но в отличие от `decision: "block"`, она показывается в транскрипте как обратная связь hook, а не ошибка hook |2807| `hookSpecificOutput.additionalContext` | Обратная связь для Claude без ошибки. Диалог продолжается, чтобы Claude мог действовать на её основе, но, в отличие от `decision: "block"`, она отображается в транскрипте как обратная связь хука, а не как ошибка хука |
2804 2808
2805Hook, который блокирует выходом 2, маршрутизируется так же, как `reason`: Claude получает сообщение stderr как объяснение того, почему он должен продолжить.2809Хук, который блокирует с кодом выхода 2, обрабатывается так же, как `reason`: Claude получает сообщение stderr в качестве объяснения, почему он должен продолжить.
2806 2810
2807```json theme={null}2811```json theme={null}
2808{2812{
2811}2815}
2812```2816```
2813 2817
2814Используйте `additionalContext`, когда hook работает как задумано и дает Claude руководство, такое как "запустить набор тестов перед завершением". Это держит разговор идущим через те же защиты цикла, что и `decision: "block"`, а именно ввод `stop_hook_active` и ограничение на 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback` и уведомление об ошибке hook не показывается:2818Используйте `additionalContext`, когда хук работает как задумано и даёт Claude указания, например «запусти набор тестов перед завершением». Он продолжает диалог с теми же защитами от зацикливания, что и `decision: "block"`, а именно входным полем `stop_hook_active` и ограничением в 8 последовательных продолжений, но транскрипт помечает его как `Stop hook feedback`, и уведомление об ошибке хука не показывается:
2815 2819
2816```json theme={null}2820```json theme={null}
2817{2821{
2826 StopFailure2830 StopFailure
2827</h3>2831</h3>
2828 2832
2829Запускается вместо [Stop](#stop), когда ход заканчивается из-за ошибки API. Claude Code игнорирует вывод и код выхода hook, кроме [`terminalSequence`](#emit-terminal-notifications). Используйте это для логирования сбоев, отправки оповещений или принятия действий восстановления, когда Claude не может завершить ответ из-за ограничений скорости, проблем аутентификации или других ошибок API.2833Запускается вместо [Stop](#stop), когда ход завершается из-за ошибки API. Claude Code игнорирует вывод и код выхода хука, за исключением [`terminalSequence`](#emit-terminal-notifications). Используйте его для записи сбоев в лог, отправки оповещений или выполнения действий по восстановлению, когда Claude не может завершить ответ из-за ограничений частоты запросов, проблем с аутентификацией или других ошибок API.
2830 2834
2831<h4 id="stopfailure-input">2835<h4 id="stopfailure-input">
2832 StopFailure input2836 Входные данные StopFailure
2833</h4>2837</h4>
2834 2838
2835Помимо [общих полей ввода](#common-input-fields), hooks StopFailure получают `error`, опциональный `error_details` и опциональный `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.2839Помимо [общих входных полей](#common-input-fields), хуки StopFailure получают `error`, необязательное `error_details` и необязательное `last_assistant_message`. Поле `error` определяет тип ошибки и используется для фильтрации matcher.
2836 2840
2837| Поле | Описание |2841| Поле | Описание |
2838| :- | :- |2842| :- | :- |
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` |2843| `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` | Дополнительные детали об ошибке, когда доступны |2844| `error_details` | Дополнительные сведения об ошибке, если они доступны |
2841| `last_assistant_message` | Отображаемый текст ошибки, показанный в разговоре. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит строку ошибки API, такую как `"API Error: Rate limit reached"` |2845| `last_assistant_message` | Отображаемый текст ошибки, показанный в диалоге. В отличие от `Stop` и `SubagentStop`, где это поле содержит разговорный вывод Claude, для `StopFailure` оно содержит саму строку ошибки API, например `"API Error: Rate limit reached"` |
2842 2846
2843```json theme={null}2847```json theme={null}
2844{2848{
2852}2856}
2853```2857```
2854 2858
2855Hooks StopFailure не имеют управления решениями. Они запускаются только в целях уведомления и логирования.2859Хуки StopFailure не имеют управления решениями. Они запускаются только для уведомлений и логирования.
2856 2860
2857<h3 id="teammateidle">2861<h3 id="teammateidle">
2858 TeammateIdle2862 TeammateIdle
2859</h3>2863</h3>
2860 2864
2861Запускается, когда товарищ [команды агентов](/docs/ru/agent-teams) собирается перейти в режим ожидания после завершения своего хода. Используйте это для обеспечения шлюзов качества перед остановкой товарища, такие как требование прохождения проверок lint или проверка существования выходных файлов.2865Запускается, когда участник [команды агентов](/docs/ru/agent-teams) собирается перейти в режим простоя после завершения своего хода. Используйте его для применения контроля качества до того, как участник команды прекратит работу, например требуя прохождения проверок линтера или проверяя наличие выходных файлов.
2862 2866
2863Hooks TeammateIdle не поддерживают matchers и срабатывают при каждом возникновении.2867Хуки TeammateIdle не поддерживают matcher и срабатывают при каждом возникновении события.
2864 2868
2865<h4 id="teammateidle-input">2869<h4 id="teammateidle-input">
2866 TeammateIdle input2870 Входные данные TeammateIdle
2867</h4>2871</h4>
2868 2872
2869Помимо [общих полей ввода](#common-input-fields), hooks TeammateIdle получают `teammate_name` и `team_name`.2873Помимо [общих входных полей](#common-input-fields), хуки TeammateIdle получают `teammate_name` и `team_name`.
2870 2874
2871```json theme={null}2875```json theme={null}
2872{2876{
2882 2886
2883| Поле | Описание |2887| Поле | Описание |
2884| :- | :- |2888| :- | :- |
2885| `teammate_name` | Имя товарища, который собирается перейти в режим ожидания |2889| `teammate_name` | Имя участника команды, который собирается перейти в режим простоя |
2886| `team_name` | Устарело. Название команды, полученное из сеанса; будет удалено в будущем выпуске |2890| `team_name` | Устаревшее. Имя команды, производное от сессии; будет удалено в будущем выпуске |
2887 2891
2888<h4 id="teammateidle-decision-control">2892<h4 id="teammateidle-decision-control">
2889 Управление решениями TeammateIdle2893 Управление решениями TeammateIdle
2890</h4>2894</h4>
2891 2895
2892Hooks TeammateIdle поддерживают два способа управления поведением товарища:2896Хуки TeammateIdle поддерживают два способа управления поведением участника команды:
2893 2897
2894* **Код выхода 2**: товарищ получает сообщение stderr как обратную связь и продолжает работать вместо перехода в режим ожидания.2898* **Код выхода 2**: участник команды получает сообщение stderr в качестве обратной связи и продолжает работу вместо перехода в режим простоя.
2895* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает товарища, совпадая с поведением hook `Stop`. `stopReason` показывается пользователю.2899* **JSON `{"continue": false, "stopReason": "..."}`**: полностью останавливает участника команды, аналогично поведению хука `Stop`. `stopReason` показывается пользователю.
2896 2900
2897Этот пример проверяет, что артефакт сборки существует перед разрешением товарищу перейти в режим ожидания:2901Этот пример проверяет наличие артефакта сборки, прежде чем разрешить участнику команды перейти в режим простоя:
2898 2902
2899```bash theme={null}2903```bash theme={null}
2900#!/bin/bash2904#!/bin/bash
2911 ConfigChange2915 ConfigChange
2912</h3>2916</h3>
2913 2917
2914Запускается, когда файл конфигурации изменяется во время сеанса. Используйте это для аудита изменений параметров, обеспечения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.2918Запускается, когда файл конфигурации изменяется во время сессии. Используйте его для аудита изменений настроек, применения политик безопасности или блокировки несанкционированных изменений файлов конфигурации.
2915 2919
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 на его опросе политики без запуска их.2920Claude Code запускает хуки ConfigChange, когда изменяется файл настроек, файл управляемой политики или файл скилла. Для управляемой политики он запускает их, только когда изменяется `managed-settings.json` или файл в `managed-settings.d/`. [Настройки, управляемые сервером](/docs/ru/server-managed-settings), и изменения управляемых настроек macOS или политики реестра Windows он применяет без запуска хуков. В WSL с [`wslInheritsWindowsSettings`](/docs/ru/settings-reference#wslinheritswindowssettings) он также применяет изменённый файл управляемых настроек на стороне Windows при опросе политики, не запуская хуки.
2917 2921
2918Matcher фильтрует по источнику конфигурации:2922Matcher фильтрует по источнику конфигурации:
2919 2923
2920| Matcher | Когда срабатывает |2924| Matcher | Когда срабатывает |
2921| :- | :- |2925| :- | :- |
2922| `user_settings` | `~/.claude/settings.json` изменяется |2926| `user_settings` | Изменяется `~/.claude/settings.json` |
2923| `project_settings` | `.claude/settings.json` изменяется |2927| `project_settings` | Изменяется `.claude/settings.json` |
2924| `local_settings` | `.claude/settings.local.json` изменяется |2928| `local_settings` | Изменяется `.claude/settings.local.json` |
2925| `policy_settings` | `managed-settings.json` или файл в `managed-settings.d/` изменяется |2929| `policy_settings` | Изменяется `managed-settings.json` или файл в `managed-settings.d/` |
2926| `skills` | Файл skill в `.claude/skills/` изменяется |2930| `skills` | Изменяется файл скилла в `.claude/skills/` |
2927 2931
2928Этот пример логирует все изменения конфигурации для аудита безопасности:2932Этот пример записывает в лог все изменения конфигурации для аудита безопасности:
2929 2933
2930```json theme={null}2934```json theme={null}
2931{2935{
2946```2950```
2947 2951
2948<h4 id="configchange-input">2952<h4 id="configchange-input">
2949 ConfigChange input2953 Входные данные ConfigChange
2950</h4>2954</h4>
2951 2955
2952Помимо [общих полей ввода](#common-input-fields), hooks ConfigChange получают `source` и опционально `file_path`. Поле `source` указывает, какой тип конфигурации изменился, и `file_path` предоставляет путь к конкретному файлу, который был изменен.2956Помимо [общих входных полей](#common-input-fields), хуки ConfigChange получают `source` и, необязательно, `file_path`. Поле `source` указывает, какой тип конфигурации изменился, а `file_path` содержит путь к конкретному изменённому файлу.
2953 2957
2954```json theme={null}2958```json theme={null}
2955{2959{
2966 Управление решениями ConfigChange2970 Управление решениями ConfigChange
2967</h4>2971</h4>
2968 2972
2969Hooks ConfigChange могут блокировать изменения конфигурации от вступления в силу. Используйте код выхода 2 или JSON `decision` для предотвращения изменения. При блокировке новые параметры не применяются к работающему сеансу.2973Хуки ConfigChange могут блокировать вступление изменений конфигурации в силу. Используйте код выхода 2 или JSON-поле `decision`, чтобы предотвратить изменение. При блокировке новые настройки не применяются к работающей сессии.
2970 2974
2971| Поле | Описание |2975| Поле | Описание |
2972| :- | :- |2976| :- | :- |
2973| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы позволить изменению |2977| `decision` | `"block"` предотвращает применение изменения конфигурации. Опустите, чтобы разрешить изменение |
2974| `reason` | Принято, но никогда не показано |2978| `reason` | Принимается, но никогда не показывается |
2975 2979
2976```json theme={null}2980```json theme={null}
2977{2981{
2980}2984}
2981```2985```
2982 2986
2983Изменения `policy_settings` не могут быть заблокированы. Hooks все еще срабатывают для источников `policy_settings`, когда файл управляемых параметров на машине изменяется, поэтому вы можете использовать их для логирования этих редактирований, но любое решение блокировки игнорируется. Это гарантирует, что параметры, управляемые предприятием, всегда вступают в силу. Claude Code не запускает hooks `ConfigChange`, когда прибывают [параметры, управляемые сервером](/docs/ru/server-managed-settings) или обновляются.2987Изменения `policy_settings` нельзя заблокировать. Хуки по-прежнему срабатывают для источников `policy_settings`, когда изменяется файл управляемых настроек на компьютере, поэтому вы можете использовать их для записи этих правок в лог, но любое решение о блокировке игнорируется. Это гарантирует, что настройки, управляемые организацией, всегда вступают в силу. Claude Code не запускает хуки `ConfigChange`, когда [настройки, управляемые сервером](/docs/ru/server-managed-settings), поступают или обновляются.
2984 2988
2985Claude Code действует на решение блокировки из вывода JSON hook ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения вам или Claude, блокируете ли вы с `reason` или с stderr при выходе 2. Claude Code только записывает строку в debug log.2989Claude Code учитывает решение о блокировке из JSON-вывода хука ConfigChange и отбрасывает `systemMessage` и `continue`. Заблокированное изменение не выводит никакого сообщения ни вам, ни Claude, независимо от того, блокируете ли вы с помощью `reason` или через stderr с кодом выхода 2. Claude Code лишь записывает строку в лог отладки.
2986 2990
2987<h3 id="cwdchanged">2991<h3 id="cwdchanged">
2988 CwdChanged2992 CwdChanged
2989</h3>2993</h3>
2990 2994
2991Запускается, когда команда оболочки в основном разговоре изменяет рабочую директорию, например когда Claude выполняет команду `cd`. Используйте это для реакции на изменения директории: перезагрузка переменных окружения, активация цепочек инструментов, специфичных для проекта, или автоматический запуск скриптов настройки. Пары с [FileChanged](#filechanged) для инструментов, таких как [direnv](https://direnv.net/), которые управляют окружением для каждой директории.2995Запускается, когда shell-команда в основном диалоге изменяет рабочий каталог, например когда Claude выполняет команду `cd`. Используйте его для реакции на смену каталога: перезагрузки переменных окружения, активации инструментальных цепочек проекта или автоматического запуска скриптов настройки. Работает в паре с [FileChanged](#filechanged) для таких инструментов, как [direnv](https://direnv.net/), которые управляют окружением для каждого каталога.
2992 2996
2993Hooks CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события CwdChanged, когда Claude Code их очищает.2997Хуки CwdChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события CwdChanged, когда Claude Code их очищает.
2994 2998
2995CwdChanged не поддерживает matchers и срабатывает при каждом возникновении.2999CwdChanged не поддерживает matcher и срабатывает при каждом возникновении события.
2996 3000
2997<h4 id="cwdchanged-input">3001<h4 id="cwdchanged-input">
2998 CwdChanged input3002 Входные данные CwdChanged
2999</h4>3003</h4>
3000 3004
3001Помимо [общих полей ввода](#common-input-fields), hooks CwdChanged получают `old_cwd` и `new_cwd`.3005Помимо [общих входных полей](#common-input-fields), хуки CwdChanged получают `old_cwd` и `new_cwd`.
3002 3006
3003```json theme={null}3007```json theme={null}
3004{3008{
3012```3016```
3013 3017
3014<h4 id="cwdchanged-output">3018<h4 id="cwdchanged-output">
3015 CwdChanged output3019 Вывод CwdChanged
3016</h4>3020</h4>
3017 3021
3018Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks CwdChanged могут вернуть `watchPaths` для динамической установки того, какие пути файлов [FileChanged](#filechanged) наблюдает:3022Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки CwdChanged могут возвращать `watchPaths`, чтобы динамически задавать, за какими путями файлов следит [FileChanged](#filechanged):
3019 3023
3020| Поле | Описание |3024| Поле | Описание |
3021| :- | :- |3025| :- | :- |
3022| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Возврат пустого массива очищает динамический список, что типично при входе в новую директорию |3026| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Возврат пустого массива очищает динамический список, что типично при входе в новый каталог |
3023 3027
3024Hooks CwdChanged не имеют управления решениями. Они не могут блокировать изменение директории.3028Хуки CwdChanged не имеют управления решениями. Они не могут заблокировать смену каталога.
3025 3029
3026Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3030Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3027 3031
3028<h3 id="directoryadded">3032<h3 id="directoryadded">
3029 DirectoryAdded3033 DirectoryAdded
3030</h3>3034</h3>
3031 3035
3032Запускается после добавления рабочей директории во время сеанса с командой `/add-dir` или после добавления клиентом SDK с запросом управления `register_repo_root`. Используйте это для подготовки вновь добавленного репозитория, например, установки его зависимостей.3036Запускается после того, как вы добавляете рабочий каталог в середине сессии командой `/add-dir` или после того, как клиент SDK добавляет его управляющим запросом `register_repo_root`. Используйте его для подготовки только что добавленного репозитория, например для установки его зависимостей.
3033 3037
3034Claude Code не срабатывает это событие, когда:3038Claude Code не вызывает это событие, когда:
3035 3039
3036* Вы передаете директорию с флагом запуска `--add-dir`; [SessionStart](#sessionstart) охватывает эти директории3040* Вы передаёте каталог с помощью флага запуска `--add-dir`; такие каталоги охватывает [SessionStart](#sessionstart)
3037* Вы добавляете директорию на вкладку Workspace `/permissions`3041* Вы добавляете каталог на вкладке Workspace в `/permissions`
3038* Вы добавляете директорию, которая уже является рабочей директорией или находится внутри одной3042* Вы добавляете каталог, который уже является рабочим каталогом или находится внутри него
3039 3043
3040Claude Code срабатывает DirectoryAdded после обновления состояния sandbox и разрешений, поэтому изолированные инструменты уже видят новую директорию, когда запускается ваш hook. Команды hook сами выполняются без изоляции.3044Claude Code вызывает DirectoryAdded после обновления состояния песочницы и разрешений, поэтому инструменты в песочнице уже видят новый каталог, когда запускается ваш хук. Сами команды хуков выполняются вне песочницы.
3041 3045
3042Claude Code не ждет hook: добавление завершается немедленно, и hook выполняется в фоне с тайм-аутом по умолчанию 600 секунд.3046Claude Code не ждёт хук: добавление завершается немедленно, а хук выполняется в фоне со стандартным таймаутом 600 секунд.
3043 3047
3044Matcher фильтрует по тому, как была добавлена директория:3048Matcher фильтрует по способу добавления каталога:
3045 3049
3046| Matcher | Когда срабатывает |3050| Matcher | Когда срабатывает |
3047| :- | :- |3051| :- | :- |
3048| `slash_command` | Вы добавляете директорию с `/add-dir` |3052| `slash_command` | Вы добавляете каталог с помощью `/add-dir` |
3049| `register_repo_root` | Клиент SDK добавляет директорию с запросом управления `register_repo_root` |3053| `register_repo_root` | Клиент SDK добавляет каталог управляющим запросом `register_repo_root` |
3050 3054
3051<h4 id="directoryadded-input">3055<h4 id="directoryadded-input">
3052 DirectoryAdded input3056 Входные данные DirectoryAdded
3053</h4>3057</h4>
3054 3058
3055Помимо [общих полей ввода](#common-input-fields), hooks DirectoryAdded получают `directory` и `source`.3059Помимо [общих входных полей](#common-input-fields), хуки DirectoryAdded получают `directory` и `source`.
3056 3060
3057| Поле | Описание |3061| Поле | Описание |
3058| :- | :- |3062| :- | :- |
3059| `directory` | Абсолютный путь директории, которая была добавлена |3063| `directory` | Абсолютный путь к добавленному каталогу |
3060| `source` | Как была добавлена директория, `"slash_command"` для `/add-dir` или `"register_repo_root"` для запроса управления SDK |3064| `source` | Способ добавления каталога: `"slash_command"` для `/add-dir` или `"register_repo_root"` для управляющего запроса SDK |
3061 3065
3062```json theme={null}3066```json theme={null}
3063{3067{
3070}3074}
3071```3075```
3072 3076
3073Hooks DirectoryAdded не имеют управления решениями. Они не могут блокировать добавление, которое уже завершилось, когда выполняется hook. Claude Code отбрасывает поле `continue` из их вывода JSON и выводит остальное по-разному в зависимости от источника:3077Хуки DirectoryAdded не имеют управления решениями. Они не могут заблокировать добавление, которое уже завершено к моменту запуска хука. Claude Code отбрасывает поле `continue` из их JSON-вывода, а остальное обрабатывает по-разному в зависимости от источника:
3074 3078
3075* `slash_command`: Claude Code доставляет `systemMessage` hook Claude как контекст на следующем ходе разговора, а не показывает вам. Количество неудачных hooks появляется в транскрипте. Полный вывод сбоя идет в debug log3079* `slash_command`: Claude Code доставляет `systemMessage` хука Claude в качестве контекста на следующем ходе диалога, а не показывает его вам. Количество неудавшихся хуков отображается в транскрипте. Полный вывод сбоев записывается в лог отладки
3076* `register_repo_root`: Claude Code пишет вывод `systemMessage` и вывод сбоя только в debug log3080* `register_repo_root`: Claude Code записывает вывод `systemMessage` и вывод сбоев только в лог отладки
3077 3081
3078<h3 id="filechanged">3082<h3 id="filechanged">
3079 FileChanged3083 FileChanged
3080</h3>3084</h3>
3081 3085
3082Запускается, когда наблюдаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путем проверки вызовов инструментов, поэтому он запускает hook независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает с `Bash`, или процесс вне Claude Code полностью. Обычное использование — перезагрузка переменных окружения, когда изменяются файлы конфигурации проекта.3086Запускается, когда отслеживаемый файл изменяется на диске. Claude Code обнаруживает изменения с помощью наблюдателя файловой системы, а не путём анализа вызовов инструментов, поэтому он запускает хук независимо от того, что изменило файл: вызов инструмента `Edit` или `Write`, скрипт, который Claude запускает через `Bash`, или процесс полностью вне Claude Code. Типичное применение — перезагрузка переменных окружения при изменении файлов конфигурации проекта.
3083 3087
3084`matcher` для этого события служит двум целям:3088`matcher` для этого события выполняет две роли:
3085 3089
3086* **Построение списка наблюдения**: значение разделяется на `|` и каждый сегмент регистрируется как буквальное имя файла в рабочей директории, поэтому `".envrc|.env"` наблюдает ровно эти два файла. Шаблоны regex не полезны здесь: значение, такое как `^\.env`, наблюдало бы файл буквально названный `^\.env`.3090* **Построение списка наблюдения**: значение разбивается по `|`, и каждый сегмент регистрируется как буквальное имя файла в рабочем каталоге, поэтому `".envrc|.env"` отслеживает ровно эти два файла. Шаблоны регулярных выражений здесь бесполезны: значение вроде `^\.env` будет отслеживать файл с буквальным именем `^\.env`.
3087* **Фильтрация, какие hooks запускаются**: когда наблюдаемый файл изменяется, то же значение фильтрует, какие группы hook запускаются, используя стандартные [правила matcher](#matcher-patterns) против базового имени измененного файла.3091* **Фильтрация запускаемых хуков**: когда отслеживаемый файл изменяется, то же значение фильтрует, какие группы хуков запускаются, по стандартным [правилам matcher](#matcher-patterns) применительно к базовому имени изменённого файла.
3088 3092
3089Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая команду `Bash` или внешний скрипт, переписывающий файл:3093Этот пример нормализует окончания строк в `data.csv` после любого изменения, включая перезапись файла командой `Bash` или внешним скриптом:
3090 3094
3091```json theme={null}3095```json theme={null}
3092{3096{
3106}3110}
3107```3111```
3108 3112
3109Hook читает абсолютный путь измененного файла из поля `file_path` [JSON ввода](#filechanged-input) из stdin. Его охрана `grep` тестирует то же самое, что `perl` удаляет, CR в конце строки, поэтому запуск после нормализации выходит без касания файла. Более слабая охрана зацикливается навсегда, потому что `perl -i` переписывает файл, даже когда он ничего не заменяет, и Claude Code запускает hook снова после каждой переписи. Сохраните этот скрипт в `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:3113Хук считывает абсолютный путь изменённого файла из поля `file_path` [входных данных JSON](#filechanged-input) в stdin. Его защитная проверка `grep` ищет то же, что удаляет `perl`, — CR в конце строки, поэтому запуск после нормализации завершается, не трогая файл. Менее строгая проверка приводит к бесконечному циклу, потому что `perl -i` перезаписывает файл, даже если ничего не заменяет, а Claude Code снова запускает хук после каждой перезаписи. Сохраните этот скрипт по пути `/path/to/normalize-line-endings.sh` и сделайте его исполняемым:
3110 3114
3111```bash theme={null}3115```bash theme={null}
3112#!/bin/bash3116#!/bin/bash
3116fi3120fi
3117```3121```
3118 3122
3119Чтобы подтвердить, что hook работает, попросите Claude добавить строку CRLF в `data.csv` с командой `Bash`. Claude Code запускает hook и файл заканчивается с окончаниями LF.3123Чтобы убедиться, что хук работает, попросите Claude добавить строку с CRLF в `data.csv` с помощью команды `Bash`. Claude Code запускает хук, и в итоге файл получает окончания строк LF.
3120 3124
3121Чтобы наблюдать файлы, которые вы не можете назвать заранее, верните [`watchPaths`](#filechanged-output) из hook для динамического обновления списка наблюдения. Claude Code запускает наблюдатель только, когда что-то называет файл для наблюдения, поэтому посейте список с группой FileChanged, чей matcher называет по крайней мере один файл, или с hook [SessionStart](#sessionstart-decision-control) или [CwdChanged](#cwdchanged), который возвращает `watchPaths`. Matcher все еще фильтрует, какие группы hook запускаются, когда наблюдаемый файл изменяется, поэтому дайте группе, которая обрабатывает динамические пути, опущенный matcher, который совпадает с каждым наблюдаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` также совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения, как любое другое значение, как буквальный файл с именем `*`.3125Чтобы отслеживать файлы, которые нельзя назвать заранее, возвращайте [`watchPaths`](#filechanged-output) из хука для динамического обновления списка наблюдения. Claude Code запускает наблюдатель, только когда что-то указывает файл для наблюдения, поэтому заполните список группой FileChanged, matcher которой называет хотя бы один файл, или хуком [SessionStart](#sessionstart-decision-control) либо [CwdChanged](#cwdchanged), возвращающим `watchPaths`. Matcher по-прежнему фильтрует, какие группы хуков запускаются при изменении отслеживаемого файла, поэтому для группы, обрабатывающей динамические пути, опустите matcher — тогда он совпадает с каждым отслеживаемым файлом и ничего не добавляет в список наблюдения. Matcher `"*"` тоже совпадает с каждым файлом, но Claude Code регистрирует его в списке наблюдения как любое другое значение — как буквальный файл с именем `*`.
3122 3126
3123Hooks FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются в последующих командах Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.3127Хуки FileChanged имеют доступ к [`CLAUDE_ENV_FILE`](#persist-environment-variables). Переменные, записанные в этот файл, сохраняются для последующих команд Bash до следующего события [CwdChanged](#cwdchanged), когда Claude Code их очищает.
3124 3128
3125<h4 id="filechanged-input">3129<h4 id="filechanged-input">
3126 FileChanged input3130 Входные данные FileChanged
3127</h4>3131</h4>
3128 3132
3129Помимо [общих полей ввода](#common-input-fields), hooks FileChanged получают `file_path` и `event`.3133Помимо [общих входных полей](#common-input-fields), хуки FileChanged получают `file_path` и `event`.
3130 3134
3131| Поле | Описание |3135| Поле | Описание |
3132| :- | :- |3136| :- | :- |
3133| `file_path` | Абсолютный путь к файлу, который изменился |3137| `file_path` | Абсолютный путь к изменённому файлу |
3134| `event` | Что произошло: `"change"` для измененного файла, `"add"` для созданного файла или `"unlink"` для удаленного файла |3138| `event` | Что произошло: `"change"` для изменённого файла, `"add"` для созданного файла или `"unlink"` для удалённого файла |
3135 3139
3136```json theme={null}3140```json theme={null}
3137{3141{
3145```3149```
3146 3150
3147<h4 id="filechanged-output">3151<h4 id="filechanged-output">
3148 FileChanged output3152 Вывод FileChanged
3149</h4>3153</h4>
3150 3154
3151Помимо [полей вывода JSON](#json-output), доступных всем hooks, hooks FileChanged могут вернуть `watchPaths` для динамического обновления того, какие пути файлов наблюдаются:3155Помимо [полей вывода JSON](#json-output), доступных всем хукам, хуки FileChanged могут возвращать `watchPaths`, чтобы динамически обновлять отслеживаемые пути файлов:
3152 3156
3153| Поле | Описание |3157| Поле | Описание |
3154| :- | :- |3158| :- | :- |
3155| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из конфигурации вашего `matcher` всегда наблюдаются. Используйте это, когда ваш скрипт hook обнаруживает дополнительные файлы для наблюдения на основе измененного файла |3159| `watchPaths` | Массив абсолютных путей. Заменяет текущий динамический список наблюдения. Пути из вашей конфигурации `matcher` отслеживаются всегда. Используйте это, когда ваш скрипт хука обнаруживает дополнительные файлы для наблюдения на основе изменённого файла |
3156 3160
3157Hooks FileChanged не имеют управления решениями. Они не могут блокировать изменение файла от возникновения.3161Хуки FileChanged не имеют управления решениями. Они не могут предотвратить изменение файла.
3158 3162
3159Claude Code читает `watchPaths` и `systemMessage` из их вывода JSON и отбрасывает `continue`. В интерактивных сеансах он показывает `systemMessage` как краткое уведомление терминала. Сообщение не достигает потока сообщений SDK.3163Claude Code считывает `watchPaths` и `systemMessage` из их JSON-вывода и отбрасывает `continue`. В интерактивных сессиях он показывает `systemMessage` как краткое уведомление в терминале. Сообщение не попадает в поток сообщений SDK.
3160 3164
3161<h3 id="worktreecreate">3165<h3 id="worktreecreate">
3162 WorktreeCreate3166 WorktreeCreate
3163</h3>3167</h3>
3164 3168
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.3169Запускается при создании 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 3170
3167Поскольку hook заменяет поведение по умолчанию полностью, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, такие как `.env`, в новый worktree, сделайте это внутри вашего скрипта hook.3171Поскольку хук полностью заменяет стандартное поведение, [`.worktreeinclude`](/docs/ru/worktrees#copy-gitignored-files-into-worktrees) не обрабатывается. Если вам нужно скопировать локальные файлы конфигурации, например `.env`, в новый worktree, сделайте это в своём скрипте хука.
3168 3172
3169Hook должен вернуть путь к созданной директории worktree. Claude Code использует этот путь как рабочую директорию для изолированного сеанса. См. [WorktreeCreate output](#worktreecreate-output) для того, как каждый тип hook возвращает путь.3173Хук должен вернуть путь к созданному каталогу worktree. Claude Code использует этот путь как рабочий каталог для изолированной сессии. О том, как каждый тип хука возвращает путь, см. в разделе [Вывод WorktreeCreate](#worktreecreate-output).
3170 3174
3171Claude Code действует на успех hook и возвращенный путь и отбрасывает `systemMessage` и `continue`.3175Claude Code учитывает успешность хука и возвращённый путь и отбрасывает `systemMessage` и `continue`.
3172 3176
3173Этот пример создает рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой собственный:3177Этот пример создаёт рабочую копию SVN и выводит путь для использования Claude Code. Замените URL репозитория на свой:
3174 3178
3175```json theme={null}3179```json theme={null}
3176{3180{
3189}3193}
3190```3194```
3191 3195
3192Hook читает `name` worktree из JSON ввода на stdin, проверяет свежую копию в новую директорию и выводит путь директории. `echo` на последней строке — это то, что Claude Code читает как путь worktree. Перенаправьте любой другой вывод в stderr, чтобы он не мешал пути.3196Хук считывает `name` worktree из входных данных JSON в stdin, извлекает свежую копию в новый каталог и выводит путь к каталогу. `echo` в последней строке — это то, что Claude Code считывает как путь к worktree. Перенаправляйте любой другой вывод в stderr, чтобы он не мешал пути.
3193 3197
3194<h4 id="worktreecreate-input">3198<h4 id="worktreecreate-input">
3195 WorktreeCreate input3199 Входные данные WorktreeCreate
3196</h4>3200</h4>
3197 3201
3198Помимо [общих полей ввода](#common-input-fields), hooks WorktreeCreate получают поле `name`. Это идентификатор slug для нового worktree, либо указанный пользователем, либо автоматически сгенерированный, например `bold-oak-a3f2`.3202Помимо [общих входных полей](#common-input-fields), хуки WorktreeCreate получают поле `name`. Это идентификатор-слаг для нового worktree, заданный пользователем или сгенерированный автоматически, например `bold-oak-a3f2`.
3199 3203
3200```json theme={null}3204```json theme={null}
3201{3205{
3208```3212```
3209 3213
3210<h4 id="worktreecreate-output">3214<h4 id="worktreecreate-output">
3211 WorktreeCreate output3215 Вывод WorktreeCreate
3212</h4>3216</h4>
3213 3217
3214Hooks WorktreeCreate не используют стандартную модель решения разрешить/заблокировать. Вместо этого успех или сбой hook определяет результат. Hook должен вернуть путь к созданной директории worktree:3218Хуки WorktreeCreate не используют стандартную модель решений allow/block. Вместо этого результат определяется успехом или неудачей хука. Хук должен вернуть путь к созданному каталогу worktree:
3215 3219
3216* **Hooks команды** (`type: "command"`): выведите путь как последнюю непустую строку stdout. Claude Code удаляет коды ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные перед вашим `echo`, игнорируются. Перенаправьте любой другой вывод hook в stderr.3220* **Командные хуки** (`type: "command"`): выведите путь последней непустой строкой stdout. Claude Code удаляет escape-последовательности ANSI перед чтением этой строки, поэтому баннеры запуска оболочки, выведенные до вашего `echo`, игнорируются. Перенаправляйте любой другой вывод хука в stderr.
3217* **HTTP hooks** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.3221* **HTTP-хуки** (`type: "http"`): верните `{ "hookSpecificOutput": { "hookEventName": "WorktreeCreate", "worktreePath": "/absolute/path" } }` в теле ответа.
3218 3222
3219Если hook не удается или не создает путь, создание worktree не удается с ошибкой.3223Если хук завершается с ошибкой или не возвращает путь, создание worktree завершается ошибкой.
3220 3224
3221Claude Code разрешает относительный путь против директории, в которой выполнялся hook, свернув любые сегменты `.` или `..` в нем. Если результирующий путь не является директорией, которую Claude Code может ввести, сеанс выводит ошибку, называющую путь, и выходит с кодом 1.3225Claude Code разрешает относительный путь относительно каталога, в котором выполнялся хук, сворачивая все сегменты `.` или `..` в нём. Если полученный путь не является каталогом, в который Claude Code может перейти, сессия выводит ошибку с указанием пути и завершается с кодом 1.
3222 3226
3223Claude Code отказывает абсолютному пути, который содержит сегменты `.` или `..`, и любому пути, который проходит через символическую ссылку ниже корня репозитория, потому что символическая ссылка, зафиксированная в репозитории, может перенаправить worktree вне его. Ошибка называет отклоненный компонент. Верните нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До версии 2.1.216 создание worktree следовало пути hook без этого скрининга.3227Claude Code отклоняет абсолютный путь, содержащий сегменты `.` или `..`, а также любой путь, проходящий через символическую ссылку ниже корня репозитория, поскольку символическая ссылка, закоммиченная в репозиторий, могла бы перенаправить worktree за его пределы. В ошибке указывается отклонённый компонент. Возвращайте нормализованный путь, который не проходит через символическую ссылку внутри репозитория. До v2.1.216 создание worktree следовало по пути хука без этой проверки.
3224 3228
3225<h3 id="worktreeremove">3229<h3 id="worktreeremove">
3226 WorktreeRemove3230 WorktreeRemove
3227</h3>3231</h3>
3228 3232
3229Запускается, когда worktree удаляется. Это парный hook очистки для [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:3233Выполняется при удалении worktree. Это парный хук очистки для [WorktreeCreate](#worktreecreate). Событие срабатывает, когда:
3230 3234
3231* вы выходите из сеанса `--worktree` и выбираете его удаление3235* вы выходите из сессии `--worktree` и выбираете её удаление
3232* подагент с `isolation: "worktree"` завершается3236* завершается субагент с `isolation: "worktree"`
3233* вы удаляете [фоновый сеанс](/docs/ru/agent-view#what-deleting-a-session-removes), чей worktree создал hook3237* вы удаляете [фоновую сессию](/docs/ru/agent-view#what-deleting-a-session-removes), worktree которой создал хук
3234 3238
3235Для git-based worktrees Claude Code обрабатывает очистку автоматически с `git worktree remove`. Если вы настроили hook WorktreeCreate, свяжите его с hook WorktreeRemove для управления очисткой worktrees, которые он создает:3239Для worktree на основе git Claude Code выполняет очистку автоматически с помощью `git worktree remove`. Если вы настроили хук WorktreeCreate, добавьте к нему хук WorktreeRemove, чтобы управлять очисткой создаваемых им worktree:
3236 3240
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.3241* **Нет хука 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 удалил директорию.3242* **Хук завершается с кодом 0**: worktree считается удалённым. Claude Code больше ничего не читает из хука, поэтому убедитесь, что ваш хук удалил каталог.
3239* **Hook выходит не-нулевой**: удаление не удается, если директория в `worktree_path` все еще существует после этого, и worktree остается на диске без fallback git. Hook, который удалил директорию перед выходом не-нулевой, считается удаленным. Для того, как сбой сообщается, см. [WorktreeRemove input](#worktreeremove-input).3243* **Хук завершается с ненулевым кодом**: удаление завершается ошибкой, если каталог по пути `worktree_path` после этого всё ещё существует, и worktree остаётся на диске без резервного варианта через git. Хук, удаливший каталог перед завершением с ненулевым кодом, считается выполнившим удаление. О том, как сообщается об ошибке, см. [Входные данные WorktreeRemove](#worktreeremove-input).
3240 3244
3241Claude Code никогда не удаляет ветку, принадлежащую hook-созданному worktree, потому что он знает только путь, который вернул ваш hook WorktreeCreate. Если ваш hook WorktreeCreate создает ветку, удалите ее в вашем hook WorktreeRemove.3245Claude Code никогда не удаляет ветку, принадлежащую созданному хуком worktree, поскольку ему известен только путь, который вернул ваш хук WorktreeCreate. Если ваш хук WorktreeCreate создаёт ветку, удаляйте её в хуке WorktreeRemove.
3242 3246
3243Claude Code отбрасывает [поля вывода JSON](#json-output) hook WorktreeRemove, такие как `systemMessage` и `continue`.3247Claude Code отбрасывает [поля JSON-вывода](#json-output) хука WorktreeRemove, такие как `systemMessage` и `continue`.
3244 3248
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 запускался на сохраненном пути без этих проверок.3249При удалении фоновой сессии 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 3250
3247Claude Code передает путь, возвращенный WorktreeCreate, как `worktree_path` в ввод hook. Этот пример читает этот путь и удаляет директорию:3251Claude Code передаёт путь, возвращённый WorktreeCreate, как `worktree_path` во входных данных хука. Этот пример считывает этот путь и удаляет каталог:
3248 3252
3249```json theme={null}3253```json theme={null}
3250{3254{
3264```3268```
3265 3269
3266<h4 id="worktreeremove-input">3270<h4 id="worktreeremove-input">
3267 WorktreeRemove input3271 Входные данные WorktreeRemove
3268</h4>3272</h4>
3269 3273
3270Помимо [общих полей ввода](#common-input-fields), hooks WorktreeRemove получают поле `worktree_path`, которое является абсолютным путем к удаляемому worktree.3274Помимо [общих полей входных данных](#common-input-fields), хуки WorktreeRemove получают поле `worktree_path` — абсолютный путь к удаляемому worktree.
3271 3275
3272```json theme={null}3276```json theme={null}
3273{3277{
3279}3283}
3280```3284```
3281 3285
3282Код выхода hook WorktreeRemove определяет результат. Когда hook выходит не-нулевой и директория в `worktree_path` все еще существует после этого, удаление не удается:3286Результат определяется кодом выхода хука WorktreeRemove. Когда хук завершается с ненулевым кодом и каталог по пути `worktree_path` после этого всё ещё существует, удаление завершается ошибкой:
3283 3287
3284* Worktree остается на диске, и команда hook и stderr идут в [debug log](#debug-hooks).3288* Worktree остаётся на диске, а команда хука и stderr записываются в [отладочный лог](#debug-hooks).
3285* Если вы удаляли фоновый сеанс, сеанс остается тоже. Сообщение отказа в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как закончился hook, такой как `exited 1`, цитирует начало его stderr и говорит, удалит ли удаление сеанса снова директорию в любом случае.3289* Если вы удаляли фоновую сессию, сессия тоже сохраняется. Сообщение об отказе в [agent view](/docs/ru/agent-view#what-deleting-a-session-removes) сообщает, как завершился хук, например `exited 1`, цитирует начало его stderr и указывает, удалит ли повторное удаление сессии каталог в любом случае.
3286 3290
3287<h3 id="precompact">3291<h3 id="precompact">
3288 PreCompact3292 PreCompact
3289</h3>3293</h3>
3290 3294
3291Запускается перед тем, как Claude Code собирается запустить операцию compact.3295Выполняется перед тем, как Claude Code собирается выполнить операцию сжатия контекста.
3292 3296
3293Значение matcher указывает, было ли сжатие запущено вручную или автоматически:3297Значение matcher указывает, было ли сжатие запущено вручную или автоматически:
3294 3298
3295| Matcher | Когда срабатывает |3299| Matcher | Когда срабатывает |
3296| :- | :- |3300| :- | :- |
3297| `manual` | `/compact` |3301| `manual` | `/compact` |
3298| `auto` | Auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3302| `auto` | Автосжатие, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |
3299 3303
3300Выйдите с кодом 2 для блокировки сжатия. Для ручного `/compact` сообщение stderr показывается пользователю. Вы также можете заблокировать, возвращая JSON с `"decision": "block"`.3304Завершитесь с кодом 2, чтобы заблокировать сжатие. Для ручного `/compact` сообщение stderr показывается пользователю. Также можно заблокировать, вернув JSON с `"decision": "block"`.
3301 3305
3302Блокировка автоматического сжатия имеет разные эффекты в зависимости от того, когда оно срабатывает. Если сжатие было запущено проактивно перед пределом контекста, Claude Code пропускает его и разговор продолжается несжатым. Если сжатие было запущено для восстановления от ошибки лимита контекста, уже возвращенной API, основная ошибка выводится и текущий запрос не удается.3306Блокировка автоматического сжатия даёт разный эффект в зависимости от того, когда она срабатывает. Если сжатие было запущено упреждающе до достижения лимита контекста, Claude Code пропускает его, и диалог продолжается без сжатия. Если сжатие было запущено для восстановления после ошибки лимита контекста, уже возвращённой API, исходная ошибка отображается, и текущий запрос завершается неудачей.
3303 3307
3304Claude Code отбрасывает поля `systemMessage` и `continue` hook PreCompact.3308Claude Code отбрасывает поля `systemMessage` и `continue` хука PreCompact.
3305 3309
3306<h4 id="precompact-input">3310<h4 id="precompact-input">
3307 PreCompact input3311 Входные данные PreCompact
3308</h4>3312</h4>
3309 3313
3310Помимо [общих полей ввода](#common-input-fields), hooks PreCompact получают `trigger` и `custom_instructions`. Для `manual`, `custom_instructions` содержит то, что пользователь передает в `/compact` и является `null`, когда они ничего не передают. Для `auto`, `custom_instructions` — это `null`.3314Помимо [общих полей входных данных](#common-input-fields), хуки PreCompact получают `trigger` и `custom_instructions`. Для `manual` поле `custom_instructions` содержит то, что пользователь передаёт в `/compact`, и равно `null`, если он ничего не передаёт. Для `auto` поле `custom_instructions` равно `null`.
3311 3315
3312```json theme={null}3316```json theme={null}
3313{3317{
3324 PostCompact3328 PostCompact
3325</h3>3329</h3>
3326 3330
3327Запускается после завершения Claude Code операции compact. Используйте это событие для реакции на новое сжатое состояние, например для логирования сгенерированного резюме или обновления внешнего состояния. Claude Code отбрасывает поля `systemMessage` и `continue` hook PostCompact.3331Выполняется после того, как Claude Code завершает операцию сжатия контекста. Используйте это событие, чтобы реагировать на новое сжатое состояние, например записывать в лог сгенерированную сводку или обновлять внешнее состояние. Claude Code отбрасывает поля `systemMessage` и `continue` хука PostCompact.
3328 3332
3329Те же значения matcher применяются, как для `PreCompact`:3333Применяются те же значения matcher, что и для `PreCompact`:
3330 3334
3331| Matcher | Когда срабатывает |3335| Matcher | Когда срабатывает |
3332| :- | :- |3336| :- | :- |
3333| `manual` | После `/compact` |3337| `manual` | После `/compact` |
3334| `auto` | После auto-compact, когда разговор достигает [окна auto-compact](/docs/ru/model-config#set-the-auto-compact-window) |3338| `auto` | После автосжатия, когда диалог достигает [окна автосжатия](/docs/ru/model-config#set-the-auto-compact-window) |
3335 3339
3336<h4 id="postcompact-input">3340<h4 id="postcompact-input">
3337 PostCompact input3341 Входные данные PostCompact
3338</h4>3342</h4>
3339 3343
3340Помимо [общих полей ввода](#common-input-fields), hooks PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит резюме разговора, сгенерированное операцией compact.3344Помимо [общих полей входных данных](#common-input-fields), хуки PostCompact получают `trigger` и `compact_summary`. Поле `compact_summary` содержит сводку диалога, сгенерированную операцией сжатия.
3341 3345
3342```json theme={null}3346```json theme={null}
3343{3347{
3350}3354}
3351```3355```
3352 3356
3353Hooks PostCompact не имеют управления решениями. Они не могут влиять на результат сжатия, но могут выполнять последующие задачи.3357Хуки PostCompact не имеют управления решениями. Они не могут повлиять на результат сжатия, но могут выполнять последующие задачи.
3354 3358
3355<h3 id="premodelswitch">3359<h3 id="premodelswitch">
3356 PreModelSwitch3360 PreModelSwitch
3357</h3>3361</h3>
3358 3362
3359Запускается перед применением Claude Code переключения модели, которое вы или клиент запросили. Используйте это для блокировки переключения, требования подтверждения или показа того, что переключение будет стоить, перед его возникновением.3363Выполняется перед тем, как Claude Code применяет переключение модели, запрошенное вами или клиентом. Используйте его, чтобы заблокировать переключение, потребовать подтверждения или показать, во что обойдётся переключение, до того как оно произойдёт.
3360 3364
3361PreModelSwitch требует Claude Code v2.1.251 или позже. Claude Code запускает его для этих запросов:3365PreModelSwitch требует Claude Code v2.1.251 или новее. Claude Code запускает его для следующих запросов:
3362 3366
3363* `/model <name>` и средство выбора `/model`3367* `/model <name>` и средство выбора `/model`
3364* Средство выбора модели `Option+P` или `Alt+P`3368* Средство выбора модели `Option+P` или `Alt+P`
3365* Параметр Model в `/config`3369* Настройка Model в `/config`
3366* Включение [fast mode](/docs/ru/fast-mode), когда это изменяет модель сеанса3370* Включение [быстрого режима](/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)3371* Запрос `set_model` или смена модели в запросе `apply_flag_settings` от хоста [Agent SDK](/docs/ru/agent-sdk/typescript#query-object) или [Remote Control](/docs/ru/remote-control)
3368 3372
3369Claude Code не запускает hooks PreModelSwitch для переключений, которые он делает сам, такие как [автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback) или восстановление модели при возобновлении сеанса. Эти изменения достигают [PostModelSwitch](#postmodelswitch) только.3373Claude Code не запускает хуки PreModelSwitch для переключений, которые он выполняет самостоятельно, например при [автоматическом переключении на резервную модель](/docs/ru/model-config#automatic-model-fallback) или восстановлении модели при возобновлении сессии. Такие изменения доходят только до [PostModelSwitch](#postmodelswitch).
3370 3374
3371Claude Code сравнивает matcher против канонического имени модели, на которую сеанс переключается, игнорируя любой суффикс `[1m]`. Псевдоним, такой как `opus`, датированный ID модели и ID, специфичный для провайдера, такой как ID модели Amazon Bedrock, все совпадают с одним каноническим именем, на которое они разрешаются, поэтому `claude-opus-5` охватывает каждое написание Opus 5.3375Claude Code сравнивает matcher с каноническим именем модели, на которую переключается сессия, игнорируя суффикс `[1m]`. Псевдоним, например `opus`, идентификатор модели с датой и идентификатор конкретного провайдера, например идентификатор модели Amazon Bedrock, — все соответствуют одному каноническому имени, в которое они разрешаются, поэтому `claude-opus-5` охватывает любое написание Opus 5.
3372 3376
3373Когда Claude Code не может определить каноническое имя для цели, например пользовательский ID модели, который знает только ваш [LLM gateway](/docs/ru/llm-gateway), он запускает каждый hook PreModelSwitch независимо от matcher. Hook, который блокирует, должен поэтому проверить `to_model` из его ввода, а не полагаться только на matcher.3377Когда Claude Code не может определить каноническое имя целевой модели, например для пользовательского идентификатора модели, известного только вашему [LLM-шлюзу](/docs/ru/llm-gateway), он запускает каждый хук PreModelSwitch независимо от matcher. Поэтому блокирующий хук должен проверять `to_model` из своих входных данных, а не полагаться только на matcher.
3374 3378
3375Напишите matcher как точное имя, список, разделенный `|`, такой как `claude-opus-4-6|claude-opus-5`, или регулярное выражение, такое как `.*opus.*`. Этот пример использует matcher точного имени и также проверяет `to_model` из ввода hook, поэтому он отказывает переключению на Opus 4.6, выходя с кодом 2, и позволяет любой другой цели пройти:3379Записывайте matcher как точное имя, список через `|`, например `claude-opus-4-6|claude-opus-5`, или регулярное выражение, например `.*opus.*`. Этот пример использует matcher с точным именем и также проверяет `to_model` из входных данных хука, поэтому он отклоняет переключение на Opus 4.6, завершаясь с кодом 2, и пропускает любую другую целевую модель:
3376 3380
3377<Tabs>3381<Tabs>
3378 <Tab title="macOS/Linux">3382 <Tab title="macOS/Linux">
3379 Команда проверяет `to_model` с `jq`:3383 Команда проверяет `to_model` с помощью `jq`:
3380 3384
3381 ```json theme={null}3385 ```json theme={null}
3382 {3386 {
3398 </Tab>3402 </Tab>
3399 3403
3400 <Tab title="Windows (PowerShell)">3404 <Tab title="Windows (PowerShell)">
3401 Зарегистрируйте hook команды, который запускает скрипт через PowerShell:3405 Зарегистрируйте командный хук, который запускает скрипт через PowerShell:
3402 3406
3403 ```json theme={null}3407 ```json theme={null}
3404 {3408 {
3438 </Tab>3442 </Tab>
3439</Tabs>3443</Tabs>
3440 3444
3441Чтобы подтвердить, что hook работает, запустите `/model claude-opus-4-6` из сеанса, запущенного на другой модели. Claude Code сохраняет текущую модель и сообщает, что hook PreModelSwitch заблокировал переключение, с вашим сообщением как причиной.3445Чтобы убедиться, что хук работает, выполните `/model claude-opus-4-6` из сессии, использующей другую модель. Claude Code сохраняет текущую модель и сообщает, что хук PreModelSwitch заблокировал переключение, указывая ваше сообщение в качестве причины.
3442 3446
3443<h4 id="premodelswitch-input">3447<h4 id="premodelswitch-input">
3444 PreModelSwitch input3448 Входные данные PreModelSwitch
3445</h4>3449</h4>
3446 3450
3447Помимо [общих полей ввода](#common-input-fields), hooks PreModelSwitch получают поля в этой таблице. Последние пять описывают, что повторная отправка разговора на новую модель стоит, поэтому hook может показать эту цифру перед переключением.3451Помимо [общих полей входных данных](#common-input-fields), хуки PreModelSwitch получают поля из этой таблицы. Последние пять описывают стоимость повторной отправки диалога новой модели, чтобы хук мог показать эту сумму до переключения.
3448 3452
3449| Поле | Тип | Описание |3453| Поле | Тип | Описание |
3450| :- | :- | :- |3454| :- | :- | :- |
3451| `from_model` | string | ID модели, на которую переключается |3455| `from_model` | string | Идентификатор модели, с которой выполняется переключение |
3452| `to_model` | string | ID модели, на которую переключается. Matcher сравнивает против канонического имени этой модели |3456| `to_model` | string | Идентификатор модели, на которую выполняется переключение. Matcher сравнивается с каноническим именем этой модели |
3453| `requested_model` | string или `null` | Модель, которую запрос назвал: псевдоним, такой как `opus`, полный ID модели или `null`, когда запрос был для модели по умолчанию |3457| `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 |3458| `source` | string | Откуда пришёл запрос: `"command"` для `/model <name>`, настройки Model в `/config` или включения быстрого режима; `"picker"` для средства выбора модели; `"sdk"` для запроса `set_model` или смены модели в запросе `apply_flag_settings` от хоста Agent SDK или Remote Control |
3455| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет как его подсказка: входные, кэш-чтение, кэш-создание и выходные токены последнего ответа в основном разговоре, в сумме. `0` перед первым ответом |3459| `context_tokens` | number | Токены, которые следующий запрос повторно отправляет в качестве промпта: суммарно входные токены, токены чтения кэша, создания кэша и выходные токены последнего ответа в основном диалоге. `0` до первого ответа |
3456| `prompt_cache_warm` | boolean | Вероятно ли, что кэш подсказок текущей модели все еще теплый, означая, что переключение его теряет |3460| `prompt_cache_warm` | boolean | Вероятно ли, что кэш промптов текущей модели всё ещё прогрет, то есть переключение приведёт к его потере |
3457| `cache_ttl` | string | [Время жизни кэша подсказок](/docs/ru/prompt-caching#cache-lifetime), которое Claude Code запрашивает для этого сеанса: `"5m"` или `"1h"` |3461| `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`, исключая следующий ответ. Сервер может не нуждаться в повторном кэшировании всего контекста, поэтому рассматривайте это как оценку |3462| `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 предположил ставку по умолчанию |3463| `pricing` | string | Как Claude Code рассчитал `estimated_cache_write_usd`: `"configured"` — по собственным тарифам вашей организации, если она их настроила, `"catalog"` — по прейскурантной цене, или `"default"`, если для `to_model` нет известной цены и Claude Code использовал тариф по умолчанию |
3460 3464
3461Этот пример показывает ввод для `/model opus` в сеансе, запущенном на Sonnet 5:3465Этот пример показывает входные данные для `/model opus` в сессии, использующей Sonnet 5:
3462 3466
3463```json theme={null}3467```json theme={null}
3464{3468{
3482 Управление решениями PreModelSwitch3486 Управление решениями PreModelSwitch
3483</h4>3487</h4>
3484 3488
3485Hooks `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или позволить ему продолжить. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.3489Хуки `PreModelSwitch` могут отменить переключение, попросить пользователя подтвердить его или разрешить его выполнение. Код выхода 2 или `decision: "block"` верхнего уровня отменяет переключение.
3486 3490
3487Для более тонкого управления, верните `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как на [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. Таблица ниже описывает оба поля:3491Для более тонкого управления возвращайте `permissionDecision` и `permissionDecisionReason` в объекте `hookSpecificOutput`, как в [PreToolUse](#pretooluse-decision-control). `PreModelSwitch` принимает `"allow"`, `"deny"` и `"ask"`. Он не принимает `"defer"`, `updatedInput` или `additionalContext`. В таблице ниже описаны оба поля:
3488 3492
3489| Поле | Описание |3493| Поле | Описание |
3490| :- | :- |3494| :- | :- |
3491| `permissionDecision` | `"allow"` продолжает и пропускает [подтверждение, которое Claude Code показывает, пока кэш подсказок теплый](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` подсказывает пользователю подтвердить его |3495| `permissionDecision` | `"allow"` выполняет переключение и пропускает [подтверждение, которое Claude Code показывает, пока кэш промптов прогрет](/docs/ru/prompt-caching#switching-models). `"deny"` отменяет переключение. `"ask"` запрашивает у пользователя подтверждение |
3492| `permissionDecisionReason` | Для `"deny"`, показано пользователю как причина блокировки переключения или возвращено как ошибка для запроса `set_model`. Для `"ask"`, показано в подсказке подтверждения. Игнорируется для `"allow"` |3496| `permissionDecisionReason` | Для `"deny"` показывается пользователю как причина блокировки переключения или возвращается как ошибка для запроса `set_model`. Для `"ask"` показывается в запросе подтверждения. Игнорируется для `"allow"` |
3493 3497
3494Только `/model` в интерактивном сеансе может показать подсказку `"ask"`. На каждой другой поверхности, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.3498Только `/model` в интерактивной сессии может показать запрос `"ask"`. Во всех остальных интерфейсах, включая неинтерактивный режим с флагом `-p`, `/config` и запросы `set_model`, Claude Code рассматривает `"ask"` как отказ.
3495 3499
3496Этот пример просит пользователя подтвердить и цитирует количество токенов из `context_tokens`:3500Этот пример просит пользователя подтвердить переключение и приводит количество токенов из `context_tokens`:
3497 3501
3498```json theme={null}3502```json theme={null}
3499{3503{
3505}3509}
3506```3510```
3507 3511
3508Когда несколько hooks PreModelSwitch возвращают разные решения, приоритет `deny` > `ask` > `allow`.3512Когда несколько хуков PreModelSwitch возвращают разные решения, приоритет таков: `deny` > `ask` > `allow`.
3509 3513
3510Claude Code показывает пользователю любой `systemMessage`, который возвращает ваш hook, независимо от решения, поэтому hook отчета о затратах может вернуть `{"systemMessage": "..."}` и выйти 0.3514Claude Code показывает пользователю любое `systemMessage`, которое возвращает ваш хук, независимо от решения, поэтому хук для отчёта о стоимости может вернуть `{"systemMessage": "..."}` и завершиться с кодом 0.
3511 3515
3512Hook PreModelSwitch, который не отвечает перед своим тайм-аутом, блокирует переключение. На [PreToolUse](#timeouts), в отличие от этого, hook команды с истекшим временем позволяет вызову инструмента продолжить. Тайм-аут по умолчанию для этого события составляет 30 секунд. `PreModelSwitch` запускает только hooks `command`, `http` и `mcp_tool`, поэтому стандарты `prompt` и `agent` не применяются.3516Хук PreModelSwitch, который не отвечает до истечения таймаута, блокирует переключение. В [PreToolUse](#timeouts), напротив, командный хук с истёкшим таймаутом позволяет вызову инструмента продолжиться. Таймаут по умолчанию для этого события — 30 секунд. `PreModelSwitch` запускает только хуки `command`, `http` и `mcp_tool`, поэтому значения по умолчанию для `prompt` и `agent` не применяются.
3513 3517
3514Hook, который выходит с кодом, отличным от 0 или 2, и не выводит JSON решение, не блокирует: Claude Code показывает его stderr и применяет переключение, как описано в [Other exit codes](#other-exit-codes).3518Хук, который завершается с кодом, отличным от 0 или 2, и не выводит JSON-решения, не блокирует переключение: Claude Code показывает его stderr и применяет переключение, как описано в разделе [Другие коды выхода](#other-exit-codes).
3515 3519
3516<h3 id="postmodelswitch">3520<h3 id="postmodelswitch">
3517 PostModelSwitch3521 PostModelSwitch
3518</h3>3522</h3>
3519 3523
3520Запускается после изменения модели сеанса. Используйте это для предоставления руководства, специфичного для модели, без редактирования каждого CLAUDE.md, например организационной инструкции, которая применяется на определенных моделях.3524Выполняется после смены модели сессии. Используйте его, чтобы давать Claude указания, специфичные для модели, без редактирования каждого CLAUDE.md, например инструкцию для всей организации, которая применяется к определённым моделям.
3521 3525
3522PostModelSwitch требует Claude Code v2.1.251 или позже. Он не может блокировать, потому что модель уже изменилась. Claude Code запускает hooks PostModelSwitch после любого из этих изменений:3526PostModelSwitch требует Claude Code v2.1.251 или новее. Он не может блокировать, поскольку модель уже сменилась. Claude Code запускает хуки PostModelSwitch после любого из следующих изменений:
3523 3527
3524* Переключение, которое вы или клиент запросили3528* Переключение, запрошенное вами или клиентом
3525* [Автоматический fallback модели](/docs/ru/model-config#automatic-model-fallback), который изменяет модель сеанса3529* [Автоматическое переключение на резервную модель](/docs/ru/model-config#automatic-model-fallback), которое меняет модель сессии
3526* Параметр, такой как [`opusplan`](/docs/ru/model-config#opusplan-model-setting), входящий или выходящий из режима плана3530* Настройка, например [`opusplan`](/docs/ru/model-config#opusplan-model-setting), при входе в режим планирования или выходе из него
3527* Claude Code восстанавливает модель при возобновлении сеанса3531* Восстановление модели Claude Code при возобновлении сессии
3528 3532
3529Claude Code не запускает hooks PostModelSwitch, когда модель из [цепочки fallback модели](/docs/ru/model-config#fallback-model-chains) служит ходу, потому что эта замена длится один ход и оставляет модель сеанса неизменной.3533Claude Code не запускает хуки PostModelSwitch, когда ход обслуживает модель из [цепочки резервных моделей](/docs/ru/model-config#fallback-model-chains), поскольку такая замена длится один ход и оставляет модель сессии неизменной.
3530 3534
3531Matcher следует тем же правилам, что и [PreModelSwitch](#premodelswitch): Claude Code сравнивает его против канонического имени модели, на которую переключился сеанс.3535Matcher подчиняется тем же правилам, что и в [PreModelSwitch](#premodelswitch): Claude Code сравнивает его с каноническим именем модели, на которую переключилась сессия.
3532 3536
3533Этот пример добавляет руководство, когда модель сеанса изменяется на любую модель Opus:3537Этот пример добавляет указания всякий раз, когда модель сессии меняется на любую модель Opus:
3534 3538
3535```json theme={null}3539```json theme={null}
3536{3540{
3550}3554}
3551```3555```
3552 3556
3553Чтобы подтвердить, что hook работает, переключитесь на модель Opus из сеанса, запущенного на другой модели, например запустите `/model opus` из сеанса Sonnet, затем попросите Claude, какое руководство у него есть о текущей модели.3557Чтобы убедиться, что хук работает, переключитесь на модель Opus из сессии, использующей другую модель, например выполните `/model opus` из сессии Sonnet, а затем спросите Claude, какие у него есть указания относительно текущей модели.
3554 3558
3555<h4 id="postmodelswitch-input">3559<h4 id="postmodelswitch-input">
3556 PostModelSwitch input3560 Входные данные PostModelSwitch
3557</h4>3561</h4>
3558 3562
3559Hooks PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), с `hook_event_name`, установленным на `"PostModelSwitch"`, и двумя дополнительными значениями `source`: `"auto"` для автоматического fallback или другого изменения, которое Claude Code сделал сам, и `"resume"` для модели, восстановленной при возобновлении сеанса.3563Хуки PostModelSwitch получают те же поля, что и [PreModelSwitch](#premodelswitch-input), при этом `hook_event_name` имеет значение `"PostModelSwitch"`, а для `source` есть ещё два значения: `"auto"` для автоматического переключения на резервную модель или другого изменения, которое Claude Code выполнил самостоятельно, и `"resume"` для модели, восстановленной при возобновлении сессии.
3560 3564
3561`requested_model` — это `null`, когда `source` — это `"auto"`. Когда `source` — это `"resume"`, это сохраненный параметр модели, который Claude Code восстановил.3565`requested_model` равно `null`, когда `source` равно `"auto"`. Когда `source` равно `"resume"`, это сохранённая настройка модели, которую восстановил Claude Code.
3562 3566
3563<h4 id="postmodelswitch-decision-control">3567<h4 id="postmodelswitch-decision-control">
3564 Управление решениями PostModelSwitch3568 Управление решениями PostModelSwitch
3565</h4>3569</h4>
3566 3570
3567Claude Code берет ваш [простой текст stdout](#exit-code-0) hook при выходе 0 или `additionalContext` из вывода JSON и доставляет его Claude со следующим запросом после переключения. Помимо [полей вывода JSON](#json-output), доступных всем hooks, вы можете вернуть:3571Claude Code берёт [простой текстовый stdout](#exit-code-0) вашего хука при коде выхода 0 или `additionalContext` из JSON-вывода и передаёт его Claude со следующим запросом после переключения. Помимо [полей JSON-вывода](#json-output), доступных всем хукам, вы можете вернуть:
3568 3572
3569| Поле | Описание |3573| Поле | Описание |
3570| :- | :- |3574| :- | :- |
3571| `additionalContext` | Строка, добавленная в контекст Claude со следующим запросом. См. [Add context for Claude](#add-context-for-claude) |3575| `additionalContext` | Строка, добавляемая в контекст Claude со следующим запросом. См. [Добавление контекста для Claude](#add-context-for-claude) |
3572 3576
3573Если hook не завершится в течение пяти секунд после отправки следующей подсказки, Claude Code отправляет этот запрос без вывода и прикрепляет его к следующему запросу вместо этого. Если модель изменяется несколько раз перед следующим запросом, Claude Code доставляет только вывод для переключения последней цели модели.3577Если хук не завершился в течение пяти секунд после отправки следующего промпта, Claude Code отправляет этот запрос без вывода и вместо этого прикрепляет его к последующему запросу. Если модель меняется несколько раз до следующего запроса, Claude Code передаёт только вывод для целевой модели последнего переключения.
3574 3578
3575<h3 id="sessionend">3579<h3 id="sessionend">
3576 SessionEnd3580 SessionEnd
3577</h3>3581</h3>
3578 3582
3579Запускается, когда сеанс Claude Code заканчивается. Полезно для задач очистки, логирования статистики сеанса или сохранения состояния сеанса. Поддерживает matchers для фильтрации по причине выхода.3583Выполняется при завершении сессии Claude Code. Полезен для задач очистки, записи в лог статистики
3584сессии или сохранения состояния сессии. Поддерживает matcher для фильтрации по причине выхода.
3580 3585
3581Поле `reason` в ввод hook указывает, почему сеанс закончился:3586Поле `reason` во входных данных хука указывает, почему завершилась сессия:
3582 3587
3583| Причина | Описание |3588| Причина | Описание |
3584| :- | :- |3589| :- | :- |
3585| `clear` | Сеанс очищен с помощью команды `/clear` |3590| `clear` | Сессия очищена командой `/clear` |
3586| `resume` | Сеанс переключен через интерактивный `/resume` |3591| `resume` | Сессия переключена через интерактивную `/resume` |
3587| `logout` | Пользователь вышел |3592| `logout` | Пользователь вышел из системы |
3588| `prompt_input_exit` | Пользователь вышел, пока ввод подсказки был видимым |3593| `prompt_input_exit` | Пользователь вышел, когда поле ввода промпта было видимо |
3589| `other` | Другие причины выхода |3594| `other` | Другие причины выхода |
3590| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code не отправляет его. Удалите его из ваших matchers `SessionEnd` |3595| `bypass_permissions_disabled` | Удалено в v2.1.234; Claude Code его не отправляет. Уберите его из matcher ваших `SessionEnd` |
3591 3596
3592<h4 id="sessionend-input">3597<h4 id="sessionend-input">
3593 SessionEnd input3598 Входные данные SessionEnd
3594</h4>3599</h4>
3595 3600
3596Помимо [общих полей ввода](#common-input-fields), hooks SessionEnd получают поле `reason`, указывающее, почему сеанс закончился. См. [таблицу причин](#sessionend) выше для всех значений.3601Помимо [общих полей входных данных](#common-input-fields), хуки SessionEnd получают поле `reason`, указывающее, почему завершилась сессия. Все значения см. в [таблице причин](#sessionend) выше.
3597 3602
3598```json theme={null}3603```json theme={null}
3599{3604{
3605}3610}
3606```3611```
3607 3612
3608Hooks SessionEnd не имеют управления решениями. Они не могут блокировать завершение сеанса, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля вывода JSON](#json-output), такие как `systemMessage`.3613Хуки SessionEnd не имеют управления решениями. Они не могут заблокировать завершение сессии, но могут выполнять задачи очистки. Claude Code отбрасывает их [поля JSON-вывода](#json-output), такие как `systemMessage`.
3609 3614
3610Hooks SessionEnd имеют тайм-аут по умолчанию 1.5 секунды. Он применяется, когда вы выходите, запускаете `/clear` или переключаете сеансы с интерактивным `/resume`. Вы можете дать hook больше времени двумя способами:3615Хуки SessionEnd имеют таймаут по умолчанию 1,5 секунды. Он применяется, когда вы выходите, выполняете `/clear` или переключаете сессии с помощью интерактивной `/resume`. Дать хуку больше времени можно двумя способами:
3611 3616
3612* **Per-hook `timeout`**: установите `timeout` в конфигурации этого hook. Общий бюджет автоматически повышается, чтобы совпадать с наивысшим `timeout` per-hook в ваших файлах параметров, до 60 секунд. Если вы повышаете бюджет таким образом, hook без своего собственного `timeout` все еще сохраняет стандарт. Тайм-ауты, установленные на hooks, предоставленные plugin, не повышают бюджет.3617* **`timeout` для отдельного хука**: задайте `timeout` в конфигурации этого хука. Общий лимит времени автоматически повышается до наибольшего значения `timeout` среди хуков в ваших файлах настроек, но не более 60 секунд. Если вы повышаете лимит таким образом, хук без собственного `timeout` по-прежнему сохраняет значение по умолчанию. Таймауты, заданные для хуков из плагинов, не повышают лимит.
3613* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: установите эту переменную окружения в миллисекундах для явного переопределения бюджета. Значение, которое вы установили, также становится тайм-аутом для каждого hook без своего собственного `timeout`.3618* **`CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS`**: задайте эту переменную окружения в миллисекундах, чтобы явно переопределить лимит. Заданное значение также становится таймаутом для каждого хука без собственного `timeout`.
3614 3619
3615Этот пример устанавливает бюджет на 5 секунд:3620Этот пример устанавливает лимит в 5 секунд:
3616 3621
3617```bash theme={null}3622```bash theme={null}
3618CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude3623CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS=5000 claude
3619```3624```
3620 3625
3621До версии 2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышал только общий бюджет, и hook без своего собственного `timeout` все еще отменялся через 1.5 секунды.3626До v2.1.268 `CLAUDE_CODE_SESSIONEND_HOOKS_TIMEOUT_MS` повышала только общий лимит, а хук без собственного `timeout` всё равно отменялся через 1,5 секунды.
3622 3627
3623<h3 id="elicitation">3628<h3 id="elicitation">
3624 Elicitation3629 Elicitation
3625</h3>3630</h3>
3626 3631
3627Запускается, когда сервер MCP запрашивает ввод пользователя во время задачи. По умолчанию Claude Code показывает интерактивный диалог для ответа пользователя. Hooks могут перехватить этот запрос и ответить программно, полностью пропустив диалог.3632Выполняется, когда MCP-сервер запрашивает ввод пользователя во время выполнения задачи. По умолчанию Claude Code показывает интерактивное диалоговое окно для ответа пользователя. Хуки могут перехватить этот запрос и ответить программно, полностью пропустив диалоговое окно.
3628 3633
3629Поле matcher совпадает с именем сервера MCP.3634Поле matcher сопоставляется с именем MCP-сервера.
3630 3635
3631<h4 id="elicitation-input">3636<h4 id="elicitation-input">
3632 Elicitation input3637 Входные данные Elicitation
3633</h4>3638</h4>
3634 3639
3635Помимо [общих полей ввода](#common-input-fields), hooks Elicitation получают `mcp_server_name`, `message` и опциональные поля `mode`, `url`, `elicitation_id` и `requested_schema`.3640Помимо [общих полей входных данных](#common-input-fields), хуки Elicitation получают поля `mcp_server_name`, `message` и необязательные поля `mode`, `url`, `elicitation_id` и `requested_schema`.
3636 3641
3637Для режима формы elicitation, наиболее распространенный случай:3642Для elicitation в режиме формы, наиболее распространённого случая:
3638 3643
3639```json theme={null}3644```json theme={null}
3640{3645{
3654}3659}
3655```3660```
3656 3661
3657Для URL-режима elicitation, используемого для аутентификации на основе браузера:3662Для elicitation в режиме URL, используемого для аутентификации через браузер:
3658 3663
3659```json theme={null}3664```json theme={null}
3660{3665{
3670```3675```
3671 3676
3672<h4 id="elicitation-output">3677<h4 id="elicitation-output">
3673 Elicitation output3678 Вывод Elicitation
3674</h4>3679</h4>
3675 3680
3676Чтобы ответить программно без показа диалога, верните объект JSON с `hookSpecificOutput`:3681Чтобы ответить программно без показа диалогового окна, верните JSON-объект с `hookSpecificOutput`:
3677 3682
3678```json theme={null}3683```json theme={null}
3679{3684{
3689 3694
3690| Поле | Значения | Описание |3695| Поле | Значения | Описание |
3691| :- | :- | :- |3696| :- | :- | :- |
3692| `action` | `accept`, `decline`, `cancel` | Принять ли, отклонить или отменить запрос |3697| `action` | `accept`, `decline`, `cancel` | Принять, отклонить или отменить запрос |
3693| `content` | object | Значения полей формы для отправки. Используется только, когда `action` — это `accept` |3698| `content` | object | Значения полей формы для отправки. Используется только когда `action` равно `accept` |
3694 3699
3695Код выхода 2 отклоняет elicitation. Claude Code не показывает ваше сообщение stderr нигде.3700Код выхода 2 отклоняет elicitation. Claude Code нигде не показывает ваше сообщение stderr.
3696 3701
3697Claude Code действует на `hookSpecificOutput` из вывода JSON hook Elicitation и отбрасывает `systemMessage` и `continue`.3702Claude Code использует `hookSpecificOutput` из JSON-вывода хука Elicitation и отбрасывает `systemMessage` и `continue`.
3698 3703
3699<h3 id="elicitationresult">3704<h3 id="elicitationresult">
3700 ElicitationResult3705 ElicitationResult
3701</h3>3706</h3>
3702 3707
3703Запускается после того, как пользователь отвечает на запрос MCP elicitation. Hooks могут наблюдать, изменять или блокировать ответ перед его отправкой обратно на сервер MCP.3708Выполняется после того, как пользователь отвечает на elicitation MCP. Хуки могут наблюдать, изменять или блокировать ответ до его отправки обратно MCP-серверу.
3704 3709
3705Поле matcher совпадает с именем сервера MCP.3710Поле matcher сопоставляется с именем MCP-сервера.
3706 3711
3707<h4 id="elicitationresult-input">3712<h4 id="elicitationresult-input">
3708 ElicitationResult input3713 Входные данные ElicitationResult
3709</h4>3714</h4>
3710 3715
3711Помимо [общих полей ввода](#common-input-fields), hooks ElicitationResult получают `mcp_server_name`, `action` и опциональные поля `mode`, `elicitation_id` и `content`.3716Помимо [общих полей входных данных](#common-input-fields), хуки ElicitationResult получают поля `mcp_server_name`, `action` и необязательные поля `mode`, `elicitation_id` и `content`.
3712 3717
3713```json theme={null}3718```json theme={null}
3714{3719{
3725```3730```
3726 3731
3727<h4 id="elicitationresult-output">3732<h4 id="elicitationresult-output">
3728 ElicitationResult output3733 Вывод ElicitationResult
3729</h4>3734</h4>
3730 3735
3731Чтобы переопределить ответ пользователя, верните объект JSON с `hookSpecificOutput`:3736Чтобы переопределить ответ пользователя, верните JSON-объект с `hookSpecificOutput`:
3732 3737
3733```json theme={null}3738```json theme={null}
3734{3739{
3743| Поле | Значения | Описание |3748| Поле | Значения | Описание |
3744| :- | :- | :- |3749| :- | :- | :- |
3745| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |3750| `action` | `accept`, `decline`, `cancel` | Переопределяет действие пользователя |
3746| `content` | object | Переопределяет значения полей формы. Имеет смысл только, когда `action` — это `accept` |3751| `content` | object | Переопределяет значения полей формы. Имеет смысл только когда `action` равно `accept` |
3747 3752
3748Код выхода 2 блокирует ответ, изменяя эффективное действие на `decline`. Claude Code не показывает ваше сообщение stderr нигде.3753Код выхода 2 блокирует ответ, меняя фактическое действие на `decline`. Claude Code нигде не показывает ваше сообщение stderr.
3749 3754
3750Claude Code действует на `hookSpecificOutput` из вывода JSON hook ElicitationResult и отбрасывает `systemMessage` и `continue`.3755Claude Code использует `hookSpecificOutput` из JSON-вывода хука ElicitationResult и отбрасывает `systemMessage` и `continue`.
3751 3756
3752<h2 id="prompt-based-hooks">3757<h2 id="prompt-based-hooks">
3753 Prompt-based hooks3758 Prompt-based hooks