HOOK.md, встановлений оператором, для команд і подій Gateway, таких як
/new, /reset, /stop, agent:bootstrap або gateway:startup.
Швидкий старт
Зареєструйте типізовані хуки Plugin за допомогоюapi.on(...) у точці входу вашого Plugin:
priority. Хуки
з однаковим пріоритетом зберігають порядок реєстрації.
Каталог хуків
Хуки згруповано за поверхнею, яку вони розширюють. Назви, виділені жирним, приймають результат рішення (block, cancel, override або require approval); усі інші є лише спостережними. Хід агентаbefore_model_resolve— перевизначає провайдера або модель до завантаження повідомлень сесіїbefore_prompt_build— додає динамічний контекст або текст системного промпту перед викликом моделіbefore_agent_start— лише сумісний об’єднаний етап; натомість віддавайте перевагу двом хукам вищеbefore_agent_reply— достроково завершує хід моделі синтетичною відповіддю або беззвучним режимомagent_end— спостерігає фінальні повідомлення, стан успіху та тривалість запуску
llm_input— спостерігає вхідні дані провайдера (системний промпт, промпт, історія)llm_output— спостерігає вихідні дані провайдера
before_tool_call— переписує параметри інструмента, блокує виконання або вимагає схваленняafter_tool_call— спостерігає результати інструмента, помилки та тривалістьtool_result_persist— переписує повідомлення асистента, створене з результату інструментаbefore_message_write— перевіряє або блокує запис повідомлення в процесі виконання (рідко)
inbound_claim— перехоплює вхідне повідомлення до маршрутизації агента (синтетичні відповіді)message_received— спостерігає вхідний вміст, відправника, потік та метаданіmessage_sending— переписує вихідний вміст або скасовує доставкуmessage_sent— спостерігає успіх або збій вихідної доставкиbefore_dispatch— перевіряє або переписує вихідну диспетчеризацію до передавання каналуreply_dispatch— бере участь у фінальному конвеєрі диспетчеризації відповіді
session_start/session_end— відстежують межі життєвого циклу сесіїbefore_compaction/after_compaction— спостерігають або анотують цикли Compactionbefore_reset— спостерігає події скидання сесії (/reset, програмні скидання)
subagent_spawning/subagent_delivery_target/subagent_spawned/subagent_ended— координують маршрутизацію субагентів і доставку завершення
gateway_start/gateway_stop— запускають або зупиняють служби Plugin, що належать Gatewaybefore_install— перевіряє сканування встановлення skill або Plugin і за потреби блокує
Політика викликів інструментів
before_tool_call отримує:
event.toolNameevent.params- необов’язковий
event.runId - необов’язковий
event.toolCallId - поля контексту, такі як
ctx.agentId,ctx.sessionKey,ctx.sessionId, і діагностичнийctx.trace
block: trueє термінальним і пропускає обробники з нижчим пріоритетом.block: falseтрактується як відсутність рішення.paramsпереписує параметри інструмента для виконання.requireApprovalпризупиняє запуск агента й запитує користувача через схвалення Plugin. Команда/approveможе схвалювати як exec, так і схвалення Plugin.block: trueз нижчим пріоритетом усе ще може заблокувати виконання після того, як хук з вищим пріоритетом запросив схвалення.onResolutionотримує остаточне рішення щодо схвалення —allow-once,allow-always,deny,timeoutабоcancelled.
Хуки промптів і моделей
Для нових Plugin використовуйте хуки, специфічні для етапу:before_model_resolve: отримує лише поточний промпт і метадані вкладень. ПовертаєproviderOverrideабоmodelOverride.before_prompt_build: отримує поточний промпт і повідомлення сесії. ПовертаєprependContext,systemPrompt,prependSystemContextабоappendSystemContext.
before_agent_start лишається для сумісності. Віддавайте перевагу явним хукам вище,
щоб ваш Plugin не залежав від застарілого об’єднаного етапу.
before_agent_start і agent_end містять event.runId, коли OpenClaw може
визначити активний запуск. Це саме значення також доступне в ctx.runId.
Сторонні Plugin, яким потрібні llm_input, llm_output або agent_end, мають установити:
plugins.entries.<id>.hooks.allowPromptInjection=false.
Хуки повідомлень
Використовуйте хуки повідомлень для маршрутизації на рівні каналу та політики доставки:message_received: спостерігає вхідний вміст, відправника,threadId,messageId,senderId, необов’язкову кореляцію запуску/сесії та метадані.message_sending: переписуєcontentабо повертає{ cancel: true }.message_sent: спостерігає фінальний успіх або збій.
ctx.sessionKey, ctx.runId, ctx.messageId, ctx.senderId, ctx.trace,
ctx.traceId, ctx.spanId, ctx.parentSpanId і ctx.callDepth. Віддавайте перевагу
цим першокласним полям, перш ніж звертатися до застарілих метаданих.
Віддавайте перевагу типізованим полям threadId і replyToId, перш ніж використовувати
метадані, специфічні для каналу.
Правила рішень:
message_sendingізcancel: trueє термінальним.message_sendingізcancel: falseтрактується як відсутність рішення.- Переписаний
contentпередається хукам із нижчим пріоритетом, якщо пізніший хук не скасовує доставку.
Хуки встановлення
before_install виконується після вбудованого сканування встановлень skill і Plugin.
Поверніть додаткові результати або { block: true, blockReason }, щоб зупинити
встановлення.
block: true є термінальним. block: false трактується як відсутність рішення.
Життєвий цикл Gateway
Використовуйтеgateway_start для служб Plugin, яким потрібен стан, що належить Gateway.
Контекст надає ctx.config, ctx.workspaceDir і ctx.getCron?.() для
перевірки та оновлення Cron. Використовуйте gateway_stop для очищення довготривалих
ресурсів.
Не покладайтеся на внутрішній хук gateway:startup для служб часу виконання, що належать Plugin.