الانتقال إلى المحتوى الرئيسي

Documentation Index

Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt

Use this file to discover all available pages before exploring further.

مرجع لتحزيم Plugin (بيانات package.json الوصفية)، والبيانات التعريفية (openclaw.plugin.json)، وإدخالات الإعداد، ومخططات التهيئة.
هل تبحث عن شرح تفصيلي؟ تغطي أدلة كيفية التنفيذ التحزيم ضمن السياق: Plugins القنوات وPlugins المزوّدين.

بيانات الحزمة الوصفية

يحتاج package.json لديك إلى حقل openclaw يوضّح لنظام Plugin ما يوفّره 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."
    }
  }
}
إذا نشرت Plugin خارجيًا على ClawHub، فحقلا compat وbuild مطلوبان. توجد مقتطفات النشر المعتمدة في docs/snippets/plugin-publish/.

حقول openclaw

extensions
string[]
ملفات نقطة الدخول (نسبية إلى جذر الحزمة).
setupEntry
string
إدخال خفيف خاص بالإعداد فقط (اختياري).
channel
object
بيانات وصفية لفهرس القنوات لواجهات الإعداد، والاختيار، والبدء السريع، والحالة.
providers
string[]
معرّفات المزوّدين التي يسجلها هذا Plugin.
install
object
تلميحات التثبيت: npmSpec، وlocalPath، وdefaultChoice، وminHostVersion، وexpectedIntegrity، وallowInvalidConfigRecovery.
startup
object
أعلام سلوك بدء التشغيل.

openclaw.channel

