refactor: simplify chat plugin pairing configs

This commit is contained in:
Peter Steinberger
2026-03-22 22:29:42 +00:00
parent 3365f2e157
commit 7f65b3463b
4 changed files with 65 additions and 67 deletions

View File

@@ -6,10 +6,7 @@ import {
createScopedDmSecurityResolver,
} from "openclaw/plugin-sdk/channel-config-helpers";
import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle";
import {
createPairingPrefixStripper,
createTextPairingAdapter,
} from "openclaw/plugin-sdk/channel-pairing";
import { createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
import {
createOpenGroupPolicyRestrictSendersWarningCollector,
projectWarningCollector,
@@ -300,21 +297,23 @@ export const bluebubblesPlugin: ChannelPlugin<ResolvedBlueBubblesAccount> = crea
hasRepliedRef,
}),
},
pairing: createTextPairingAdapter({
idLabel: "bluebubblesSenderId",
message: PAIRING_APPROVED_MESSAGE,
normalizeAllowEntry: createPairingPrefixStripper(
/^bluebubbles:/i,
normalizeBlueBubblesHandle,
),
notify: async ({ cfg, id, message }) => {
await (
await loadBlueBubblesChannelRuntime()
).sendMessageBlueBubbles(id, message, {
cfg: cfg,
});
pairing: {
text: {
idLabel: "bluebubblesSenderId",
message: PAIRING_APPROVED_MESSAGE,
normalizeAllowEntry: createPairingPrefixStripper(
/^bluebubbles:/i,
normalizeBlueBubblesHandle,
),
notify: async ({ cfg, id, message }) => {
await (
await loadBlueBubblesChannelRuntime()
).sendMessageBlueBubbles(id, message, {
cfg: cfg,
});
},
},
}),
},
outbound: {
base: {
deliveryMode: "direct",

View File

@@ -5,7 +5,6 @@ import {
createScopedChannelConfigAdapter,
createScopedDmSecurityResolver,
} from "openclaw/plugin-sdk/channel-config-helpers";
import { createTextPairingAdapter } from "openclaw/plugin-sdk/channel-pairing";
import {
composeWarningCollectors,
createAllowlistProviderOpenWarningCollector,
@@ -313,18 +312,20 @@ export const ircPlugin: ChannelPlugin<ResolvedIrcAccount, IrcProbe> = createChat
},
},
},
pairing: createTextPairingAdapter({
idLabel: "ircUser",
message: PAIRING_APPROVED_MESSAGE,
normalizeAllowEntry: (entry) => normalizeIrcAllowEntry(entry),
notify: async ({ id, message }) => {
const target = normalizePairingTarget(id);
if (!target) {
throw new Error(`invalid IRC pairing id: ${id}`);
}
await sendMessageIrc(target, message);
pairing: {
text: {
idLabel: "ircUser",
message: PAIRING_APPROVED_MESSAGE,
normalizeAllowEntry: (entry) => normalizeIrcAllowEntry(entry),
notify: async ({ id, message }) => {
const target = normalizePairingTarget(id);
if (!target) {
throw new Error(`invalid IRC pairing id: ${id}`);
}
await sendMessageIrc(target, message);
},
},
}),
},
security: {
resolveDmPolicy: resolveIrcDmPolicy,
collectWarnings: collectIrcSecurityWarnings,

View File

@@ -1,7 +1,4 @@
import {
createPairingPrefixStripper,
createTextPairingAdapter,
} from "openclaw/plugin-sdk/channel-pairing";
import { createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
import { createRestrictSendersChannelSecurity } from "openclaw/plugin-sdk/channel-policy";
import {
createAttachedChannelResultAdapter,
@@ -283,22 +280,24 @@ export const linePlugin: ChannelPlugin<ResolvedLineAccount> = createChatChannelP
],
},
},
pairing: createTextPairingAdapter({
idLabel: "lineUserId",
message: "OpenClaw: your access has been approved.",
// LINE IDs are case-sensitive; only strip prefix variants (line: / line:user:).
normalizeAllowEntry: createPairingPrefixStripper(/^line:(?:user:)?/i),
notify: async ({ cfg, id, message }) => {
const line = getLineRuntime().channel.line;
const account = line.resolveLineAccount({ cfg });
if (!account.channelAccessToken) {
throw new Error("LINE channel access token not configured");
}
await line.pushMessageLine(id, message, {
channelAccessToken: account.channelAccessToken,
});
pairing: {
text: {
idLabel: "lineUserId",
message: "OpenClaw: your access has been approved.",
// LINE IDs are case-sensitive; only strip prefix variants (line: / line:user:).
normalizeAllowEntry: createPairingPrefixStripper(/^line:(?:user:)?/i),
notify: async ({ cfg, id, message }) => {
const line = getLineRuntime().channel.line;
const account = line.resolveLineAccount({ cfg });
if (!account.channelAccessToken) {
throw new Error("LINE channel access token not configured");
}
await line.pushMessageLine(id, message, {
channelAccessToken: account.channelAccessToken,
});
},
},
}),
},
security: lineSecurityAdapter,
outbound: {
deliveryMode: "direct",

View File

@@ -1,9 +1,6 @@
import { createScopedDmSecurityResolver } from "openclaw/plugin-sdk/channel-config-helpers";
import { createAccountStatusSink } from "openclaw/plugin-sdk/channel-lifecycle";
import {
createPairingPrefixStripper,
createTextPairingAdapter,
} from "openclaw/plugin-sdk/channel-pairing";
import { createPairingPrefixStripper } from "openclaw/plugin-sdk/channel-pairing";
import {
createEmptyChannelResult,
createRawChannelSendResultAdapter,
@@ -498,21 +495,23 @@ export const zalouserPlugin: ChannelPlugin<ResolvedZalouserAccount, ZalouserProb
threading: {
resolveReplyToMode: createStaticReplyToModeResolver("off"),
},
pairing: createTextPairingAdapter({
idLabel: "zalouserUserId",
message: "Your pairing request has been approved.",
normalizeAllowEntry: createPairingPrefixStripper(/^(zalouser|zlu):/i),
notify: async ({ cfg, id, message }) => {
const account = resolveZalouserAccountSync({ cfg: cfg });
const authenticated = await checkZcaAuthenticated(account.profile);
if (!authenticated) {
throw new Error("Zalouser not authenticated");
}
await sendMessageZalouser(id, message, {
profile: account.profile,
});
pairing: {
text: {
idLabel: "zalouserUserId",
message: "Your pairing request has been approved.",
normalizeAllowEntry: createPairingPrefixStripper(/^(zalouser|zlu):/i),
notify: async ({ cfg, id, message }) => {
const account = resolveZalouserAccountSync({ cfg: cfg });
const authenticated = await checkZcaAuthenticated(account.profile);
if (!authenticated) {
throw new Error("Zalouser not authenticated");
}
await sendMessageZalouser(id, message, {
profile: account.profile,
});
},
},
}),
},
outbound: {
deliveryMode: "direct",
chunker: (text, limit) => getZalouserRuntime().channel.text.chunkMarkdownText(text, limit),