openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
186 lines (185 loc) • 7.22 kB
JavaScript
import { s as normalizeOptionalLowercaseString } from "./string-coerce-mnp54Vah.js";
import { n as normalizeAccountId } from "./account-id-Df9e41E6.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
import { c as resolveMergedAccountConfig } from "./account-helpers-pcH3lGFY.js";
import "./account-resolution-DBB0e3KP.js";
import { n as createChannelIngressResolver, o as defineStableChannelIngressIdentity } from "./message-access-mwxdTUGC.js";
import "./channel-ingress-runtime-rGltVkKC.js";
import { t as detectIdType } from "./targets-DGmM3dk9.js";
//#region extensions/feishu/src/policy.ts
const FEISHU_PROVIDER_PREFIX_RE = /^(feishu|lark):/i;
const FEISHU_TYPED_PREFIX_RE = /^(chat|group|channel|user|dm|open_id):/i;
const FEISHU_ID_KIND = "plugin:feishu-id";
const feishuIngressIdentity = defineStableChannelIngressIdentity({
key: "feishu-id",
kind: FEISHU_ID_KIND,
normalize: normalizeFeishuAllowEntry,
sensitivity: "pii",
aliases: [{
key: "feishu-alt-id",
kind: FEISHU_ID_KIND,
normalizeEntry: () => null,
normalizeSubject: normalizeFeishuAllowEntry,
sensitivity: "pii"
}],
isWildcardEntry: (entry) => normalizeFeishuAllowEntry(entry) === "*",
resolveEntryId: ({ entryIndex }) => `feishu-entry-${entryIndex + 1}`
});
function normalizeFeishuAllowEntry(raw) {
const trimmed = raw.trim();
if (!trimmed) return "";
if (trimmed === "*") return "*";
let withoutProviderPrefix = trimmed;
while (FEISHU_PROVIDER_PREFIX_RE.test(withoutProviderPrefix)) withoutProviderPrefix = withoutProviderPrefix.replace(FEISHU_PROVIDER_PREFIX_RE, "").trim();
if (withoutProviderPrefix === "*") return "*";
const lowered = normalizeOptionalLowercaseString(withoutProviderPrefix) ?? "";
if (!lowered) return "";
const prefixed = lowered.match(FEISHU_TYPED_PREFIX_RE);
if (prefixed?.[1]) {
const kind = [
"chat",
"group",
"channel"
].includes(prefixed[1]) ? "chat" : "user";
const value = withoutProviderPrefix.slice(prefixed[0].length).trim();
return value === "*" ? "*" : value ? `${kind}:${value}` : "";
}
const detectedType = detectIdType(withoutProviderPrefix);
if (detectedType === "chat_id") return `chat:${withoutProviderPrefix}`;
if (detectedType === "open_id" || detectedType === "user_id") return `user:${withoutProviderPrefix}`;
return "";
}
function normalizeFeishuDmPolicy(policy) {
return policy === "open" || policy === "pairing" || policy === "allowlist" || policy === "disabled" ? policy : "pairing";
}
function normalizeFeishuGroupPolicy(policy) {
return policy === "allowall" ? "open" : policy;
}
function createFeishuIngressSubject(params) {
const ids = [params.primaryId, ...params.alternateIds ?? []].map((value) => value?.trim()).filter((value) => Boolean(value));
return {
stableId: ids[0],
aliases: { "feishu-alt-id": ids[1] }
};
}
function createFeishuIngressResolver(params) {
return createChannelIngressResolver({
channelId: "feishu",
accountId: normalizeAccountId(params.accountId) ?? "default",
identity: feishuIngressIdentity,
cfg: params.cfg,
...params.readAllowFromStore ? { readStoreAllowFrom: params.readAllowFromStore } : {}
});
}
async function resolveFeishuDmIngressAccess(params) {
return await createFeishuIngressResolver({
cfg: params.cfg,
accountId: params.accountId,
readAllowFromStore: params.readAllowFromStore
}).message({
subject: createFeishuIngressSubject({
primaryId: params.senderOpenId,
alternateIds: [params.senderUserId]
}),
conversation: {
kind: "direct",
id: params.conversationId
},
event: { mayPair: params.mayPair },
dmPolicy: normalizeFeishuDmPolicy(params.dmPolicy),
groupPolicy: "disabled",
allowFrom: params.allowFrom ?? [],
...params.command ? { command: params.command } : {}
});
}
async function resolveFeishuGroupConversationIngressAccess(params) {
const groupPolicy = normalizeFeishuGroupPolicy(params.groupPolicy);
const groupAllowFrom = groupPolicy === "allowlist" && params.groupExplicitlyConfigured ? [...params.groupAllowFrom ?? [], params.chatId] : params.groupAllowFrom ?? [];
return await createFeishuIngressResolver({
cfg: params.cfg,
accountId: params.accountId
}).message({
subject: createFeishuIngressSubject({ primaryId: params.chatId }),
conversation: {
kind: "group",
id: params.chatId
},
dmPolicy: "disabled",
groupPolicy,
groupAllowFrom
});
}
async function resolveFeishuGroupSenderActivationIngressAccess(params) {
const groupAllowFrom = params.allowFrom ?? [];
return await createFeishuIngressResolver({
cfg: params.cfg,
accountId: params.accountId
}).message({
subject: createFeishuIngressSubject({
primaryId: params.senderOpenId,
alternateIds: [params.senderUserId]
}),
conversation: {
kind: "group",
id: params.chatId
},
dmPolicy: "disabled",
groupPolicy: groupAllowFrom.length > 0 ? "allowlist" : "open",
groupAllowFrom,
mentionFacts: {
canDetectMention: true,
wasMentioned: params.mentionedBot
},
policy: { activation: {
requireMention: params.requireMention,
allowTextCommands: false
} },
...params.command ? { command: params.command } : {}
});
}
function resolveFeishuGroupConfig(params) {
const groups = params.cfg?.groups ?? {};
const wildcard = groups["*"];
const groupId = params.groupId?.trim();
if (!groupId) return;
const direct = groups[groupId];
if (direct) return direct;
const lowered = normalizeOptionalLowercaseString(groupId) ?? "";
const matchKey = Object.keys(groups).find((key) => normalizeOptionalLowercaseString(key) === lowered);
if (matchKey) return groups[matchKey];
return wildcard;
}
function hasExplicitFeishuGroupConfig(params) {
const groups = params.cfg?.groups ?? {};
const groupId = params.groupId?.trim();
if (!groupId) return false;
if (Object.hasOwn(groups, groupId) && groupId !== "*") return true;
const lowered = normalizeOptionalLowercaseString(groupId) ?? "";
return Object.keys(groups).some((key) => key !== "*" && normalizeOptionalLowercaseString(key) === lowered);
}
function resolveFeishuGroupToolPolicy(params) {
const cfg = params.cfg.channels?.feishu;
if (!cfg) return;
return resolveFeishuGroupConfig({
cfg,
groupId: params.groupId
})?.tools;
}
function resolveFeishuReplyPolicy(params) {
if (params.isDirectMessage) return { requireMention: false };
const feishuCfg = params.cfg.channels?.feishu;
const resolvedCfg = resolveMergedAccountConfig({
channelConfig: feishuCfg,
accounts: feishuCfg?.accounts,
accountId: normalizeAccountId(params.accountId),
normalizeAccountId,
omitKeys: ["defaultAccount"]
});
const groupRequireMention = resolveFeishuGroupConfig({
cfg: resolvedCfg,
groupId: params.groupId
})?.requireMention;
return { requireMention: typeof groupRequireMention === "boolean" ? groupRequireMention : typeof resolvedCfg.requireMention === "boolean" ? resolvedCfg.requireMention : params.groupPolicy !== "open" };
}
//#endregion
export { resolveFeishuGroupConversationIngressAccess as a, resolveFeishuReplyPolicy as c, resolveFeishuGroupConfig as i, normalizeFeishuAllowEntry as n, resolveFeishuGroupSenderActivationIngressAccess as o, resolveFeishuDmIngressAccess as r, resolveFeishuGroupToolPolicy as s, hasExplicitFeishuGroupConfig as t };