@ai-devkit/channel-connector 0.13.4 โ†’ 0.14.0

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/README.md CHANGED
@@ -31,4 +31,4 @@ Full guides and workflow examples: **[ai-devkit.com/docs](https://ai-devkit.com/
31
31
 
32
32
  ## License
33
33
 
34
- MIT
34
+ Apache License 2.0
@@ -1,6 +1,6 @@
1
1
  import * as telegrafModule from "telegraf";
2
2
  import * as telegramHtml from "../../../adapters/telegram/telegramHtml.js";
3
- import { TelegramAdapter } from "../../../adapters/telegram/TelegramAdapter.js";
3
+ import { TelegramAdapter, validateTelegramBotToken } from "../../../adapters/telegram/TelegramAdapter.js";
4
4
  // Mock telegraf
5
5
  vi.mock("telegraf", ()=>{
6
6
  const handlers = {};
@@ -78,6 +78,29 @@ function expectHtmlChunkWithinLimit(chunk) {
78
78
  expect((chunk.match(/<code(?: class="language-[^"]+")?>/g) ?? []).length).toBe((chunk.match(/<\/code>/g) ?? []).length);
79
79
  }
80
80
  describe("TelegramAdapter", ()=>{
81
+ it("returns the bot username for a valid token", async ()=>{
82
+ const getMe = vi.fn().mockResolvedValue({
83
+ username: "test_bot"
84
+ });
85
+ await expect(validateTelegramBotToken("123:abc", {
86
+ getMe
87
+ })).resolves.toEqual({
88
+ username: "test_bot"
89
+ });
90
+ expect(getMe).toHaveBeenCalledOnce();
91
+ });
92
+ it("rejects when the API reports no username", async ()=>{
93
+ const getMe = vi.fn().mockResolvedValue({});
94
+ await expect(validateTelegramBotToken("123:abc", {
95
+ getMe
96
+ })).rejects.toThrow("Telegram bot token returned no username");
97
+ });
98
+ it("propagates API errors such as 401 Unauthorized", async ()=>{
99
+ const getMe = vi.fn().mockRejectedValue(new Error("401: Unauthorized"));
100
+ await expect(validateTelegramBotToken("123:abc", {
101
+ getMe
102
+ })).rejects.toThrow("401: Unauthorized");
103
+ });
81
104
  let adapter;
82
105
  beforeEach(()=>{
83
106
  vi.clearAllMocks();
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/__tests__/adapters/telegram/TelegramAdapter.test.ts"],"sourcesContent":["import * as telegrafModule from \"telegraf\";\nimport * as telegramHtml from \"../../../adapters/telegram/telegramHtml.js\";\nimport { TelegramAdapter } from \"../../../adapters/telegram/TelegramAdapter.js\";\nimport type { IncomingMessage } from \"../../../types.js\";\n\n// Mock telegraf\nvi.mock(\"telegraf\", () => {\n const handlers: Record<string, (...args: any[]) => any> = {};\n const mockBot = {\n launch: vi.fn().mockResolvedValue(undefined),\n stop: vi.fn().mockResolvedValue(undefined),\n on: vi.fn((event: string, handler: (...args: any[]) => any) => {\n handlers[event] = handler;\n }),\n telegram: {\n sendMessage: vi.fn().mockResolvedValue(undefined),\n editMessageReplyMarkup: vi.fn().mockResolvedValue(undefined),\n answerCbQuery: vi.fn().mockResolvedValue(undefined),\n getMe: vi.fn().mockResolvedValue({ username: \"test_bot\" }),\n },\n _handlers: handlers,\n _triggerText: async (chatId: number, userId: number, text: string) => {\n const ctx = {\n message: {\n chat: { id: chatId },\n from: { id: userId },\n text,\n date: Math.floor(Date.now() / 1000),\n },\n reply: vi.fn().mockResolvedValue(undefined),\n };\n if (handlers[\"text\"]) {\n await handlers[\"text\"](ctx);\n }\n return ctx;\n },\n _triggerCallback: async (chatId: number, userId: number, data: string, messageId = 555) => {\n const ctx = {\n callbackQuery: {\n id: \"cbq-test\",\n data,\n message: { message_id: messageId, chat: { id: chatId } },\n from: { id: userId },\n },\n answerCbQuery: vi.fn().mockResolvedValue(undefined),\n };\n if (handlers[\"callback_query\"]) {\n await handlers[\"callback_query\"](ctx);\n }\n return ctx;\n },\n };\n return {\n Telegraf: vi.fn(function () {\n return mockBot;\n }),\n __mockBot: mockBot,\n };\n});\n\nfunction getMockBot() {\n return (\n telegrafModule as unknown as {\n __mockBot: ReturnType<typeof vi.fn>[\"mock\"] & Record<string, unknown>;\n }\n ).__mockBot;\n}\n\nfunction expectHtmlChunkWithinLimit(chunk: string): void {\n expect(chunk.length).toBeLessThanOrEqual(4096);\n expect(chunk).not.toMatch(/&(?:l|lt|g|gt|a|am|amp|q|qu|quo|quot)$/);\n expect((chunk.match(/<pre>/g) ?? []).length).toBe((chunk.match(/<\\/pre>/g) ?? []).length);\n expect((chunk.match(/<code(?: class=\"language-[^\"]+\")?>/g) ?? []).length).toBe(\n (chunk.match(/<\\/code>/g) ?? []).length,\n );\n}\n\ndescribe(\"TelegramAdapter\", () => {\n let adapter: TelegramAdapter;\n\n beforeEach(() => {\n vi.clearAllMocks();\n adapter = new TelegramAdapter({ botToken: \"test-token-123\" });\n });\n\n describe(\"type\", () => {\n it('should return \"telegram\"', () => {\n expect(adapter.type).toBe(\"telegram\");\n });\n });\n\n describe(\"start\", () => {\n it(\"should launch the telegraf bot\", async () => {\n const bot = getMockBot();\n await adapter.start();\n expect(bot.launch).toHaveBeenCalled();\n });\n });\n\n describe(\"stop\", () => {\n it(\"should stop the telegraf bot\", async () => {\n const bot = getMockBot();\n await adapter.start();\n await adapter.stop();\n expect(bot.stop).toHaveBeenCalled();\n });\n });\n\n describe(\"onMessage\", () => {\n it(\"should silently ignore messages when no handler is registered\", async () => {\n // Don't register a handler\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n // Should not throw or reply\n expect(ctx.reply).not.toHaveBeenCalled();\n });\n\n it(\"should handle non-Error thrown by handler\", async () => {\n const handler = vi.fn().mockRejectedValue(\"string error\");\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n expect(ctx.reply).toHaveBeenCalledWith(\"Error processing message: Unknown error\");\n });\n\n it(\"should call handler with IncomingMessage on incoming text\", async () => {\n const handler = vi.fn().mockResolvedValue(undefined);\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n await bot._triggerText(12345, 67890, \"hello agent\");\n\n expect(handler).toHaveBeenCalledTimes(1);\n const msg: IncomingMessage = handler.mock.calls[0][0];\n expect(msg.channelType).toBe(\"telegram\");\n expect(msg.chatId).toBe(\"12345\");\n expect(msg.userId).toBe(\"67890\");\n expect(msg.text).toBe(\"hello agent\");\n expect(msg.timestamp).toBeInstanceOf(Date);\n });\n\n it(\"should handle handler errors gracefully\", async () => {\n const handler = vi.fn().mockRejectedValue(new Error(\"handler failed\"));\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n // Should not throw, and should reply with error\n expect(ctx.reply).toHaveBeenCalledWith(expect.stringContaining(\"Error processing message\"));\n });\n });\n\n describe(\"sendMessage\", () => {\n it(\"should send plain text with parse_mode HTML\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"hello from bot\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledWith(\"12345\", \"hello from bot\", {\n parse_mode: \"HTML\",\n });\n });\n\n it(\"should render markdown as Telegram HTML\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"**bold** and *italic* and `code`\");\n\n const sent = bot.telegram.sendMessage.mock.calls[0][1];\n expect(sent).toContain(\"<b>bold</b>\");\n expect(sent).toContain(\"<i>italic</i>\");\n expect(sent).toContain(\"<code>code</code>\");\n expect(bot.telegram.sendMessage.mock.calls[0][2]).toEqual({\n parse_mode: \"HTML\",\n });\n });\n\n it(\"should chunk messages exceeding 4096 chars\", async () => {\n const bot = getMockBot();\n const line = \"A\".repeat(100) + \"\\n\";\n const longMessage = line.repeat(50); // 5050 chars\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n expect(call[1].length).toBeLessThanOrEqual(4096);\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n }\n });\n\n it(\"should split long fenced code into independently valid HTML code blocks\", async () => {\n const bot = getMockBot();\n const codeLine = 'const sample = \"<code>tag</code>\" && value < limit;\\n';\n const longMessage = `Before\\n\\n\\`\\`\\`ts\\n${codeLine.repeat(100)}\\`\\`\\`\\n\\nAfter`;\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n if (chunk.includes(\"<pre>\")) {\n expect(chunk).toContain('<code class=\"language-ts\">');\n expect(chunk).toContain(\"&lt;code&gt;tag&lt;/code&gt;\");\n }\n }\n });\n\n it(\"should split nested list fenced code without sending partial HTML tags\", async () => {\n const bot = getMockBot();\n const codeLine = ' return \"<code>tag</code>\" && input < output;\\n';\n const longMessage = [\n \"- parent item\",\n \" - child item with code\",\n \" ```js\",\n codeLine.repeat(100).trimEnd(),\n \" ```\",\n \"- final item\",\n ].join(\"\\n\");\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n }\n });\n\n it(\"should split long paragraphs at readable markdown boundaries\", async () => {\n const bot = getMockBot();\n const sentence =\n \"This is a long sentence with enough words to make chunking choose sentence boundaries. \";\n const longMessage = sentence.repeat(80);\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n expect(chunk.endsWith(\".\") || chunk.endsWith(\".\\n\\n\") || chunk.endsWith(\" \")).toBe(true);\n }\n });\n\n it(\"should keep emoji chunks within the configured JavaScript string length limit\", async () => {\n const bot = getMockBot();\n const longMessage = `Status ${\"๐Ÿงช\".repeat(2500)}`;\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n expect(call[1].length).toBeLessThanOrEqual(4096);\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n }\n });\n\n it(\"should hard split at 4096 when no newlines available\", async () => {\n const bot = getMockBot();\n const longMessage = \"A\".repeat(5000);\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBe(2);\n expect(bot.telegram.sendMessage.mock.calls[0][1].length).toBe(4096);\n expect(bot.telegram.sendMessage.mock.calls[1][1].length).toBe(904);\n });\n\n it(\"should prefer paragraph (\\\\n\\\\n) over single \\\\n when chunking\", async () => {\n const bot = getMockBot();\n // 4 paragraphs of ~1500 chars each, total > 4096\n const paragraph = \"A\".repeat(1500);\n const message = `${paragraph}\\n\\n${paragraph}\\n\\n${paragraph}\\n\\n${paragraph}`;\n\n await adapter.sendMessage(\"12345\", message);\n\n // First chunk should end at a \\n\\n boundary, not mid-paragraph\n const firstChunk = bot.telegram.sendMessage.mock.calls[0][1];\n expect(firstChunk).toBe(`${paragraph}\\n\\n${paragraph}`);\n });\n\n it(\"should send short messages in a single call\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"short message\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n });\n\n it(\"should retry as plain text when Telegram rejects HTML with parse-entities error\", async () => {\n const bot = getMockBot();\n const parseError = Object.assign(new Error(\"400: Bad Request\"), {\n description: 'Bad Request: can\\'t parse entities: Unsupported start tag \"foo\"',\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n await adapter.sendMessage(\"12345\", \"**hello**\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(2);\n\n // First call: rendered HTML with parse_mode\n const [, htmlChunk, htmlOpts] = bot.telegram.sendMessage.mock.calls[0];\n expect(htmlChunk).toContain(\"<b>hello</b>\");\n expect(htmlOpts).toEqual({ parse_mode: \"HTML\" });\n\n // Second call: same content, plain text (tags stripped, no parse_mode)\n const [, plainChunk, plainOpts] = bot.telegram.sendMessage.mock.calls[1];\n expect(plainChunk).toBe(\"hello\");\n expect(plainOpts).toBeUndefined();\n });\n\n it('should detect parse-entities error from \"message\" field too', async () => {\n const bot = getMockBot();\n // Some error shapes carry the marker on `message` rather than `description`\n const parseError = new Error(\"can't parse entities\");\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n await adapter.sendMessage(\"12345\", \"**hi**\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(2);\n });\n\n it(\"should decode HTML entities when falling back to plain text\", async () => {\n const bot = getMockBot();\n const parseError = Object.assign(new Error(\"400\"), {\n description: \"Bad Request: can't parse entities\",\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n // Source has chars that escapeHtml encodes; fallback should decode them\n await adapter.sendMessage(\"12345\", \"a < b && c > d\");\n\n const [, plainChunk] = bot.telegram.sendMessage.mock.calls[1];\n expect(plainChunk).toContain(\"a < b && c > d\");\n expect(plainChunk).not.toContain(\"&lt;\");\n expect(plainChunk).not.toContain(\"&amp;\");\n });\n\n it(\"should deliver nested lists without throwing\", async () => {\n const bot = getMockBot();\n\n await adapter.sendMessage(\"12345\", \"- agent\\n - Status\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n expect(bot.telegram.sendMessage.mock.calls[0][1]).toContain(\"Status\");\n });\n\n it(\"should send plain text when markdown formatting throws\", async () => {\n const bot = getMockBot();\n const formatter = vi\n .spyOn(telegramHtml, \"markdownToTelegramHtml\")\n .mockImplementationOnce(() => {\n throw new Error(\"formatter failed\");\n });\n\n await adapter.sendMessage(\"12345\", \"- agent\\n - Status\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n expect(bot.telegram.sendMessage.mock.calls[0][0]).toBe(\"12345\");\n expect(bot.telegram.sendMessage.mock.calls[0][1]).toBe(\"- agent\\n - Status\");\n expect(bot.telegram.sendMessage.mock.calls[0][2]).toBeUndefined();\n\n formatter.mockRestore();\n });\n\n it(\"should propagate non-parse-entities errors without falling back\", async () => {\n const bot = getMockBot();\n const otherError = Object.assign(new Error(\"403\"), {\n description: \"Forbidden: bot was blocked by the user\",\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(otherError);\n\n await expect(adapter.sendMessage(\"12345\", \"hi\")).rejects.toBe(otherError);\n\n // Only the HTML attempt should have happened โ€” no fallback retry\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"sendInlineKeyboard\", () => {\n it(\"sends with parse_mode HTML and inline_keyboard payload, returns message_id\", async () => {\n const bot = getMockBot();\n (bot.telegram.sendMessage as any).mockResolvedValueOnce({ message_id: 42 });\n\n const id = await adapter.sendInlineKeyboard(\"12345\", \"<b>hi</b>\", [\n [{ text: \"A\", callbackData: \"q:1:o:0\" }],\n [{ text: \"B\", callbackData: \"q:1:o:1\" }],\n ]);\n\n expect(id).toBe(42);\n expect(bot.telegram.sendMessage).toHaveBeenCalledWith(\"12345\", \"<b>hi</b>\", {\n parse_mode: \"HTML\",\n reply_markup: {\n inline_keyboard: [\n [{ text: \"A\", callback_data: \"q:1:o:0\" }],\n [{ text: \"B\", callback_data: \"q:1:o:1\" }],\n ],\n },\n });\n });\n });\n\n describe(\"editInlineKeyboard\", () => {\n it(\"replaces the keyboard on an existing message\", async () => {\n const bot = getMockBot();\n await adapter.editInlineKeyboard(\"12345\", 99, [[{ text: \"โœ“ A\", callbackData: \"q:1:o:0\" }]]);\n expect(bot.telegram.editMessageReplyMarkup).toHaveBeenCalledWith(\"12345\", 99, undefined, {\n inline_keyboard: [[{ text: \"โœ“ A\", callback_data: \"q:1:o:0\" }]],\n });\n });\n\n it(\"passes undefined reply_markup to remove the keyboard\", async () => {\n const bot = getMockBot();\n await adapter.editInlineKeyboard(\"12345\", 99, null);\n expect(bot.telegram.editMessageReplyMarkup).toHaveBeenCalledWith(\n \"12345\",\n 99,\n undefined,\n undefined,\n );\n });\n });\n\n describe(\"answerCallback\", () => {\n it(\"forwards id and optional text to telegraf\", async () => {\n const bot = getMockBot();\n await adapter.answerCallback(\"cbq-1\", \"thanks\");\n expect(bot.telegram.answerCbQuery).toHaveBeenCalledWith(\"cbq-1\", \"thanks\");\n });\n });\n\n describe(\"onCallback\", () => {\n it(\"invokes the registered handler with a normalized IncomingCallback\", async () => {\n const handler = vi.fn().mockResolvedValue(undefined);\n adapter.onCallback(handler);\n await adapter.start();\n\n const bot = getMockBot();\n await (bot as any)._triggerCallback(12345, 67890, \"q:abc:o:1\", 777);\n\n expect(handler).toHaveBeenCalledOnce();\n const cb = handler.mock.calls[0][0];\n expect(cb.channelType).toBe(\"telegram\");\n expect(cb.chatId).toBe(\"12345\");\n expect(cb.userId).toBe(\"67890\");\n expect(cb.messageId).toBe(777);\n expect(cb.callbackData).toBe(\"q:abc:o:1\");\n expect(cb.callbackQueryId).toBe(\"cbq-test\");\n });\n\n it(\"answers callbacks when no handler is registered\", async () => {\n await adapter.start();\n const bot = getMockBot();\n const ctx = await (bot as any)._triggerCallback(12345, 67890, \"q:x:o:0\");\n expect(ctx.answerCbQuery).toHaveBeenCalled();\n });\n\n it(\"answers with error when handler rejects\", async () => {\n adapter.onCallback(vi.fn().mockRejectedValue(new Error(\"boom\")));\n await adapter.start();\n const bot = getMockBot();\n const ctx = await (bot as any)._triggerCallback(12345, 67890, \"q:x:o:0\");\n expect(ctx.answerCbQuery).toHaveBeenCalledWith(\"Error\");\n });\n });\n\n describe(\"isHealthy\", () => {\n it(\"should return true after start\", async () => {\n await adapter.start();\n expect(await adapter.isHealthy()).toBe(true);\n });\n\n it(\"should return false before start\", async () => {\n expect(await adapter.isHealthy()).toBe(false);\n });\n\n it(\"should return false after stop\", async () => {\n await adapter.start();\n await adapter.stop();\n expect(await adapter.isHealthy()).toBe(false);\n });\n });\n});\n"],"names":["telegrafModule","telegramHtml","TelegramAdapter","vi","mock","handlers","mockBot","launch","fn","mockResolvedValue","undefined","stop","on","event","handler","telegram","sendMessage","editMessageReplyMarkup","answerCbQuery","getMe","username","_handlers","_triggerText","chatId","userId","text","ctx","message","chat","id","from","date","Math","floor","Date","now","reply","_triggerCallback","data","messageId","callbackQuery","message_id","Telegraf","__mockBot","getMockBot","expectHtmlChunkWithinLimit","chunk","expect","length","toBeLessThanOrEqual","not","toMatch","match","toBe","describe","adapter","beforeEach","clearAllMocks","botToken","it","type","bot","start","toHaveBeenCalled","mockRejectedValue","onMessage","toHaveBeenCalledWith","toHaveBeenCalledTimes","msg","calls","channelType","timestamp","toBeInstanceOf","Error","stringContaining","parse_mode","sent","toContain","toEqual","line","repeat","longMessage","toBeGreaterThan","call","codeLine","includes","trimEnd","join","sentence","endsWith","paragraph","firstChunk","parseError","Object","assign","description","mockRejectedValueOnce","mockResolvedValueOnce","htmlChunk","htmlOpts","plainChunk","plainOpts","toBeUndefined","formatter","spyOn","mockImplementationOnce","mockRestore","otherError","rejects","sendInlineKeyboard","callbackData","reply_markup","inline_keyboard","callback_data","editInlineKeyboard","answerCallback","onCallback","toHaveBeenCalledOnce","cb","callbackQueryId","isHealthy"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/__tests__/adapters/telegram/TelegramAdapter.test.ts"],"sourcesContent":["import * as telegrafModule from \"telegraf\";\nimport * as telegramHtml from \"../../../adapters/telegram/telegramHtml.js\";\nimport {\n TelegramAdapter,\n validateTelegramBotToken,\n} from \"../../../adapters/telegram/TelegramAdapter.js\";\nimport type { IncomingMessage } from \"../../../types.js\";\n\n// Mock telegraf\nvi.mock(\"telegraf\", () => {\n const handlers: Record<string, (...args: any[]) => any> = {};\n const mockBot = {\n launch: vi.fn().mockResolvedValue(undefined),\n stop: vi.fn().mockResolvedValue(undefined),\n on: vi.fn((event: string, handler: (...args: any[]) => any) => {\n handlers[event] = handler;\n }),\n telegram: {\n sendMessage: vi.fn().mockResolvedValue(undefined),\n editMessageReplyMarkup: vi.fn().mockResolvedValue(undefined),\n answerCbQuery: vi.fn().mockResolvedValue(undefined),\n getMe: vi.fn().mockResolvedValue({ username: \"test_bot\" }),\n },\n _handlers: handlers,\n _triggerText: async (chatId: number, userId: number, text: string) => {\n const ctx = {\n message: {\n chat: { id: chatId },\n from: { id: userId },\n text,\n date: Math.floor(Date.now() / 1000),\n },\n reply: vi.fn().mockResolvedValue(undefined),\n };\n if (handlers[\"text\"]) {\n await handlers[\"text\"](ctx);\n }\n return ctx;\n },\n _triggerCallback: async (chatId: number, userId: number, data: string, messageId = 555) => {\n const ctx = {\n callbackQuery: {\n id: \"cbq-test\",\n data,\n message: { message_id: messageId, chat: { id: chatId } },\n from: { id: userId },\n },\n answerCbQuery: vi.fn().mockResolvedValue(undefined),\n };\n if (handlers[\"callback_query\"]) {\n await handlers[\"callback_query\"](ctx);\n }\n return ctx;\n },\n };\n return {\n Telegraf: vi.fn(function () {\n return mockBot;\n }),\n __mockBot: mockBot,\n };\n});\n\nfunction getMockBot() {\n return (\n telegrafModule as unknown as {\n __mockBot: ReturnType<typeof vi.fn>[\"mock\"] & Record<string, unknown>;\n }\n ).__mockBot;\n}\n\nfunction expectHtmlChunkWithinLimit(chunk: string): void {\n expect(chunk.length).toBeLessThanOrEqual(4096);\n expect(chunk).not.toMatch(/&(?:l|lt|g|gt|a|am|amp|q|qu|quo|quot)$/);\n expect((chunk.match(/<pre>/g) ?? []).length).toBe((chunk.match(/<\\/pre>/g) ?? []).length);\n expect((chunk.match(/<code(?: class=\"language-[^\"]+\")?>/g) ?? []).length).toBe(\n (chunk.match(/<\\/code>/g) ?? []).length,\n );\n}\n\ndescribe(\"TelegramAdapter\", () => {\n it(\"returns the bot username for a valid token\", async () => {\n const getMe = vi.fn().mockResolvedValue({ username: \"test_bot\" });\n await expect(validateTelegramBotToken(\"123:abc\", { getMe })).resolves.toEqual({\n username: \"test_bot\",\n });\n expect(getMe).toHaveBeenCalledOnce();\n });\n\n it(\"rejects when the API reports no username\", async () => {\n const getMe = vi.fn().mockResolvedValue({});\n await expect(validateTelegramBotToken(\"123:abc\", { getMe })).rejects.toThrow(\n \"Telegram bot token returned no username\",\n );\n });\n\n it(\"propagates API errors such as 401 Unauthorized\", async () => {\n const getMe = vi.fn().mockRejectedValue(new Error(\"401: Unauthorized\"));\n await expect(validateTelegramBotToken(\"123:abc\", { getMe })).rejects.toThrow(\n \"401: Unauthorized\",\n );\n });\n\n let adapter: TelegramAdapter;\n\n beforeEach(() => {\n vi.clearAllMocks();\n adapter = new TelegramAdapter({ botToken: \"test-token-123\" });\n });\n\n describe(\"type\", () => {\n it('should return \"telegram\"', () => {\n expect(adapter.type).toBe(\"telegram\");\n });\n });\n\n describe(\"start\", () => {\n it(\"should launch the telegraf bot\", async () => {\n const bot = getMockBot();\n await adapter.start();\n expect(bot.launch).toHaveBeenCalled();\n });\n });\n\n describe(\"stop\", () => {\n it(\"should stop the telegraf bot\", async () => {\n const bot = getMockBot();\n await adapter.start();\n await adapter.stop();\n expect(bot.stop).toHaveBeenCalled();\n });\n });\n\n describe(\"onMessage\", () => {\n it(\"should silently ignore messages when no handler is registered\", async () => {\n // Don't register a handler\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n // Should not throw or reply\n expect(ctx.reply).not.toHaveBeenCalled();\n });\n\n it(\"should handle non-Error thrown by handler\", async () => {\n const handler = vi.fn().mockRejectedValue(\"string error\");\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n expect(ctx.reply).toHaveBeenCalledWith(\"Error processing message: Unknown error\");\n });\n\n it(\"should call handler with IncomingMessage on incoming text\", async () => {\n const handler = vi.fn().mockResolvedValue(undefined);\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n await bot._triggerText(12345, 67890, \"hello agent\");\n\n expect(handler).toHaveBeenCalledTimes(1);\n const msg: IncomingMessage = handler.mock.calls[0][0];\n expect(msg.channelType).toBe(\"telegram\");\n expect(msg.chatId).toBe(\"12345\");\n expect(msg.userId).toBe(\"67890\");\n expect(msg.text).toBe(\"hello agent\");\n expect(msg.timestamp).toBeInstanceOf(Date);\n });\n\n it(\"should handle handler errors gracefully\", async () => {\n const handler = vi.fn().mockRejectedValue(new Error(\"handler failed\"));\n adapter.onMessage(handler);\n await adapter.start();\n\n const bot = getMockBot();\n const ctx = await bot._triggerText(12345, 67890, \"hello\");\n\n // Should not throw, and should reply with error\n expect(ctx.reply).toHaveBeenCalledWith(expect.stringContaining(\"Error processing message\"));\n });\n });\n\n describe(\"sendMessage\", () => {\n it(\"should send plain text with parse_mode HTML\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"hello from bot\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledWith(\"12345\", \"hello from bot\", {\n parse_mode: \"HTML\",\n });\n });\n\n it(\"should render markdown as Telegram HTML\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"**bold** and *italic* and `code`\");\n\n const sent = bot.telegram.sendMessage.mock.calls[0][1];\n expect(sent).toContain(\"<b>bold</b>\");\n expect(sent).toContain(\"<i>italic</i>\");\n expect(sent).toContain(\"<code>code</code>\");\n expect(bot.telegram.sendMessage.mock.calls[0][2]).toEqual({\n parse_mode: \"HTML\",\n });\n });\n\n it(\"should chunk messages exceeding 4096 chars\", async () => {\n const bot = getMockBot();\n const line = \"A\".repeat(100) + \"\\n\";\n const longMessage = line.repeat(50); // 5050 chars\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n expect(call[1].length).toBeLessThanOrEqual(4096);\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n }\n });\n\n it(\"should split long fenced code into independently valid HTML code blocks\", async () => {\n const bot = getMockBot();\n const codeLine = 'const sample = \"<code>tag</code>\" && value < limit;\\n';\n const longMessage = `Before\\n\\n\\`\\`\\`ts\\n${codeLine.repeat(100)}\\`\\`\\`\\n\\nAfter`;\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n if (chunk.includes(\"<pre>\")) {\n expect(chunk).toContain('<code class=\"language-ts\">');\n expect(chunk).toContain(\"&lt;code&gt;tag&lt;/code&gt;\");\n }\n }\n });\n\n it(\"should split nested list fenced code without sending partial HTML tags\", async () => {\n const bot = getMockBot();\n const codeLine = ' return \"<code>tag</code>\" && input < output;\\n';\n const longMessage = [\n \"- parent item\",\n \" - child item with code\",\n \" ```js\",\n codeLine.repeat(100).trimEnd(),\n \" ```\",\n \"- final item\",\n ].join(\"\\n\");\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n }\n });\n\n it(\"should split long paragraphs at readable markdown boundaries\", async () => {\n const bot = getMockBot();\n const sentence =\n \"This is a long sentence with enough words to make chunking choose sentence boundaries. \";\n const longMessage = sentence.repeat(80);\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n const chunk = call[1];\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n expectHtmlChunkWithinLimit(chunk);\n expect(chunk.endsWith(\".\") || chunk.endsWith(\".\\n\\n\") || chunk.endsWith(\" \")).toBe(true);\n }\n });\n\n it(\"should keep emoji chunks within the configured JavaScript string length limit\", async () => {\n const bot = getMockBot();\n const longMessage = `Status ${\"๐Ÿงช\".repeat(2500)}`;\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBeGreaterThan(1);\n for (const call of bot.telegram.sendMessage.mock.calls) {\n expect(call[1].length).toBeLessThanOrEqual(4096);\n expect(call[2]).toEqual({ parse_mode: \"HTML\" });\n }\n });\n\n it(\"should hard split at 4096 when no newlines available\", async () => {\n const bot = getMockBot();\n const longMessage = \"A\".repeat(5000);\n\n await adapter.sendMessage(\"12345\", longMessage);\n\n expect(bot.telegram.sendMessage.mock.calls.length).toBe(2);\n expect(bot.telegram.sendMessage.mock.calls[0][1].length).toBe(4096);\n expect(bot.telegram.sendMessage.mock.calls[1][1].length).toBe(904);\n });\n\n it(\"should prefer paragraph (\\\\n\\\\n) over single \\\\n when chunking\", async () => {\n const bot = getMockBot();\n // 4 paragraphs of ~1500 chars each, total > 4096\n const paragraph = \"A\".repeat(1500);\n const message = `${paragraph}\\n\\n${paragraph}\\n\\n${paragraph}\\n\\n${paragraph}`;\n\n await adapter.sendMessage(\"12345\", message);\n\n // First chunk should end at a \\n\\n boundary, not mid-paragraph\n const firstChunk = bot.telegram.sendMessage.mock.calls[0][1];\n expect(firstChunk).toBe(`${paragraph}\\n\\n${paragraph}`);\n });\n\n it(\"should send short messages in a single call\", async () => {\n const bot = getMockBot();\n await adapter.sendMessage(\"12345\", \"short message\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n });\n\n it(\"should retry as plain text when Telegram rejects HTML with parse-entities error\", async () => {\n const bot = getMockBot();\n const parseError = Object.assign(new Error(\"400: Bad Request\"), {\n description: 'Bad Request: can\\'t parse entities: Unsupported start tag \"foo\"',\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n await adapter.sendMessage(\"12345\", \"**hello**\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(2);\n\n // First call: rendered HTML with parse_mode\n const [, htmlChunk, htmlOpts] = bot.telegram.sendMessage.mock.calls[0];\n expect(htmlChunk).toContain(\"<b>hello</b>\");\n expect(htmlOpts).toEqual({ parse_mode: \"HTML\" });\n\n // Second call: same content, plain text (tags stripped, no parse_mode)\n const [, plainChunk, plainOpts] = bot.telegram.sendMessage.mock.calls[1];\n expect(plainChunk).toBe(\"hello\");\n expect(plainOpts).toBeUndefined();\n });\n\n it('should detect parse-entities error from \"message\" field too', async () => {\n const bot = getMockBot();\n // Some error shapes carry the marker on `message` rather than `description`\n const parseError = new Error(\"can't parse entities\");\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n await adapter.sendMessage(\"12345\", \"**hi**\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(2);\n });\n\n it(\"should decode HTML entities when falling back to plain text\", async () => {\n const bot = getMockBot();\n const parseError = Object.assign(new Error(\"400\"), {\n description: \"Bad Request: can't parse entities\",\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(parseError).mockResolvedValueOnce(undefined);\n\n // Source has chars that escapeHtml encodes; fallback should decode them\n await adapter.sendMessage(\"12345\", \"a < b && c > d\");\n\n const [, plainChunk] = bot.telegram.sendMessage.mock.calls[1];\n expect(plainChunk).toContain(\"a < b && c > d\");\n expect(plainChunk).not.toContain(\"&lt;\");\n expect(plainChunk).not.toContain(\"&amp;\");\n });\n\n it(\"should deliver nested lists without throwing\", async () => {\n const bot = getMockBot();\n\n await adapter.sendMessage(\"12345\", \"- agent\\n - Status\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n expect(bot.telegram.sendMessage.mock.calls[0][1]).toContain(\"Status\");\n });\n\n it(\"should send plain text when markdown formatting throws\", async () => {\n const bot = getMockBot();\n const formatter = vi\n .spyOn(telegramHtml, \"markdownToTelegramHtml\")\n .mockImplementationOnce(() => {\n throw new Error(\"formatter failed\");\n });\n\n await adapter.sendMessage(\"12345\", \"- agent\\n - Status\");\n\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n expect(bot.telegram.sendMessage.mock.calls[0][0]).toBe(\"12345\");\n expect(bot.telegram.sendMessage.mock.calls[0][1]).toBe(\"- agent\\n - Status\");\n expect(bot.telegram.sendMessage.mock.calls[0][2]).toBeUndefined();\n\n formatter.mockRestore();\n });\n\n it(\"should propagate non-parse-entities errors without falling back\", async () => {\n const bot = getMockBot();\n const otherError = Object.assign(new Error(\"403\"), {\n description: \"Forbidden: bot was blocked by the user\",\n });\n bot.telegram.sendMessage.mockRejectedValueOnce(otherError);\n\n await expect(adapter.sendMessage(\"12345\", \"hi\")).rejects.toBe(otherError);\n\n // Only the HTML attempt should have happened โ€” no fallback retry\n expect(bot.telegram.sendMessage).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"sendInlineKeyboard\", () => {\n it(\"sends with parse_mode HTML and inline_keyboard payload, returns message_id\", async () => {\n const bot = getMockBot();\n (bot.telegram.sendMessage as any).mockResolvedValueOnce({ message_id: 42 });\n\n const id = await adapter.sendInlineKeyboard(\"12345\", \"<b>hi</b>\", [\n [{ text: \"A\", callbackData: \"q:1:o:0\" }],\n [{ text: \"B\", callbackData: \"q:1:o:1\" }],\n ]);\n\n expect(id).toBe(42);\n expect(bot.telegram.sendMessage).toHaveBeenCalledWith(\"12345\", \"<b>hi</b>\", {\n parse_mode: \"HTML\",\n reply_markup: {\n inline_keyboard: [\n [{ text: \"A\", callback_data: \"q:1:o:0\" }],\n [{ text: \"B\", callback_data: \"q:1:o:1\" }],\n ],\n },\n });\n });\n });\n\n describe(\"editInlineKeyboard\", () => {\n it(\"replaces the keyboard on an existing message\", async () => {\n const bot = getMockBot();\n await adapter.editInlineKeyboard(\"12345\", 99, [[{ text: \"โœ“ A\", callbackData: \"q:1:o:0\" }]]);\n expect(bot.telegram.editMessageReplyMarkup).toHaveBeenCalledWith(\"12345\", 99, undefined, {\n inline_keyboard: [[{ text: \"โœ“ A\", callback_data: \"q:1:o:0\" }]],\n });\n });\n\n it(\"passes undefined reply_markup to remove the keyboard\", async () => {\n const bot = getMockBot();\n await adapter.editInlineKeyboard(\"12345\", 99, null);\n expect(bot.telegram.editMessageReplyMarkup).toHaveBeenCalledWith(\n \"12345\",\n 99,\n undefined,\n undefined,\n );\n });\n });\n\n describe(\"answerCallback\", () => {\n it(\"forwards id and optional text to telegraf\", async () => {\n const bot = getMockBot();\n await adapter.answerCallback(\"cbq-1\", \"thanks\");\n expect(bot.telegram.answerCbQuery).toHaveBeenCalledWith(\"cbq-1\", \"thanks\");\n });\n });\n\n describe(\"onCallback\", () => {\n it(\"invokes the registered handler with a normalized IncomingCallback\", async () => {\n const handler = vi.fn().mockResolvedValue(undefined);\n adapter.onCallback(handler);\n await adapter.start();\n\n const bot = getMockBot();\n await (bot as any)._triggerCallback(12345, 67890, \"q:abc:o:1\", 777);\n\n expect(handler).toHaveBeenCalledOnce();\n const cb = handler.mock.calls[0][0];\n expect(cb.channelType).toBe(\"telegram\");\n expect(cb.chatId).toBe(\"12345\");\n expect(cb.userId).toBe(\"67890\");\n expect(cb.messageId).toBe(777);\n expect(cb.callbackData).toBe(\"q:abc:o:1\");\n expect(cb.callbackQueryId).toBe(\"cbq-test\");\n });\n\n it(\"answers callbacks when no handler is registered\", async () => {\n await adapter.start();\n const bot = getMockBot();\n const ctx = await (bot as any)._triggerCallback(12345, 67890, \"q:x:o:0\");\n expect(ctx.answerCbQuery).toHaveBeenCalled();\n });\n\n it(\"answers with error when handler rejects\", async () => {\n adapter.onCallback(vi.fn().mockRejectedValue(new Error(\"boom\")));\n await adapter.start();\n const bot = getMockBot();\n const ctx = await (bot as any)._triggerCallback(12345, 67890, \"q:x:o:0\");\n expect(ctx.answerCbQuery).toHaveBeenCalledWith(\"Error\");\n });\n });\n\n describe(\"isHealthy\", () => {\n it(\"should return true after start\", async () => {\n await adapter.start();\n expect(await adapter.isHealthy()).toBe(true);\n });\n\n it(\"should return false before start\", async () => {\n expect(await adapter.isHealthy()).toBe(false);\n });\n\n it(\"should return false after stop\", async () => {\n await adapter.start();\n await adapter.stop();\n expect(await adapter.isHealthy()).toBe(false);\n });\n });\n});\n"],"names":["telegrafModule","telegramHtml","TelegramAdapter","validateTelegramBotToken","vi","mock","handlers","mockBot","launch","fn","mockResolvedValue","undefined","stop","on","event","handler","telegram","sendMessage","editMessageReplyMarkup","answerCbQuery","getMe","username","_handlers","_triggerText","chatId","userId","text","ctx","message","chat","id","from","date","Math","floor","Date","now","reply","_triggerCallback","data","messageId","callbackQuery","message_id","Telegraf","__mockBot","getMockBot","expectHtmlChunkWithinLimit","chunk","expect","length","toBeLessThanOrEqual","not","toMatch","match","toBe","describe","it","resolves","toEqual","toHaveBeenCalledOnce","rejects","toThrow","mockRejectedValue","Error","adapter","beforeEach","clearAllMocks","botToken","type","bot","start","toHaveBeenCalled","onMessage","toHaveBeenCalledWith","toHaveBeenCalledTimes","msg","calls","channelType","timestamp","toBeInstanceOf","stringContaining","parse_mode","sent","toContain","line","repeat","longMessage","toBeGreaterThan","call","codeLine","includes","trimEnd","join","sentence","endsWith","paragraph","firstChunk","parseError","Object","assign","description","mockRejectedValueOnce","mockResolvedValueOnce","htmlChunk","htmlOpts","plainChunk","plainOpts","toBeUndefined","formatter","spyOn","mockImplementationOnce","mockRestore","otherError","sendInlineKeyboard","callbackData","reply_markup","inline_keyboard","callback_data","editInlineKeyboard","answerCallback","onCallback","cb","callbackQueryId","isHealthy"],"mappings":"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"}
@@ -1,6 +1,15 @@
1
1
  import type { ChannelAdapter } from "../ChannelAdapter.js";
2
2
  import type { IncomingMessage, InlineKeyboard, CallbackHandler } from "../../types.js";
3
3
  export declare const TELEGRAM_CHANNEL_TYPE = "telegram";
4
+ interface TelegramBotClient {
5
+ getMe(): Promise<{
6
+ username?: string;
7
+ }>;
8
+ }
9
+ export interface TelegramIdentity {
10
+ username: string;
11
+ }
12
+ export declare function validateTelegramBotToken(botToken: string, client?: TelegramBotClient): Promise<TelegramIdentity>;
4
13
  export interface TelegramAdapterOptions {
5
14
  botToken: string;
6
15
  }
@@ -43,4 +52,5 @@ export declare class TelegramAdapter implements ChannelAdapter {
43
52
  answerCallback(callbackQueryId: string, text?: string): Promise<void>;
44
53
  isHealthy(): Promise<boolean>;
45
54
  }
55
+ export {};
46
56
  //# sourceMappingURL=TelegramAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TelegramAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/TelegramAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAGhD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAyB;IAEtC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,cAAc,CAA0D;IAChF,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,sBAAsB;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,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,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC;IAQlB;;;OAGG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GAAG,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAShB;;;OAGG;IACG,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAGpC"}
1
+ {"version":3,"file":"TelegramAdapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/telegram/TelegramAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,KAAK,EACV,eAAe,EACf,cAAc,EAEd,eAAe,EAChB,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAGhD,UAAU,iBAAiB;IACzB,KAAK,IAAI,OAAO,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAK3B;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,eAAgB,YAAW,cAAc;IACpD,QAAQ,CAAC,IAAI,cAAyB;IAEtC,OAAO,CAAC,GAAG,CAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,cAAc,CAA0D;IAChF,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,sBAAsB;IAKrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;OAIG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,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,CACtB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,MAAM,CAAC;IAQlB;;;OAGG;IACG,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GAAG,IAAI,GAC9B,OAAO,CAAC,IAAI,CAAC;IAShB;;;OAGG;IACG,cAAc,CAAC,eAAe,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrE,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAGpC"}
@@ -3,6 +3,14 @@ import { TelegramMessageDelivery } from "./TelegramMessageDelivery.js";
3
3
  import { toTelegrafKeyboard } from "./telegramKeyboard.js";
4
4
  export const TELEGRAM_CHANNEL_TYPE = "telegram";
5
5
  const TELEGRAM_PARSE_MODE = "HTML";
6
+ export async function validateTelegramBotToken(botToken, client) {
7
+ const telegram = client ?? new Telegraf(botToken).telegram;
8
+ const me = await telegram.getMe();
9
+ if (!me.username) throw new Error("Telegram bot token returned no username");
10
+ return {
11
+ username: me.username
12
+ };
13
+ }
6
14
  /**
7
15
  * Telegram Bot API adapter using telegraf with long polling.
8
16
  */ export class TelegramAdapter {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/adapters/telegram/TelegramAdapter.ts"],"sourcesContent":["import { Telegraf } from \"telegraf\";\nimport type { ChannelAdapter } from \"../ChannelAdapter.js\";\nimport { TelegramMessageDelivery } from \"./TelegramMessageDelivery.js\";\nimport { toTelegrafKeyboard } from \"./telegramKeyboard.js\";\nimport type {\n IncomingMessage,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from \"../../types.js\";\n\nexport const TELEGRAM_CHANNEL_TYPE = \"telegram\";\nconst TELEGRAM_PARSE_MODE = \"HTML\" as const;\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 readonly delivery: TelegramMessageDelivery;\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 this.delivery = new TelegramMessageDelivery(this.bot.telegram);\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 {\n await ctx.answerCbQuery();\n } catch {\n /* ignore */\n }\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 {\n await ctx.answerCbQuery();\n } catch {\n /* ignore */\n }\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 {\n await ctx.answerCbQuery(\"Error\");\n } catch {\n /* ignore */\n }\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 await this.delivery.send(chatId, text);\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(\n chatId: string,\n html: string,\n keyboard: InlineKeyboard,\n ): 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(\n chatId: string,\n messageId: number,\n keyboard: InlineKeyboard | null,\n ): Promise<void> {\n await this.bot.telegram.editMessageReplyMarkup(\n chatId,\n messageId,\n undefined,\n keyboard ? { inline_keyboard: toTelegrafKeyboard(keyboard) } : undefined,\n );\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"],"names":["Telegraf","TelegramMessageDelivery","toTelegrafKeyboard","TELEGRAM_CHANNEL_TYPE","TELEGRAM_PARSE_MODE","TelegramAdapter","type","bot","delivery","messageHandler","callbackHandler","running","options","botToken","telegram","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","send","onMessage","handler","onCallback","sendInlineKeyboard","html","keyboard","result","parse_mode","reply_markup","inline_keyboard","editInlineKeyboard","editMessageReplyMarkup","undefined","answerCallback","isHealthy"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/adapters/telegram/TelegramAdapter.ts"],"sourcesContent":["import { Telegraf } from \"telegraf\";\nimport type { ChannelAdapter } from \"../ChannelAdapter.js\";\nimport { TelegramMessageDelivery } from \"./TelegramMessageDelivery.js\";\nimport { toTelegrafKeyboard } from \"./telegramKeyboard.js\";\nimport type {\n IncomingMessage,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from \"../../types.js\";\n\nexport const TELEGRAM_CHANNEL_TYPE = \"telegram\";\nconst TELEGRAM_PARSE_MODE = \"HTML\" as const;\n\ninterface TelegramBotClient {\n getMe(): Promise<{ username?: string }>;\n}\n\nexport interface TelegramIdentity {\n username: string;\n}\n\nexport async function validateTelegramBotToken(\n botToken: string,\n client?: TelegramBotClient,\n): Promise<TelegramIdentity> {\n const telegram = client ?? new Telegraf(botToken).telegram;\n const me = await telegram.getMe();\n if (!me.username) throw new Error(\"Telegram bot token returned no username\");\n return { username: me.username };\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 readonly delivery: TelegramMessageDelivery;\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 this.delivery = new TelegramMessageDelivery(this.bot.telegram);\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 {\n await ctx.answerCbQuery();\n } catch {\n /* ignore */\n }\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 {\n await ctx.answerCbQuery();\n } catch {\n /* ignore */\n }\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 {\n await ctx.answerCbQuery(\"Error\");\n } catch {\n /* ignore */\n }\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 await this.delivery.send(chatId, text);\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(\n chatId: string,\n html: string,\n keyboard: InlineKeyboard,\n ): 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(\n chatId: string,\n messageId: number,\n keyboard: InlineKeyboard | null,\n ): Promise<void> {\n await this.bot.telegram.editMessageReplyMarkup(\n chatId,\n messageId,\n undefined,\n keyboard ? { inline_keyboard: toTelegrafKeyboard(keyboard) } : undefined,\n );\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"],"names":["Telegraf","TelegramMessageDelivery","toTelegrafKeyboard","TELEGRAM_CHANNEL_TYPE","TELEGRAM_PARSE_MODE","validateTelegramBotToken","botToken","client","telegram","me","getMe","username","Error","TelegramAdapter","type","bot","delivery","messageHandler","callbackHandler","running","options","start","on","ctx","msg","channelType","chatId","String","message","chat","id","userId","from","text","timestamp","Date","date","error","errorMessage","reply","answerCbQuery","query","callbackQuery","data","cb","messageId","message_id","callbackData","callbackQueryId","launch","stop","sendMessage","send","onMessage","handler","onCallback","sendInlineKeyboard","html","keyboard","result","parse_mode","reply_markup","inline_keyboard","editInlineKeyboard","editMessageReplyMarkup","undefined","answerCallback","isHealthy"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  export { ChannelManager } from "./ChannelManager.js";
2
2
  export { ChannelConfigRepository } from "./ChannelConfigRepository.js";
3
- export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from "./adapters/telegram/TelegramAdapter.js";
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, validateTelegramBotToken, } from "./adapters/telegram/TelegramAdapter.js";
4
4
  export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials, } from "./adapters/slack/SlackAdapter.js";
5
5
  export type { SlackIdentity } from "./adapters/slack/SlackAdapter.js";
6
- export type { TelegramAdapterOptions } from "./adapters/telegram/TelegramAdapter.js";
6
+ export type { TelegramAdapterOptions, TelegramIdentity, } from "./adapters/telegram/TelegramAdapter.js";
7
7
  export { isInteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
8
8
  export type { ChannelAdapter, InteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
9
9
  export type { IncomingMessage, MessageHandler, ChannelConfig, ChannelEntry, ChannelType, TelegramConfig, SlackConfig, SlackChannelEntry, SendMessageOptions, SentMessage, ChannelQuestion, ChannelQuestionOption, IncomingInteraction, InteractionHandler, InlineKeyboardButton, InlineKeyboard, IncomingCallback, CallbackHandler, } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAChG,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAErF,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,YAAY,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACL,eAAe,EACf,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACtE,YAAY,EACV,sBAAsB,EACtB,gBAAgB,GACjB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,2BAA2B,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,YAAY,EACV,eAAe,EACf,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  export { ChannelManager } from "./ChannelManager.js";
2
2
  export { ChannelConfigRepository } from "./ChannelConfigRepository.js";
3
- export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from "./adapters/telegram/TelegramAdapter.js";
3
+ export { TelegramAdapter, TELEGRAM_CHANNEL_TYPE, validateTelegramBotToken } from "./adapters/telegram/TelegramAdapter.js";
4
4
  export { SlackAdapter, SLACK_CHANNEL_TYPE, validateSlackAppToken, validateSlackCredentials } from "./adapters/slack/SlackAdapter.js";
5
5
  export { isInteractiveChannelAdapter } from "./adapters/ChannelAdapter.js";
6
6
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { ChannelManager } from \"./ChannelManager.js\";\nexport { ChannelConfigRepository } from \"./ChannelConfigRepository.js\";\nexport { TelegramAdapter, TELEGRAM_CHANNEL_TYPE } from \"./adapters/telegram/TelegramAdapter.js\";\nexport {\n SlackAdapter,\n SLACK_CHANNEL_TYPE,\n validateSlackAppToken,\n validateSlackCredentials,\n} from \"./adapters/slack/SlackAdapter.js\";\nexport type { SlackIdentity } from \"./adapters/slack/SlackAdapter.js\";\nexport type { TelegramAdapterOptions } from \"./adapters/telegram/TelegramAdapter.js\";\n\nexport { isInteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\nexport type { ChannelAdapter, InteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\n\nexport type {\n IncomingMessage,\n MessageHandler,\n ChannelConfig,\n ChannelEntry,\n ChannelType,\n TelegramConfig,\n SlackConfig,\n SlackChannelEntry,\n SendMessageOptions,\n SentMessage,\n ChannelQuestion,\n ChannelQuestionOption,\n IncomingInteraction,\n InteractionHandler,\n InlineKeyboardButton,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from \"./types.js\";\n"],"names":["ChannelManager","ChannelConfigRepository","TelegramAdapter","TELEGRAM_CHANNEL_TYPE","SlackAdapter","SLACK_CHANNEL_TYPE","validateSlackAppToken","validateSlackCredentials","isInteractiveChannelAdapter"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,uBAAuB,QAAQ,+BAA+B;AACvE,SAASC,eAAe,EAAEC,qBAAqB,QAAQ,yCAAyC;AAChG,SACEC,YAAY,EACZC,kBAAkB,EAClBC,qBAAqB,EACrBC,wBAAwB,QACnB,mCAAmC;AAI1C,SAASC,2BAA2B,QAAQ,+BAA+B"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { ChannelManager } from \"./ChannelManager.js\";\nexport { ChannelConfigRepository } from \"./ChannelConfigRepository.js\";\nexport {\n TelegramAdapter,\n TELEGRAM_CHANNEL_TYPE,\n validateTelegramBotToken,\n} from \"./adapters/telegram/TelegramAdapter.js\";\nexport {\n SlackAdapter,\n SLACK_CHANNEL_TYPE,\n validateSlackAppToken,\n validateSlackCredentials,\n} from \"./adapters/slack/SlackAdapter.js\";\nexport type { SlackIdentity } from \"./adapters/slack/SlackAdapter.js\";\nexport type {\n TelegramAdapterOptions,\n TelegramIdentity,\n} from \"./adapters/telegram/TelegramAdapter.js\";\n\nexport { isInteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\nexport type { ChannelAdapter, InteractiveChannelAdapter } from \"./adapters/ChannelAdapter.js\";\n\nexport type {\n IncomingMessage,\n MessageHandler,\n ChannelConfig,\n ChannelEntry,\n ChannelType,\n TelegramConfig,\n SlackConfig,\n SlackChannelEntry,\n SendMessageOptions,\n SentMessage,\n ChannelQuestion,\n ChannelQuestionOption,\n IncomingInteraction,\n InteractionHandler,\n InlineKeyboardButton,\n InlineKeyboard,\n IncomingCallback,\n CallbackHandler,\n} from \"./types.js\";\n"],"names":["ChannelManager","ChannelConfigRepository","TelegramAdapter","TELEGRAM_CHANNEL_TYPE","validateTelegramBotToken","SlackAdapter","SLACK_CHANNEL_TYPE","validateSlackAppToken","validateSlackCredentials","isInteractiveChannelAdapter"],"mappings":"AAAA,SAASA,cAAc,QAAQ,sBAAsB;AACrD,SAASC,uBAAuB,QAAQ,+BAA+B;AACvE,SACEC,eAAe,EACfC,qBAAqB,EACrBC,wBAAwB,QACnB,yCAAyC;AAChD,SACEC,YAAY,EACZC,kBAAkB,EAClBC,qBAAqB,EACrBC,wBAAwB,QACnB,mCAAmC;AAO1C,SAASC,2BAA2B,QAAQ,+BAA+B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-devkit/channel-connector",
3
- "version": "0.13.4",
3
+ "version": "0.14.0",
4
4
  "description": "Generic messaging bridge for connecting to external communication platforms",
5
5
  "keywords": [
6
6
  "ai",
@@ -9,7 +9,7 @@
9
9
  "messaging",
10
10
  "telegram"
11
11
  ],
12
- "license": "MIT",
12
+ "license": "Apache-2.0",
13
13
  "author": "",
14
14
  "repository": {
15
15
  "type": "git",