diff --git a/extensions/whatsapp/src/group-policy.test.ts b/extensions/whatsapp/src/group-policy.test.ts new file mode 100644 index 00000000000..bd1aecdeaa5 --- /dev/null +++ b/extensions/whatsapp/src/group-policy.test.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from "vitest"; +import { + resolveWhatsAppGroupRequireMention, + resolveWhatsAppGroupToolPolicy, +} from "./group-policy.js"; + +describe("whatsapp group policy", () => { + it("uses generic channel group policy helpers", () => { + const cfg = { + channels: { + whatsapp: { + groups: { + "1203630@g.us": { + requireMention: false, + tools: { deny: ["exec"] }, + }, + "*": { + requireMention: true, + tools: { allow: ["message.send"] }, + }, + }, + }, + }, + // oxlint-disable-next-line typescript/no-explicit-any + } as any; + + expect(resolveWhatsAppGroupRequireMention({ cfg, groupId: "1203630@g.us" })).toBe(false); + expect(resolveWhatsAppGroupRequireMention({ cfg, groupId: "other@g.us" })).toBe(true); + expect(resolveWhatsAppGroupToolPolicy({ cfg, groupId: "1203630@g.us" })).toEqual({ + deny: ["exec"], + }); + expect(resolveWhatsAppGroupToolPolicy({ cfg, groupId: "other@g.us" })).toEqual({ + allow: ["message.send"], + }); + }); +}); diff --git a/extensions/whatsapp/src/group-policy.ts b/extensions/whatsapp/src/group-policy.ts new file mode 100644 index 00000000000..dd1d04b7868 --- /dev/null +++ b/extensions/whatsapp/src/group-policy.ts @@ -0,0 +1,40 @@ +import { + resolveChannelGroupRequireMention, + resolveChannelGroupToolsPolicy, + type GroupToolPolicyConfig, +} from "openclaw/plugin-sdk/channel-policy"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/whatsapp-core"; + +type WhatsAppGroupContext = { + cfg: OpenClawConfig; + accountId?: string | null; + groupId?: string | null; + senderId?: string | null; + senderName?: string | null; + senderUsername?: string | null; + senderE164?: string | null; +}; + +export function resolveWhatsAppGroupRequireMention(params: WhatsAppGroupContext): boolean { + return resolveChannelGroupRequireMention({ + cfg: params.cfg, + channel: "whatsapp", + groupId: params.groupId, + accountId: params.accountId, + }); +} + +export function resolveWhatsAppGroupToolPolicy( + params: WhatsAppGroupContext, +): GroupToolPolicyConfig | undefined { + return resolveChannelGroupToolsPolicy({ + cfg: params.cfg, + channel: "whatsapp", + groupId: params.groupId, + accountId: params.accountId, + senderId: params.senderId, + senderName: params.senderName, + senderUsername: params.senderUsername, + senderE164: params.senderE164, + }); +} diff --git a/extensions/whatsapp/src/shared.ts b/extensions/whatsapp/src/shared.ts index 6f8952687e2..11177f41f66 100644 --- a/extensions/whatsapp/src/shared.ts +++ b/extensions/whatsapp/src/shared.ts @@ -13,8 +13,6 @@ import { resolveWhatsAppConfigAllowFrom, resolveWhatsAppConfigDefaultTo, resolveWhatsAppGroupIntroHint, - resolveWhatsAppGroupRequireMention, - resolveWhatsAppGroupToolPolicy, WhatsAppConfigSchema, type ChannelPlugin, } from "openclaw/plugin-sdk/whatsapp-core"; @@ -24,6 +22,10 @@ import { resolveWhatsAppAccount, type ResolvedWhatsAppAccount, } from "./accounts.js"; +import { + resolveWhatsAppGroupRequireMention, + resolveWhatsAppGroupToolPolicy, +} from "./group-policy.js"; export const WHATSAPP_CHANNEL = "whatsapp" as const; diff --git a/src/plugin-sdk/whatsapp-core.ts b/src/plugin-sdk/whatsapp-core.ts index 03a396e38f4..1bfcf7e5471 100644 --- a/src/plugin-sdk/whatsapp-core.ts +++ b/src/plugin-sdk/whatsapp-core.ts @@ -13,7 +13,7 @@ export { export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; +} from "../../extensions/whatsapp/src/group-policy.js"; export { resolveWhatsAppGroupIntroHint } from "../channels/plugins/whatsapp-shared.js"; export { ToolAuthorizationError, diff --git a/src/plugin-sdk/whatsapp.ts b/src/plugin-sdk/whatsapp.ts index 74ab27dac2f..405118818b5 100644 --- a/src/plugin-sdk/whatsapp.ts +++ b/src/plugin-sdk/whatsapp.ts @@ -52,7 +52,7 @@ export { export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, -} from "../channels/plugins/group-mentions.js"; +} from "../../extensions/whatsapp/src/group-policy.js"; export { createWhatsAppOutboundBase, resolveWhatsAppGroupIntroHint,