Plugin maintainer reference
سازگاری Plugin
OpenClaw قراردادهای قدیمیتر Plugin را پیش از حذف، از طریق آداپتورهای سازگاری نامگذاریشده متصل نگه میدارد. این کار از Pluginهای داخلی و خارجی موجود محافظت میکند، در حالی که قراردادهای SDK، مانیفست، راهاندازی، پیکربندی و زمان اجرای عامل تکامل پیدا میکنند.
رجیستری سازگاری
قراردادهای سازگاری Plugin در رجیستری هسته در
src/plugins/compat/registry.ts ردیابی میشوند.
هر رکورد شامل این موارد است:
- یک کد سازگاری پایدار
- وضعیت:
active،deprecated،removal-pending، یاremoved - مالک: SDK، پیکربندی، راهاندازی، کانال، ارائهدهنده، اجرای Plugin، زمان اجرای عامل، یا هسته
- تاریخهای معرفی و منسوخسازی، در صورت کاربرد
- راهنمای جایگزینی
- مستندات، عیبیابیها، و آزمونهایی که رفتار قدیمی و جدید را پوشش میدهند
رجیستری منبع برنامهریزی نگهدارندگان و بررسیهای آینده بازرس Plugin است. اگر رفتاری روبهروی Plugin تغییر کند، رکورد سازگاری را در همان تغییری که آداپتور را اضافه میکند، اضافه یا بهروزرسانی کنید.
سازگاری ترمیم و مهاجرت doctor بهصورت جداگانه در
src/commands/doctor/shared/deprecation-compat.ts ردیابی میشود. این رکوردها شکلهای قدیمی پیکربندی، چیدمانهای دفتر نصب، و شیمهای ترمیمی را پوشش میدهند که ممکن است پس از حذف مسیر سازگاری زمان اجرا نیز لازم باشد در دسترس بمانند.
بازبینیهای انتشار باید هر دو رجیستری را بررسی کنند. فقط به این دلیل که رکورد سازگاری متناظرِ زمان اجرا یا پیکربندی منقضی شده، یک مهاجرت doctor را حذف نکنید؛ ابتدا تأیید کنید هیچ مسیر ارتقای پشتیبانیشدهای وجود ندارد که هنوز به آن ترمیم نیاز داشته باشد. همچنین در زمان برنامهریزی انتشار، هر حاشیهنویسی جایگزینی را دوباره اعتبارسنجی کنید، چون مالکیت Plugin و ردپای پیکربندی میتواند با خروج ارائهدهندهها و کانالها از هسته تغییر کند.
بسته بازرس Plugin
بازرس Plugin باید بیرون از مخزن اصلی OpenClaw، بهعنوان یک بسته/مخزن جداگانه که بر قراردادهای نسخهدار سازگاری و مانیفست متکی است، قرار بگیرد.
CLI روز اول باید این باشد:
openclaw-plugin-inspector ./my-pluginباید این موارد را خروجی دهد:
- اعتبارسنجی مانیفست/شِما
- نسخه سازگاری قرارداد که بررسی میشود
- بررسیهای فراداده نصب/منبع
- بررسیهای import مسیر سرد
- هشدارهای منسوخسازی و سازگاری
برای خروجی پایدار قابلخواندن توسط ماشین در حاشیهنویسیهای CI از --json استفاده کنید. هسته OpenClaw باید قراردادها و fixtureهایی را در اختیار بگذارد که بازرس بتواند مصرف کند، اما نباید باینری بازرس را از بسته اصلی openclaw منتشر کند.
مسیر پذیرش نگهدارنده
هنگام اعتبارسنجی بازرس خارجی در برابر بستههای Plugin OpenClaw، برای مسیر پذیرش بسته قابلنصب از Blacksmith Testbox متکی بر Crabbox استفاده کنید. پس از ساخت بسته، آن را از یک checkout تمیز OpenClaw اجرا کنید:
pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "pnpm install && pnpm build && npm exec --yes @openclaw/plugin-inspector@0.1.0 -- ./extensions/telegram --json"pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "npm exec --yes @openclaw/plugin-inspector@0.1.0 -- ./extensions/discord --json"pnpm crabbox:run -- --provider blacksmith-testbox --timing-json --shell -- "npm exec --yes @openclaw/plugin-inspector@0.1.0 -- <clawhub-plugin-dir> --json"این مسیر را برای نگهدارندگان اختیاری نگه دارید، چون یک بسته خارجی npm را نصب میکند و ممکن است بستههای Plugin کلونشده بیرون از مخزن را بررسی کند. نگهبانهای مخزن محلی نقشه export SDK، فراداده رجیستری سازگاری، کاهش importهای منسوخ SDK، و مرزهای import افزونههای داخلی را پوشش میدهند؛ اثبات بازرس Testbox بسته را همانطور پوشش میدهد که نویسندگان Plugin خارجی آن را مصرف میکنند.
سیاست منسوخسازی
OpenClaw نباید یک قرارداد مستند Plugin را در همان انتشاری حذف کند که جایگزین آن را معرفی میکند.
ترتیب مهاجرت این است:
- قرارداد جدید را اضافه کنید.
- رفتار قدیمی را از طریق یک آداپتور سازگاری نامگذاریشده متصل نگه دارید.
- وقتی نویسندگان Plugin میتوانند اقدام کنند، عیبیابیها یا هشدارها را صادر کنید.
- جایگزین و زمانبندی را مستند کنید.
- هر دو مسیر قدیمی و جدید را آزمایش کنید.
- تا پایان پنجره مهاجرت اعلامشده صبر کنید.
- فقط با تأیید صریح انتشار ناسازگار حذف کنید.
رکوردهای منسوخشده باید شامل تاریخ شروع هشدار، جایگزین، لینک مستندات، و تاریخ حذف نهایی حداکثر سه ماه پس از شروع هشدار باشند. مسیر سازگاری منسوخشدهای با پنجره حذف بدون پایان اضافه نکنید، مگر اینکه نگهدارندگان صراحتاً تصمیم بگیرند که سازگاری دائمی است و بهجای آن آن را active علامتگذاری کنند.
حوزههای سازگاری فعلی
رکوردهای سازگاری فعلی شامل این موارد هستند:
- importهای گسترده قدیمی SDK مانند
openclaw/plugin-sdk/compat - شکلهای قدیمی Plugin فقطhook و
before_agent_start - نامهای قدیمی hook پاکسازی
api.on("deactivate", ...)در حالی که Pluginها بهgateway_stopمهاجرت میکنند - entrypointهای قدیمی Plugin به شکل
activate(api)در حالی که Pluginها بهregister(api)مهاجرت میکنند - aliasهای قدیمی SDK مانند
openclaw/extension-api،openclaw/plugin-sdk/channel-runtime، سازندههای وضعیتopenclaw/plugin-sdk/command-auth،openclaw/plugin-sdk/test-utils(جایگزینشده با زیرمسیرهای آزمون متمرکزopenclaw/plugin-sdk/*)، و aliasهای نوعClawdbotConfig/OpenClawSchemaType - رفتار allowlist و فعالسازی Pluginهای داخلی
- فراداده مانیفست قدیمی env-var برای ارائهدهنده/کانال
- hookها و aliasهای نوع قدیمی Plugin ارائهدهنده، در حالی که ارائهدهندهها به hookهای صریح کاتالوگ، احراز هویت، thinking، replay، و انتقال منتقل میشوند
- aliasهای قدیمی زمان اجرا مانند
api.runtime.taskFlow،api.runtime.subagent.getSession،api.runtime.stt، وapi.runtime.config.loadConfig()/api.runtime.config.writeConfigFile(...)منسوخشده - فیلدهای callback تخت
WebInboundMessageدر WhatsApp مانندbody،chatId،reply(...)، وmediaPathدر حالی که مصرفکنندگان callback به contextهای تودرتویevent،payload،quote،group، وplatformدرWebInboundCallbackMessageمهاجرت میکنند - فیلدهای پذیرش سطحبالای
WebInboundMessageدر WhatsApp مانندfrom،conversationId،accountId،accessControlPassed، وchatTypeدر حالی که مصرفکنندگان callback به envelopeadmissionمهاجرت میکنند - ثبت جداشده قدیمی memory-plugin در حالی که Pluginهای حافظه به
registerMemoryCapabilityمنتقل میشوند - ثبت قدیمی ارائهدهنده embedding ویژه حافظه، در حالی که ارائهدهندههای embedding به
api.registerEmbeddingProvider(...)وcontracts.embeddingProvidersمنتقل میشوند - helperهای قدیمی SDK کانال برای شِماهای پیام native، کنترل mention، قالببندی envelope ورودی، و تودرتوسازی قابلیت approval
- aliasهای قدیمی کلید route کانال و helper هدف قابلمقایسه، در حالی که Pluginها
به
openclaw/plugin-sdk/channel-routeمنتقل میشوند - hintهای فعالسازی که با مالکیت contribution در مانیفست جایگزین میشوند
- fallback زمان اجرای
setup-apiدر حالی که توصیفگرهای راهاندازی به فراداده سردsetup.requiresRuntime: falseمنتقل میشوند - hookهای
discoveryارائهدهنده در حالی که hookهای کاتالوگ ارائهدهنده بهcatalog.run(...)منتقل میشوند - فراداده
showConfigured/showInSetupکانال در حالی که بستههای کانال بهopenclaw.channel.exposureمنتقل میشوند - کلیدهای قدیمی پیکربندی سیاست زمان اجرا، در حالی که doctor اپراتورها را به
agentRuntimeمهاجرت میدهد - fallback فراداده تولیدشده پیکربندی کانال داخلی، در حالی که فراداده registry-first
channelConfigsاضافه میشود - flagهای env برای غیرفعالسازی رجیستری Plugin پایدارشده و install-migration در حالی که
جریانهای ترمیم اپراتورها را به
openclaw plugins registry --refreshوopenclaw doctor --fixمهاجرت میدهند - مسیرهای قدیمی پیکربندی web search، web fetch، و x_search متعلق به Plugin در حالی که
doctor آنها را به
plugins.entries.<plugin>.configمهاجرت میدهد - پیکربندی نوشتهشده قدیمی
plugins.installsو aliasهای load-path Plugin داخلی در حالی که فراداده نصب به دفتر Plugin مدیریتشده توسط state منتقل میشود
کد جدید Plugin باید جایگزین فهرستشده در رجیستری و در راهنمای مهاجرت مشخص را ترجیح دهد. Pluginهای موجود میتوانند تا زمانی که مستندات، عیبیابیها، و یادداشتهای انتشار یک پنجره حذف را اعلام کنند، به استفاده از مسیر سازگاری ادامه دهند.
Aliasهای تخت Callback ورودی WhatsApp
callbackهای زمان اجرای WhatsApp، WebInboundMessage را تحویل میدهند: contextهای تودرتوی canonical
event، payload، quote، group، و platform بههمراه aliasهای تخت منسوخ برای فیلدهای callback منتشرشده. کد callback جدید باید contextهای تودرتو را بخواند. کدی که پیامهای callback تودرتوی تمیز میسازد میتواند از
WebInboundCallbackMessage استفاده کند؛ listenerهای سازگاری که هنوز پیامهای قدیمی تخت آزمون یا Plugin را inject میکنند باید از LegacyFlatWebInboundMessage یا
WebInboundMessageInput استفاده کنند.
aliasهای تخت تا 2026-08-30 در دسترس میمانند. این پنجره حذف فقط برای دسترسی alias تخت اعمال میشود؛ شکل callback تودرتو قرارداد canonical زمان اجرا است. حاشیهنویسیهای TypeScript @deprecated روی هر alias تخت، جایگزین تودرتوی دقیق آن را نام میبرد. مثالهای رایج:
id،timestamp، وisBatchedبه زیرeventمنتقل میشوند.body،mediaPath،mediaType،mediaFileName،mediaUrl،location، وuntrustedStructuredContextبه زیرpayloadمنتقل میشوند.to،chatId، فیلدهای فرستنده/خود،sendComposing،reply(...)، وsendMedia(...)به زیرplatformمنتقل میشوند.- فیلدهای
replyTo*به زیرquoteمنتقل میشوند، و فیلدهای موضوع گروه/شرکتکننده/mention به زیرgroupمنتقل میشوند.
payload.untrustedStructuredContext از payloadهای ورودی ارائهدهنده استخراج میشود.
Pluginها باید پیش از معتبر دانستن payload آن، label، source، و type را بررسی کنند.
فیلدهای پذیرش ورودی WhatsApp
پیامهای callback پذیرفتهشده WhatsApp اکنون admission را حمل میکنند، یک envelope عمومیامن برای تصمیم کنترل دسترسی که پیام را پذیرفته است. کد callback جدید باید بهجای فیلدهای قدیمی پذیرش در سطح بالا، facts پذیرش را از msg.admission بخواند.
فیلدهای سطح بالا تا 2026-08-30 در دسترس میمانند. حاشیهنویسیهای TypeScript
@deprecated هر جایگزین را نام میبرند:
fromوconversationIdبهadmission.conversation.idمنتقل میشوند.accountIdبهadmission.accountIdمنتقل میشود.accessControlPassedیک نمای سازگاری مشتقشده ازadmission.ingress.decision === "allow"است؛ در پیامهایی که از قبلadmissionدارند، نوشتن boolean قدیمی گراف ingress را بازنویسی نمیکند.chatTypeبهadmission.conversation.kindمنتقل میشود.
یادداشتهای انتشار
یادداشتهای انتشار باید منسوخسازیهای آتی Plugin را با تاریخهای هدف و لینک به مستندات مهاجرت شامل شوند. این هشدار باید پیش از آن رخ دهد که یک مسیر سازگاری به removal-pending یا removed منتقل شود.