@ai-devkit/channel-connector 0.3.0 → 0.5.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.
@@ -17,8 +17,10 @@ export declare class TelegramAdapter implements ChannelAdapter {
17
17
  start(): Promise<void>;
18
18
  stop(): Promise<void>;
19
19
  /**
20
- * Send a message to a chat. Automatically chunks messages exceeding
21
- * Telegram's 4096-char limit, preferring newline boundaries.
20
+ * Input is treated as markdown and rendered as Telegram-compatible HTML.
21
+ * Long messages are chunked at paragraph boundaries when possible; very
22
+ * long single blocks (e.g. a `<pre>` over 4096 chars) may still split
23
+ * mid-tag and produce a partial render in the second chunk.
22
24
  */
23
25
  sendMessage(chatId: string, text: string): Promise<void>;
24
26
  onMessage(handler: (msg: IncomingMessage) => Promise<void>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"TelegramAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/TelegramAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAEhD,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,OAAO,CAAS;gBAEZ,OAAO,EAAE,sBAAsB;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9D,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI3D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
1
+ {"version":3,"file":"TelegramAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/TelegramAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAGhD,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,OAAO,CAAS;gBAEZ,OAAO,EAAE,sBAAsB;IAIrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe9D,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAI3D,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
@@ -2,8 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TelegramAdapter = exports.TELEGRAM_MAX_MESSAGE_LENGTH = exports.TELEGRAM_CHANNEL_TYPE = void 0;
4
4
  const telegraf_1 = require("telegraf");
5
+ const telegramHtml_1 = require("../utils/telegramHtml");
5
6
  exports.TELEGRAM_CHANNEL_TYPE = 'telegram';
6
7
  exports.TELEGRAM_MAX_MESSAGE_LENGTH = 4096;
8
+ const TELEGRAM_PARSE_MODE = 'HTML';
7
9
  /**
8
10
  * Telegram Bot API adapter using telegraf with long polling.
9
11
  */
@@ -41,13 +43,25 @@ class TelegramAdapter {
41
43
  await this.bot.stop();
42
44
  }
43
45
  /**
44
- * Send a message to a chat. Automatically chunks messages exceeding
45
- * Telegram's 4096-char limit, preferring newline boundaries.
46
+ * Input is treated as markdown and rendered as Telegram-compatible HTML.
47
+ * Long messages are chunked at paragraph boundaries when possible; very
48
+ * long single blocks (e.g. a `<pre>` over 4096 chars) may still split
49
+ * mid-tag and produce a partial render in the second chunk.
46
50
  */
47
51
  async sendMessage(chatId, text) {
48
- const chunks = chunkMessage(text, exports.TELEGRAM_MAX_MESSAGE_LENGTH);
52
+ const html = (0, telegramHtml_1.markdownToTelegramHtml)(text);
53
+ const chunks = chunkMessage(html, exports.TELEGRAM_MAX_MESSAGE_LENGTH);
49
54
  for (const chunk of chunks) {
50
- await this.bot.telegram.sendMessage(chatId, chunk);
55
+ try {
56
+ await this.bot.telegram.sendMessage(chatId, chunk, { parse_mode: TELEGRAM_PARSE_MODE });
57
+ }
58
+ catch (error) {
59
+ if (!isParseEntitiesError(error))
60
+ throw error;
61
+ // Telegram rejected the rendered HTML — fall back to plain text
62
+ // so the user still gets the content (just unformatted).
63
+ await this.bot.telegram.sendMessage(chatId, htmlToPlainText(chunk));
64
+ }
51
65
  }
52
66
  }
53
67
  onMessage(handler) {
@@ -58,14 +72,26 @@ class TelegramAdapter {
58
72
  }
59
73
  }
60
74
  exports.TelegramAdapter = TelegramAdapter;
75
+ function isParseEntitiesError(error) {
76
+ if (!error || typeof error !== 'object')
77
+ return false;
78
+ const description = error.description;
79
+ const message = error.message;
80
+ return ((description ?? '') + (message ?? '')).includes("can't parse entities");
81
+ }
82
+ function htmlToPlainText(html) {
83
+ return html
84
+ .replace(/<[^>]+>/g, '')
85
+ .replace(/&lt;/g, '<')
86
+ .replace(/&gt;/g, '>')
87
+ .replace(/&quot;/g, '"')
88
+ .replace(/&amp;/g, '&');
89
+ }
61
90
  /**
62
- * Split text into chunks of maxLen or fewer characters,
63
- * preferring to split at newline boundaries.
91
+ * Split text into chunks of maxLen or fewer characters. Prefers paragraph
92
+ * boundaries (\n\n), then single newlines (\n), then hard-splits at maxLen.
64
93
  */
65
94
  function chunkMessage(text, maxLen) {
66
- if (text.length <= maxLen) {
67
- return [text];
68
- }
69
95
  const chunks = [];
70
96
  let remaining = text;
71
97
  while (remaining.length > 0) {
@@ -73,15 +99,16 @@ function chunkMessage(text, maxLen) {
73
99
  chunks.push(remaining);
74
100
  break;
75
101
  }
76
- // Find the last newline within the limit
77
- const searchArea = remaining.slice(0, maxLen);
78
- const lastNewline = searchArea.lastIndexOf('\n');
102
+ const lastParagraph = remaining.lastIndexOf('\n\n', maxLen - 2);
103
+ const lastNewline = remaining.lastIndexOf('\n', maxLen - 1);
79
104
  let splitAt;
80
- if (lastNewline > 0) {
81
- splitAt = lastNewline + 1; // include the newline in the current chunk
105
+ if (lastParagraph > 0) {
106
+ splitAt = lastParagraph + 2;
107
+ }
108
+ else if (lastNewline > 0) {
109
+ splitAt = lastNewline + 1;
82
110
  }
83
111
  else {
84
- // No newline found — hard split at maxLen
85
112
  splitAt = maxLen;
86
113
  }
87
114
  chunks.push(remaining.slice(0, splitAt));
@@ -1 +1 @@
1
- {"version":3,"file":"TelegramAdapter.js","sourceRoot":"","sources":["../../src/adapters/TelegramAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TelegramAdapter.js","sourceRoot":"","sources":["../../src/adapters/TelegramAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Convert markdown to Telegram-compatible HTML (uses only the tag subset
3
+ * Telegram's Bot API accepts for parse_mode: 'HTML').
4
+ */
5
+ export declare function markdownToTelegramHtml(markdown: string): string;
6
+ //# sourceMappingURL=telegramHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegramHtml.d.ts","sourceRoot":"","sources":["../../src/utils/telegramHtml.ts"],"names":[],"mappings":"AAwFA;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.markdownToTelegramHtml = markdownToTelegramHtml;
4
+ const marked_1 = require("marked");
5
+ const escapeHtml = (s) => s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
6
+ const escapeUrl = (s) => s.replace(/&/g, '&amp;').replace(/"/g, '&quot;');
7
+ const renderer = {
8
+ heading({ tokens }) {
9
+ return `<b>${this.parser.parseInline(tokens)}</b>\n\n`;
10
+ },
11
+ paragraph({ tokens }) {
12
+ return `${this.parser.parseInline(tokens)}\n\n`;
13
+ },
14
+ strong({ tokens }) {
15
+ return `<b>${this.parser.parseInline(tokens)}</b>`;
16
+ },
17
+ em({ tokens }) {
18
+ return `<i>${this.parser.parseInline(tokens)}</i>`;
19
+ },
20
+ del({ tokens }) {
21
+ return `<s>${this.parser.parseInline(tokens)}</s>`;
22
+ },
23
+ codespan({ text }) {
24
+ return `<code>${escapeHtml(text)}</code>`;
25
+ },
26
+ code({ text, lang }) {
27
+ const langAttr = lang ? ` class="language-${escapeHtml(lang.split(/\s/)[0])}"` : '';
28
+ return `<pre><code${langAttr}>${escapeHtml(text)}</code></pre>\n\n`;
29
+ },
30
+ link({ href, tokens }) {
31
+ return `<a href="${escapeUrl(href)}">${this.parser.parseInline(tokens)}</a>`;
32
+ },
33
+ image({ href, text }) {
34
+ const label = text || href;
35
+ return `<a href="${escapeUrl(href)}">${escapeHtml(label)}</a>`;
36
+ },
37
+ list({ items, ordered, start }) {
38
+ const startNum = typeof start === 'number' ? start : 1;
39
+ const lines = items.map((item, i) => {
40
+ const marker = ordered ? `${startNum + i}.` : '•';
41
+ const inner = this.parser.parseInline(item.tokens).trimEnd();
42
+ return `${marker} ${inner}`;
43
+ });
44
+ return `${lines.join('\n')}\n\n`;
45
+ },
46
+ listitem(item) {
47
+ return this.parser.parseInline(item.tokens);
48
+ },
49
+ blockquote({ tokens }) {
50
+ return `<blockquote>${this.parser.parse(tokens).trimEnd()}</blockquote>\n\n`;
51
+ },
52
+ table({ header, rows }) {
53
+ const headerCells = header.map((c) => c.text);
54
+ const bodyRows = rows.map((row) => row.map((c) => c.text));
55
+ const widths = headerCells.map((h, i) => Math.max(h.length, ...bodyRows.map((row) => (row[i] ?? '').length)));
56
+ const pad = (cells) => cells.map((c, i) => c.padEnd(widths[i] ?? 0)).join(' | ');
57
+ const lines = [
58
+ pad(headerCells),
59
+ widths.map((w) => '-'.repeat(w)).join('-+-'),
60
+ ...bodyRows.map(pad),
61
+ ];
62
+ return `<pre>${escapeHtml(lines.join('\n'))}</pre>\n\n`;
63
+ },
64
+ hr() {
65
+ return '———\n\n';
66
+ },
67
+ br() {
68
+ return '\n';
69
+ },
70
+ html() {
71
+ return '';
72
+ },
73
+ text(token) {
74
+ if ('tokens' in token && token.tokens) {
75
+ return this.parser.parseInline(token.tokens);
76
+ }
77
+ return escapeHtml(token.text);
78
+ },
79
+ };
80
+ const marked = new marked_1.Marked({ renderer });
81
+ /**
82
+ * Convert markdown to Telegram-compatible HTML (uses only the tag subset
83
+ * Telegram's Bot API accepts for parse_mode: 'HTML').
84
+ */
85
+ function markdownToTelegramHtml(markdown) {
86
+ return marked.parse(markdown, { async: false }).trimEnd();
87
+ }
88
+ //# sourceMappingURL=telegramHtml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegramHtml.js","sourceRoot":"","sources":["../../src/utils/telegramHtml.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "nx": {
4
4
  "name": "channel-connector"
5
5
  },
6
- "version": "0.3.0",
6
+ "version": "0.5.0",
7
7
  "description": "Generic messaging bridge for connecting to external communication platforms",
8
8
  "main": "dist/index.js",
9
9
  "types": "dist/index.d.ts",
@@ -31,6 +31,7 @@
31
31
  "author": "",
32
32
  "license": "MIT",
33
33
  "dependencies": {
34
+ "marked": "^15.0.12",
34
35
  "telegraf": "^4.16.3"
35
36
  },
36
37
  "devDependencies": {