UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

191 lines (190 loc) 6.87 kB
import { a as normalizeLowercaseStringOrEmpty, c as normalizeOptionalString } from "./string-coerce-mnp54Vah.js"; import { v as parseStrictInteger } from "./number-coercion-CJQ8TR--.js"; import "./parse-finite-number-Z7n6tXLk.js"; import { l as normalizeStringEntries } from "./string-normalization-WNUDCpXX.js"; //#region src/channels/plugins/chat-target-prefixes.ts /** * Chat target prefix parsers. * * Parses service-qualified chat ids, guids, identifiers, and sender allowlist targets. */ /** * Checks whether a sender or current conversation matches an allowlist entry. */ function isAllowedParsedChatSender(params) { const allowFrom = normalizeStringEntries(params.allowFrom); if (allowFrom.length === 0) return false; if (allowFrom.includes("*")) return true; const senderNormalized = params.normalizeSender(params.sender); const allowConversationTargets = params.allowConversationTargets === true; const chatId = allowConversationTargets ? params.chatId ?? void 0 : void 0; const chatGuid = allowConversationTargets ? normalizeOptionalString(params.chatGuid) : void 0; const chatIdentifier = allowConversationTargets ? normalizeOptionalString(params.chatIdentifier) : void 0; for (const entry of allowFrom) { if (!entry) continue; const parsed = params.parseAllowTarget(entry); if (parsed.kind === "chat_id" && chatId !== void 0) { if (parsed.chatId === chatId) return true; } else if (parsed.kind === "chat_guid" && chatGuid) { if (parsed.chatGuid === chatGuid) return true; } else if (parsed.kind === "chat_identifier" && chatIdentifier) { if (parsed.chatIdentifier === chatIdentifier) return true; } else if (parsed.kind === "handle" && senderNormalized) { if (parsed.handle === senderNormalized) return true; } } return false; } function stripPrefix(value, prefix) { return value.slice(prefix.length).trim(); } function startsWithAnyPrefix(value, prefixes) { return prefixes.some((prefix) => value.startsWith(prefix)); } /** * Resolves service-prefixed handle targets, delegating chat-shaped remainders. */ function resolveServicePrefixedTarget(params) { for (const { prefix, service } of params.servicePrefixes) { if (!params.lower.startsWith(prefix)) continue; const remainder = stripPrefix(params.trimmed, prefix); if (!remainder) throw new Error(`${prefix} target is required`); const remainderLower = normalizeLowercaseStringOrEmpty(remainder); if (params.isChatTarget(remainderLower)) return params.parseTarget(remainder); return { kind: "handle", to: remainder, service }; } return null; } /** * Resolves service-prefixed targets where chat ids should bypass handle parsing. */ function resolveServicePrefixedChatTarget(params) { const chatPrefixes = [ ...params.chatIdPrefixes, ...params.chatGuidPrefixes, ...params.chatIdentifierPrefixes, ...params.extraChatPrefixes ?? [] ]; return resolveServicePrefixedTarget({ trimmed: params.trimmed, lower: params.lower, servicePrefixes: params.servicePrefixes, isChatTarget: (remainderLower) => startsWithAnyPrefix(remainderLower, chatPrefixes), parseTarget: params.parseTarget }); } /** * Parses chat target prefixes and throws for malformed prefixed values. */ function parseChatTargetPrefixesOrThrow(params) { for (const prefix of params.chatIdPrefixes) if (params.lower.startsWith(prefix)) { const value = stripPrefix(params.trimmed, prefix); const chatId = parseStrictInteger(value); if (chatId === void 0) throw new Error(`Invalid chat_id: ${value}`); return { kind: "chat_id", chatId }; } for (const prefix of params.chatGuidPrefixes) if (params.lower.startsWith(prefix)) { const value = stripPrefix(params.trimmed, prefix); if (!value) throw new Error("chat_guid is required"); return { kind: "chat_guid", chatGuid: value }; } for (const prefix of params.chatIdentifierPrefixes) if (params.lower.startsWith(prefix)) { const value = stripPrefix(params.trimmed, prefix); if (!value) throw new Error("chat_identifier is required"); return { kind: "chat_identifier", chatIdentifier: value }; } return null; } /** * Resolves service-prefixed allowlist targets. */ function resolveServicePrefixedAllowTarget(params) { for (const { prefix } of params.servicePrefixes) { if (!params.lower.startsWith(prefix)) continue; const remainder = stripPrefix(params.trimmed, prefix); if (!remainder) return { kind: "handle", handle: "" }; return params.parseAllowTarget(remainder); } return null; } /** * Resolves service-prefixed allow targets before falling back to chat prefixes. */ function resolveServicePrefixedOrChatAllowTarget(params) { const servicePrefixed = resolveServicePrefixedAllowTarget({ trimmed: params.trimmed, lower: params.lower, servicePrefixes: params.servicePrefixes, parseAllowTarget: params.parseAllowTarget }); if (servicePrefixed) return servicePrefixed; const chatTarget = parseChatAllowTargetPrefixes({ trimmed: params.trimmed, lower: params.lower, chatIdPrefixes: params.chatIdPrefixes, chatGuidPrefixes: params.chatGuidPrefixes, chatIdentifierPrefixes: params.chatIdentifierPrefixes }); if (chatTarget) return chatTarget; return null; } /** * Creates a reusable sender matcher for chat-aware channel allowlists. */ function createAllowedChatSenderMatcher(params) { return (input) => isAllowedParsedChatSender({ allowFrom: input.allowFrom, sender: input.sender, chatId: input.chatId, chatGuid: input.chatGuid, chatIdentifier: input.chatIdentifier, allowConversationTargets: input.allowConversationTargets ?? params.allowConversationTargets ?? false, normalizeSender: params.normalizeSender, parseAllowTarget: params.parseAllowTarget }); } /** * Parses chat target prefixes for allowlist entries, ignoring malformed values. */ function parseChatAllowTargetPrefixes(params) { for (const prefix of params.chatIdPrefixes) if (params.lower.startsWith(prefix)) { const chatId = parseStrictInteger(stripPrefix(params.trimmed, prefix)); if (chatId !== void 0) return { kind: "chat_id", chatId }; } for (const prefix of params.chatGuidPrefixes) if (params.lower.startsWith(prefix)) { const value = stripPrefix(params.trimmed, prefix); if (value) return { kind: "chat_guid", chatGuid: value }; } for (const prefix of params.chatIdentifierPrefixes) if (params.lower.startsWith(prefix)) { const value = stripPrefix(params.trimmed, prefix); if (value) return { kind: "chat_identifier", chatIdentifier: value }; } return null; } //#endregion export { resolveServicePrefixedAllowTarget as a, resolveServicePrefixedTarget as c, parseChatTargetPrefixesOrThrow as i, isAllowedParsedChatSender as n, resolveServicePrefixedChatTarget as o, parseChatAllowTargetPrefixes as r, resolveServicePrefixedOrChatAllowTarget as s, createAllowedChatSenderMatcher as t };