UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

142 lines (141 loc) 4.57 kB
import { t as createMessageReceiptFromOutboundResults } from "./receipt-B3SXxhHV.js"; import "./channel-outbound-B3_Zy-kG.js"; import { p as isRecord } from "./accounts-BTmGOBDX.js"; //#region extensions/feishu/src/card-interaction.ts const FEISHU_CARD_INTERACTION_VERSION = "ocf1"; function isInteractionKind(value) { return value === "button" || value === "quick" || value === "meta"; } function isMetadataValue(value) { return value === null || value === void 0 || typeof value === "string" || typeof value === "number" || typeof value === "boolean"; } function createFeishuCardInteractionEnvelope(envelope) { return { oc: FEISHU_CARD_INTERACTION_VERSION, ...envelope }; } function buildFeishuCardActionTextFallback(event) { const actionValue = event.action.value; if (isRecord(actionValue)) { if (typeof actionValue.text === "string") return actionValue.text; if (typeof actionValue.command === "string") return actionValue.command; return JSON.stringify(actionValue); } return String(actionValue); } function decodeFeishuCardAction(params) { const { event, now = Date.now() } = params; const actionValue = event.action.value; if (!isRecord(actionValue) || actionValue.oc !== "ocf1") return { kind: "legacy", text: buildFeishuCardActionTextFallback(event) }; if (!isInteractionKind(actionValue.k) || typeof actionValue.a !== "string" || !actionValue.a) return { kind: "invalid", reason: "malformed" }; if (actionValue.q !== void 0 && typeof actionValue.q !== "string") return { kind: "invalid", reason: "malformed" }; if (actionValue.m !== void 0) { if (!isRecord(actionValue.m)) return { kind: "invalid", reason: "malformed" }; for (const value of Object.values(actionValue.m)) if (!isMetadataValue(value)) return { kind: "invalid", reason: "malformed" }; } if (actionValue.c !== void 0) { if (!isRecord(actionValue.c)) return { kind: "invalid", reason: "malformed" }; if (actionValue.c.u !== void 0 && typeof actionValue.c.u !== "string") return { kind: "invalid", reason: "malformed" }; if (actionValue.c.h !== void 0 && typeof actionValue.c.h !== "string") return { kind: "invalid", reason: "malformed" }; if (actionValue.c.s !== void 0 && typeof actionValue.c.s !== "string") return { kind: "invalid", reason: "malformed" }; if (actionValue.c.e !== void 0 && !Number.isFinite(actionValue.c.e)) return { kind: "invalid", reason: "malformed" }; if (actionValue.c.t !== void 0 && actionValue.c.t !== "p2p" && actionValue.c.t !== "group") return { kind: "invalid", reason: "malformed" }; if (typeof actionValue.c.e === "number" && actionValue.c.e < now) return { kind: "invalid", reason: "stale" }; const expectedUser = actionValue.c.u?.trim(); if (expectedUser && expectedUser !== (event.operator.open_id ?? "").trim()) return { kind: "invalid", reason: "wrong_user" }; const expectedChat = actionValue.c.h?.trim(); if (expectedChat && expectedChat !== (event.context.chat_id ?? "").trim()) return { kind: "invalid", reason: "wrong_conversation" }; } return { kind: "structured", envelope: actionValue }; } //#endregion //#region extensions/feishu/src/send-result.ts function resolveFeishuReceiptKind(msgType) { switch (msgType) { case "audio": return "voice"; case "image": case "media": case "file": return "media"; case "interactive": return "card"; case "post": case "text": return "text"; default: return "unknown"; } } function createFeishuSendReceipt(params) { const messageId = params.messageId?.trim(); const chatId = params.chatId.trim(); return createMessageReceiptFromOutboundResults({ results: messageId ? [{ channel: "feishu", messageId, chatId, conversationId: chatId }] : [], ...chatId ? { threadId: chatId } : {}, kind: params.kind ?? "unknown" }); } function assertFeishuMessageApiSuccess(response, errorPrefix) { if (response.code !== 0) throw new Error(`${errorPrefix}: ${response.msg || `code ${response.code}`}`); } function toFeishuSendResult(response, chatId, kind) { const messageId = response.data?.message_id ?? "unknown"; return { messageId, chatId, receipt: createFeishuSendReceipt({ messageId, chatId, kind }) }; } //#endregion export { FEISHU_CARD_INTERACTION_VERSION as a, decodeFeishuCardAction as c, toFeishuSendResult as i, createFeishuSendReceipt as n, buildFeishuCardActionTextFallback as o, resolveFeishuReceiptKind as r, createFeishuCardInteractionEnvelope as s, assertFeishuMessageApiSuccess as t };