Claude Code 2.1.290 подсказывает модам, кто просит доступ

Мод в Claude Code решал, пускать ли инструмент, но не знал, кто его просит: основная сессия или один из её субагентов. В релизе 2.1.290 на GitHub хук tool.check получил поле agentId, а WebFetch перестал молча обрезать длинные страницы.
Коротко
- Моды в версии 2.1.290 получают больше данных: результат turn.step перечисляет серверные вызовы инструментов в serverToolUses, а вопрос и вердикт tool.check несут поле ceiling с требованием организации.
- WebFetch раньше молча отбрасывал текст страницы после 100 000 символов, а сейчас сообщает, сколько осталось непрочитанным, и принимает смещение, чтобы дочитать страницу с нужного места.
- Подвох в деталях: список изменений не объясняет, какие значения принимает поле ceiling и что именно за advisor выполняет серверные вызовы, которые попадают в serverToolUses.
Если вы не следили: по данным GitHub, моды появились в версии 2.1.269 как среда выполнения плагинов, о которой не было ни одной страницы документации. До 2.1.286 они прятались за флагом CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1, а с 2.1.287 вышла документация и моды грузятся по умолчанию. Предыдущий релиз 2.1.289, как пишет Changelogs, тоже был про стабильность модов и дал тиммейтам единый ID агента во всех событиях хуков.
Хук tool.check отличает субагента от основной сессии
Главная правка для авторов модов касается tool.check, события, через которое плагин участвует в проверке разрешений. В него добавили agentId, и хук видит, пришла проверка от субагента или от основной сессии. Субагент работает в собственном окне контексте и возвращает основной сессии только сводку.
Второе новое поле, ceiling, лежит в вопросе и вердикте, которые читает хук tool.check. Оно называет уровень одобрения, которого организация требует для инструмента. Рядом закрыли две дыры: установленный пользователем мод мог заставить защитную проверку организации пропустить работу или добиться выгрузки организационного плагина. В обоих случаях выгружается сам пользовательский мод.
Подтянули и проверки Bash. Команды rg и git grep с аргументами, которые оболочка раскроет как шаблоны, pyright, часть форм ps и команды с именами переменных, которые zsh читает иначе, чем bash, спрашивают разрешения. Зато конвейер с heredoc вроде cat <<EOF | python3 в песочнице не требует одобрения при каждом запуске.
turn.step показывает вызовы, которые API выполнил сам
В результат хука turn.step добавили serverToolUses: список вызовов инструментов, которые API выполнил на своей стороне, в changelog он назван advisor. У каждого вызова есть id, имя, входные данные, время начала и конца. Попутно исправили ошибку, из-за которой turn.step показывал вызов, отброшенный при переключении на запасную модель посреди ответа.
Для проверки самих модов команда claude plugin validate перечисляет каждый хук, зарегистрированный в точке принятия решений, и отмечает, есть ли у него обработчик .catch. С флагом --json этот список лежит в поле gatingHooks. Ещё исправили случай, когда хук с .catch надолго занимал рабочий процесс хуков, выгружался, а .catch пропускался. Моды также заработали у тех, кто ходит к Claude через шлюз с ANTHROPIC_BASE_URL и ANTHROPIC_AUTH_TOKEN без аккаунта Anthropic.
WebSearch получает 100 вызовов в час вместо потолка в 200
В интерактивной сессии бюджет WebSearch пополняется со временем, по 100 вызовов в час. Раньше он просто заканчивался после 200 вызовов. Темп задаёт переменная CLAUDE_CODE_WEB_SEARCH_REFILLS_PER_HOUR, значение 0 отключает пополнение. Вызов browser_batch в Claude in Chrome получает 90 секунд вместо 60, прежде чем его объявят зависшим.
WebFetch на страницах длиннее 100 000 символов сообщает, сколько текста осталось непрочитанным, и принимает смещение для следующего чтения. Раньше хвост страницы пропадал молча. MCP-сервер, который прокси блокирует ответом HTTP 403, при запуске не перезапрашивается трижды.
Мелочь для тех, кто держит много фоновых сессий: claude attach <name> и claude logs <name> принимают часть имени сессии вместо id. Исправили и потерю мышления и кэша промпта у возобновлённых субагентов и тиммейтов, получивших сообщение посреди работы.
Почему мод может вмешаться в любой вызов инструмента
Согласно документации Claude Code, мод устроен как плагин с файлом хуков на JavaScript или TypeScript, и Claude Code загружает его напрямую, без Node.js и сборки. Каждый хук получает три аргумента: API модов $, событие e с данными вроде имени инструмента и аргументов и функцию next. Вызов next(e) передаёт событие следующим модам, затем штатной логике Claude Code и возвращает результат.
В той же документации сказано, что хук может просто наблюдать, вернув next(e), или ответить сам. Представьте проходную с цепочкой охранников, где каждый пропускает посетителя дальше или решает за всех. С agentId охранник видит, из какого отдела пришёл человек, а ceiling подсказывает, какой допуск требует руководство. По данным GitHub, все события и методы $ описаны в файле типов, который Claude Code пишет при каждой загрузке мода из папки.
Чего релиз не объясняет, так это кто такой advisor, чьи вызовы попадают в serverToolUses, и какие значения принимает ceiling. По данным GitHub, главным описанием API считается копия файла типов от 2.1.290 размером 586 КБ. На наш взгляд, новый лимит WebSearch устроен удобнее старого: длинная сессия не упирается в стену после 200 вызовов, хотя для плотного исследования 100 в час может оказаться тесно.
Какие исправления сработают позже
Два исправления из 2.1.290 действуют не сразу. Сбой claude agents с ошибкой «Couldn't restart the background service» после обновления через Homebrew уйдёт начиная со следующего апгрейда после этого. Возврат запланированных задач после сжатия разговора касается только сжатий, сделанных начиная с этой версии.
Читайте также
- Claude Code 2.1.288 вернёт промпт, стёртый по Ctrl+C
- На модах Claude Code Anthropic собрала /diff и AGENTS.md
- В Claude Code появился агент, который читает вывод за вас
- Claude Code 2.1.286 считает стопку запросов на разрешение
- Claude Code научился собирать тесты для ваших приложений
- В проекте без CLAUDE.md Claude Code 2.1.277 читает AGENTS.md
Комментарии
Пока никто не написал. Будьте первым.
Присоединяйтесь к разговору
Войдите через Google, чтобы оставить комментарий. Имя и аватар подставятся из вашего профиля Google, а комментарий появится после модерации.
