openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
141 lines (140 loc) • 4.68 kB
JavaScript
import { a as normalizeLowercaseStringOrEmpty } from "./string-coerce-mnp54Vah.js";
import "./string-coerce-runtime-CEGJWkQ_.js";
//#region extensions/feishu/src/conversation-id.ts
function normalizeText(value) {
if (typeof value !== "string") return;
return value.trim() || void 0;
}
function buildFeishuConversationId(params) {
const chatId = normalizeText(params.chatId) ?? "unknown";
const senderOpenId = normalizeText(params.senderOpenId);
const topicId = normalizeText(params.topicId);
switch (params.scope) {
case "group_sender": return senderOpenId ? `${chatId}:sender:${senderOpenId}` : chatId;
case "group_topic": return topicId ? `${chatId}:topic:${topicId}` : chatId;
case "group_topic_sender":
if (topicId && senderOpenId) return `${chatId}:topic:${topicId}:sender:${senderOpenId}`;
if (topicId) return `${chatId}:topic:${topicId}`;
return senderOpenId ? `${chatId}:sender:${senderOpenId}` : chatId;
default: return chatId;
}
}
function parseFeishuTargetId(raw) {
const target = normalizeText(raw);
if (!target) return;
const withoutProvider = target.replace(/^(feishu|lark):/i, "").trim();
if (!withoutProvider) return;
const lowered = normalizeLowercaseStringOrEmpty(withoutProvider);
for (const prefix of [
"chat:",
"group:",
"channel:",
"user:",
"dm:",
"open_id:"
]) if (lowered.startsWith(prefix)) return normalizeText(withoutProvider.slice(prefix.length));
return withoutProvider;
}
function parseFeishuDirectConversationId(raw) {
const target = normalizeText(raw);
if (!target) return;
const withoutProvider = target.replace(/^(feishu|lark):/i, "").trim();
if (!withoutProvider) return;
const lowered = normalizeLowercaseStringOrEmpty(withoutProvider);
for (const prefix of [
"user:",
"dm:",
"open_id:"
]) if (lowered.startsWith(prefix)) return normalizeText(withoutProvider.slice(prefix.length));
const id = parseFeishuTargetId(target);
if (!id) return;
if (id.startsWith("ou_") || id.startsWith("on_")) return id;
}
function parseFeishuConversationId(params) {
const conversationId = normalizeText(params.conversationId);
const parentConversationId = normalizeText(params.parentConversationId);
if (!conversationId) return null;
const topicSenderMatch = conversationId.match(/^(.+):topic:([^:]+):sender:([^:]+)$/i);
if (topicSenderMatch) {
const [, chatId, topicId, senderOpenId] = topicSenderMatch;
return {
canonicalConversationId: buildFeishuConversationId({
chatId,
scope: "group_topic_sender",
topicId,
senderOpenId
}),
chatId,
topicId,
senderOpenId,
scope: "group_topic_sender"
};
}
const topicMatch = conversationId.match(/^(.+):topic:([^:]+)$/i);
if (topicMatch) {
const [, chatId, topicId] = topicMatch;
return {
canonicalConversationId: buildFeishuConversationId({
chatId,
scope: "group_topic",
topicId
}),
chatId,
topicId,
scope: "group_topic"
};
}
const senderMatch = conversationId.match(/^(.+):sender:([^:]+)$/i);
if (senderMatch) {
const [, chatId, senderOpenId] = senderMatch;
return {
canonicalConversationId: buildFeishuConversationId({
chatId,
scope: "group_sender",
senderOpenId
}),
chatId,
senderOpenId,
scope: "group_sender"
};
}
if (parentConversationId) return {
canonicalConversationId: buildFeishuConversationId({
chatId: parentConversationId,
scope: "group_topic",
topicId: conversationId
}),
chatId: parentConversationId,
topicId: conversationId,
scope: "group_topic"
};
return {
canonicalConversationId: conversationId,
chatId: conversationId,
scope: "group"
};
}
function buildFeishuModelOverrideParentCandidates(parentConversationId) {
const rawId = normalizeText(parentConversationId);
if (!rawId) return [];
const topicSenderMatch = rawId.match(/^(.+):topic:([^:]+):sender:([^:]+)$/i);
if (topicSenderMatch) {
const chatId = normalizeLowercaseStringOrEmpty(topicSenderMatch[1]);
const topicId = normalizeLowercaseStringOrEmpty(topicSenderMatch[2]);
if (chatId && topicId) return [`${chatId}:topic:${topicId}`, chatId];
return [];
}
const topicMatch = rawId.match(/^(.+):topic:([^:]+)$/i);
if (topicMatch) {
const chatId = normalizeLowercaseStringOrEmpty(topicMatch[1]);
return chatId ? [chatId] : [];
}
const senderMatch = rawId.match(/^(.+):sender:([^:]+)$/i);
if (senderMatch) {
const chatId = normalizeLowercaseStringOrEmpty(senderMatch[1]);
return chatId ? [chatId] : [];
}
return [];
}
//#endregion
export { parseFeishuTargetId as a, parseFeishuDirectConversationId as i, buildFeishuModelOverrideParentCandidates as n, parseFeishuConversationId as r, buildFeishuConversationId as t };