/new و/reset و/stop، وCompaction الجلسة، ودورة حياة Gateway، وتدفق الرسائل. تُكتشف من الأدلة وتُدار باستخدام openclaw hooks. لا يحمّل Gateway Hooks الداخلية إلا بعد تمكين Hooks أو تهيئة إدخال Hook واحد على الأقل، أو حزمة Hooks، أو معالج قديم، أو دليل Hooks إضافي.
يوجد نوعان من Hooks في OpenClaw:
- Hooks الداخلية (هذه الصفحة): تعمل داخل Gateway عند إطلاق أحداث الوكيل.
- Webhooks: نقاط نهاية HTTP خارجية تتيح للأنظمة الأخرى تشغيل أعمال في OpenClaw. راجع Webhooks.
openclaw hooks list كلًا من Hooks المستقلة وتلك المُدارة بواسطة Plugins (وتظهر بصيغة plugin:<id>).
اختيار السطح المناسب
لدى OpenClaw عدة أسطح توسعة تبدو متشابهة، لكنها تحل مشكلات مختلفة:
استخدم Hooks الداخلية عندما تريد أتمتة تتصرف مثل تكامل صغير مثبّت. واستخدم Hooks المكتوبة بأنواع في Plugin عندما تحتاج إلى التحكم في دورة حياة وقت التشغيل.
البدء السريع
أنواع الأحداث
تشترك Hooks في مفتاح محدد من هذا الجدول، أو في اسم فئة مجرد (command أو session أو agent أو gateway أو message) لتلقي كل إجراء
ضمن تلك الفئة. لا يطلق نواة OpenClaw أي شيء آخر، ولذلك يكون أي اسم آخر في
الغالب خطأً مطبعيًا يترك Hook معطلة بصمت (ولا يمكن إطلاقه إلا بواسطة Plugin
يطلق حدثًا مخصصًا). يسجل محمّل Hooks تحذيرًا لمثل هذه الأسماء
(مثل command:nwe)، ويشير إليها openclaw hooks info <name>، ولذلك يمكن
تشخيص Hook التي لا تعمل مطلقًا.
كتابة Hooks
بنية Hook
كل Hook عبارة عن دليل يحتوي على ملفين:handler.ts أو handler.js أو index.ts أو index.js.
تنسيق HOOK.md
metadata.openclaw):
تنفيذ المعالج
type وaction وsessionKey وtimestamp وmessages وcontext (بيانات خاصة بالحدث). يمكن أيضًا أن تتضمن سياقات Hooks المكتوبة بأنواع في Plugin الخاصة بالوكيل والأداة الحقل trace، وهو سياق تتبع تشخيصي متوافق مع W3C وللقراءة فقط، ويمكن للـ Plugins تمريره إلى السجلات المهيكلة لربطه مع OTEL.
لا تُسلَّم السلاسل النصية المدفوعة إلى event.messages مرة أخرى إلى الدردشة إلا مع
command:new وcommand:reset (وتُوجَّه كرد إلى المحادثة الأصلية)
ومع session:compact:before وsession:compact:after
(وتُرسل كإشعارات بحالة Compaction). تتجاهل جميع الأحداث الأخرى الرسائل
المدفوعة، بما فيها command:stop وmessage:* وagent:bootstrap
وsession:patch وgateway:*.
أبرز عناصر سياق الأحداث
أحداث الأوامر (command:new وcommand:reset): context.sessionEntry وcontext.previousSessionEntry وcontext.commandSource وcontext.senderId وcontext.workspaceDir وcontext.cfg.
أحداث الأوامر (command:stop): context.sessionEntry وcontext.sessionId وcontext.commandSource وcontext.senderId.
أحداث الرسائل (message:received): context.from وcontext.content وcontext.channelId وcontext.metadata (بيانات خاصة بالمزوّد، بما فيها senderId وsenderName وguildId). يفضّل context.content نص أمر غير فارغ للرسائل الشبيهة بالأوامر، ثم يعود إلى نص الرسالة الواردة الخام والنص العام؛ ولا يتضمن إثراءً خاصًا بالوكيل، مثل سجل سلسلة المحادثة أو ملخصات الروابط.
أحداث الرسائل (message:sent): context.to وcontext.content وcontext.success وcontext.channelId، بالإضافة إلى context.error عند فشل الإرسال.
أحداث الرسائل (message:transcribed): context.transcript وcontext.from وcontext.channelId وcontext.mediaPath.
أحداث الرسائل (message:preprocessed): context.bodyForAgent (النص النهائي المُثرى) وcontext.from وcontext.channelId.
أحداث التمهيد (agent:bootstrap): context.bootstrapFiles (مصفوفة قابلة للتعديل) وcontext.agentId.
أحداث تصحيح الجلسة (session:patch): context.sessionEntry وcontext.patch (الحقول المتغيرة فقط) وcontext.cfg. لا يمكن إلا للعملاء ذوي الامتيازات تشغيل أحداث التصحيح؛ والسياق نسخة مستنسخة، ولذلك لا تستطيع المعالجات تعديل إدخال الجلسة الفعلي.
أحداث Compaction: يتضمن session:compact:before الحقلين messageCount وtokenCount. ويضيف session:compact:after الحقول compactedCount وsummaryLength وtokensBefore وtokensAfter.
يراقب command:stop إصدار المستخدم للأمر /stop؛ فهو جزء من دورة حياة الإلغاء/الأمر،
وليس بوابة لإنهاء الوكيل. ينبغي للـ Plugins التي تحتاج إلى فحص إجابة نهائية طبيعية
ومطالبة الوكيل بتمرير إضافي أن تستخدم Hook المكتوبة بأنواع
before_agent_finalize بدلًا من ذلك. راجع Hooks الخاصة بـ Plugin.
أحداث دورة حياة Gateway: يتضمن gateway:shutdown الحقلين reason وrestartExpectedMs، ويُطلق عند بدء إيقاف تشغيل Gateway. يتضمن gateway:pre-restart السياق نفسه، لكنه لا يُطلق إلا عندما يكون الإيقاف جزءًا من إعادة تشغيل متوقعة وتُقدَّم قيمة محدودة لـ restartExpectedMs. أثناء الإيقاف، يكون انتظار كل Hook لدورة الحياة قائمًا على أفضل جهد ومحدودًا، بحيث يستمر الإيقاف إذا تعطل أحد المعالجات. ميزانية الانتظار الافتراضية هي 5 ثوانٍ لـ gateway:shutdown و10 ثوانٍ لـ gateway:pre-restart.
استخدم gateway:pre-restart لإشعارات إعادة التشغيل القصيرة بينما لا تزال القنوات متاحة:
gateway:shutdown (أو gateway:pre-restart) وبقية تسلسل الإيقاف، يطلق Gateway أيضًا Hook مكتوبة بأنواع في Plugin باسم session_end لكل جلسة كانت لا تزال نشطة عند توقف العملية. تكون قيمة reason للحدث هي shutdown عند التوقف العادي بإشارة SIGTERM/SIGINT، وrestart عندما يكون الإغلاق مجدولًا كجزء من إعادة تشغيل متوقعة. تكون عملية التصريف هذه محدودة حتى لا يتمكن معالج session_end البطيء من منع خروج العملية، ويجري تخطي الجلسات التي سبق إنهاؤها عبر الاستبدال أو إعادة الضبط أو الحذف أو Compaction لتجنب الإطلاق المزدوج.
اكتشاف Hooks
تُكتشف Hooks من أربعة مصادر:- Hooks المضمّنة: تُشحن مع OpenClaw
- Hooks الخاصة بـ Plugin: تكون مضمّنة داخل Plugins المثبّتة؛ ويمكنها تجاوز Hooks المضمّنة التي تحمل الاسم نفسه
- Hooks المُدارة:
~/.openclaw/hooks/(مثبّتة من المستخدم ومشتركة بين مساحات العمل)؛ ويمكنها تجاوز Hooks المضمّنة وتلك الخاصة بـ Plugins. تشترك الأدلة الإضافية منhooks.internal.load.extraDirsفي هذه الأولوية. - Hooks مساحة العمل:
<workspace>/hooks/(لكل وكيل، ومعطّلة افتراضيًا إلى أن تُمكّن صراحةً)
openclaw hooks enable <name>، أو ثبّت حزمة Hooks، أو اضبط hooks.internal.enabled=true للاشتراك. عندما تمكّن Hook واحدة بالاسم، لا يحمّل Gateway إلا معالج تلك Hook؛ أما hooks.internal.enabled=true وأدلة Hooks الإضافية والمعالجات القديمة فتشترك في الاكتشاف الواسع.
حزم Hooks
حزم Hooks هي حزم npm تصدّر Hooks عبرopenclaw.hooks في package.json. ثبّتها باستخدام:
openclaw hooks install وopenclaw hooks update اسمان مستعاران مهملان للأمرين openclaw plugins install وopenclaw plugins update.
الخطافات المضمّنة
فعّل أي خطاف مضمّن:
تفاصيل session-memory
يستخرج آخر رسائل المستخدم/المساعد (15 افتراضيًا، وقابلة للضبط عبرhooks.internal.entries.session-memory.messages) ويحفظها في <workspace>/memory/YYYY-MM-DD-HHMM.md باستخدام التاريخ المحلي للمضيف. يعمل التقاط الذاكرة في الخلفية كي لا تتأخر إقرارات /new و/reset بسبب قراءة النصوص المنسوخة أو التوليد الاختياري للاسم المختصر. اضبط hooks.internal.entries.session-memory.llmSlug: true لتوليد أسماء مختصرة وصفية للملفات، ويمكنك اختياريًا ضبط hooks.internal.entries.session-memory.model على اسم مستعار مضبوط مثل sonnet، أو معرّف نموذج مجرد لدى المزوّد الافتراضي للوكيل، أو مرجع provider/model. يستخدم توليد الاسم المختصر النموذج الافتراضي للوكيل عند حذف model، ويرجع إلى أسماء مختصرة قائمة على الطابع الزمني عند عدم توفره. يتطلب ضبط workspace.dir.
إعداد bootstrap-extra-files
patterns وfiles كاسمين مستعارين لـpaths. تُحل المسارات نسبةً إلى مساحة العمل ويجب أن تبقى داخلها. لا تُحمّل إلا أسماء ملفات التمهيد الأساسية المعروفة (AGENTS.md، وSOUL.md، وTOOLS.md، وIDENTITY.md، وUSER.md، وHEARTBEAT.md، وBOOTSTRAP.md، وMEMORY.md).
تفاصيل command-logger
يسجّل كل أمر يبدأ بشرطة مائلة كسطر JSON (الطابع الزمني، والإجراء، ومفتاح الجلسة، ومعرّف المرسل، والمصدر) في~/.openclaw/logs/commands.log.
تفاصيل compaction-notifier
يرسل رسائل حالة قصيرة إلى المحادثة الحالية عندما يبدأ OpenClaw ضغط النص المنسوخ للجلسة وينتهي منه. يجعل هذا المنعطفات الطويلة أقل إرباكًا على واجهات المحادثة، إذ يمكن للمستخدم رؤية أن المساعد يلخّص السياق وسيواصل بعد Compaction.تفاصيل boot-md
يشغّلBOOT.md عند بدء Gateway لكل نطاق وكيل مضبوط، إذا كان الملف موجودًا في مساحة العمل المحلولة لذلك الوكيل.
خطافات Plugin
يمكن لبرامج Plugin تسجيل خطافات محددة الأنواع عبر حزمة تطوير Plugin لتحقيق تكامل أعمق: اعتراض استدعاءات الأدوات، وتعديل المطالبات، والتحكم في تدفق الرسائل، وغير ذلك. استخدم خطافات Plugin عندما تحتاج إلىbefore_tool_call أو before_agent_reply
أو before_install أو خطافات دورة حياة أخرى داخل العملية.
تختلف الخطافات الداخلية التي تديرها برامج Plugin: فهي تشارك في نظام أحداث
الأوامر/دورة الحياة العام في هذه الصفحة، وتظهر في openclaw hooks list بصيغة
plugin:<id>. استخدمها للآثار الجانبية والتوافق مع حزم الخطافات، وليس
للبرمجيات الوسيطة المرتبة أو بوابات السياسات.
للاطلاع على المرجع الكامل لخطافات Plugin، راجع خطافات Plugin.
الإعداد
requires.env للخطاف (إلى جانب بيئة العملية)، ويمكن للمعالجات قراءتها من إدخال إعداد الخطاف الخاص بها:
لا يزال تنسيق إعداد المصفوفة القديم
hooks.internal.handlers مدعومًا للتوافق مع الإصدارات السابقة، لكن ينبغي للخطافات الجديدة استخدام النظام القائم على الاكتشاف.مرجع CLI
أفضل الممارسات
- أبقِ المعالجات سريعة. تعمل الخطافات أثناء معالجة الأوامر. شغّل الأعمال الثقيلة دون انتظار باستخدام
void processInBackground(event). - تعامل مع الأخطاء بسلاسة. غلّف العمليات المحفوفة بالمخاطر ضمن try/catch؛ ولا تطرح استثناءً حتى تتمكن المعالجات الأخرى من العمل.
- رشّح الأحداث مبكرًا. ارجع فورًا إذا لم يكن نوع الحدث/الإجراء ذا صلة.
- استخدم مفاتيح أحداث محددة. فضّل
"events": ["command:new"]على"events": ["command"]لتقليل الحمل الإضافي.
استكشاف الأخطاء وإصلاحها
لم يُكتشف الخطاف
الخطاف غير مؤهل
الخطاف لا يُنفّذ
- تحقق من تمكين الخطاف:
openclaw hooks list - أعد تشغيل عملية Gateway حتى يُعاد تحميل الخطافات.
- تحقق من سجلات Gateway:
openclaw logs --follow | grep -i hook
ذو صلة
- مرجع CLI: الخطافات
- خطافات Webhook
- خطافات Plugin — خطافات دورة حياة Plugin داخل العملية
- الإعداد