@ai-devkit/channel-connector 0.13.1 → 0.13.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{ConfigStore.d.ts → ChannelConfigRepository.d.ts} +2 -2
- package/dist/ChannelConfigRepository.d.ts.map +1 -0
- package/dist/{ConfigStore.js → ChannelConfigRepository.js} +2 -2
- package/dist/ChannelConfigRepository.js.map +1 -0
- package/dist/__tests__/{ConfigStore.test.js → ChannelConfigRepository.test.js} +6 -6
- package/dist/__tests__/ChannelConfigRepository.test.js.map +1 -0
- package/dist/__tests__/adapters/{SlackAdapter.test.js → slack/SlackAdapter.test.js} +1 -1
- package/dist/__tests__/adapters/slack/SlackAdapter.test.js.map +1 -0
- package/dist/__tests__/{utils/SlackDeliveryQueue.test.js → adapters/slack/SlackMessageDelivery.test.js} +11 -11
- package/dist/__tests__/adapters/slack/SlackMessageDelivery.test.js.map +1 -0
- package/dist/__tests__/{utils → adapters/slack}/slackMarkdown.test.js +1 -1
- package/dist/__tests__/adapters/slack/slackMarkdown.test.js.map +1 -0
- package/dist/__tests__/adapters/slack/slackQuestion.test.js +88 -0
- package/dist/__tests__/adapters/slack/slackQuestion.test.js.map +1 -0
- package/dist/__tests__/adapters/{TelegramAdapter.test.js → telegram/TelegramAdapter.test.js} +2 -2
- package/dist/__tests__/adapters/telegram/TelegramAdapter.test.js.map +1 -0
- package/dist/__tests__/{utils → adapters/telegram}/telegramHtml.test.js +1 -1
- package/dist/__tests__/adapters/telegram/telegramHtml.test.js.map +1 -0
- package/dist/adapters/{SlackAdapter.d.ts → slack/SlackAdapter.d.ts} +2 -2
- package/dist/adapters/slack/SlackAdapter.d.ts.map +1 -0
- package/dist/adapters/{SlackAdapter.js → slack/SlackAdapter.js} +4 -41
- package/dist/adapters/slack/SlackAdapter.js.map +1 -0
- package/dist/{utils/SlackDeliveryQueue.d.ts → adapters/slack/SlackMessageDelivery.d.ts} +3 -3
- package/dist/adapters/slack/SlackMessageDelivery.d.ts.map +1 -0
- package/dist/{utils/SlackDeliveryQueue.js → adapters/slack/SlackMessageDelivery.js} +3 -3
- package/dist/adapters/slack/SlackMessageDelivery.js.map +1 -0
- package/dist/adapters/slack/slackMarkdown.d.ts.map +1 -0
- package/dist/adapters/slack/slackMarkdown.js.map +1 -0
- package/dist/adapters/slack/slackQuestion.d.ts +30 -0
- package/dist/adapters/slack/slackQuestion.d.ts.map +1 -0
- package/dist/adapters/slack/slackQuestion.js +44 -0
- package/dist/adapters/slack/slackQuestion.js.map +1 -0
- package/dist/adapters/{TelegramAdapter.d.ts → telegram/TelegramAdapter.d.ts} +4 -4
- package/dist/adapters/telegram/TelegramAdapter.d.ts.map +1 -0
- package/dist/adapters/telegram/TelegramAdapter.js +120 -0
- package/dist/adapters/telegram/TelegramAdapter.js.map +1 -0
- package/dist/adapters/telegram/TelegramMessageDelivery.d.ts +11 -0
- package/dist/adapters/telegram/TelegramMessageDelivery.d.ts.map +1 -0
- package/dist/adapters/telegram/TelegramMessageDelivery.js +38 -0
- package/dist/adapters/telegram/TelegramMessageDelivery.js.map +1 -0
- package/dist/adapters/telegram/telegramHtml.d.ts.map +1 -0
- package/dist/adapters/telegram/telegramHtml.js.map +1 -0
- package/dist/adapters/telegram/telegramKeyboard.d.ts +7 -0
- package/dist/adapters/telegram/telegramKeyboard.d.ts.map +1 -0
- package/dist/adapters/telegram/telegramKeyboard.js +8 -0
- package/dist/adapters/telegram/telegramKeyboard.js.map +1 -0
- package/dist/adapters/telegram/telegramMarkdown.d.ts +13 -0
- package/dist/adapters/telegram/telegramMarkdown.d.ts.map +1 -0
- package/dist/adapters/{TelegramAdapter.js → telegram/telegramMarkdown.js} +6 -151
- package/dist/adapters/telegram/telegramMarkdown.js.map +1 -0
- package/dist/index.d.ts +5 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -5
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/ConfigStore.d.ts.map +0 -1
- package/dist/ConfigStore.js.map +0 -1
- package/dist/__tests__/ConfigStore.test.js.map +0 -1
- package/dist/__tests__/adapters/SlackAdapter.test.js.map +0 -1
- package/dist/__tests__/adapters/TelegramAdapter.test.js.map +0 -1
- package/dist/__tests__/utils/SlackDeliveryQueue.test.js.map +0 -1
- package/dist/__tests__/utils/slackMarkdown.test.js.map +0 -1
- package/dist/__tests__/utils/telegramHtml.test.js.map +0 -1
- package/dist/adapters/SlackAdapter.d.ts.map +0 -1
- package/dist/adapters/SlackAdapter.js.map +0 -1
- package/dist/adapters/TelegramAdapter.d.ts.map +0 -1
- package/dist/adapters/TelegramAdapter.js.map +0 -1
- package/dist/utils/SlackDeliveryQueue.d.ts.map +0 -1
- package/dist/utils/SlackDeliveryQueue.js.map +0 -1
- package/dist/utils/slackMarkdown.d.ts.map +0 -1
- package/dist/utils/slackMarkdown.js.map +0 -1
- package/dist/utils/telegramHtml.d.ts.map +0 -1
- package/dist/utils/telegramHtml.js.map +0 -1
- /package/dist/{utils → adapters/slack}/slackMarkdown.d.ts +0 -0
- /package/dist/{utils → adapters/slack}/slackMarkdown.js +0 -0
- /package/dist/{utils → adapters/telegram}/telegramHtml.d.ts +0 -0
- /package/dist/{utils → adapters/telegram}/telegramHtml.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TelegramAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/TelegramAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAoB,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtG,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAShD,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,cAAc;IAClD,QAAQ,CAAC,IAAI,cAAyB;IAEtC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,cAAc,CAA0D;IAChF,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,sBAAsB;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4DtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4B9D,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIjE,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAI1C;;;;OAIG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IAQjG;;;OAGG;IACG,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3G;;;OAGG;IACG,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/adapters/TelegramAdapter.ts"],"sourcesContent":["import { Telegraf } from 'telegraf';\nimport { Marked, type Token, type Tokens } from 'marked';\nimport type { ChannelAdapter } from './ChannelAdapter.js';\nimport { markdownToTelegramHtml } from '../utils/telegramHtml.js';\nimport type { IncomingMessage, InlineKeyboard, IncomingCallback, CallbackHandler } from '../types.js';\n\nexport const TELEGRAM_CHANNEL_TYPE = 'telegram';\nexport const TELEGRAM_MAX_MESSAGE_LENGTH = 4096;\nconst TELEGRAM_PARSE_MODE = 'HTML' as const;\nconst markdownLexer = new Marked();\n\ntype TelegramMessageChunk = {\n text: string;\n html: boolean;\n};\n\nexport interface TelegramAdapterOptions {\n botToken: string;\n}\n\n/**\n * Telegram Bot API adapter using telegraf with long polling.\n */\nexport class TelegramAdapter implements ChannelAdapter {\n readonly type = TELEGRAM_CHANNEL_TYPE;\n\n private bot: Telegraf;\n private messageHandler: ((msg: IncomingMessage) => Promise<void>) | null = null;\n private callbackHandler: CallbackHandler | null = null;\n private running = false;\n\n constructor(options: TelegramAdapterOptions) {\n this.bot = new Telegraf(options.botToken);\n }\n\n async start(): Promise<void> {\n this.bot.on('text', async (ctx) => {\n if (!this.messageHandler) return;\n\n const msg: IncomingMessage = {\n channelType: TELEGRAM_CHANNEL_TYPE,\n chatId: String(ctx.message.chat.id),\n userId: String(ctx.message.from.id),\n text: ctx.message.text,\n timestamp: new Date(ctx.message.date * 1000),\n };\n\n try {\n await this.messageHandler(msg);\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n await ctx.reply(`Error processing message: ${errorMessage}`);\n }\n });\n\n this.bot.on('callback_query', async (ctx) => {\n if (!this.callbackHandler) {\n try { await ctx.answerCbQuery(); } catch { /* ignore */ }\n return;\n }\n\n const query = ctx.callbackQuery as {\n id: string;\n data?: string;\n message?: { message_id: number; chat: { id: number | string } };\n from: { id: number | string };\n };\n\n const data = typeof query.data === 'string' ? query.data : '';\n if (!query.message) {\n try { await ctx.answerCbQuery(); } catch { /* ignore */ }\n return;\n }\n\n const cb: IncomingCallback = {\n channelType: TELEGRAM_CHANNEL_TYPE,\n chatId: String(query.message.chat.id),\n userId: String(query.from.id),\n messageId: query.message.message_id,\n callbackData: data,\n callbackQueryId: query.id,\n timestamp: new Date(),\n };\n\n try {\n await this.callbackHandler(cb);\n } catch {\n try { await ctx.answerCbQuery('Error'); } catch { /* ignore */ }\n }\n });\n\n await this.bot.launch();\n this.running = true;\n }\n\n async stop(): Promise<void> {\n this.running = false;\n await this.bot.stop();\n }\n\n /**\n * Input is treated as markdown and rendered as Telegram-compatible HTML.\n * Long messages are chunked as markdown source before rendering so each\n * Telegram HTML payload is independently valid.\n */\n async sendMessage(chatId: string, text: string): Promise<void> {\n let chunks: TelegramMessageChunk[];\n try {\n chunks = chunkMarkdownForTelegram(text, TELEGRAM_MAX_MESSAGE_LENGTH);\n } catch {\n for (const chunk of chunkMessage(text, TELEGRAM_MAX_MESSAGE_LENGTH)) {\n await this.bot.telegram.sendMessage(chatId, chunk);\n }\n return;\n }\n\n for (const chunk of chunks) {\n if (!chunk.html) {\n await this.bot.telegram.sendMessage(chatId, chunk.text);\n continue;\n }\n\n try {\n await this.bot.telegram.sendMessage(chatId, chunk.text, { parse_mode: TELEGRAM_PARSE_MODE });\n } catch (error) {\n if (!isParseEntitiesError(error)) throw error;\n // Telegram rejected the rendered HTML — fall back to plain text\n // so the user still gets the content (just unformatted).\n await this.bot.telegram.sendMessage(chatId, htmlToPlainText(chunk.text));\n }\n }\n }\n\n onMessage(handler: (msg: IncomingMessage) => Promise<void>): void {\n this.messageHandler = handler;\n }\n\n onCallback(handler: CallbackHandler): void {\n this.callbackHandler = handler;\n }\n\n /**\n * Send a message with an inline keyboard. `html` is sent verbatim with\n * parse_mode=HTML — callers must pre-escape any user-controlled fields.\n * Returns the Telegram message_id of the sent message.\n */\n async sendInlineKeyboard(chatId: string, html: string, keyboard: InlineKeyboard): Promise<number> {\n const result = await this.bot.telegram.sendMessage(chatId, html, {\n parse_mode: TELEGRAM_PARSE_MODE,\n reply_markup: { inline_keyboard: toTelegrafKeyboard(keyboard) },\n }) as { message_id: number };\n return result.message_id;\n }\n\n /**\n * Replace the inline keyboard on an existing message. Pass `null` to remove\n * the keyboard entirely.\n */\n async editInlineKeyboard(chatId: string, messageId: number, keyboard: InlineKeyboard | null): Promise<void> {\n await this.bot.telegram.editMessageReplyMarkup(chatId, messageId, undefined, keyboard\n ? { inline_keyboard: toTelegrafKeyboard(keyboard) }\n : undefined);\n }\n\n /**\n * Acknowledge a callback_query. Without this Telegram leaves a spinner on\n * the tapped button. Pass `text` to show a transient toast.\n */\n async answerCallback(callbackQueryId: string, text?: string): Promise<void> {\n await this.bot.telegram.answerCbQuery(callbackQueryId, text);\n }\n\n async isHealthy(): Promise<boolean> {\n return this.running;\n }\n}\n\nfunction toTelegrafKeyboard(keyboard: InlineKeyboard): { text: string; callback_data: string }[][] {\n return keyboard.map((row) => row.map((btn) => ({ text: btn.text, callback_data: btn.callbackData })));\n}\n\nfunction isParseEntitiesError(error: unknown): boolean {\n if (!error || typeof error !== 'object') return false;\n const description = (error as { description?: string }).description;\n const message = (error as { message?: string }).message;\n return ((description ?? '') + (message ?? '')).includes(\"can't parse entities\");\n}\n\nfunction htmlToPlainText(html: string): string {\n return html\n .replace(/<[^>]+>/g, '')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/"/g, '\"')\n .replace(/&/g, '&');\n}\n\nfunction chunkMarkdownForTelegram(markdown: string, maxLen: number): TelegramMessageChunk[] {\n const markdownChunks = splitMarkdownSource(markdown, maxLen);\n const chunks: TelegramMessageChunk[] = [];\n\n for (const markdownChunk of markdownChunks) {\n const html = markdownToTelegramHtml(markdownChunk);\n if (html.length <= maxLen) {\n if (html.length > 0) chunks.push({ text: html, html: true });\n continue;\n }\n\n for (const plainChunk of chunkMessage(markdownChunk, maxLen)) {\n if (plainChunk.length > 0) chunks.push({ text: plainChunk, html: false });\n }\n }\n\n return chunks;\n}\n\nfunction splitMarkdownSource(markdown: string, maxLen: number, depth = 0): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n if (depth > 6) return splitPlainMarkdownText(markdown, maxLen);\n\n const chunks: string[] = [];\n let current = '';\n const tokens = markdownLexer.lexer(markdown);\n\n for (const token of tokens) {\n const raw = token.raw ?? '';\n if (raw.length === 0) continue;\n\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitOversizedToken(token, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks.flatMap((chunk) => renderedLengthFits(chunk, maxLen) ? [chunk] : splitPlainMarkdownText(chunk, maxLen));\n}\n\nfunction splitOversizedToken(token: Token, maxLen: number, depth: number): string[] {\n switch (token.type) {\n case 'code':\n return splitCodeToken(token as Tokens.Code, maxLen);\n case 'list':\n return splitListToken(token as Tokens.List, maxLen, depth);\n case 'paragraph':\n case 'text':\n return splitPlainMarkdownText(token.raw, maxLen);\n default:\n if ('tokens' in token && Array.isArray(token.tokens) && token.raw !== undefined) {\n return splitMarkdownSource(token.raw, maxLen, depth);\n }\n return splitPlainMarkdownText(token.raw ?? '', maxLen);\n }\n}\n\nfunction splitListToken(token: Tokens.List, maxLen: number, depth: number): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const item of token.items) {\n const raw = item.raw;\n const candidate = current + raw;\n if (candidate.length > 0 && renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(raw, maxLen)) {\n current = raw;\n } else {\n chunks.push(...splitMarkdownSource(raw, maxLen, depth + 1));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitCodeToken(token: Tokens.Code, maxLen: number): string[] {\n const fence = token.raw.startsWith('~~~') ? '~~~' : '```';\n const lang = token.lang ? token.lang.split(/\\s/)[0] : '';\n const lines = token.text.split('\\n');\n const chunks: string[] = [];\n let currentLines: string[] = [];\n\n const renderFence = (codeLines: string[]): string =>\n `${fence}${lang}\\n${codeLines.join('\\n')}\\n${fence}\\n\\n`;\n\n for (const line of lines) {\n const candidateLines = [...currentLines, line];\n if (renderedLengthFits(renderFence(candidateLines), maxLen)) {\n currentLines = candidateLines;\n continue;\n }\n\n if (currentLines.length > 0) {\n chunks.push(renderFence(currentLines));\n currentLines = [];\n }\n\n if (renderedLengthFits(renderFence([line]), maxLen)) {\n currentLines = [line];\n } else {\n for (const segment of splitCodeLine(line, fence, lang, maxLen)) {\n chunks.push(renderFence([segment]));\n }\n }\n }\n\n if (currentLines.length > 0) chunks.push(renderFence(currentLines));\n return chunks;\n}\n\nfunction splitCodeLine(line: string, fence: string, lang: string, maxLen: number): string[] {\n const segments: string[] = [];\n let current = '';\n const renderFence = (value: string): string => `${fence}${lang}\\n${value}\\n${fence}\\n\\n`;\n\n for (const char of Array.from(line)) {\n const candidate = current + char;\n if (renderedLengthFits(renderFence(candidate), maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n segments.push(current);\n current = '';\n }\n\n if (renderedLengthFits(renderFence(char), maxLen)) {\n current = char;\n } else {\n segments.push(char);\n }\n }\n\n if (current.length > 0) segments.push(current);\n return segments;\n}\n\nfunction splitPlainMarkdownText(markdown: string, maxLen: number): string[] {\n if (markdown.length === 0) return [];\n if (renderedLengthFits(markdown, maxLen)) return [markdown];\n\n const newlineUnits = markdown.split(/(?<=\\n)/u);\n if (newlineUnits.length > 1) {\n return packMarkdownUnits(newlineUnits, maxLen, splitPlainMarkdownText);\n }\n\n const sentenceUnits = markdown.match(/[^.!?]+[.!?]+(?:\\s+|$)|[^.!?]+$/gu);\n if (sentenceUnits && sentenceUnits.length > 1) {\n return packMarkdownUnits(sentenceUnits, maxLen, splitPlainMarkdownText);\n }\n\n const wordUnits = markdown.match(/\\S+\\s*/gu);\n if (wordUnits && wordUnits.length > 1) {\n return packMarkdownUnits(wordUnits, maxLen, splitPlainMarkdownText);\n }\n\n return splitByCodePoint(markdown, maxLen);\n}\n\nfunction packMarkdownUnits(\n units: string[],\n maxLen: number,\n splitOversized: (unit: string, maxLen: number) => string[],\n): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const unit of units) {\n const candidate = current + unit;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(unit, maxLen)) {\n current = unit;\n } else {\n chunks.push(...splitOversized(unit, maxLen));\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction splitByCodePoint(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let current = '';\n\n for (const char of Array.from(text)) {\n const candidate = current + char;\n if (renderedLengthFits(candidate, maxLen)) {\n current = candidate;\n continue;\n }\n\n if (current.length > 0) {\n chunks.push(current);\n current = '';\n }\n\n if (renderedLengthFits(char, maxLen)) {\n current = char;\n } else {\n chunks.push(char);\n }\n }\n\n if (current.length > 0) chunks.push(current);\n return chunks;\n}\n\nfunction renderedLengthFits(markdown: string, maxLen: number): boolean {\n return markdownToTelegramHtml(markdown).length <= maxLen;\n}\n\n/**\n * Split text into chunks of maxLen or fewer characters. Prefers paragraph\n * boundaries (\\n\\n), then single newlines (\\n), then hard-splits at maxLen.\n */\nfunction chunkMessage(text: string, maxLen: number): string[] {\n const chunks: string[] = [];\n let remaining = text;\n\n while (remaining.length > 0) {\n if (remaining.length <= maxLen) {\n chunks.push(remaining);\n break;\n }\n\n const lastParagraph = remaining.lastIndexOf('\\n\\n', maxLen - 2);\n const lastNewline = remaining.lastIndexOf('\\n', maxLen - 1);\n\n let splitAt: number;\n if (lastParagraph > 0) {\n splitAt = lastParagraph + 2;\n } else if (lastNewline > 0) {\n splitAt = lastNewline + 1;\n } else {\n splitAt = maxLen;\n }\n\n chunks.push(remaining.slice(0, splitAt));\n remaining = remaining.slice(splitAt);\n }\n\n return chunks;\n}\n"],"names":["Telegraf","Marked","markdownToTelegramHtml","TELEGRAM_CHANNEL_TYPE","TELEGRAM_MAX_MESSAGE_LENGTH","TELEGRAM_PARSE_MODE","markdownLexer","TelegramAdapter","type","bot","messageHandler","callbackHandler","running","options","botToken","start","on","ctx","msg","channelType","chatId","String","message","chat","id","userId","from","text","timestamp","Date","date","error","errorMessage","Error","reply","answerCbQuery","query","callbackQuery","data","cb","messageId","message_id","callbackData","callbackQueryId","launch","stop","sendMessage","chunks","chunkMarkdownForTelegram","chunk","chunkMessage","telegram","html","parse_mode","isParseEntitiesError","htmlToPlainText","onMessage","handler","onCallback","sendInlineKeyboard","keyboard","result","reply_markup","inline_keyboard","toTelegrafKeyboard","editInlineKeyboard","editMessageReplyMarkup","undefined","answerCallback","isHealthy","map","row","btn","callback_data","description","includes","replace","markdown","maxLen","markdownChunks","splitMarkdownSource","markdownChunk","length","push","plainChunk","depth","renderedLengthFits","splitPlainMarkdownText","current","tokens","lexer","token","raw","candidate","splitOversizedToken","flatMap","splitCodeToken","splitListToken","Array","isArray","item","items","fence","startsWith","lang","split","lines","currentLines","renderFence","codeLines","join","line","candidateLines","segment","splitCodeLine","segments","value","char","newlineUnits","packMarkdownUnits","sentenceUnits","match","wordUnits","splitByCodePoint","units","splitOversized","unit","remaining","lastParagraph","lastIndexOf","lastNewline","splitAt","slice"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SlackDeliveryQueue.d.ts","sourceRoot":"","sources":["../../src/utils/SlackDeliveryQueue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,UAAU,WAAW;IACjB,WAAW,CAAC,KAAK,EAAE;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,IAAI,CAAC;QACb,YAAY,EAAE,KAAK,CAAC;QACpB,YAAY,EAAE,KAAK,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;KACtB,GAAG,OAAO,CAAC;QAAE,EAAE,CAAC,EAAE,OAAO,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9C;AAED,UAAU,eAAe;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAUD,qBAAa,kBAAkB;IAMf,OAAO,CAAC,QAAQ,CAAC,MAAM;IALnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwC;IAC/D,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA0C;gBAEnC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,eAAoB;IAMzE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YA4BrD,OAAO;YAqBP,iBAAiB;CAUlC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/SlackDeliveryQueue.ts"],"sourcesContent":["import type { SentMessage } from '../types.js';\nimport { chunkMarkdownForSlack, SLACK_MAX_MESSAGE_LENGTH } from './slackMarkdown.js';\n\ninterface SlackPoster {\n postMessage(input: {\n channel: string;\n text: string;\n mrkdwn: true;\n unfurl_links: false;\n unfurl_media: false;\n thread_ts?: string;\n blocks?: unknown[];\n }): Promise<{ ok?: boolean; ts?: string }>;\n}\n\ninterface DeliveryOptions {\n maxMessageLength?: number;\n maxQueueSize?: number;\n sleep?: (milliseconds: number) => Promise<void>;\n}\n\ninterface ConversationState {\n tail: Promise<void>;\n pending: number;\n}\n\nconst defaultSleep = (milliseconds: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, milliseconds));\n\nexport class SlackDeliveryQueue {\n private readonly states = new Map<string, ConversationState>();\n private readonly maxMessageLength: number;\n private readonly maxQueueSize: number;\n private readonly sleep: (milliseconds: number) => Promise<void>;\n\n constructor(private readonly client: SlackPoster, options: DeliveryOptions = {}) {\n this.maxMessageLength = options.maxMessageLength ?? SLACK_MAX_MESSAGE_LENGTH;\n this.maxQueueSize = options.maxQueueSize ?? 100;\n this.sleep = options.sleep ?? defaultSleep;\n }\n\n async send(channel: string, markdown: string): Promise<SentMessage> {\n const state = this.states.get(channel) ?? { tail: Promise.resolve(), pending: 0 };\n if (state.pending >= this.maxQueueSize) {\n throw new Error('Slack delivery queue is full');\n }\n state.pending += 1;\n this.states.set(channel, state);\n\n let resolveResult!: (result: SentMessage) => void;\n let rejectResult!: (error: unknown) => void;\n const result = new Promise<SentMessage>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n state.tail = state.tail.then(async () => {\n try {\n resolveResult(await this.deliver(channel, markdown));\n } catch (error) {\n rejectResult(error);\n } finally {\n state.pending -= 1;\n if (state.pending === 0) this.states.delete(channel);\n }\n });\n return result;\n }\n\n private async deliver(channel: string, markdown: string): Promise<SentMessage> {\n const chunks = chunkMarkdownForSlack(markdown, this.maxMessageLength);\n if (chunks.length === 0) throw new Error('Cannot send an empty Slack message');\n let parentTs: string | undefined;\n\n for (const text of chunks) {\n const response = await this.postWithRateLimit({\n channel,\n text,\n mrkdwn: true,\n unfurl_links: false,\n unfurl_media: false,\n ...(parentTs ? { thread_ts: parentTs } : {}),\n });\n if (!response.ts) throw new Error('Slack did not return a message timestamp');\n parentTs ??= response.ts;\n }\n\n return { messageId: parentTs!, threadId: parentTs };\n }\n\n private async postWithRateLimit(input: Parameters<SlackPoster['postMessage']>[0]): Promise<{ ok?: boolean; ts?: string }> {\n try {\n return await this.client.postMessage(input);\n } catch (error) {\n const retryAfter = readRetryAfter(error);\n if (retryAfter === undefined) throw error;\n await this.sleep(Math.min(retryAfter * 1000, 60_000));\n return this.client.postMessage(input);\n }\n }\n}\n\nfunction readRetryAfter(error: unknown): number | undefined {\n if (!error || typeof error !== 'object') return undefined;\n const value = (error as { retryAfter?: unknown }).retryAfter;\n return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n}\n"],"names":["chunkMarkdownForSlack","SLACK_MAX_MESSAGE_LENGTH","defaultSleep","milliseconds","Promise","resolve","setTimeout","SlackDeliveryQueue","states","Map","maxMessageLength","maxQueueSize","sleep","client","options","send","channel","markdown","state","get","tail","pending","Error","set","resolveResult","rejectResult","result","reject","then","deliver","error","delete","chunks","length","parentTs","text","response","postWithRateLimit","mrkdwn","unfurl_links","unfurl_media","thread_ts","ts","messageId","threadId","input","postMessage","retryAfter","readRetryAfter","undefined","Math","min","value","Number","isFinite"],"mappings":"AACA,SAASA,qBAAqB,EAAEC,wBAAwB,QAAQ,qBAAqB;AAyBrF,MAAMC,eAAe,CAACC,eAClB,IAAIC,QAAQ,CAACC,UAAYC,WAAWD,SAASF;AAEjD,OAAO,MAAMI;;IACQC,SAAS,IAAIC,MAAiC;IAC9CC,iBAAyB;IACzBC,aAAqB;IACrBC,MAA+C;IAEhE,YAAY,AAAiBC,MAAmB,EAAEC,UAA2B,CAAC,CAAC,CAAE;aAApDD,SAAAA;QACzB,IAAI,CAACH,gBAAgB,GAAGI,QAAQJ,gBAAgB,IAAIT;QACpD,IAAI,CAACU,YAAY,GAAGG,QAAQH,YAAY,IAAI;QAC5C,IAAI,CAACC,KAAK,GAAGE,QAAQF,KAAK,IAAIV;IAClC;IAEA,MAAMa,KAAKC,OAAe,EAAEC,QAAgB,EAAwB;QAChE,MAAMC,QAAQ,IAAI,CAACV,MAAM,CAACW,GAAG,CAACH,YAAY;YAAEI,MAAMhB,QAAQC,OAAO;YAAIgB,SAAS;QAAE;QAChF,IAAIH,MAAMG,OAAO,IAAI,IAAI,CAACV,YAAY,EAAE;YACpC,MAAM,IAAIW,MAAM;QACpB;QACAJ,MAAMG,OAAO,IAAI;QACjB,IAAI,CAACb,MAAM,CAACe,GAAG,CAACP,SAASE;QAEzB,IAAIM;QACJ,IAAIC;QACJ,MAAMC,SAAS,IAAItB,QAAqB,CAACC,SAASsB;YAC9CH,gBAAgBnB;YAChBoB,eAAeE;QACnB;QAEAT,MAAME,IAAI,GAAGF,MAAME,IAAI,CAACQ,IAAI,CAAC;YACzB,IAAI;gBACAJ,cAAc,MAAM,IAAI,CAACK,OAAO,CAACb,SAASC;YAC9C,EAAE,OAAOa,OAAO;gBACZL,aAAaK;YACjB,SAAU;gBACNZ,MAAMG,OAAO,IAAI;gBACjB,IAAIH,MAAMG,OAAO,KAAK,GAAG,IAAI,CAACb,MAAM,CAACuB,MAAM,CAACf;YAChD;QACJ;QACA,OAAOU;IACX;IAEA,MAAcG,QAAQb,OAAe,EAAEC,QAAgB,EAAwB;QAC3E,MAAMe,SAAShC,sBAAsBiB,UAAU,IAAI,CAACP,gBAAgB;QACpE,IAAIsB,OAAOC,MAAM,KAAK,GAAG,MAAM,IAAIX,MAAM;QACzC,IAAIY;QAEJ,KAAK,MAAMC,QAAQH,OAAQ;YACvB,MAAMI,WAAW,MAAM,IAAI,CAACC,iBAAiB,CAAC;gBAC1CrB;gBACAmB;gBACAG,QAAQ;gBACRC,cAAc;gBACdC,cAAc;gBACd,GAAIN,WAAW;oBAAEO,WAAWP;gBAAS,IAAI,CAAC,CAAC;YAC/C;YACA,IAAI,CAACE,SAASM,EAAE,EAAE,MAAM,IAAIpB,MAAM;YAClCY,aAAaE,SAASM,EAAE;QAC5B;QAEA,OAAO;YAAEC,WAAWT;YAAWU,UAAUV;QAAS;IACtD;IAEA,MAAcG,kBAAkBQ,KAAgD,EAA0C;QACtH,IAAI;YACA,OAAO,MAAM,IAAI,CAAChC,MAAM,CAACiC,WAAW,CAACD;QACzC,EAAE,OAAOf,OAAO;YACZ,MAAMiB,aAAaC,eAAelB;YAClC,IAAIiB,eAAeE,WAAW,MAAMnB;YACpC,MAAM,IAAI,CAAClB,KAAK,CAACsC,KAAKC,GAAG,CAACJ,aAAa,MAAM;YAC7C,OAAO,IAAI,CAAClC,MAAM,CAACiC,WAAW,CAACD;QACnC;IACJ;AACJ;AAEA,SAASG,eAAelB,KAAc;IAClC,IAAI,CAACA,SAAS,OAAOA,UAAU,UAAU,OAAOmB;IAChD,MAAMG,QAAQ,AAACtB,MAAmCiB,UAAU;IAC5D,OAAO,OAAOK,UAAU,YAAYC,OAAOC,QAAQ,CAACF,UAAUA,SAAS,IAAIA,QAAQH;AACvF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"slackMarkdown.d.ts","sourceRoot":"","sources":["../../src/utils/slackMarkdown.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAG7C,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,SAAS,SAA2B,GACrC,MAAM,EAAE,CAwCV"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/slackMarkdown.ts"],"sourcesContent":["import { Marked, type Token, type Tokens } from 'marked';\n\nexport const SLACK_MAX_MESSAGE_LENGTH = 4000;\nconst lexer = new Marked();\n\nexport function escapeSlackText(text: string): string {\n return text.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nexport function markdownToSlackMrkdwn(markdown: string): string {\n return renderBlocks(lexer.lexer(markdown)).trimEnd();\n}\n\nexport function chunkMarkdownForSlack(\n markdown: string,\n maxLength = SLACK_MAX_MESSAGE_LENGTH,\n): string[] {\n const tokens = lexer.lexer(markdown);\n const chunks: string[] = [];\n let current = '';\n\n const append = (rendered: string): void => {\n if (!rendered) return;\n if (rendered.length > maxLength) {\n if (current) {\n chunks.push(current.trimEnd());\n current = '';\n }\n chunks.push(...splitRendered(rendered.trimEnd(), maxLength));\n return;\n }\n const candidate = current ? `${current}${rendered}` : rendered;\n if (candidate.trimEnd().length <= maxLength) {\n current = candidate;\n } else {\n chunks.push(current.trimEnd());\n current = rendered;\n }\n };\n\n for (const token of tokens) {\n if (token.type === 'code') {\n const rendered = renderCode(token as Tokens.Code);\n if (rendered.length > maxLength) {\n if (current) {\n chunks.push(current.trimEnd());\n current = '';\n }\n chunks.push(...splitCode((token as Tokens.Code).text, maxLength));\n continue;\n }\n }\n append(renderBlock(token));\n }\n if (current.trimEnd()) chunks.push(current.trimEnd());\n return chunks;\n}\n\nfunction renderBlocks(tokens: Token[]): string {\n return tokens.map(renderBlock).join('');\n}\n\nfunction renderBlock(token: Token): string {\n switch (token.type) {\n case 'heading':\n return `*${renderInline((token as Tokens.Heading).tokens)}*\\n\\n`;\n case 'paragraph':\n return `${renderInline((token as Tokens.Paragraph).tokens)}\\n\\n`;\n case 'text': {\n const text = token as Tokens.Text;\n return text.tokens ? renderInline(text.tokens) : escapeSlackText(text.text);\n }\n case 'code':\n return `${renderCode(token as Tokens.Code)}\\n\\n`;\n case 'blockquote':\n return renderBlocks((token as Tokens.Blockquote).tokens)\n .trimEnd().split('\\n').map((line) => `> ${line}`).join('\\n') + '\\n\\n';\n case 'list':\n return renderList(token as Tokens.List);\n case 'space':\n return '';\n case 'hr':\n return '—\\n\\n';\n default:\n return escapeSlackText(token.raw ?? '');\n }\n}\n\nfunction renderInline(tokens: Token[]): string {\n return tokens.map((token) => {\n switch (token.type) {\n case 'text':\n return escapeSlackText((token as Tokens.Text).text);\n case 'strong':\n return `*${renderInline((token as Tokens.Strong).tokens)}*`;\n case 'em':\n return `_${renderInline((token as Tokens.Em).tokens)}_`;\n case 'del':\n return `~${renderInline((token as Tokens.Del).tokens)}~`;\n case 'codespan':\n return `\\`${escapeSlackText((token as Tokens.Codespan).text)}\\``;\n case 'link': {\n const link = token as Tokens.Link;\n return `<${escapeLinkTarget(link.href)}|${renderInline(link.tokens)}>`;\n }\n case 'br':\n return '\\n';\n default:\n return escapeSlackText(token.raw ?? '');\n }\n }).join('');\n}\n\nfunction renderCode(token: Tokens.Code): string {\n return `\\`\\`\\`\\n${escapeSlackText(token.text)}\\n\\`\\`\\``;\n}\n\nfunction renderList(token: Tokens.List): string {\n return token.items.map((item, index) => {\n const marker = token.ordered ? `${(token.start || 1) + index}.` : '•';\n return `${marker} ${renderBlocks(item.tokens).trim()}\\n`;\n }).join('') + '\\n';\n}\n\nfunction escapeLinkTarget(href: string): string {\n return href.replace(/&/g, '&').replace(/>/g, '%3E').replace(/\\|/g, '%7C');\n}\n\nfunction splitCode(code: string, maxLength: number): string[] {\n const wrapperLength = 8;\n const contentLimit = Math.max(1, maxLength - wrapperLength);\n const parts: string[] = [];\n let current = '';\n for (const char of Array.from(code)) {\n const escaped = escapeSlackText(char);\n if (current.length + escaped.length > contentLimit && current) {\n parts.push(current);\n current = '';\n }\n current += escaped;\n }\n if (current) parts.push(current);\n return parts.map((part) => `\\`\\`\\`\\n${part}\\n\\`\\`\\``);\n}\n\nfunction splitRendered(text: string, maxLength: number): string[] {\n return splitText(text, maxLength);\n}\n\nfunction splitText(text: string, maxLength: number): string[] {\n const chunks: string[] = [];\n let current = '';\n for (const unit of text.match(/.*(?:\\n|$)|./gu) ?? []) {\n if (!unit) continue;\n for (const char of Array.from(unit)) {\n if (current.length + char.length > maxLength && current) {\n chunks.push(current);\n current = '';\n }\n current += char;\n }\n }\n if (current) chunks.push(current);\n return chunks;\n}\n"],"names":["Marked","SLACK_MAX_MESSAGE_LENGTH","lexer","escapeSlackText","text","replace","markdownToSlackMrkdwn","markdown","renderBlocks","trimEnd","chunkMarkdownForSlack","maxLength","tokens","chunks","current","append","rendered","length","push","splitRendered","candidate","token","type","renderCode","splitCode","renderBlock","map","join","renderInline","split","line","renderList","raw","link","escapeLinkTarget","href","items","item","index","marker","ordered","start","trim","code","wrapperLength","contentLimit","Math","max","parts","char","Array","from","escaped","part","splitText","unit","match"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"telegramHtml.d.ts","sourceRoot":"","sources":["../../src/utils/telegramHtml.ts"],"names":[],"mappings":"AAyFA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/telegramHtml.ts"],"sourcesContent":["import { Marked, type RendererObject, type Tokens } from 'marked';\n\nconst escapeHtml = (s: string): string =>\n s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n\nconst escapeUrl = (s: string): string =>\n s.replace(/&/g, '&').replace(/\"/g, '"');\n\nconst renderer: RendererObject = {\n heading({ tokens }: Tokens.Heading): string {\n return `<b>${this.parser.parseInline(tokens)}</b>\\n\\n`;\n },\n paragraph({ tokens }: Tokens.Paragraph): string {\n return `${this.parser.parseInline(tokens)}\\n\\n`;\n },\n strong({ tokens }: Tokens.Strong): string {\n return `<b>${this.parser.parseInline(tokens)}</b>`;\n },\n em({ tokens }: Tokens.Em): string {\n return `<i>${this.parser.parseInline(tokens)}</i>`;\n },\n del({ tokens }: Tokens.Del): string {\n return `<s>${this.parser.parseInline(tokens)}</s>`;\n },\n codespan({ text }: Tokens.Codespan): string {\n return `<code>${escapeHtml(text)}</code>`;\n },\n code({ text, lang }: Tokens.Code): string {\n const langAttr = lang ? ` class=\"language-${escapeHtml(lang.split(/\\s/)[0])}\"` : '';\n return `<pre><code${langAttr}>${escapeHtml(text)}</code></pre>\\n\\n`;\n },\n link({ href, tokens }: Tokens.Link): string {\n return `<a href=\"${escapeUrl(href)}\">${this.parser.parseInline(tokens)}</a>`;\n },\n image({ href, text }: Tokens.Image): string {\n const label = text || href;\n return `<a href=\"${escapeUrl(href)}\">${escapeHtml(label)}</a>`;\n },\n list({ items, ordered, start }: Tokens.List): string {\n const startNum = typeof start === 'number' ? start : 1;\n const lines = items.map((item, i) => {\n const marker = ordered ? `${startNum + i}.` : '•';\n const inner = item.tokens\n .map((token) =>\n token.type === 'text'\n ? this.parser.parseInline(token.tokens!)\n : this.parser.parse([token])\n )\n .join('')\n .trimEnd();\n return `${marker} ${inner}`;\n });\n return `${lines.join('\\n')}\\n\\n`;\n },\n blockquote({ tokens }: Tokens.Blockquote): string {\n return `<blockquote>${this.parser.parse(tokens).trimEnd()}</blockquote>\\n\\n`;\n },\n table({ header, rows }: Tokens.Table): string {\n const headerCells = header.map((c) => c.text);\n const bodyRows = rows.map((row) => row.map((c) => c.text));\n const widths = headerCells.map((h, i) =>\n Math.max(h.length, ...bodyRows.map((row) => (row[i] ?? '').length))\n );\n const pad = (cells: string[]) =>\n cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' | ');\n\n const lines = [\n pad(headerCells),\n widths.map((w) => '-'.repeat(w)).join('-+-'),\n ...bodyRows.map(pad),\n ];\n return `<pre>${escapeHtml(lines.join('\\n'))}</pre>\\n\\n`;\n },\n hr(): string {\n return '———\\n\\n';\n },\n br(): string {\n return '\\n';\n },\n html({ block, text }: Tokens.HTML | Tokens.Tag): string {\n return block ? '' : escapeHtml(text);\n },\n text(token: Tokens.Text | Tokens.Escape): string {\n return escapeHtml(token.text);\n },\n};\n\nconst marked = new Marked({ renderer });\n\n/**\n * Convert markdown to Telegram-compatible HTML (uses only the tag subset\n * Telegram's Bot API accepts for parse_mode: 'HTML').\n */\nexport function markdownToTelegramHtml(markdown: string): string {\n return (marked.parse(markdown, { async: false }) as string).trimEnd();\n}\n"],"names":["Marked","escapeHtml","s","replace","escapeUrl","renderer","heading","tokens","parser","parseInline","paragraph","strong","em","del","codespan","text","code","lang","langAttr","split","link","href","image","label","list","items","ordered","start","startNum","lines","map","item","i","marker","inner","token","type","parse","join","trimEnd","blockquote","table","header","rows","headerCells","c","bodyRows","row","widths","h","Math","max","length","pad","cells","padEnd","w","repeat","hr","br","html","block","marked","markdownToTelegramHtml","markdown","async"],"mappings":"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"}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|