openclaw.channel هو بيانات وصفية خفيفة للحزمة لاكتشاف القنوات وواجهات الإعداد قبل تحميل وقت التشغيل.
الحقلالنوعمعناه
idstringمعرّف القناة المعتمد.
labelstringتسمية القناة الرئيسية.
selectionLabelstringتسمية أداة الاختيار/الإعداد عندما ينبغي أن تختلف عن label.
detailLabelstringتسمية تفاصيل ثانوية لفهارس القنوات الأكثر ثراءً وواجهات الحالة.
docsPathstringمسار الوثائق لروابط الإعداد والاختيار.
docsLabelstringتسمية بديلة تُستخدم لروابط الوثائق عندما ينبغي أن تختلف عن معرّف القناة.
blurbstringوصف قصير للتعريف/الفهرس.
ordernumberترتيب الفرز في فهارس القنوات.
aliasesstring[]أسماء مستعارة إضافية للبحث عند اختيار القناة.
preferOverstring[]معرّفات Plugins/قنوات ذات أولوية أدنى ينبغي أن تتقدم هذه القناة عليها.
systemImagestringاسم اختياري لأيقونة/صورة نظام لفهارس واجهة مستخدم القنوات.
selectionDocsPrefixstringنص بادئة قبل روابط الوثائق في واجهات الاختيار.
selectionDocsOmitLabelbooleanعرض مسار الوثائق مباشرة بدلًا من رابط وثائق ذي تسمية في نص الاختيار.
selectionExtrasstring[]سلاسل قصيرة إضافية تُلحق بنص الاختيار.
markdownCapablebooleanيعلّم القناة على أنها تدعم Markdown لقرارات التنسيق الصادر.
exposureobjectعناصر التحكم في ظهور القناة لواجهات الإعداد، والقوائم المهيأة، والوثائق.
quickstartAllowFrombooleanيضم هذه القناة إلى مسار إعداد البدء السريع القياسي allowFrom.
forceAccountBindingbooleanيتطلب ربط الحساب صراحة حتى عند وجود حساب واحد فقط.
preferSessionLookupForAnnounceTargetbooleanيفضّل البحث عن الجلسة عند حل أهداف الإعلان لهذه القناة.
مثال:
{
  "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: تعليم القناة على أنها عامة الظهور في واجهات الوثائق/التنقل
لا يزال showConfigured وshowInSetup مدعومين كأسماء مستعارة قديمة. فضّل exposure.

openclaw.install

openclaw.install هو بيانات وصفية للحزمة، وليس بيانات وصفية للبيان التعريفي.
الحقلالنوعمعناه
clawhubSpecstringمواصفة ClawHub المعتمدة لمسارات التثبيت/التحديث وتثبيت التعريف عند الطلب.
npmSpecstringمواصفة npm المعتمدة لمسارات التثبيت/التحديث الاحتياطية.
localPathstringمسار التطوير المحلي أو التثبيت المضمّن.
defaultChoice"clawhub" | "npm" | "local"مصدر التثبيت المفضل عند توفر عدة مصادر.
minHostVersionstringأدنى إصدار OpenClaw مدعوم بالصيغة >=x.y.z أو >=x.y.z-prerelease.
expectedIntegritystringسلسلة سلامة توزيعة npm المتوقعة، عادةً sha512-...، للتثبيتات المثبتة بإصدار محدد.
allowInvalidConfigRecoverybooleanيتيح لمسارات إعادة تثبيت Plugin المضمّن التعافي من إخفاقات محددة في تهيئة قديمة.
يستخدم التعريف التفاعلي أيضًا openclaw.install لواجهات التثبيت عند الطلب. إذا كان Plugin لديك يعرض خيارات مصادقة المزوّد أو بيانات وصفية لإعداد/فهرس القنوات قبل تحميل وقت التشغيل، يمكن للتعريف عرض ذلك الخيار، والمطالبة بتثبيت ClawHub أو npm أو تثبيت محلي، ثم تثبيت Plugin أو تمكينه، ثم متابعة المسار المحدد. تستخدم خيارات تعريف ClawHub clawhubSpec وتُفضّل عند وجودها؛ وتتطلب خيارات npm بيانات وصفية موثوقة للفهرس مع npmSpec للسجل؛ وتكون الإصدارات الدقيقة وexpectedIntegrity اختيارية كتثبيتات npm مثبتة. إذا كان expectedIntegrity موجودًا، تفرضه مسارات التثبيت/التحديث لـ npm. أبقِ بيانات “ما الذي يجب عرضه” الوصفية في openclaw.plugin.json وبيانات “كيفية تثبيته” الوصفية في package.json.
إذا تم تعيين minHostVersion، فإن كلًا من التثبيت وتحميل سجل البيانات التعريفية غير المضمّن يفرضان ذلك. تتخطى المضيفات الأقدم Plugins الخارجية؛ وتُرفض سلاسل الإصدارات غير الصالحة. يُفترض أن Plugins المصدر المضمّنة متوافقة الإصدار مع نسخة عمل المضيف.
بالنسبة إلى تثبيتات npm المثبتة بإصدار محدد، احتفظ بالإصدار الدقيق في npmSpec وأضف سلامة الأثر المتوقعة:
{
  "openclaw": {
    "install": {
      "npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3",
      "expectedIntegrity": "sha512-REPLACE_WITH_NPM_DIST_INTEGRITY",
      "defaultChoice": "npm"
    }
  }
}
لا يُعد allowInvalidConfigRecovery تجاوزًا عامًا للتهيئات المعطلة. إنه مخصص فقط لاسترداد Plugin المضمّن ضمن نطاق ضيق، بحيث يمكن لإعادة التثبيت/الإعداد إصلاح بقايا ترقية معروفة مثل مسار Plugin مضمّن مفقود أو إدخال channels.<id> قديم لذلك Plugin نفسه. إذا كانت التهيئة معطلة لأسباب غير ذات صلة، يظل التثبيت يفشل بإغلاق آمن ويطلب من المشغّل تشغيل openclaw doctor --fix.

التحميل الكامل المؤجل

يمكن لـ Plugins القنوات اختيار التحميل المؤجل باستخدام:
{
  "openclaw": {
    "extensions": ["./index.ts"],
    "setupEntry": "./setup-entry.ts",
    "startup": {
      "deferConfiguredChannelFullLoadUntilAfterListen": true
    }
  }
}
عند التمكين، يحمّل OpenClaw فقط setupEntry أثناء مرحلة بدء التشغيل السابقة للاستماع، حتى للقنوات المهيأة مسبقًا. يتم تحميل الإدخال الكامل بعد أن يبدأ Gateway بالاستماع.
فعّل التحميل المؤجل فقط عندما يسجّل setupEntry لديك كل ما يحتاجه Gateway قبل أن يبدأ بالاستماع (تسجيل القناة، ومسارات HTTP، وطرق 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-run
clawhub package publish your-org/your-plugin
الاسم المستعار القديم للنشر الخاص بالـ Skills فقط مخصص للـ Skills. ينبغي لحزم Plugin استخدام clawhub package publish دائمًا.

إدخال الإعداد

ملف setup-entry.ts هو بديل خفيف لـ index.ts يحمّله OpenClaw عندما يحتاج فقط إلى أسطح الإعداد (التهيئة الأولية، إصلاح الإعدادات، فحص القناة المعطّلة).
// setup-entry.ts
import { defineSetupPluginEntry } from "openclaw/plugin-sdk/channel-core";
import { myChannelPlugin } from "./src/channel.js";

export default defineSetupPluginEntry(myChannelPlugin);
يتجنب هذا تحميل كود وقت التشغيل الثقيل (مكتبات التشفير، تسجيلات CLI، خدمات الخلفية) أثناء تدفقات الإعداد. يمكن لقنوات مساحة العمل المضمّنة التي تحتفظ بتصديرات آمنة للإعداد في وحدات جانبية استخدام defineBundledChannelSetupEntry(...) من openclaw/plugin-sdk/channel-entry-contract بدلًا من defineSetupPluginEntry(...). يدعم ذلك العقد المضمّن أيضًا تصدير runtime اختياريًا بحيث تبقى وصلات وقت التشغيل أثناء الإعداد خفيفة وصريحة.
  • تكون القناة معطّلة لكنها تحتاج إلى أسطح الإعداد/التهيئة الأولية.
  • تكون القناة مفعّلة لكنها غير مهيأة.
  • يكون التحميل المؤجل مفعّلًا (deferConfiguredChannelFullLoadUntilAfterListen).
  • كائن Channel Plugin (عبر defineSetupPluginEntry).
  • أي مسارات HTTP مطلوبة قبل استماع Gateway.
  • أي أساليب Gateway مطلوبة أثناء بدء التشغيل.
يجب أن تتجنب أساليب Gateway عند بدء التشغيل هذه أيضًا مساحات أسماء الإدارة الأساسية المحجوزة مثل config.* أو update.*.
  • تسجيلات 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-runtimecreateEnvPatchedAccountSetupAdapter
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(...): اختيار الحساب الحالي الذي يتلقى القيم المرقّاة
Matrix هو المثال المضمّن الحالي. إذا كان هناك حساب Matrix مسمى واحد بالضبط موجود بالفعل، أو إذا كان defaultAccount يشير إلى مفتاح غير قياسي موجود مثل Ops، فإن الترقية تحتفظ بذلك الحساب بدلًا من إنشاء إدخال accounts.default جديد.

مخطط الإعدادات

يُتحقق من إعدادات 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:
import { z } from "zod";
import { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-schema";

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 في مسارات البيانات الوصفية:
import { Type } from "typebox";
import { buildJsonChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-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:
import type { ChannelSetupWizard } from "openclaw/plugin-sdk/channel-setup";

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) للحصول على أمثلة كاملة.
بالنسبة لمطالبات قائمة السماح في الرسائل المباشرة التي لا تحتاج إلا إلى التدفق القياسي 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، ثم ثبّت:
openclaw plugins install @myorg/openclaw-my-plugin
تُثبَّت مواصفات الحزم المجردة من npm أثناء انتقال الإطلاق.
Plugins داخل المستودع: ضعها ضمن شجرة مساحة عمل Plugin المضمّنة، وسيتم اكتشافها تلقائيًا أثناء البناء. يمكن للمستخدمين التثبيت:
openclaw plugins install <package-name>
بالنسبة إلى عمليات التثبيت من مصدر npm، يثبّت openclaw plugins install الحزمة ضمن ~/.openclaw/npm مع تعطيل سكربتات دورة الحياة. أبقِ أشجار تبعيات Plugin نقية من JS/TS وتجنب الحزم التي تتطلب عمليات بناء postinstall.
بدء تشغيل Gateway لا يثبّت تبعيات Plugin. تدفقات تثبيت npm/git/ClawHub هي المسؤولة عن تسوية التبعيات؛ ويجب أن تكون تبعيات Plugins المحلية مثبتة مسبقًا.
بيانات تعريف الحزمة المضمّنة صريحة، وليست مستنتجة من JavaScript المبني عند بدء تشغيل Gateway. تبعيات وقت التشغيل تنتمي إلى حزمة Plugin التي تملكها؛ ولا يقوم بدء تشغيل OpenClaw المعبأ أبدًا بإصلاح تبعيات Plugin أو نسخها.

ذات صلة