26. Хуки: пробелы и статус
🔵 Аудит подсистемы хуков (hooks core): что закрыто и что ещё предстоит. Справочник — 06-hooks-reference, скриптовый API — 07-scripts, плагины — 20-native-plugins.
Изначально хуки умели только три точки жизненного цикла
(before_user_message, after_turn, after_loop) и не имели ни
перехвата инструментов/инференса, ни аудита, ни изоляции. Ниже — журнал
закрытых пробелов и оставшийся список.
26.1 Что уже закрыто
| Пробел | Решение |
|---|---|
| Только 3 точки перехвата | Добавлены before_tool_call, after_tool_result, before_inference, on_spawn, on_terminate, on_error, after_assistant_message |
| Паника в hook-хендлере роняла ход | Kernel::run_hook оборачивает каждый вызов в catch_unwind |
| Хук мог подвесить ход навсегда | Лимит timeouts.hook_secs (перекрывает дефолт ядра 300с) |
| Аудит только текстом в транскрипт | Событие ProcessEvent::HookIntercepted (events.db + JSONL) для всех точек; строки kind hook в message store |
| Скриптовым хукам недоступен scratch сессии | HookServices::temp_dir → работают fs_write / caller().temp_dir |
hook_tool не проверял новые точки |
Команды tool / result / inference / spawn / terminate / error |
| Плагинные хуки без перехвата | ABI v2: колбэки перехвата в AoHookVtable (AO_ABI_VERSION = 2) |
| Нет output-guardrail | after_assistant_message (rewrite / suppress / notice; исправленный ответ пере-эмитится как final_answer) |
| Хук мог вызвать инструмент вне allowlist агента | Гейт по proc.tools и на LLM-пути, и в call_tool (хуки/скрипты) |
| Нет attach/detach у живого процесса | grant_hook / revoke_hook / process_hooks (паритет с инструментами) |
tool-шаги воркфлоу шли мимо хуков |
Kernel::run_tool_for (ключ — pid запуска воркфлоу) |
26.2 Что осталось
| # | Пробел | Суть | Приоритет |
|---|---|---|---|
| 1 | on_token |
Перехват стрима токенов (модерация/редакция на лету) | средний |
| 2 | before_context_evict |
Кастомная компакция/суммаризация вытесняемого контекста | средний |
| 3 | Композиция хуков | Фиксированный трейт, порядок = порядок регистрации: нет приоритетов, условий активации, enabled, per-scope (tenant/user) |
средний |
| 4 | Глобальные хуки | Хуки только per-process (из шаблона); нет wildcard / глобального DLP на всех агентов | средний |
| 5 | Хуки жизненного цикла сессии | Нет on_session_created / on_session_closed |
низкий |
| 6 | Контекст хука | HookContext без глубины/родителя, доступных инструментов, остатка бюджета |
низкий |
| 7 | Метрики хуков | Нет длительности/счётчиков/ошибок по хукам | низкий |
| 8 | ABI-паритет after_assistant_message |
Точка есть в Rust и скриптах, но не в plugin ABI | низкий |
| 9 | Short-circuit и история | Короткозамкнутый результат инструмента не пишется в tool_result_history (композиция его не видит) |
низкий |
| 10 | before_inference без отказа |
Только мутация запроса; нельзя отказать/заменить ответ; вызывается и на ретраях | низкий |
26.3 Концептуальные механизмы (не реализовано)
- Middleware/цепочка перехватчиков (à la Tower): приоритеты, зависимости, условная активация, композиция short-circuit'ов. Сейчас — плоский трейт с фиксированными вызовами в ядре.
- Стековый контекст: хуки не знают, что работают в субагенте (нет
depth/parent). - Перехват на уровне syscall/IPC: нет общего
before_syscall/ фильтрацииsend/recvмежду агентами. - Бюджетные пороги: нет
on_budget_threshold(предупреждение/эскалация до исчерпания). - Политика ретраев:
on_errorесть, но кастомной retry/backoff/circuit-breaker политики через хук нет.
26.4 Приоритеты
on_token+before_context_evict— закрыть оставшиеся точки перехвата (стриминговая модерация + компакция).- Middleware/глобальные хуки — композиция, приоритеты, единый DLP.
- ABI-паритет
after_assistant_message— иначе плагины отстают от скриптов. - Метрики хуков — длительность/ошибки для эксплуатации.
26.5 История
Коммиты в master: 0d3e1d5, 74edef1, 854d525, 3a8cc5b, f135e1d,
f192e5e (слиты в f0cad02). Тесты: agent_os_core (hooks) + plugin-host
ABI round-trip.