Plugin SDK reference
إعداد Plugin وتكوينه
مرجع لتحزيم Plugin (بيانات package.json الوصفية)، والبيانات التعريفية (openclaw.plugin.json)، وإدخالات الإعداد، ومخططات التهيئة.
بيانات الحزمة الوصفية
يحتاج package.json لديك إلى حقل openclaw يوضّح لنظام Plugin ما يوفّره Plugin لديك:
Channel plugin
{ "name": "@myorg/openclaw-my-channel", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "channel": { "id": "my-channel", "label": "My Channel", "blurb": "Short description of the channel." } }}Provider plugin / ClawHub baseline
{ "name": "@myorg/openclaw-my-plugin", "version": "1.0.0", "type": "module", "openclaw": { "extensions": ["./index.ts"], "compat": { "pluginApi": ">=2026.3.24-beta.2", "minGatewayVersion": "2026.3.24-beta.2" }, "build": { "openclawVersion": "2026.3.24-beta.2", "pluginSdkVersion": "2026.3.24-beta.2" } }}حقول openclaw
extensionsstring[]ملفات نقطة الدخول (نسبية إلى جذر الحزمة).
setupEntrystringإدخال خفيف خاص بالإعداد فقط (اختياري).
channelobjectبيانات وصفية لفهرس القنوات لواجهات الإعداد، والاختيار، والبدء السريع، والحالة.
providersstring[]معرّفات المزوّدين التي يسجلها هذا Plugin.
installobjectتلميحات التثبيت: npmSpec، وlocalPath، وdefaultChoice، وminHostVersion، وexpectedIntegrity، وallowInvalidConfigRecovery.
startupobjectأعلام سلوك بدء التشغيل.
openclaw.channel
openclaw.channel هو بيانات وصفية خفيفة للحزمة لاكتشاف القنوات وواجهات الإعداد قبل تحميل وقت التشغيل.
| الحقل | النوع | معناه |
|---|---|---|
id |
string |
معرّف القناة المعتمد. |
label |
string |
تسمية القناة الرئيسية. |
selectionLabel |
string |
تسمية أداة الاختيار/الإعداد عندما ينبغي أن تختلف عن label. |
detailLabel |
string |
تسمية تفاصيل ثانوية لفهارس القنوات الأكثر ثراءً وواجهات الحالة. |
docsPath |
string |
مسار الوثائق لروابط الإعداد والاختيار. |
docsLabel |
string |
تسمية بديلة تُستخدم لروابط الوثائق عندما ينبغي أن تختلف عن معرّف القناة. |
blurb |
string |
وصف قصير للتعريف/الفهرس. |
order |
number |
ترتيب الفرز في فهارس القنوات. |
aliases |
string[] |
أسماء مستعارة إضافية للبحث عند اختيار القناة. |
preferOver |
string[] |
معرّفات Plugins/قنوات ذات أولوية أدنى ينبغي أن تتقدم هذه القناة عليها. |
systemImage |
string |
اسم اختياري لأيقونة/صورة نظام لفهارس واجهة مستخدم القنوات. |
selectionDocsPrefix |
string |
نص بادئة قبل روابط الوثائق في واجهات الاختيار. |
selectionDocsOmitLabel |
boolean |
عرض مسار الوثائق مباشرة بدلًا من رابط وثائق ذي تسمية في نص الاختيار. |
selectionExtras |
string[] |
سلاسل قصيرة إضافية تُلحق بنص الاختيار. |
markdownCapable |
boolean |
يعلّم القناة على أنها تدعم Markdown لقرارات التنسيق الصادر. |
exposure |
object |
عناصر التحكم في ظهور القناة لواجهات الإعداد، والقوائم المهيأة، والوثائق. |
quickstartAllowFrom |
boolean |
يضم هذه القناة إلى مسار إعداد البدء السريع القياسي allowFrom. |
forceAccountBinding |
boolean |
يتطلب ربط الحساب صراحة حتى عند وجود حساب واحد فقط. |
preferSessionLookupForAnnounceTarget |
boolean |
يفضّل البحث عن الجلسة عند حل أهداف الإعلان لهذه القناة. |
مثال:
{ "openclaw": { "channel": { "id": "my-channel", "label": "My Channel", "selectionLabel": "My Channel (self-hosted)", "detailLabel": "My Channel Bot", "docsPath": "/channels/my-channel", "docsLabel": "my-channel", "blurb": "Webhook-based self-hosted chat integration.", "order": 80, "aliases": ["mc"], "preferOver": ["my-channel-legacy"], "selectionDocsPrefix": "Guide:", "selectionExtras": ["Markdown"], "markdownCapable": true, "exposure": { "configured": true, "setup": true, "docs": true }, "quickstartAllowFrom": true } }}يدعم exposure ما يلي:
configured: تضمين القناة في واجهات القوائم المهيأة/ذات نمط الحالةsetup: تضمين القناة في أدوات اختيار الإعداد/التهيئة التفاعليةdocs: تعليم القناة على أنها عامة الظهور في واجهات الوثائق/التنقل
openclaw.install
openclaw.install هو بيانات وصفية للحزمة، وليس بيانات وصفية للبيان التعريفي.
| الحقل | النوع | معناه |
|---|---|---|
clawhubSpec |
string |
مواصفة ClawHub المعتمدة لمسارات التثبيت/التحديث وتثبيت التعريف عند الطلب. |
npmSpec |
string |
مواصفة npm المعتمدة لمسارات التثبيت/التحديث الاحتياطية. |
localPath |
string |
مسار التطوير المحلي أو التثبيت المضمّن. |
defaultChoice |
"clawhub" | "npm" | "local" |
مصدر التثبيت المفضل عند توفر عدة مصادر. |
minHostVersion |
string |
أدنى إصدار OpenClaw مدعوم بالصيغة >=x.y.z أو >=x.y.z-prerelease. |
expectedIntegrity |
string |
سلسلة سلامة توزيعة npm المتوقعة، عادةً sha512-...، للتثبيتات المثبتة بإصدار محدد. |
allowInvalidConfigRecovery |
boolean |
يتيح لمسارات إعادة تثبيت Plugin المضمّن التعافي من إخفاقات محددة في تهيئة قديمة. |
Onboarding behavior
يستخدم التعريف التفاعلي أيضًا openclaw.install لواجهات التثبيت عند الطلب. إذا كان Plugin لديك يعرض خيارات مصادقة المزوّد أو بيانات وصفية لإعداد/فهرس القنوات قبل تحميل وقت التشغيل، يمكن للتعريف عرض ذلك الخيار، والمطالبة بتثبيت ClawHub أو npm أو تثبيت محلي، ثم تثبيت Plugin أو تمكينه، ثم متابعة المسار المحدد. تستخدم خيارات تعريف ClawHub clawhubSpec وتُفضّل عند وجودها؛ وتتطلب خيارات npm بيانات وصفية موثوقة للفهرس مع npmSpec للسجل؛ وتكون الإصدارات الدقيقة وexpectedIntegrity اختيارية كتثبيتات npm مثبتة. إذا كان expectedIntegrity موجودًا، تفرضه مسارات التثبيت/التحديث لـ npm. أبقِ بيانات "ما الذي يجب عرضه" الوصفية في openclaw.plugin.json وبيانات "كيفية تثبيته" الوصفية في package.json.
minHostVersion enforcement
إذا تم تعيين minHostVersion، فإن كلًا من التثبيت وتحميل سجل البيانات التعريفية غير المضمّن يفرضان ذلك. تتخطى المضيفات الأقدم Plugins الخارجية؛ وتُرفض سلاسل الإصدارات غير الصالحة. يُفترض أن Plugins المصدر المضمّنة متوافقة الإصدار مع نسخة عمل المضيف.
Pinned npm installs
بالنسبة إلى تثبيتات npm المثبتة بإصدار محدد، احتفظ بالإصدار الدقيق في npmSpec وأضف سلامة الأثر المتوقعة:
{ "openclaw": { "install": { "npmSpec": "@wecom/[email protected]", "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY", "defaultChoice": "npm" } }}allowInvalidConfigRecovery scope
لا يُعد allowInvalidConfigRecovery تجاوزًا عامًا للتهيئات المعطلة. إنه مخصص فقط لاسترداد Plugin المضمّن ضمن نطاق ضيق، بحيث يمكن لإعادة التثبيت/الإعداد إصلاح بقايا ترقية معروفة مثل مسار Plugin مضمّن مفقود أو إدخال channels.<id> قديم لذلك Plugin نفسه. إذا كانت التهيئة معطلة لأسباب غير ذات صلة، يظل التثبيت يفشل بإغلاق آمن ويطلب من المشغّل تشغيل openclaw doctor --fix.
التحميل الكامل المؤجل
يمكن لـ Plugins القنوات اختيار التحميل المؤجل باستخدام:
{ "openclaw": { "extensions": ["./index.ts"], "setupEntry": "./setup-entry.ts", "startup": { "deferConfiguredChannelFullLoadUntilAfterListen": true } }}عند التمكين، يحمّل OpenClaw فقط setupEntry أثناء مرحلة بدء التشغيل السابقة للاستماع، حتى للقنوات المهيأة مسبقًا. يتم تحميل الإدخال الكامل بعد أن يبدأ Gateway بالاستماع.
إذا كان إدخال الإعداد/الإدخال الكامل لديك يسجّل طرق RPC في Gateway، فأبقها ضمن بادئة خاصة بـ Plugin. تظل مساحات أسماء الإدارة الأساسية المحجوزة (config.*، وexec.approvals.*، وwizard.*، وupdate.*) مملوكة للنواة وتُحل دائمًا إلى operator.admin.
البيان التعريفي لـ Plugin
يجب أن يشحن كل Plugin أصلي ملف openclaw.plugin.json في جذر الحزمة. يستخدم OpenClaw هذا الملف للتحقق من التهيئة دون تنفيذ كود Plugin.
{ "id": "my-plugin", "name": "My Plugin", "description": "Adds My Plugin capabilities to OpenClaw", "configSchema": { "type": "object", "additionalProperties": false, "properties": { "webhookSecret": { "type": "string", "description": "Webhook verification secret" } } }}بالنسبة إلى Plugins القنوات، أضف kind وchannels:
{ "id": "my-channel", "kind": "channel", "channels": ["my-channel"], "configSchema": { "type": "object", "additionalProperties": false, "properties": {} }}حتى Plugins التي لا تحتوي على تهيئة يجب أن تشحن مخططًا. المخطط الفارغ صالح:
{ "id": "my-plugin", "configSchema": { "type": "object", "additionalProperties": false }}راجع البيان التعريفي لـ Plugin للاطلاع على مرجع المخطط الكامل.
النشر على ClawHub
بالنسبة إلى حزم Plugin، استخدم أمر ClawHub الخاص بالحزمة:
clawhub package publish your-org/your-plugin --dry-runclawhub package publish your-org/your-pluginإدخال الإعداد
ملف setup-entry.ts هو بديل خفيف لـ index.ts يحمّله OpenClaw عندما يحتاج فقط إلى أسطح الإعداد (التهيئة الأولية، إصلاح الإعدادات، فحص القناة المعطّلة).
// setup-entry.ts export default defineSetupPluginEntry(myChannelPlugin);يتجنب هذا تحميل كود وقت التشغيل الثقيل (مكتبات التشفير، تسجيلات CLI، خدمات الخلفية) أثناء تدفقات الإعداد.
يمكن لقنوات مساحة العمل المضمّنة التي تحتفظ بتصديرات آمنة للإعداد في وحدات جانبية استخدام defineBundledChannelSetupEntry(...) من openclaw/plugin-sdk/channel-entry-contract بدلًا من defineSetupPluginEntry(...). يدعم ذلك العقد المضمّن أيضًا تصدير runtime اختياريًا بحيث تبقى وصلات وقت التشغيل أثناء الإعداد خفيفة وصريحة.
متى يستخدم OpenClaw setupEntry بدلًا من الإدخال الكامل
- تكون القناة معطّلة لكنها تحتاج إلى أسطح الإعداد/التهيئة الأولية.
- تكون القناة مفعّلة لكنها غير مهيأة.
- يكون التحميل المؤجل مفعّلًا (
deferConfiguredChannelFullLoadUntilAfterListen).
ما الذي يجب أن يسجله setupEntry
- كائن Channel Plugin (عبر
defineSetupPluginEntry). - أي مسارات HTTP مطلوبة قبل استماع Gateway.
- أي أساليب Gateway مطلوبة أثناء بدء التشغيل.
يجب أن تتجنب أساليب Gateway عند بدء التشغيل هذه أيضًا مساحات أسماء الإدارة الأساسية المحجوزة مثل config.* أو update.*.
ما الذي ينبغي ألا يتضمنه setupEntry
- تسجيلات CLI.
- خدمات الخلفية.
- استيرادات وقت التشغيل الثقيلة (التشفير، SDKs).
- أساليب Gateway التي لا تكون مطلوبة إلا بعد بدء التشغيل.
استيرادات مساعدي الإعداد الضيقة
بالنسبة للمسارات الساخنة الخاصة بالإعداد فقط، فضّل منافذ مساعدي الإعداد الضيقة على مظلة plugin-sdk/setup الأوسع عندما لا تحتاج إلا إلى جزء من سطح الإعداد:
| مسار الاستيراد | استخدمه من أجل | التصديرات الرئيسية |
|---|---|---|
plugin-sdk/setup-runtime |
مساعدو وقت التشغيل أثناء الإعداد الذين يبقون متاحين في setupEntry / بدء تشغيل القناة المؤجل |
createPatchedAccountSetupAdapter, createEnvPatchedAccountSetupAdapter, createSetupInputPresenceValidator, noteChannelLookupFailure, noteChannelLookupSummary, promptResolvedAllowFrom, splitSetupEntries, createAllowlistSetupWizardProxy, createDelegatedSetupWizardProxy |
plugin-sdk/setup-adapter-runtime |
اسم مستعار متوافق مهجور؛ استخدم plugin-sdk/setup-runtime |
createEnvPatchedAccountSetupAdapter |
plugin-sdk/setup-tools |
مساعدو CLI/الأرشيف/المستندات للإعداد/التثبيت | formatCliCommand, detectBinary, extractArchive, resolveBrewExecutable, formatDocsLink, CONFIG_DIR |
استخدم منفذ plugin-sdk/setup الأوسع عندما تريد صندوق أدوات الإعداد المشترك الكامل، بما في ذلك مساعدو تصحيح الإعدادات مثل moveSingleAccountChannelSectionToDefaultAccount(...).
تبقى محولات تصحيح الإعداد آمنة للمسارات الساخنة عند الاستيراد. يكون البحث في سطح عقد ترقية الحساب الواحد المضمّن كسولًا، لذلك لا يؤدي استيراد plugin-sdk/setup-runtime إلى تحميل اكتشاف سطح العقد المضمّن مسبقًا قبل استخدام المحول فعليًا.
ترقية الحساب الواحد المملوكة للقناة
عندما ترقّي قناة إعدادًا علويًا ذا حساب واحد إلى channels.<id>.accounts.*، يكون السلوك المشترك الافتراضي هو نقل القيم المرقّاة ذات نطاق الحساب إلى accounts.default.
يمكن للقنوات المضمّنة تضييق تلك الترقية أو تجاوزها عبر سطح عقد الإعداد الخاص بها:
singleAccountKeysToMove: مفاتيح علوية إضافية ينبغي نقلها إلى الحساب المرقّىnamedAccountPromotionKeys: عندما تكون الحسابات المسماة موجودة بالفعل، تُنقل هذه المفاتيح فقط إلى الحساب المرقّى؛ وتبقى مفاتيح السياسة/التسليم المشتركة في جذر القناةresolveSingleAccountPromotionTarget(...): اختيار الحساب الحالي الذي يتلقى القيم المرقّاة
مخطط الإعدادات
يُتحقق من إعدادات Plugin مقابل JSON Schema في البيان الخاص بك. يهيئ المستخدمون Plugins عبر:
{ plugins: { entries: { "my-plugin": { config: { webhookSecret: "abc123", }, }, }, },}يتلقى Plugin هذا الإعداد باسم api.pluginConfig أثناء التسجيل.
بالنسبة للإعداد الخاص بالقناة، استخدم قسم إعداد القناة بدلًا من ذلك:
{ channels: { "my-channel": { token: "bot-token", allowFrom: ["user1", "user2"], }, },}بناء مخططات إعداد القناة
استخدم buildChannelConfigSchema لتحويل مخطط Zod إلى غلاف ChannelConfigSchema المستخدم بواسطة عناصر الإعدادات المملوكة لـ Plugin:
const accountSchema = z.object({ token: z.string().optional(), allowFrom: z.array(z.string()).optional(), accounts: z.object({}).catchall(z.any()).optional(), defaultAccount: z.string().optional(),}); const configSchema = buildChannelConfigSchema(accountSchema);إذا كنت تؤلف العقد بالفعل بوصفه JSON Schema أو TypeBox، فاستخدم المساعد المباشر حتى يتمكن OpenClaw من تخطي تحويل Zod إلى JSON-Schema في مسارات البيانات الوصفية:
const configSchema = buildJsonChannelConfigSchema( Type.Object({ token: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), }),);بالنسبة لـ Plugins التابعة لأطراف ثالثة، يظل عقد المسار البارد هو بيان Plugin: انسخ JSON Schema المُنشأ إلى openclaw.plugin.json#channelConfigs بحيث يمكن لأسطح مخطط الإعدادات، والإعداد، والواجهة فحص channels.<id> دون تحميل كود وقت التشغيل.
معالجات الإعداد
يمكن لـ Channel Plugins توفير معالجات إعداد تفاعلية لـ openclaw onboard. المعالج هو كائن ChannelSetupWizard على ChannelPlugin:
const setupWizard: ChannelSetupWizard = { channel: "my-channel", status: { configuredLabel: "Connected", unconfiguredLabel: "Not configured", resolveConfigured: ({ cfg }) => Boolean((cfg.channels as any)?.["my-channel"]?.token), }, credentials: [ { inputKey: "token", providerHint: "my-channel", credentialLabel: "Bot token", preferredEnvVar: "MY_CHANNEL_BOT_TOKEN", envPrompt: "Use MY_CHANNEL_BOT_TOKEN from environment?", keepPrompt: "Keep current token?", inputPrompt: "Enter your bot token:", inspect: ({ cfg, accountId }) => { const token = (cfg.channels as any)?.["my-channel"]?.token; return { accountConfigured: Boolean(token), hasConfiguredValue: Boolean(token), }; }, }, ],};يدعم نوع ChannelSetupWizard كلًا من credentials وtextInputs وdmPolicy وallowFrom وgroupAccess وprepare وfinalize والمزيد. راجع حزم Plugin المضمّنة (على سبيل المثال Plugin الخاص بـ Discord في src/channel.setup.ts) للحصول على أمثلة كاملة.
مطالبات allowFrom المشتركة
بالنسبة لمطالبات قائمة السماح في الرسائل المباشرة التي لا تحتاج إلا إلى التدفق القياسي note -> prompt -> parse -> merge -> patch، فضّل مساعدي الإعداد المشتركين من openclaw/plugin-sdk/setup: createPromptParsedAllowFromForAccount(...)، وcreateTopLevelChannelParsedAllowFromPrompt(...)، وcreateNestedChannelParsedAllowFromPrompt(...).
حالة إعداد القناة القياسية
بالنسبة لكتل حالة إعداد القناة التي لا تختلف إلا بالملصقات والدرجات والسطور الإضافية الاختيارية، فضّل createStandardChannelSetupStatus(...) من openclaw/plugin-sdk/setup بدلًا من إنشاء كائن status نفسه يدويًا في كل Plugin.
سطح إعداد القناة الاختياري
بالنسبة لأسطح الإعداد الاختيارية التي ينبغي أن تظهر فقط في سياقات معينة، استخدم createOptionalChannelSetupSurface من openclaw/plugin-sdk/channel-setup:
import { createOptionalChannelSetupSurface } from "openclaw/plugin-sdk/channel-setup"; const setupSurface = createOptionalChannelSetupSurface({ channel: "my-channel", label: "My Channel", npmSpec: "@myorg/openclaw-my-channel", docsPath: "/channels/my-channel",});// Returns { setupAdapter, setupWizard }يعرّض plugin-sdk/channel-setup أيضًا بنّاءي المستوى الأدنى createOptionalChannelSetupAdapter(...) وcreateOptionalChannelSetupWizard(...) عندما لا تحتاج إلا إلى نصف واحد من سطح التثبيت الاختياري ذلك.
يفشل المحول/المعالج الاختياري المُنشأ بإغلاق عند عمليات كتابة الإعدادات الحقيقية. يعيدان استخدام رسالة واحدة تفيد بأن التثبيت مطلوب عبر validateInput وapplyAccountConfig وfinalize، ويضيفان رابط مستندات عندما يكون docsPath مضبوطًا.
مساعدو الإعداد المدعومون بملفات تنفيذية
بالنسبة لواجهات إعداد مدعومة بملفات تنفيذية، فضّل المساعدين المشتركين المفوضين بدلًا من نسخ غراء الملف التنفيذي/الحالة نفسه إلى كل قناة:
createDetectedBinaryStatus(...)لكتل الحالة التي لا تختلف إلا بالملصقات والتلميحات والدرجات واكتشاف الملف التنفيذيcreateCliPathTextInput(...)لمدخلات النص المدعومة بمسارcreateDelegatedSetupWizardStatusResolvers(...)، وcreateDelegatedPrepare(...)، وcreateDelegatedFinalize(...)، وcreateDelegatedResolveConfigured(...)عندما يحتاجsetupEntryإلى التمرير إلى معالج كامل أثقل بشكل كسولcreateDelegatedTextInputShouldPrompt(...)عندما يحتاجsetupEntryفقط إلى تفويض قرارtextInputs[*].shouldPrompt
النشر والتثبيت
Plugins الخارجية: انشر إلى ClawHub، ثم ثبّت:
npm
openclaw plugins install @myorg/openclaw-my-pluginتُثبَّت مواصفات الحزم المجردة من npm أثناء انتقال الإطلاق.
ClawHub فقط
openclaw plugins install clawhub:@myorg/openclaw-my-pluginمواصفة حزمة npm
استخدم npm عندما لا تكون الحزمة قد انتقلت إلى ClawHub بعد، أو عندما تحتاج إلى مسار تثبيت npm مباشر أثناء الترحيل:
openclaw plugins install npm:@myorg/openclaw-my-pluginPlugins داخل المستودع: ضعها ضمن شجرة مساحة عمل Plugin المضمّنة، وسيتم اكتشافها تلقائيًا أثناء البناء.
يمكن للمستخدمين التثبيت:
openclaw plugins install <package-name>بيانات تعريف الحزمة المضمّنة صريحة، وليست مستنتجة من JavaScript المبني عند بدء تشغيل Gateway. تبعيات وقت التشغيل تنتمي إلى حزمة Plugin التي تملكها؛ ولا يقوم بدء تشغيل OpenClaw المعبأ أبدًا بإصلاح تبعيات Plugin أو نسخها.
ذات صلة
- بناء Plugins — دليل بدء خطوة بخطوة
- بيان Plugin — مرجع مخطط البيان الكامل
- نقاط دخول SDK —
definePluginEntryوdefineChannelPluginEntry