title: Архитектура description: “Как работают обработчик хука, загрузка конфигурации и оценка политик” icon: sitemap
В этом документе объясняется, как failproofai работает внутренне: как система хуков перехватывает вызовы инструментов агента, как загружается и объединяется конфигурация, как оцениваются политики и как панель мониторинга отслеживает активность агента.Обзор
failproofai состоит из двух независимых подсистем:- Обработчик хука — быстрый CLI подпроцесс, который Claude Code вызывает при каждом вызове инструмента агента. Оценивает политики и возвращает решение.
- Agent Monitor (Dashboard) — веб-приложение Next.js для мониторинга сеансов агента и управления политиками.
~/.failproofai/ и в директории .failproofai/ проекта, но работают как отдельные процессы и общаются только через файловую систему.
Обработчик хука
Интеграция с Claude Code
Когда вы запускаетеfailproofai policies --install, в ~/.claude/settings.json добавляются записи следующего вида:
failproofai --hook PreToolUse как подпроцесс перед каждым вызовом инструмента, передавая JSON-полезную нагрузку на stdin.
Формат полезной нагрузки
PostToolUse полезная нагрузка также содержит tool_result с выходом инструмента.
Обработчик устанавливает ограничение входного потока в 1 МБ. Полезные нагрузки, превышающие этот лимит, отбрасываются и все политики неявно разрешают операцию.
Формат ответа
Отклонить (PreToolUse):- Код выхода:
2 - Причина записана в stderr (не stdout)
- Код выхода:
0 - Пустой stdout
allow(message) позволяет политике отправить контекстную информацию в Claude, даже если операция разрешена. Обработчик хука записывает в stdout следующий JSON (не в файл конфигурации — это ответ обработчика на Claude Code, как и ответы deny и instruct выше):
- Код выхода:
0(операция разрешена) - Когда несколько политик возвращают
allowс сообщением, их сообщения объединяются с переносами строк в единую строкуadditionalContext - Если ни одна политика не предоставляет сообщение, stdout остается пустым (как раньше)
Конвейер обработки
src/hooks/handler.ts реализует полный конвейер:
Загрузка конфигурации
src/hooks/hooks-config.ts реализует загрузку конфигурации с тремя областями видимости.
enabledPolicies— объединение всех трех файлов без дубликатовpolicyParams— на политику, первый файл, который ее определяет, полностью выигрываетcustomPoliciesPath— первый файл, который его определяет, выигрываетllm— первый файл, который его определяет, выигрывает
readHooksConfig() (только глобальная) для чтения и записи, так как она не вызывается с рабочей директорией проекта.
Оценка политик
src/hooks/policy-evaluator.ts запускает политики по порядку.
Для каждой политики:
- Найти схему
paramsполитики (если она существует). - Прочитать
policyParams[policy.name]из объединенной конфигурации. - Объединить предоставленные пользователем значения со значениями по умолчанию из схемы, создав
ctx.params. - Вызвать
policy.fn(ctx)с разрешенным контекстом. - Если результат —
deny, остановиться немедленно и вернуть это решение. - Если результат —
instruct, накопить сообщение и продолжить. - Если результат —
allow, перейти к следующей политике.
- Если было возвращено какое-либо
deny, выдать ответ deny. - Если были собраны возвращаемые значения
instruct, выдать единый ответ instruct со всеми объединенными сообщениями. - В противном случае выдать ответ allow (пустой stdout, выход 0).
Встроенные политики
src/hooks/builtin-policies.ts определяет все 26 встроенных политик как объекты BuiltinPolicyDefinition:
params, объявляют PolicyParamsSchema с типами и значениями по умолчанию для каждого параметра. Оценщик политик вводит разрешенные значения в ctx.params перед вызовом fn. Функции политик читают ctx.params без проверки null, потому что значения по умолчанию всегда применяются в первую очередь.
Сопоставление шаблонов внутри политик использует разобранные токены команд (argv), а не сопоставление сырых строк. Это предотвращает обход путем инъекции оператора оболочки (например, шаблон для sudo systemctl status * не может быть обойден путем добавления ; rm -rf / к команде).
Пользовательские политики
src/hooks/custom-hooks-registry.ts реализует реестр на основе globalThis:
src/hooks/custom-hooks-loader.ts загружает файл политики пользователя:
- Прочитать
customPoliciesPathиз конфигурации; пропустить, если отсутствует. - Разрешить абсолютный путь; проверить, что файл существует.
- Переписать все импорты
from "failproofai"на фактический путь dist, чтобыcustomPoliciesразрешался к тому же рееструglobalThis. - Рекурсивно переписать переходные локальные импорты, чтобы обеспечить совместимость ESM.
- Написать временные файлы
.mjsиimport()файл входа. - Вызвать
getCustomHooks(), чтобы получить зарегистрированные хуки. - Очистить все временные файлы в блоке
finally.
~/.failproofai/hook.log и загрузчик возвращает пустой массив. Встроенные политики не затрагиваются.
Пользовательские политики оцениваются после всех встроенных политик. deny пользовательской политики по-прежнему прерывает дальнейшие пользовательские политики (но все встроенные уже запустились к этому моменту).
Логирование активности
После каждого события хука обработчик добавляет строку JSONL в~/.failproofai/hook-activity.jsonl:
Архитектура панели мониторинга
Панель мониторинга — это приложение Next.js 16, использующее App Router с React Server Components и Server Actions.- Компоненты страниц вызывают
lib/projects.tsиlib/log-entries.tsдля чтения данных проекта/сеанса непосредственно из файловой системы (без слоя API для операций чтения). - Страница Policies использует Server Actions для всех мутаций (переключение, обновление параметров, установка/удаление).
- Просмотрщик сеансов анализирует формат JSONL-транскрипта Claude и отображает шкалу времени сообщений и вызовов инструментов.
- Нет базы данных — все постоянное состояние хранится в простых файлах (
~/.failproofai/,~/.claude/projects/). - Server Actions для мутаций — REST API не требуется для CRUD операций.
- React Server Components для страниц чтения — более быстрая начальная загрузка, отсутствие клиентского бандла для выборки данных.
- Клиентские компоненты только там, где требуется интерактивность (переключение политик, поиск активности, просмотр логов).

