openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
224 lines (223 loc) • 8.02 kB
JavaScript
import { p as resolvePayloadMediaUrls, y as sendPayloadMediaSequenceOrFallback } from "./reply-payload-D-VMfpYI.js";
import { f as renderMessagePresentationFallbackText, l as normalizeMessagePresentation } from "./payload-CZlThETZ.js";
import { n as resolveOutboundSendDep } from "./send-deps-DjbvQHZ4.js";
import "./channel-outbound-B3_Zy-kG.js";
import { i as createAttachedChannelResultAdapter, t as attachChannelToResult } from "./channel-send-result-Dn_C6AJS.js";
import { a as parseTelegramTarget, i as normalizeTelegramOutboundTarget } from "./targets-CDtCx0Zi.js";
import { at as parseTelegramThreadId, it as parseTelegramReplyToMessageId } from "./sent-message-cache-IpiNMjf9.js";
import { t as resolveTelegramInlineButtons } from "./button-types-Di5CvasV.js";
import { i as markdownToTelegramHtmlChunks, o as splitTelegramHtmlChunks } from "./format-RoDvU0eA.js";
import { t as resolveTelegramInteractiveTextFallback } from "./interactive-fallback-BQgyaNXo.js";
//#region extensions/telegram/src/outbound-adapter.ts
const TELEGRAM_TEXT_CHUNK_LIMIT = 4e3;
let telegramSendModulePromise;
async function loadTelegramSendModule() {
telegramSendModulePromise ??= import("./send-BpmZU7lt.js");
return await telegramSendModulePromise;
}
async function resolveDefaultTelegramSend(deps) {
return resolveOutboundSendDep(deps, "telegram") ?? (await loadTelegramSendModule()).sendMessageTelegram;
}
function chunkTelegramOutboundText(text, limit, ctx) {
return ctx?.formatting?.parseMode === "HTML" ? splitTelegramHtmlChunks(text, limit) : markdownToTelegramHtmlChunks(text, limit, { tableMode: ctx?.formatting?.tableMode });
}
async function resolveTelegramSendContext(params) {
return {
send: await params.resolveSend(params.deps),
baseOpts: {
verbose: false,
cfg: params.cfg,
messageThreadId: parseTelegramThreadId(params.threadId),
replyToMessageId: parseTelegramReplyToMessageId(params.replyToId),
accountId: params.accountId ?? void 0,
silent: params.silent,
gatewayClientScopes: params.gatewayClientScopes,
...params.formatting?.parseMode === "HTML" ? { textMode: "html" } : {}
}
};
}
async function resolveTelegramOutboundSendContext(params) {
const outboundTo = normalizeTelegramOutboundTarget(params.to);
const { send, baseOpts } = await resolveTelegramSendContext(params);
return {
outboundTo,
send,
baseOpts
};
}
async function sendTelegramPayloadMessages(params) {
const telegramData = params.payload.channelData?.telegram;
const quoteText = typeof telegramData?.quoteText === "string" ? telegramData.quoteText : void 0;
const presentation = normalizeMessagePresentation(params.payload.presentation);
const text = resolveTelegramInteractiveTextFallback({
text: params.payload.text,
interactive: params.payload.interactive,
presentation
}) ?? "";
const mediaUrls = resolvePayloadMediaUrls(params.payload);
const buttons = resolveTelegramInlineButtons({
buttons: telegramData?.buttons,
presentation,
interactive: params.payload.interactive
});
const payloadOpts = {
...params.baseOpts,
quoteText,
...params.payload.audioAsVoice === true ? { asVoice: true } : {}
};
return await sendPayloadMediaSequenceOrFallback({
text,
mediaUrls,
fallbackResult: {
messageId: "unknown",
chatId: params.to
},
sendNoMedia: async () => await params.send(params.to, text, {
...payloadOpts,
buttons
}),
send: async ({ text: textLocal, mediaUrl, isFirst }) => await params.send(params.to, textLocal, {
...payloadOpts,
mediaUrl,
...isFirst ? { buttons } : {}
})
});
}
function createTelegramOutboundAdapter(options = {}) {
const resolveSend = options.resolveSend ?? resolveDefaultTelegramSend;
const loadSendModule = options.loadSendModule ?? loadTelegramSendModule;
return {
deliveryMode: "direct",
chunker: chunkTelegramOutboundText,
chunkerMode: "markdown",
chunkedTextFormatting: { parseMode: "HTML" },
extractMarkdownImages: true,
textChunkLimit: TELEGRAM_TEXT_CHUNK_LIMIT,
shouldSuppressLocalPayloadPrompt: options.shouldSuppressLocalPayloadPrompt,
beforeDeliverPayload: options.beforeDeliverPayload,
shouldTreatDeliveredTextAsVisible: options.shouldTreatDeliveredTextAsVisible,
targetsMatchForReplySuppression: options.targetsMatchForReplySuppression,
preferFinalAssistantVisibleText: options.preferFinalAssistantVisibleText,
presentationCapabilities: {
supported: true,
buttons: true,
selects: true,
context: true,
divider: false,
limits: {
actions: {
maxActions: 100,
maxActionsPerRow: 3,
maxLabelLength: 64,
supportsStyles: false
},
selects: {
maxOptions: 100,
maxLabelLength: 64
},
text: { markdownDialect: "html" }
}
},
deliveryCapabilities: {
pin: true,
durableFinal: {
text: true,
media: true,
payload: true,
silent: true,
replyTo: true,
thread: true,
nativeQuote: false,
messageSendingHooks: true,
batch: true
}
},
renderPresentation: ({ payload, presentation }) => {
const telegramData = payload.channelData?.telegram;
const buttons = telegramData && "buttons" in telegramData || payload.interactive ? void 0 : resolveTelegramInlineButtons({ presentation });
return {
...payload,
text: renderMessagePresentationFallbackText({
text: payload.text,
presentation
}),
channelData: {
...payload.channelData,
telegram: {
...telegramData,
...buttons ? { buttons } : {}
}
}
};
},
pinDeliveredMessage: async ({ cfg, target, messageId, pin, gatewayClientScopes }) => {
const { pinMessageTelegram } = await loadSendModule();
await pinMessageTelegram(parseTelegramTarget(normalizeTelegramOutboundTarget(target.to)).chatId, messageId, {
cfg,
accountId: target.accountId ?? void 0,
notify: pin.notify,
verbose: false,
gatewayClientScopes
});
},
resolveEffectiveTextChunkLimit: ({ fallbackLimit }) => typeof fallbackLimit === "number" ? Math.min(fallbackLimit, 4096) : 4096,
pollMaxOptions: 10,
supportsPollDurationSeconds: true,
supportsAnonymousPolls: true,
...createAttachedChannelResultAdapter({
channel: "telegram",
sendText: async (params) => {
const { outboundTo, send, baseOpts } = await resolveTelegramOutboundSendContext({
...params,
resolveSend
});
return await send(outboundTo, params.text, { ...baseOpts });
},
sendMedia: async (params) => {
const { outboundTo, send, baseOpts } = await resolveTelegramOutboundSendContext({
...params,
resolveSend
});
return await send(outboundTo, params.text, {
...baseOpts,
mediaUrl: params.mediaUrl,
mediaLocalRoots: params.mediaLocalRoots,
mediaReadFile: params.mediaReadFile,
forceDocument: params.forceDocument ?? false
});
}
}),
sendPayload: async (params) => {
const { outboundTo, send, baseOpts } = await resolveTelegramOutboundSendContext({
...params,
resolveSend
});
return attachChannelToResult("telegram", await sendTelegramPayloadMessages({
send,
to: outboundTo,
payload: params.payload,
baseOpts: {
...baseOpts,
mediaLocalRoots: params.mediaLocalRoots,
mediaReadFile: params.mediaReadFile,
forceDocument: params.forceDocument ?? false
}
}));
},
sendPoll: async ({ cfg, to, poll, accountId, threadId, silent, isAnonymous, gatewayClientScopes }) => {
const outboundTo = normalizeTelegramOutboundTarget(to);
const { sendPollTelegram } = await loadSendModule();
return await sendPollTelegram(outboundTo, poll, {
cfg,
accountId: accountId ?? void 0,
messageThreadId: parseTelegramThreadId(threadId),
silent: silent ?? void 0,
isAnonymous: isAnonymous ?? void 0,
gatewayClientScopes
});
}
};
}
const telegramOutbound = createTelegramOutboundAdapter();
//#endregion
export { telegramOutbound as i, createTelegramOutboundAdapter as n, sendTelegramPayloadMessages as r, TELEGRAM_TEXT_CHUNK_LIMIT as t };