HOOK.md صغيرا مثبّتا بواسطة المشغّل لأحداث الأوامر وGateway مثل
/new أو /reset أو /stop أو agent:bootstrap أو gateway:startup.
البدء السريع
سجّل خطافات Plugin المعرّفة بالأنواع باستخدامapi.on(...) من نقطة دخول Plugin لديك:
priority تنازليا. تحتفظ الخطافات ذات الأولوية نفسها
بترتيب التسجيل.
يقبل api.on(name, handler, opts?) ما يلي:
priority- ترتيب المعالج (الأعلى يعمل أولا).timeoutMs- ميزانية اختيارية لكل خطاف. عند ضبطها، يوقف مشغّل الخطافات ذلك المعالج بعد انقضاء الميزانية ويتابع مع التالي، بدلا من السماح للإعداد البطيء أو عمل الاستدعاء باستهلاك مهلة النموذج المضبوطة لدى المستدعي. احذفها لاستخدام مهلة الملاحظة/القرار الافتراضية التي يطبّقها مشغّل الخطافات بشكل عام.
hooks.timeouts.<hookName> قيمة hooks.timeoutMs، والتي تتجاوز قيمة
api.on(..., { timeoutMs }) التي ألّفها Plugin. يجب أن تكون كل قيمة مضبوطة
عددا صحيحا موجبا لا يزيد عن 600000 مللي ثانية. فضّل التجاوزات الخاصة بكل خطاف
للخطافات المعروفة ببطئها حتى لا يحصل Plugin واحد على ميزانية أطول في كل مكان.
يتلقى كل خطاف event.context.pluginConfig، وهي الإعدادات المحلولة للـ Plugin
الذي سجّل ذلك المعالج. استخدمها لقرارات الخطاف التي تحتاج خيارات Plugin الحالية؛
يحقنها OpenClaw لكل معالج دون تغيير كائن الحدث المشترك الذي تراه Plugins الأخرى.
كتالوج الخطافات
تُجمّع الخطافات حسب السطح الذي توسّعه. الأسماء المكتوبة بخط عريض تقبل نتيجة قرار (حظر أو إلغاء أو تجاوز أو طلب موافقة)؛ وكل ما عداها مخصص للملاحظة فقط. دورة الوكيلbefore_model_resolve- تجاوز المزوّد أو النموذج قبل تحميل رسائل الجلسةagent_turn_prepare- استهلاك حقنات دورة Plugin المصطفة وإضافة سياق للدورة نفسها قبل خطافات المطالبةbefore_prompt_build- إضافة سياق ديناميكي أو نص مطالبة نظام قبل استدعاء النموذجbefore_agent_start- مرحلة مدمجة للتوافق فقط؛ فضّل الخطافين أعلاهbefore_agent_run- فحص المطالبة النهائية ورسائل الجلسة قبل إرسالها إلى النموذج وحظر التشغيل اختيارياbefore_agent_reply- اختصار دورة النموذج برد اصطناعي أو صمتbefore_agent_finalize- فحص الإجابة النهائية الطبيعية وطلب تمريرة نموذج إضافيةagent_end- مراقبة الرسائل النهائية، وحالة النجاح، ومدة التشغيلheartbeat_prompt_contribution- إضافة سياق خاص بـ Heartbeat فقط لـ Plugins مراقبة الخلفية ودورة الحياة
model_call_started/model_call_ended- مراقبة بيانات وصفية منقّحة لاستدعاء المزوّد/النموذج، والتوقيت، والنتيجة، وتجزئات معرف الطلب المحدودة دون محتوى المطالبة أو الاستجابةllm_input- مراقبة مدخلات المزوّد (مطالبة النظام، المطالبة، السجل)llm_output- مراقبة مخرجات المزوّد، والاستخدام، وقيمةcontextTokenBudgetالمحلولة عند توفرها
before_tool_call- إعادة كتابة معاملات الأداة، أو حظر التنفيذ، أو طلب الموافقةafter_tool_call- مراقبة نتائج الأدوات، والأخطاء، والمدةresolve_exec_env- إسهام متغيرات بيئة مملوكة للـ Plugin إلىexectool_result_persist- إعادة كتابة رسالة المساعد الناتجة من نتيجة أداةbefore_message_write- فحص أو حظر كتابة رسالة قيد التنفيذ (نادر)
inbound_claim- المطالبة برسالة واردة قبل توجيه الوكيل (ردود اصطناعية)message_received— مراقبة المحتوى الوارد، والمرسل، والسلسلة، والبيانات الوصفيةmessage_sending— إعادة كتابة المحتوى الصادر أو إلغاء التسليمreply_payload_sending— تعديل أو إلغاء حمولات الرد المطبّعة قبل التسليمmessage_sent— مراقبة نجاح التسليم الصادر أو فشلهbefore_dispatch- فحص أو إعادة كتابة إرسال صادر قبل تسليمه إلى القناةreply_dispatch- المشاركة في مسار إرسال الرد النهائي
session_start/session_end- تتبع حدود دورة حياة الجلسة. تكون قيمةreasonفي الحدث واحدة منnewأوresetأوidleأوdailyأوcompactionأوdeletedأوshutdownأوrestartأوunknown. تُطلق قيمتاshutdownوrestartمن منهي إيقاف Gateway عندما تتوقف العملية أو يعاد تشغيلها بينما لا تزال الجلسات نشطة، حتى تتمكن Plugins اللاحقة (مثل مخازن الذاكرة أو النصوص) من إنهاء الصفوف الشبحية التي كانت ستبقى بخلاف ذلك في حالة مفتوحة عبر عمليات إعادة التشغيل. المنهي محدود بحيث لا يستطيع Plugin بطيء حظر SIGTERM/SIGINT.before_compaction/after_compaction- مراقبة دورات Compaction أو التعليق عليهاbefore_reset- مراقبة أحداث إعادة ضبط الجلسة (/reset، عمليات إعادة الضبط البرمجية)
subagent_spawned/subagent_ended- مراقبة إطلاق الوكيل الفرعي واكتماله.subagent_delivery_target- خطاف توافق لتسليم الإكمال عندما لا يستطيع ربط جلسة أساسي إسقاط مسار.subagent_spawning- خطاف توافق مهمل. يجهّز الأساس الآن ارتباطات الوكيل الفرعيthread: trueعبر محولات ربط جلسات القنوات قبل إطلاقsubagent_spawned.- يتضمن
subagent_spawnedالقيمتينresolvedModelوresolvedProviderعندما يكون OpenClaw قد حل النموذج الأصلي للجلسة الفرعية قبل الإطلاق. - يحمل
subagent_endedالقيمtargetSessionKey(الهوية — وهذا يطابقsubagent_spawned.childSessionKey)، وtargetKind("subagent"أو"acp")، وreason، وoutcomeاختيارية ("ok"أو"error"أو"timeout"أو"killed"أو"reset"أو"deleted")، وerrorاختيارية، وrunId، وendedAt، وaccountId، وsendFarewell. لا يتضمنagentIdأوchildSessionKey؛ استخدمtargetSessionKeyلربطه بحدثsubagent_spawnedالمقابل.
gateway_start/gateway_stop- بدء أو إيقاف الخدمات المملوكة للـ Plugin مع Gatewaydeactivate- اسم بديل مهمل للتوافق معgateway_stop؛ استخدمgateway_stopفي Plugins الجديدةcron_changed- مراقبة تغييرات دورة حياة Cron المملوكة لـ Gateway (مضاف، محدّث، محذوف، بدأ، انتهى، مجدول)before_install- فحص مادة تثبيت Skills أو Plugin المرحلية من وقت تشغيل Plugin محمّل
تصحيح أخطاء خطافات وقت التشغيل
استخدمbefore_model_resolve عندما يحتاج Plugin إلى تبديل المزوّد أو النموذج
لدورة وكيل. يعمل قبل حل النموذج؛ ولا يعمل llm_output إلا بعد أن تنتج
محاولة نموذج مخرجات مساعد.
لإثبات نموذج الجلسة الفعّال، افحص تسجيلات وقت التشغيل، ثم استخدم
openclaw sessions أو أسطح جلسة/حالة Gateway. عند تصحيح أخطاء
حمولات المزوّد، ابدأ Gateway باستخدام --raw-stream و
--raw-stream-path <path>؛ تكتب هذه العلامات أحداث تدفق النموذج الخام إلى ملف
jsonl.
سياسة استدعاء الأدوات
يتلقىbefore_tool_call ما يلي:
event.toolNameevent.paramsevent.toolKindوevent.toolInputKindاختياريتان، وهما مميّزات موثوقة من المضيف للأدوات التي تشترك في الأسماء عمدا؛ على سبيل المثال، تستخدم استدعاءاتexecفي وضع الكود الخارجيtoolKind: "code_mode_exec"وتتضمنtoolInputKind: "javascript" | "typescript"عندما تكون لغة الإدخال معروفةevent.derivedPathsاختيارية، وتحتوي تلميحات مسارات أهداف مستنتجة من المضيف بأفضل جهد لأغلفة الأدوات المعروفة مثلapply_patch؛ عند وجودها، قد تكون هذه المسارات غير مكتملة أو قد تبالغ في تقدير ما ستلمسه الأداة فعليا (على سبيل المثال، مع مدخلات مشوهة أو جزئية)event.runIdاختياريevent.toolCallIdاختياري- حقول سياق مثل
ctx.agentIdوctx.sessionKeyوctx.sessionIdوctx.runIdوctx.jobId(مضبوطة في التشغيلات المدفوعة بـ Cron)، وctx.toolKindوctx.toolInputKindوctx.traceالتشخيصية
block: trueنهائي ويتخطى المعالجات ذات الأولوية الأدنى.block: falseيُعامل كأنه لا يوجد قرار.- تعيد
paramsكتابة معاملات الأداة للتنفيذ. - يوقف
requireApprovalتشغيل الوكيل مؤقتا ويطلب من المستخدم عبر موافقات Plugin. يمكن لأمر/approveالموافقة على موافقات exec وPlugin كليهما. في مرحلاتPreToolUseالأصلية لوضع تقرير خادم تطبيق Codex، يؤجل ذلك إلى طلب موافقة خادم التطبيق المطابق؛ راجع وقت تشغيل حاضنة Codex. - لا يزال بإمكان
block: trueذي أولوية أدنى الحظر بعد أن يطلب خطاف ذو أولوية أعلى الموافقة. - يتلقى
onResolutionقرار الموافقة المحلول -allow-once،allow-always، أوdeny، أوtimeout، أوcancelled.
requireApproval بدلا
من الأدوات الاختيارية أو موافقات exec.
يمكن لـ Plugins التي تحتاج سياسة على مستوى المضيف تسجيل سياسات أدوات موثوقة باستخدام
api.registerTrustedToolPolicy(...). تعمل هذه قبل خطافات
before_tool_call العادية وقبل قرارات الخطافات العادية. تعمل السياسات الموثوقة
المضمّنة أولا؛ وتعمل سياسات Plugins المثبّتة الموثوقة بعدها بترتيب تحميل Plugin؛
وتعمل خطافات before_tool_call العادية بعدها. تحتفظ Plugins المضمّنة
بمسار السياسة الموثوقة الحالي. يجب تمكين Plugins المثبّتة صراحة
والتصريح عن كل معرف سياسة في contracts.trustedToolPolicies؛ وتُرفض المعرفات
غير المصرح بها قبل التسجيل. تُنطاق معرفات السياسات إلى Plugin المسجّل،
لذلك قد تعيد Plugins مختلفة استخدام المعرف المحلي نفسه. استخدم هذه الطبقة فقط
للبوابات الموثوقة من المضيف مثل سياسة مساحة العمل، أو فرض الميزانية، أو
سلامة سير العمل المحجوز.
خطاف بيئة exec
يتيحresolve_exec_env للـ Plugins الإسهام بمتغيرات بيئة إلى استدعاءات أداة
exec بعد بناء بيئة exec الأساسية وقبل تشغيل الأمر. يتلقى:
event.sessionKeyevent.toolName، حاليا دائما"exec"event.host، واحدة من"gateway"أو"sandbox"أو"node"- حقول سياق مثل
ctx.agentIdوctx.sessionKeyوctx.messageProviderوctx.channelId
Record<string, string> لدمجه في بيئة exec. تعمل المعالجات
بترتيب الأولوية، وتتجاوز نتائج الخطافات اللاحقة نتائج الخطافات السابقة
للمفتاح نفسه.
تُرشَّح مخرجات الخطاف عبر سياسة مفاتيح بيئة تنفيذ المضيف قبل
دمجها. تُسقَط المفاتيح غير الصالحة، وPATH، ومفاتيح تجاوز المضيف الخطرة مثل
LD_* وDYLD_* وNODE_OPTIONS ومتغيرات الوكيل ومتغيرات تجاوز TLS.
تُضمَّن بيئة Plugin بعد الترشيح في بيانات تعريف موافقة/تدقيق Gateway
وتُمرَّر إلى طلبات تنفيذ node-host.
استمرارية نتائج الأدوات
يمكن أن تتضمن نتائج الأدواتdetails منظمة لعرض واجهة المستخدم، أو التشخيص،
أو توجيه الوسائط، أو بيانات تعريف يملكها Plugin. تعامَل مع details كبيانات تعريف وقت تشغيل،
وليس كمحتوى مطالبة:
- يزيل OpenClaw
toolResult.detailsقبل إعادة تشغيل المزوّد وإدخال Compaction حتى لا تصبح بيانات التعريف سياقًا للنموذج. - تحتفظ إدخالات الجلسات المستمرة فقط بـ
detailsمحدودة. تُستبدَل التفاصيل كبيرة الحجم بملخص موجز وpersistedDetailsTruncated: true. - يعمل
tool_result_persistوbefore_message_writeقبل الحد النهائي للاستمرارية. ومع ذلك، ينبغي للخطافات إبقاءdetailsالمُعادة صغيرة وتجنب وضع نص متعلق بالمطالبة فيdetailsفقط؛ ضع مخرجات الأداة المرئية للنموذج فيcontent.
خطافات المطالبات والنماذج
استخدم الخطافات الخاصة بالمرحلة للـ plugins الجديدة:before_model_resolve: يتلقى المطالبة الحالية وبيانات تعريف المرفقات فقط. أعِدproviderOverrideأوmodelOverride.agent_turn_prepare: يتلقى المطالبة الحالية، ورسائل الجلسة المُحضَّرة، وأي حقنات مصفوفة للاستخدام مرة واحدة بالضبط تم تفريغها لهذه الجلسة. أعِدprependContextأوappendContext.before_prompt_build: يتلقى المطالبة الحالية ورسائل الجلسة. أعِدprependContextأوappendContextأوsystemPromptأوprependSystemContextأوappendSystemContext.heartbeat_prompt_contribution: يعمل فقط لدورات Heartbeat ويعيدprependContextأوappendContext. وهو مخصص للمراقبات الخلفية التي تحتاج إلى تلخيص الحالة الحالية دون تغيير الدورات التي يبدأها المستخدم.
before_agent_start للتوافق. فضّل الخطافات الصريحة أعلاه
حتى لا يعتمد Plugin الخاص بك على مرحلة مدمجة قديمة.
يعمل before_agent_run بعد إنشاء المطالبة وقبل أي إدخال للنموذج،
بما في ذلك تحميل الصور المحلية للمطالبة وملاحظة llm_input. يتلقى
إدخال المستخدم الحالي باسم prompt، بالإضافة إلى سجل الجلسة المُحمّل في messages
والمطالبة النظامية النشطة. أعِد { outcome: "block", reason, message? }
لإيقاف التشغيل قبل أن يتمكن النموذج من قراءة المطالبة. reason داخلي؛
وmessage هو البديل المعروض للمستخدم. النتائج الوحيدة المدعومة هي
pass وblock؛ أشكال القرار غير المدعومة تفشل مغلقة.
عندما يُحظَر تشغيل، يخزن OpenClaw نص الاستبدال فقط في
message.content بالإضافة إلى بيانات تعريف حظر غير حساسة مثل معرّف Plugin
الحاظر والطابع الزمني. لا يُحتفَظ بنص المستخدم الأصلي في النص المنسوخ أو السياق المستقبلي.
تُعامل أسباب الحظر الداخلية كحساسة وتُستبعد من حمولات
النص المنسوخ والسجل والبث والسجلات والتشخيصات. ينبغي للملاحظة التشغيلية
استخدام حقول مُنقّاة مثل معرّف الحاظر، أو النتيجة، أو الطابع الزمني، أو فئة آمنة.
يتضمن before_agent_start وagent_end القيمة event.runId عندما يستطيع OpenClaw
تحديد التشغيل النشط. وتتوفر القيمة نفسها أيضًا في ctx.runId.
تعرض عمليات التشغيل المدفوعة بواسطة Cron أيضًا ctx.jobId (معرّف مهمة cron الأصلية) حتى
تتمكن خطافات Plugin من تحديد نطاق المقاييس أو الآثار الجانبية أو الحالة لمهمة مجدولة محددة.
بالنسبة إلى عمليات التشغيل الناشئة من قناة، يحدد ctx.channel وctx.messageProvider
سطح المزوّد مثل discord أو telegram، بينما يكون ctx.channelId
معرّف هدف المحادثة عندما يستطيع OpenClaw اشتقاقه من مفتاح الجلسة
أو بيانات تعريف التسليم.
عندما تكون هوية المرسل متاحة، تتضمن سياقات خطافات الوكيل أيضًا:
ctx.senderId— معرّف المرسل ضمن نطاق القناة (مثل Feishuopen_id، ومعرّف مستخدم Discord). يُملأ عندما ينشأ التشغيل من رسالة مستخدم ذات بيانات تعريف مرسل معروفة.ctx.chatId— معرّف المحادثة الأصلي للنقل (مثل Feishuchat_id، وTelegramchat_id). يُملأ عندما توفر القناة الأصلية معرّف محادثة أصليًا.ctx.channelContext.sender.id— معرّف المرسل نفسه مثلctx.senderId، ضمن كائن تملكه القناة ويمكن للـ plugins توسيعه بحقول خاصة بالقناة.ctx.channelContext.chat.id— معرّف المحادثة نفسه مثلctx.chatId، ضمن كائن تملكه القناة ويمكن للـ plugins توسيعه بحقول خاصة بالقناة.
id المتداخلة فقط. يمكن لـ Channel plugins التي تمرر بيانات تعريف
أغنى للمرسل أو الدردشة عبر مساعد الوارد أن توسّع
PluginHookChannelSenderContext أو PluginHookChannelChatContext من
openclaw/plugin-sdk/channel-inbound:
ctx.senderExternalId كحقل توافق مصدر مهجور للـ plugins الأقدم.
لا يملؤه النواة؛ ينبغي لهويات المرسلين الجديدة الخاصة بالقنوات
أن تعيش تحت ctx.channelContext.sender من خلال توسيع الوحدة.
agent_end هو خطاف ملاحظة. تشغّله مسارات Gateway والحاضنة المستمرة
بنمط إطلاق ونسيان بعد الدورة، بينما تنتظر مسارات CLI قصيرة العمر ذات التشغيل الواحد
وعد الخطاف قبل تنظيف العملية حتى تتمكن plugins الموثوقة من تفريغ
ملاحظات الطرفية أو التقاط الحالة. يطبق مشغّل الخطافات مهلة قدرها 30 ثانية حتى لا
يترك Plugin عالق أو نقطة نهاية تضمين عالقة وعد الخطاف معلقًا
إلى الأبد. تُسجَّل المهلة ويواصل OpenClaw؛ ولا يلغي
عمل الشبكة الذي يملكه Plugin إلا إذا استخدم Plugin أيضًا إشارة الإلغاء الخاصة به.
استخدم model_call_started وmodel_call_ended لقياسات استدعاء المزوّد
التي يجب ألا تتلقى المطالبات الخام، أو السجل، أو الردود، أو الرؤوس، أو أجسام الطلبات،
أو معرّفات طلبات المزوّد. تتضمن هذه الخطافات بيانات تعريف مستقرة مثل
runId وcallId وprovider وmodel، وapi/transport اختياريين، و
durationMs/outcome النهائية، وupstreamRequestIdHash عندما يستطيع OpenClaw اشتقاق
تجزئة محدودة لمعرّف طلب المزوّد. عندما يكون وقت التشغيل قد حسم بيانات تعريف نافذة السياق،
يتضمن حدث الخطاف والسياق أيضًا contextTokenBudget، وهي
ميزانية الرموز الفعالة بعد حدود النموذج/الإعداد/الوكيل، بالإضافة إلى
contextWindowSource وcontextWindowReferenceTokens عند تطبيق حد أدنى.
يعمل before_agent_finalize فقط عندما تكون الحاضنة على وشك قبول إجابة مساعد نهائية
طبيعية. ليس هذا مسار إلغاء /stop ولا يعمل
عندما يجهض المستخدم دورة. أعِد { action: "revise", reason } لطلب
مرور نموذج إضافي واحد من الحاضنة قبل الإنهاء، أو { action: "finalize", reason? } لفرض الإنهاء، أو احذف النتيجة للمتابعة.
تُمرَّر خطافات Codex الأصلية Stop إلى هذا الخطاف كقرارات OpenClaw
before_agent_finalize.
عند إرجاع action: "revise"، يمكن للـ plugins تضمين بيانات تعريف retry لجعل
مرور النموذج الإضافي محدودًا وآمنًا لإعادة التشغيل:
instruction بسبب المراجعة المرسل إلى الحاضنة.
يتيح idempotencyKey للمضيف عدّ المحاولات للطلب نفسه من Plugin عبر
قرارات إنهاء مكافئة، ويحد maxAttempts من عدد المرورّات الإضافية التي
سيسمح بها المضيف قبل المتابعة بالإجابة النهائية الطبيعية.
يجب على plugins غير المجمعة التي تحتاج إلى خطافات محادثة خام (before_model_resolve,
before_agent_reply, llm_input, llm_output, before_agent_finalize,
agent_end, أو before_agent_run) ضبط:
plugins.entries.<id>.hooks.allowPromptInjection=false.
امتدادات الجلسة وحقنات الدور التالي
يمكن لـ Workflow plugins حفظ حالة جلسة صغيرة متوافقة مع JSON باستخدامapi.registerSessionExtension(...) وتحديثها عبر طريقة Gateway
sessions.pluginPatch. تعرض صفوف الجلسات حالة الامتداد المسجلة
عبر pluginExtensions، مما يتيح لـ Control UI والعملاء الآخرين عرض
حالة يملكها Plugin دون معرفة تفاصيله الداخلية.
استخدم api.enqueueNextTurnInjection(...) عندما يحتاج Plugin إلى سياق دائم
يصل إلى دورة النموذج التالية مرة واحدة بالضبط. يفرّغ OpenClaw الحقنات المصطفة قبل
خطافات المطالبة، ويسقط الحقنات المنتهية الصلاحية، ويزيل التكرار حسب idempotencyKey
لكل Plugin. هذا هو الحد الصحيح لاستئنافات الموافقة، وملخصات السياسات،
وفروق مراقبة الخلفية، واستمرارات الأوامر التي ينبغي أن تكون مرئية
للنموذج في الدورة التالية ولكن لا ينبغي أن تصبح نص مطالبة نظامية دائمًا.
دلالات التنظيف جزء من العقد. تتلقى عمليات تنظيف امتدادات الجلسة
واستدعاءات تنظيف دورة حياة وقت التشغيل reset أو delete أو disable أو
restart. يزيل المضيف حالة امتداد الجلسة المستمرة التي يملكها Plugin
وحقنات الدور التالي المعلقة عند reset/delete/disable؛ أما restart فيُبقي
حالة الجلسة الدائمة بينما تتيح استدعاءات التنظيف للـ plugins تحرير مهام المجدول
وسياق التشغيل والموارد الأخرى خارج النطاق لجيل وقت التشغيل القديم.
خطافات الرسائل
استخدم خطافات الرسائل لتوجيه مستوى القناة وسياسة التسليم:message_received: يراقب المحتوى الوارد، والمرسل، وthreadId، وmessageId, وsenderId، والارتباط الاختياري بالتشغيل/الجلسة، وبيانات التعريف.message_sending: يعيد كتابةcontentأو يعيد{ cancel: true }.reply_payload_sending: يعيد كتابة كائناتReplyPayloadالمطبّعة (بما في ذلكpresentationوdeliveryومراجع الوسائط والنص) أو يعيد{ cancel: true }.message_sent: يراقب النجاح أو الفشل النهائي.
content على النص المنطوق المخفي
حتى عندما لا تحتوي حمولة القناة على نص/تعليق مرئي. إعادة كتابة ذلك
content تحدّث النص المنسوخ المرئي للخطاف فقط؛ ولا يُعرض كتعليق
وسائط.
قد تتضمن أحداث reply_payload_sending قيمة usageState، وهي لقطة حية بأفضل جهد
لكل دورة للنموذج/الاستخدام/السياق. التسليم الدائم، وإعادة التشغيل المستعادة، والردود
دون ارتباط تشغيل دقيق تحذفها.
تعرض سياقات خطافات الرسائل حقول ارتباط مستقرة عند توفرها:
ctx.sessionKey وctx.runId وctx.messageId وctx.senderId وctx.trace
وctx.traceId وctx.spanId وctx.parentSpanId وctx.callDepth. كما تعرض سياقات الوارد
وbefore_dispatch بيانات تعريف الرد عندما تكون لدى القناة بيانات رسالة مقتبسة
مرشحة حسب الرؤية: replyToId وreplyToIdFull و
replyToBody وreplyToSender وreplyToIsQuote. فضّل هذه
الحقول من الدرجة الأولى قبل قراءة بيانات التعريف القديمة.
فضّل حقلي threadId وreplyToId المطبوعين قبل استخدام بيانات تعريف
خاصة بالقناة.
قواعد القرار:
- يكون
message_sendingمعcancel: trueنهائيًا. - يُعامَل
message_sendingمعcancel: falseكأنه بلا قرار. - يواصل
contentالمعاد كتابته المرور إلى الخطافات الأقل أولوية ما لم يلغِ خطاف لاحق التسليم. - يعمل
reply_payload_sendingبعد تطبيع الحمولة وقبل تسليم القناة، بما في ذلك الردود الموجَّهة عائدةً إلى القناة الأصلية. تعمل المعالجات بالتتابع، ويرى كل معالج أحدث حمولة أنتجتها المعالجات الأعلى أولوية. - لا تكشف حمولات
reply_payload_sendingعلامات الثقة في وقت التشغيل مثلtrustedLocalMedia؛ يمكن للـ plugins تعديل شكل الحمولة لكنها لا تستطيع منح الثقة في الوسائط المحلية. - يمكن أن يعيد
message_sendingقيمةcancelReasonوmetadataمحدودة مع الإلغاء. تعرض واجهات API الجديدة لدورة حياة الرسائل ذلك كنتيجة تسليم مكبوتة بالسببcancelled_by_message_sending_hook؛ ويستمر التسليم المباشر القديم في إعادة مصفوفة نتائج فارغة للتوافق. message_sentمخصص للمراقبة فقط. تُسجَّل إخفاقات المعالج ولا تغيّر نتيجة التسليم.
خطافات التثبيت
استخدمsecurity.installPolicy لقرارات السماح/الحظر التي يملكها المشغّل. تعمل
تلك السياسة من إعداد OpenClaw، وتغطي مسارات تثبيت CLI وتحديثه، وتفشل
مغلقة عند تفعيلها وعدم توفرها.
before_install هو خطاف دورة حياة في وقت تشغيل الـ plugin. يعمل بعد
security.installPolicy فقط في عملية OpenClaw التي تكون خطافات الـ plugin فيها
قد حُمّلت بالفعل، مثل تدفقات التثبيت المدعومة من Gateway. وهو مفيد
للملاحظات والتحذيرات وفحوصات التوافق التي يملكها الـ plugin، لكنه ليس
الحد الأمني الأساسي للمؤسسة أو المضيف في عمليات التثبيت. يبقى الحقل builtinScan
في حمولة الحدث للتوافق، لكن OpenClaw لم يعد
يشغّل حظر الشيفرات الخطرة المدمج في وقت التثبيت، لذلك يكون نتيجة ok
فارغة. أعد نتائج إضافية أو { block: true, blockReason } لإيقاف
التثبيت في تلك العملية.
block: true نهائي. يُعامَل block: false كأنه بلا قرار.
تحظر إخفاقات المعالج التثبيت بفشل مغلق.
دورة حياة Gateway
استخدمgateway_start لخدمات الـ plugin التي تحتاج إلى حالة يملكها Gateway. يكشف
السياق ctx.config وctx.workspaceDir وctx.getCron?.() لفحص
Cron وتحديثاته. استخدم gateway_stop لتنظيف الموارد طويلة التشغيل.
لا تعتمد على خطاف gateway:startup الداخلي للخدمات وقت التشغيل التي يملكها الـ plugin.
ينطلق cron_changed لأحداث دورة حياة Cron التي يملكها Gateway مع حمولة
حدث نمطية تغطي أسباب added وupdated وremoved وstarted وfinished
وscheduled. يحمل الحدث لقطة PluginHookGatewayCronJob
(بما في ذلك state.nextRunAtMs وstate.lastRunStatus و
state.lastError عند وجودها) إضافةً إلى PluginHookGatewayCronDeliveryStatus
بقيمة not-requested | delivered | not-delivered | unknown. لا تزال
أحداث الإزالة تحمل لقطة المهمة المحذوفة حتى تتمكن المجدولات الخارجية من
مطابقة الحالة. استخدم ctx.getCron?.() وctx.config من سياق وقت التشغيل
عند مزامنة مجدولات الإيقاظ الخارجية، واجعل OpenClaw
مصدر الحقيقة لفحوصات الاستحقاق والتنفيذ.
الإهمالات القادمة
بعض الأسطح المجاورة للخطافات مهملة لكنها لا تزال مدعومة. انتقل قبل الإصدار الرئيسي التالي:- أغلفة القنوات بالنص الصريح في معالجات
inbound_claimوmessage_received. اقرأBodyForAgentوكتل سياق المستخدم المنظمة بدلًا من تحليل نص الغلاف المسطح. راجع أغلفة القنوات بالنص الصريح → BodyForAgent. - يبقى
before_agent_startللتوافق. يجب على الـ plugins الجديدة استخدامbefore_model_resolveوbefore_prompt_buildبدلًا من المرحلة المدمجة. - يبقى
subagent_spawningللتوافق مع الـ plugins الأقدم، لكن يجب ألا تعيد الـ plugins الجديدة توجيه الخيوط منه. يجهز Core ارتباطات الوكلاء الفرعيينthread: trueعبر محولات ربط جلسات القنوات قبل انطلاقsubagent_spawned. - يبقى
deactivateكاسم توافق بديل مهمل للتنظيف حتى ما بعد 2026-08-16. يجب على الـ plugins الجديدة استخدامgateway_stop. - يستخدم
onResolutionفيbefore_tool_callالآن اتحادPluginApprovalResolutionالنمطي (allow-once/allow-always/deny/timeout/cancelled) بدلًا منstringحر الصياغة.
command-auth إلى command-status - راجع
ترحيل Plugin SDK → الإهمالات النشطة.
ذو صلة
- ترحيل Plugin SDK - الإهمالات النشطة والجدول الزمني للإزالة
- بناء plugins
- نظرة عامة على Plugin SDK
- نقاط دخول Plugin
- الخطافات الداخلية
- داخليات بنية Plugin