Plugin maintainer reference
Kanal-Eingangs-API
Kanal-Ingress-API
Kanal-Ingress ist die experimentelle Zugriffskontrollgrenze für eingehende Kanalereignisse. Verwenden Sie openclaw/plugin-sdk/channel-ingress-runtime für Empfangspfade. Der ältere Subpfad openclaw/plugin-sdk/channel-ingress bleibt als veraltete Kompatibilitätsfassade für Drittanbieter-Plugins exportiert.
Plugins besitzen plattformspezifische Fakten und Seiteneffekte. Der Core besitzt generische Richtlinien: Zulassungslisten für Direktnachrichten/Gruppen, DM-Einträge im Pairing-Store, Routing-Gates, Befehls-Gates, Ereignisautorisierung, Aktivierung durch Erwähnung, redigierte Diagnosen und Zulassung.
Laufzeit-Resolver
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,});Berechnen Sie effektive Zulassungslisten, Befehlsinhaber oder Befehlsgruppen nicht vorab. Der Resolver leitet sie aus Roh-Zulassungslisten, Store-Callbacks, Routen-Deskriptoren, Zugriffsgruppen, Richtlinien und Konversationsart ab.
Ergebnis
Gebündelte Plugins sollten moderne Projektionen direkt verwenden:
ingress: geordnete Gate-Entscheidung und ZulassungsenderAccess: nur Autorisierung von Absender/KonversationrouteAccess: Routen- und Routenabsender-ProjektioncommandAccess: Befehlsautorisierung; false, wenn kein Befehls-Gate ausgeführt wurdeactivationAccess: Ergebnis der Erwähnung/Aktivierung
Die Ereignisautorisierung bleibt im geordneten ingress.graph und im entscheidenden ingress.reasonCode verfügbar; es wird keine separate Ereignisprojektion ausgegeben.
Veraltete SDK-Hilfsfunktionen für Drittanbieter können ältere Formen intern neu aufbauen. Neue gebündelte Empfangspfade sollten moderne Ergebnisse nicht wieder in lokale DTOs übersetzen.
Zugriffsgruppen
accessGroup:<name>-Einträge bleiben redigiert. Der Core löst statische message.senders-Gruppen selbst auf und ruft resolveAccessGroupMembership nur für dynamische Gruppen auf, die eine Plattformabfrage erfordern. Fehlende, nicht unterstützte und fehlgeschlagene Gruppen schlagen geschlossen fehl.
Ereignismodi
authMode |
Bedeutung |
|---|---|
inbound |
normale Gates für eingehende Absender |
command |
Befehls-Gates für Callbacks oder begrenzte Schaltflächen |
origin-subject |
Akteur muss mit dem Subjekt der ursprünglichen Nachricht übereinstimmen |
route-only |
nur Routen-Gates für routenbezogene vertrauenswürdige Ereignisse |
none |
Plugin-eigene interne Ereignisse umgehen gemeinsame Authentifizierung |
Verwenden Sie mayPair: false für Reaktionen, Schaltflächen, Callbacks und native Befehle.
Routen und Aktivierung
Verwenden Sie Routen-Deskriptoren für Raum-, Themen-, Guild-, Thread- oder verschachtelte Routenrichtlinien:
route: { id: "room", allowed: roomAllowed, enabled: roomEnabled, senderPolicy: "replace", senderAllowFrom: roomAllowFrom, blockReason: "room_sender_not_allowlisted",}Verwenden Sie channelIngressRoutes(...), wenn ein Plugin mehrere optionale Routen-Deskriptoren hat; es filtert deaktivierte Zweige heraus, während Routenfakten generisch bleiben und nach der precedence jedes Deskriptors geordnet werden.
Mention-Gating ist ein Aktivierungs-Gate. Eine verfehlte Erwähnung gibt admission: "skip" zurück, sodass der Turn-Kernel keinen reinen Beobachtungs-Turn verarbeitet. Die meisten Kanäle sollten die Aktivierung nach Absender- und Befehls-Gates belassen. Öffentliche Chat-Oberflächen, die nicht erwähnten Verkehr vor Rauschen durch Absender-Zulassungslisten unterdrücken müssen, können activation.order: "before-sender" aktivieren, wenn die Umgehung per Textbefehl deaktiviert ist. Kanäle mit impliziter Aktivierung, etwa Antworten in Bot-Threads, können activation.allowedImplicitMentionKinds übergeben; das projizierte activationAccess.shouldBypassMention meldet dann, wann Befehls- oder implizite Aktivierung eine ausdrückliche Erwähnung umgangen hat.
Redigierung
Rohwerte von Absendern und rohe Zulassungslisten-Einträge sind nur Eingaben für den Resolver. Sie dürfen nicht in aufgelöstem Zustand, Entscheidungen, Diagnosen, Snapshots oder Kompatibilitätsfakten erscheinen. Verwenden Sie opake Subjekt-IDs, Eintrags-IDs, Routen-IDs und Diagnose-IDs.
Verifizierung
pnpm test src/channels/message-access/message-access.test.ts src/plugin-sdk/channel-ingress-runtime.test.tspnpm plugin-sdk:api:check