Plugin maintainer reference
رابط برنامهنویسی کاربردی ورودی کانال
API ورودی کانال
ورودی کانال مرز آزمایشی کنترل دسترسی برای رویدادهای ورودی کانال است. برای مسیرهای دریافت از openclaw/plugin-sdk/channel-ingress-runtime استفاده کنید. زیربخش قدیمیتر openclaw/plugin-sdk/channel-ingress همچنان بهعنوان نمای سازگاری منسوخشده برای Pluginهای شخص ثالث صادر میماند.
Pluginها مالک واقعیتهای پلتفرم و اثرات جانبی هستند. هسته مالک سیاست عمومی است: فهرستهای مجاز DM/گروه، ورودیهای DM در pairing-store، دروازههای مسیر، دروازههای فرمان، احراز رویداد، فعالسازی با منشن، عیبیابیهای پوشیدهشده، و پذیرش.
حلکننده زمان اجرا
defineStableChannelIngressIdentity,
resolveChannelMessageIngress,
} from "openclaw/plugin-sdk/channel-ingress-runtime";
const identity = defineStableChannelIngressIdentity({
key: "platform-user-id",
normalize: normalizePlatformUserId,
sensitivity: "pii",
});
const result = await resolveChannelMessageIngress({
channelId: "my-channel",
accountId,
identity,
subject: { stableId: platformUserId },
conversation: { kind: isGroup ? "group" : "direct", id: conversationId },
event: { kind: "message", authMode: "inbound", mayPair: !isGroup },
policy: {
dmPolicy: config.dmPolicy,
groupPolicy: config.groupPolicy,
groupAllowFromFallbackToAllowFrom: true,
},
allowFrom: config.allowFrom,
groupAllowFrom: config.groupAllowFrom,
accessGroups: cfg.accessGroups,
route,
readStoreAllowFrom,
command: hasControlCommand ? { allowTextCommands: true, hasControlCommand } : undefined,
});
فهرستهای مجاز مؤثر، مالکان فرمان، یا گروههای فرمان را از پیش محاسبه نکنید. حلکننده آنها را از فهرستهای مجاز خام، callbackهای ذخیرهگاه، توصیفگرهای مسیر، گروههای دسترسی، سیاست، و نوع مکالمه استخراج میکند.
نتیجه
Pluginهای همراه باید projectionهای مدرن را مستقیماً مصرف کنند:
ingress: تصمیم مرتبشده دروازه و پذیرشsenderAccess: فقط مجوز فرستنده/مکالمهrouteAccess: projection مسیر و فرستنده مسیرcommandAccess: مجوز فرمان؛ وقتی هیچ دروازه فرمانی اجرا نشده باشد false استactivationAccess: نتیجه منشن/فعالسازی
مجوز رویداد همچنان روی ingress.graph مرتبشده و ingress.reasonCode تعیینکننده در دسترس میماند؛ هیچ projection جداگانهای برای رویداد منتشر نمیشود.
کمککنندههای منسوخ SDK شخص ثالث میتوانند شکلهای قدیمیتر را بهصورت داخلی بازسازی کنند. مسیرهای دریافت همراه جدید نباید نتایج مدرن را دوباره به DTOهای محلی تبدیل کنند.
گروههای دسترسی
ورودیهای accessGroup:<name> پوشیدهشده باقی میمانند. هسته خودش گروههای ایستای message.senders را حل میکند و resolveAccessGroupMembership را فقط برای گروههای پویایی فراخوانی میکند که به جستوجوی پلتفرم نیاز دارند. گروههای ناموجود، پشتیبانینشده، و ناموفق بهصورت بسته شکست میخورند.
حالتهای رویداد
authMode |
معنی |
|---|---|
inbound |
دروازههای عادی فرستنده ورودی |
command |
دروازههای فرمان برای callbackها یا دکمههای scoped |
origin-subject |
کنشگر باید با subject پیام اصلی مطابقت داشته باشد |
route-only |
فقط دروازههای مسیر برای رویدادهای مورد اعتماد scoped به مسیر |
none |
رویدادهای داخلی متعلق به Plugin از احراز مشترک عبور میکنند |
برای واکنشها، دکمهها، callbackها، و فرمانهای بومی از mayPair: false استفاده کنید.
مسیرها و فعالسازی
برای سیاست اتاق، موضوع، guild، thread، یا مسیر تودرتو از توصیفگرهای مسیر استفاده کنید:
route: {
id: "room",
allowed: roomAllowed,
enabled: roomEnabled,
senderPolicy: "replace",
senderAllowFrom: roomAllowFrom,
blockReason: "room_sender_not_allowlisted",
}
وقتی یک Plugin چند توصیفگر مسیر اختیاری دارد از channelIngressRoutes(...) استفاده کنید؛ شاخههای غیرفعال را فیلتر میکند و در عین حال واقعیتهای مسیر را عمومی و مطابق precedence هر توصیفگر مرتب نگه میدارد.
دروازهگذاری منشن یک دروازه فعالسازی است. نبود منشن admission: "skip" برمیگرداند تا هسته turn یک turn فقط مشاهدهای را پردازش نکند. بیشتر کانالها باید فعالسازی را پس از دروازههای فرستنده و فرمان باقی بگذارند. سطوح گفتوگوی عمومی که باید ترافیک بدون منشن را پیش از نویز فهرست مجاز فرستنده ساکت کنند، وقتی عبور فرمان متنی غیرفعال است، میتوانند activation.order: "before-sender" را انتخاب کنند. کانالهایی با فعالسازی ضمنی، مانند پاسخها در threadهای بات، میتوانند activation.allowedImplicitMentionKinds را ارسال کنند؛ سپس activationAccess.shouldBypassMention projected گزارش میدهد چه زمانی فرمان یا فعالسازی ضمنی از منشن صریح عبور کرده است.
پوشاندن
مقادیر خام فرستنده و ورودیهای خام فهرست مجاز فقط ورودی حلکننده هستند. آنها نباید در وضعیت حلشده، تصمیمها، عیبیابیها، snapshotها، یا واقعیتهای سازگاری ظاهر شوند. از شناسههای opaque برای subject، شناسههای ورودی، شناسههای مسیر، و شناسههای عیبیابی استفاده کنید.
راستیآزمایی
pnpm test src/channels/message-access/message-access.test.ts src/plugin-sdk/channel-ingress-runtime.test.ts
pnpm plugin-sdk:api:check