dsh-connect 0.7.2 → 0.8.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.
Files changed (114) hide show
  1. package/README.md +68 -32
  2. package/README.zh.md +67 -31
  3. package/client/client.js +387 -0
  4. package/client/client.js.map +7 -0
  5. package/client/settings-client.mjs +177 -0
  6. package/examples/minimal.config.json +16 -0
  7. package/lib/channels/dingtalk/adapter.d.ts +59 -0
  8. package/lib/channels/dingtalk/adapter.d.ts.map +1 -0
  9. package/lib/channels/dingtalk/adapter.js +123 -0
  10. package/lib/channels/dingtalk/adapter.js.map +1 -0
  11. package/lib/channels/dingtalk/i18n.d.ts +14 -0
  12. package/lib/channels/dingtalk/i18n.d.ts.map +1 -0
  13. package/lib/channels/dingtalk/i18n.js +16 -0
  14. package/lib/channels/dingtalk/i18n.js.map +1 -0
  15. package/lib/channels/dingtalk/index.d.ts +127 -0
  16. package/lib/channels/dingtalk/index.d.ts.map +1 -0
  17. package/lib/channels/dingtalk/index.js +144 -0
  18. package/lib/channels/dingtalk/index.js.map +1 -0
  19. package/lib/channels/dingtalk/message.d.ts +49 -0
  20. package/lib/channels/dingtalk/message.d.ts.map +1 -0
  21. package/lib/channels/dingtalk/message.js +43 -0
  22. package/lib/channels/dingtalk/message.js.map +1 -0
  23. package/lib/channels/dingtalk/stomp.d.ts +36 -0
  24. package/lib/channels/dingtalk/stomp.d.ts.map +1 -0
  25. package/lib/channels/dingtalk/stomp.js +107 -0
  26. package/lib/channels/dingtalk/stomp.js.map +1 -0
  27. package/lib/channels/dingtalk/stream.d.ts +53 -0
  28. package/lib/channels/dingtalk/stream.d.ts.map +1 -0
  29. package/lib/channels/dingtalk/stream.js +199 -0
  30. package/lib/channels/dingtalk/stream.js.map +1 -0
  31. package/lib/channels/dingtalk/webhook.d.ts +84 -0
  32. package/lib/channels/dingtalk/webhook.d.ts.map +1 -0
  33. package/lib/channels/dingtalk/webhook.js +143 -0
  34. package/lib/channels/dingtalk/webhook.js.map +1 -0
  35. package/lib/channels/feishu/adapter.d.ts +139 -0
  36. package/lib/channels/feishu/adapter.d.ts.map +1 -0
  37. package/lib/channels/feishu/adapter.js +677 -0
  38. package/lib/channels/feishu/adapter.js.map +1 -0
  39. package/lib/channels/feishu/i18n.d.ts +28 -0
  40. package/lib/channels/feishu/i18n.d.ts.map +1 -0
  41. package/lib/channels/feishu/i18n.js +40 -0
  42. package/lib/channels/feishu/i18n.js.map +1 -0
  43. package/lib/channels/feishu/index.d.ts +61 -0
  44. package/lib/channels/feishu/index.d.ts.map +1 -0
  45. package/lib/channels/feishu/index.js +77 -0
  46. package/lib/channels/feishu/index.js.map +1 -0
  47. package/lib/channels/feishu/onboard.d.ts +16 -0
  48. package/lib/channels/feishu/onboard.d.ts.map +1 -0
  49. package/lib/channels/feishu/onboard.js +86 -0
  50. package/lib/channels/feishu/onboard.js.map +1 -0
  51. package/lib/channels/telegram/adapter.d.ts +70 -0
  52. package/lib/channels/telegram/adapter.d.ts.map +1 -0
  53. package/lib/channels/telegram/adapter.js +454 -0
  54. package/lib/channels/telegram/adapter.js.map +1 -0
  55. package/lib/channels/telegram/client.d.ts +115 -0
  56. package/lib/channels/telegram/client.d.ts.map +1 -0
  57. package/lib/channels/telegram/client.js +198 -0
  58. package/lib/channels/telegram/client.js.map +1 -0
  59. package/lib/channels/telegram/i18n.d.ts +14 -0
  60. package/lib/channels/telegram/i18n.d.ts.map +1 -0
  61. package/lib/channels/telegram/i18n.js +18 -0
  62. package/lib/channels/telegram/i18n.js.map +1 -0
  63. package/lib/channels/telegram/index.d.ts +46 -0
  64. package/lib/channels/telegram/index.d.ts.map +1 -0
  65. package/lib/channels/telegram/index.js +54 -0
  66. package/lib/channels/telegram/index.js.map +1 -0
  67. package/lib/channels/web/adapter.d.ts +103 -0
  68. package/lib/channels/web/adapter.d.ts.map +1 -0
  69. package/lib/channels/web/adapter.js +161 -0
  70. package/lib/channels/web/adapter.js.map +1 -0
  71. package/lib/channels/web/index.d.ts +47 -0
  72. package/lib/channels/web/index.d.ts.map +1 -0
  73. package/lib/channels/web/index.js +59 -0
  74. package/lib/channels/web/index.js.map +1 -0
  75. package/lib/index.d.ts +68 -11
  76. package/lib/index.d.ts.map +1 -1
  77. package/lib/index.js +141 -8
  78. package/lib/index.js.map +1 -1
  79. package/lib/runner.d.ts +1 -2
  80. package/lib/runner.d.ts.map +1 -1
  81. package/lib/runner.js.map +1 -1
  82. package/lib/service.d.ts +1 -1
  83. package/lib/service.d.ts.map +1 -1
  84. package/lib/service.js +1 -1
  85. package/lib/service.js.map +1 -1
  86. package/lib/settings/channels.d.ts +51 -0
  87. package/lib/settings/channels.d.ts.map +1 -0
  88. package/lib/settings/channels.js +101 -0
  89. package/lib/settings/channels.js.map +1 -0
  90. package/lib/settings/credential-store.d.ts +39 -0
  91. package/lib/settings/credential-store.d.ts.map +1 -0
  92. package/lib/settings/credential-store.js +68 -0
  93. package/lib/settings/credential-store.js.map +1 -0
  94. package/lib/settings/index.d.ts +14 -0
  95. package/lib/settings/index.d.ts.map +1 -0
  96. package/lib/settings/index.js +14 -0
  97. package/lib/settings/index.js.map +1 -0
  98. package/lib/settings/rpc-client.d.ts +36 -0
  99. package/lib/settings/rpc-client.d.ts.map +1 -0
  100. package/lib/settings/rpc-client.js +45 -0
  101. package/lib/settings/rpc-client.js.map +1 -0
  102. package/lib/settings/settings-model.d.ts +107 -0
  103. package/lib/settings/settings-model.d.ts.map +1 -0
  104. package/lib/settings/settings-model.js +110 -0
  105. package/lib/settings/settings-model.js.map +1 -0
  106. package/lib/settings/settings-rpc.d.ts +62 -0
  107. package/lib/settings/settings-rpc.d.ts.map +1 -0
  108. package/lib/settings/settings-rpc.js +90 -0
  109. package/lib/settings/settings-rpc.js.map +1 -0
  110. package/lib/settings/settings-service.d.ts +27 -0
  111. package/lib/settings/settings-service.d.ts.map +1 -0
  112. package/lib/settings/settings-service.js +103 -0
  113. package/lib/settings/settings-service.js.map +1 -0
  114. package/package.json +48 -6
@@ -0,0 +1,454 @@
1
+ import { TelegramClient, telegramFileMethod } from "./client.js";
2
+ import { telegramMessages } from "./i18n.js";
3
+ const CHOICE_TIMEOUT_MS = 60_000;
4
+ /** Key a pending choice by chat + option so concurrent menus never collide. */
5
+ function choiceKey(chatId, optionId) {
6
+ return `${chatId}\u0000${optionId}`;
7
+ }
8
+ /** Encode chatId + messageId into the opaque message id the core passes around. */
9
+ export function encodeMessageRef(chatId, messageId) {
10
+ return `${chatId}:${messageId}`;
11
+ }
12
+ /** Split an opaque message ref back into chatId + messageId. */
13
+ export function decodeMessageRef(ref) {
14
+ const idx = ref.lastIndexOf(":");
15
+ const chatId = idx >= 0 ? ref.slice(0, idx) : ref;
16
+ const messageId = idx >= 0 ? Number(ref.slice(idx + 1)) : Number(ref);
17
+ return { chatId, messageId: Number.isFinite(messageId) ? messageId : NaN };
18
+ }
19
+ /** Escape text for Telegram HTML parse mode (only `& < >` need escaping). */
20
+ export function escapeHtml(text) {
21
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
22
+ }
23
+ /** Convert plain markdown (bold/italic/inline code/code blocks/headings/links) to Telegram HTML. */
24
+ export function markdownToTelegramHtml(markdown) {
25
+ // Token-based conversion: plain text is escaped as-is (Telegram HTML mode
26
+ // rejects unescaped `& < >` anywhere), then markdown spans are converted and
27
+ // their inner content escaped too. Everything the LLM writes — "R&D",
28
+ // "x < y", fenced ```code``` blocks — survives without breaking parse mode.
29
+ let html = "";
30
+ let i = 0;
31
+ const n = markdown.length;
32
+ const MARKERS = ["*", "`", "[", "#"];
33
+ while (i < n) {
34
+ // Skip ahead to the next potential marker, escaping plain text in bulk.
35
+ let next = n;
36
+ for (const m of MARKERS) {
37
+ const idx = markdown.indexOf(m, i);
38
+ if (idx !== -1 && idx < next)
39
+ next = idx;
40
+ }
41
+ if (next > i) {
42
+ html += escapeHtml(markdown.slice(i, next));
43
+ i = next;
44
+ }
45
+ if (i >= n)
46
+ break;
47
+ const rest = markdown.slice(i);
48
+ // Fenced code block (```lang\n...\n```) — inner text fully escaped.
49
+ const fence = rest.match(/^```[^\n]*\n([\s\S]*?)(?:```|$)/);
50
+ if (fence !== null) {
51
+ html += `<pre>${escapeHtml(fence[1])}</pre>`;
52
+ i += fence[0].length;
53
+ continue;
54
+ }
55
+ // Inline code.
56
+ const inline = rest.match(/^`([^`\n]+)`/);
57
+ if (inline !== null) {
58
+ html += `<code>${escapeHtml(inline[1])}</code>`;
59
+ i += inline[0].length;
60
+ continue;
61
+ }
62
+ // Bold.
63
+ const bold = rest.match(/^\*\*([^*\n]+)\*\*/);
64
+ if (bold !== null) {
65
+ html += `<b>${escapeHtml(bold[1])}</b>`;
66
+ i += bold[0].length;
67
+ continue;
68
+ }
69
+ // Italic (single asterisk, not part of a bold pair).
70
+ const italic = rest.match(/^\*([^*\n]+)\*/);
71
+ if (italic !== null) {
72
+ html += `<i>${escapeHtml(italic[1])}</i>`;
73
+ i += italic[0].length;
74
+ continue;
75
+ }
76
+ // Link [label](url) — the href is escaped to survive HTML attribute parsing.
77
+ const link = rest.match(/^\[([^\]]+)\]\(([^)\s]+)\)/);
78
+ if (link !== null) {
79
+ html += `<a href="${escapeHtml(link[2])}">${escapeHtml(link[1])}</a>`;
80
+ i += link[0].length;
81
+ continue;
82
+ }
83
+ // Heading — only at the start of a line.
84
+ const atLineStart = i === 0 || markdown[i - 1] === "\n";
85
+ const heading = rest.match(/^#{1,6}\s+([^\n]+)/);
86
+ if (atLineStart && heading !== null) {
87
+ html += `<b>${escapeHtml(heading[1])}</b>`;
88
+ i += heading[0].length;
89
+ continue;
90
+ }
91
+ // Not a real marker after all — emit the character escaped.
92
+ html += escapeHtml(markdown[i]);
93
+ i += 1;
94
+ }
95
+ return html;
96
+ }
97
+ /** Render @-mentions into HTML (tg://user?id= links). */
98
+ function mentionHtml(users) {
99
+ return users
100
+ .map((id) => `<a href="tg://user?id=${id}">@</a>`)
101
+ .join(" ");
102
+ }
103
+ /** Build the inline-keyboard reply_markup for a choice prompt. */
104
+ export function buildInlineKeyboard(options, columnsPerRow) {
105
+ const rows = [];
106
+ for (let i = 0; i < options.length; i += columnsPerRow) {
107
+ const group = options.slice(i, i + columnsPerRow);
108
+ rows.push(group.map((o) => ({ text: o.label, callback_data: `choice:${o.id}` })));
109
+ }
110
+ return { inline_keyboard: rows };
111
+ }
112
+ /** Pick a callback data prefix that won't collide with menu ids. */
113
+ const CHOICE_PREFIX = "choice:";
114
+ export class TelegramAdapter {
115
+ logger;
116
+ id = "telegram";
117
+ client;
118
+ t;
119
+ requireMention;
120
+ pendingChoices = new Map();
121
+ handler;
122
+ pollPromise;
123
+ stopped = false;
124
+ /** The bot's own user id (from getMe) — used for precise mention/reply checks. */
125
+ botId;
126
+ /** The bot's username (from getMe) — used to verify @-mentions. */
127
+ botUsername;
128
+ constructor(config, logger) {
129
+ this.logger = logger;
130
+ const botToken = config.botToken ?? process.env.TELEGRAM_BOT_TOKEN;
131
+ if (!botToken) {
132
+ throw new Error(telegramMessages(config.language ?? "zh").tokenMissing);
133
+ }
134
+ this.t = telegramMessages(config.language ?? "zh");
135
+ this.requireMention = config.requireMention ?? true;
136
+ this.client = new TelegramClient({
137
+ botToken,
138
+ ...(config.pollingTimeoutSeconds === undefined ? {} : { pollingTimeoutSeconds: config.pollingTimeoutSeconds }),
139
+ ...(config.baseUrl === undefined ? {} : { baseUrl: config.baseUrl }),
140
+ });
141
+ }
142
+ onInbound(handler) {
143
+ this.handler = handler;
144
+ }
145
+ async start() {
146
+ this.stopped = false;
147
+ // Resolve the bot's own identity for precise mention/reply checks. On
148
+ // failure, fall back to a permissive heuristic (logged so it's observable).
149
+ try {
150
+ const me = await this.client.getMe();
151
+ this.botId = me.id;
152
+ this.botUsername = me.username;
153
+ }
154
+ catch (error) {
155
+ this.logger?.warn?.(`connect-telegram: getMe failed: ${String(error)} — mention checks use a permissive fallback`);
156
+ }
157
+ // Skip the backlog: don't replay old messages on (re)connect. A failure
158
+ // here leaves offset=0 and would replay history — log it instead of hiding.
159
+ try {
160
+ await this.client.resetOffset();
161
+ }
162
+ catch (error) {
163
+ this.logger?.warn?.(`connect-telegram: resetOffset failed (old messages may be replayed): ${String(error)}`);
164
+ }
165
+ const loop = async () => {
166
+ while (!this.stopped) {
167
+ try {
168
+ const updates = await this.client.pollUpdates();
169
+ for (const update of updates) {
170
+ // Confirm the offset per update AFTER it is handled, so a failure
171
+ // mid-batch never drops the remaining updates.
172
+ try {
173
+ await this.handleUpdate(update);
174
+ }
175
+ catch (error) {
176
+ this.logger?.warn?.(`connect-telegram: update ${update.update_id} failed: ${error instanceof Error ? error.message : String(error)}`);
177
+ }
178
+ this.client.confirmOffset(update.update_id);
179
+ }
180
+ }
181
+ catch (error) {
182
+ this.logger?.warn?.(this.t.pollFailed(error instanceof Error ? error.message : String(error)));
183
+ await sleep(this.client.config.retryDelayMs ?? 3_000);
184
+ }
185
+ }
186
+ };
187
+ this.pollPromise = loop();
188
+ }
189
+ async stop() {
190
+ this.stopped = true;
191
+ // The in-flight getUpdates will settle (server closes or times out); wait briefly.
192
+ const p = this.pollPromise;
193
+ if (p !== undefined)
194
+ await Promise.race([p, sleep(1000)]).catch(() => undefined);
195
+ }
196
+ async handleUpdate(update) {
197
+ if (update.callback_query !== undefined) {
198
+ await this.handleCallbackQuery(update.callback_query);
199
+ return;
200
+ }
201
+ // Only fresh messages are processed. `edited_message` (including the bot's
202
+ // own streamed edits) is ignored — otherwise every in-place stream edit
203
+ // would re-trigger an agent turn.
204
+ const message = update.message;
205
+ if (message === undefined)
206
+ return;
207
+ const normalized = await this.normalizeMessage(message);
208
+ if (normalized !== undefined)
209
+ await this.handler?.(normalized);
210
+ }
211
+ async handleCallbackQuery(query) {
212
+ const data = query.data ?? "";
213
+ if (!data.startsWith(CHOICE_PREFIX)) {
214
+ await this.client.answerCallbackQuery(query.id).catch(() => undefined);
215
+ return;
216
+ }
217
+ const choiceId = data.slice(CHOICE_PREFIX.length);
218
+ const queryChatId = query.message?.chat !== undefined ? String(query.message.chat.id) : undefined;
219
+ // Pending entries are keyed by (chat, option) so concurrent menus in
220
+ // different chats never overwrite each other.
221
+ const pending = queryChatId === undefined ? undefined : this.pendingChoices.get(choiceKey(queryChatId, choiceId));
222
+ if (pending !== undefined) {
223
+ // `resolve` is the prompt's settle(): clears its keys and the timer.
224
+ pending.resolve(choiceId);
225
+ await this.client.answerCallbackQuery(query.id, this.t.choiceDone).catch(() => undefined);
226
+ }
227
+ else {
228
+ await this.client.answerCallbackQuery(query.id, this.t.choiceExpired).catch(() => undefined);
229
+ }
230
+ }
231
+ /** Normalize a Telegram message into dsh-connect's InboundMessage; returns undefined when ignored. */
232
+ async normalizeMessage(message) {
233
+ // Never echo-loop: Telegram delivers the bot's own messages back through
234
+ // getUpdates, and treating them as inbound would re-trigger the agent on
235
+ // every ack / reply / summary card.
236
+ if (message.from?.is_bot === true)
237
+ return undefined;
238
+ const chat = message.chat;
239
+ const chatId = String(chat.id);
240
+ const chatType = chat.type === "private" ? "p2p" : "group";
241
+ const senderKey = message.from === undefined ? chatId : String(message.from.id);
242
+ const text = message.text ?? message.caption ?? "";
243
+ // Group mention policy: require an @-mention of this bot (or a reply to it).
244
+ if (chatType === "group" && this.requireMention && !isBotMentioned(message, text, this.botUsername, this.botId)) {
245
+ return undefined;
246
+ }
247
+ // Download attached images / files / audio / video.
248
+ const images = [];
249
+ const files = [];
250
+ let imageError;
251
+ let fileError;
252
+ if (message.photo !== undefined && message.photo.length > 0) {
253
+ const largest = message.photo[message.photo.length - 1];
254
+ const res = await this.client.downloadFileToTemp(largest.file_id, `photo_${largest.file_unique_id}.jpg`);
255
+ if (res.error !== undefined)
256
+ imageError = res.error;
257
+ else if (res.path !== "")
258
+ images.push(res.path);
259
+ }
260
+ const media = message.document ?? message.voice ?? message.video ?? message.audio;
261
+ if (media !== undefined) {
262
+ const name = message.document?.file_name ?? `${media.file_id}.${media === message.voice ? "ogg" : media === message.video ? "mp4" : "mp3"}`;
263
+ const res = await this.client.downloadFileToTemp(media.file_id, name);
264
+ if (res.error !== undefined)
265
+ fileError = res.error;
266
+ else if (res.path !== "")
267
+ files.push(res.path);
268
+ }
269
+ // A message with no text and no media has nothing for the agent — ignore
270
+ // (e.g. stickers, service messages) instead of running an empty turn.
271
+ if (text.trim() === "" && images.length === 0 && files.length === 0)
272
+ return undefined;
273
+ return {
274
+ channel: "telegram",
275
+ chatKey: chatId,
276
+ chatType,
277
+ senderKey,
278
+ text,
279
+ ...(message.reply_to_message === undefined ? {} : { replyRef: String(message.reply_to_message.message_id) }),
280
+ ...(images.length > 0 ? { images } : {}),
281
+ ...(files.length > 0 ? { files } : {}),
282
+ ...(imageError === undefined ? {} : { imageError }),
283
+ ...(fileError === undefined ? {} : { fileError }),
284
+ };
285
+ }
286
+ async sendText(target, text) {
287
+ const html = markdownToTelegramHtml(text);
288
+ await this.client.sendMessage(target.chatKey, html, {
289
+ parse_mode: "HTML",
290
+ ...(target.replyRef === undefined ? {} : { reply_to_message_id: Number(target.replyRef) }),
291
+ disable_web_page_preview: true,
292
+ });
293
+ }
294
+ async sendCard(target, card) {
295
+ const html = markdownToTelegramHtml(card.markdown);
296
+ const atPrefix = target.atUsers !== undefined && target.atUsers.length > 0 ? `${mentionHtml(target.atUsers)}\n` : "";
297
+ await this.client.sendMessage(target.chatKey, `${atPrefix}${html}`, {
298
+ parse_mode: "HTML",
299
+ ...(target.replyRef === undefined ? {} : { reply_to_message_id: Number(target.replyRef) }),
300
+ disable_web_page_preview: true,
301
+ });
302
+ }
303
+ async sendFile(target, filePath, options) {
304
+ const filename = options?.filename ?? filePath.split(/[\\/]/).pop() ?? "file";
305
+ const replyTo = target.replyRef === undefined ? undefined : Number(target.replyRef);
306
+ if (telegramFileMethod(filename) === "sendPhoto") {
307
+ await this.client.sendPhoto(target.chatKey, filePath, undefined, { reply_to_message_id: replyTo });
308
+ }
309
+ else {
310
+ await this.client.sendDocument(target.chatKey, filePath, { reply_to_message_id: replyTo });
311
+ }
312
+ }
313
+ async streamText(target, chunks) {
314
+ // editMessageText REPLACES the whole message text, so the stream must
315
+ // accumulate the full answer and send the complete text on every flush —
316
+ // sending only the incremental delta would wipe the earlier content.
317
+ let messageId;
318
+ let fullText = "";
319
+ let lastFlushAt = 0;
320
+ const chatId = target.chatKey;
321
+ const sendOpts = {
322
+ parse_mode: "HTML",
323
+ ...(target.replyRef === undefined ? {} : { reply_to_message_id: Number(target.replyRef) }),
324
+ disable_web_page_preview: true,
325
+ };
326
+ const flush = async () => {
327
+ if (fullText === "")
328
+ return;
329
+ // Telegram caps a message at 4096 characters; truncate (with a marker)
330
+ // so a long answer still delivers instead of failing to send.
331
+ const MAX_TEXT = 4000;
332
+ const body = fullText.length > MAX_TEXT ? `${fullText.slice(0, MAX_TEXT)}\n\n…` : fullText;
333
+ const html = markdownToTelegramHtml(body);
334
+ try {
335
+ if (messageId === undefined) {
336
+ const sent = await this.client.sendMessage(chatId, html, sendOpts);
337
+ messageId = sent.message_id;
338
+ }
339
+ else {
340
+ await this.client.editMessageText(Number(chatId), messageId, html, { parse_mode: "HTML" });
341
+ }
342
+ lastFlushAt = Date.now();
343
+ }
344
+ catch (error) {
345
+ // Keep `fullText` intact: a transient failure (429, network) is retried
346
+ // by the next flush carrying the full text — content is never dropped.
347
+ this.logger?.warn?.(`connect-telegram: stream flush failed: ${error instanceof Error ? error.message : String(error)}`);
348
+ }
349
+ };
350
+ for await (const chunk of chunks) {
351
+ fullText += chunk;
352
+ const now = Date.now();
353
+ // Throttle: flush at most every ~700ms, but force a flush past 4KB.
354
+ if (fullText.length >= 4096) {
355
+ await flush();
356
+ }
357
+ else if (fullText.length >= 200 && now - lastFlushAt >= 700) {
358
+ await flush();
359
+ }
360
+ }
361
+ await flush();
362
+ }
363
+ async promptChoice(target, prompt, updateMessageId) {
364
+ const keyboard = buildInlineKeyboard(prompt.options, prompt.columnsPerRow ?? 2);
365
+ const title = `<b>${escapeHtml(prompt.title)}</b>`;
366
+ const desc = prompt.description === undefined ? "" : `\n${escapeHtml(prompt.description)}`;
367
+ const text = `${title}${desc}`;
368
+ const chatId = target.chatKey;
369
+ let messageId;
370
+ if (updateMessageId !== undefined) {
371
+ const ref = decodeMessageRef(updateMessageId);
372
+ messageId = ref.messageId;
373
+ await this.client.editMessageText(ref.chatId, messageId, text, {
374
+ parse_mode: "HTML",
375
+ reply_markup: keyboard,
376
+ });
377
+ }
378
+ else {
379
+ const sent = await this.client.sendMessage(chatId, text, {
380
+ parse_mode: "HTML",
381
+ reply_markup: keyboard,
382
+ });
383
+ messageId = sent.message_id;
384
+ }
385
+ // One pending record per (chat, option) key — concurrent menus in different
386
+ // chats never collide. Timeout resolves `undefined` (dismiss) and replaces
387
+ // the stale keyboard with an expired notice (parity with Feishu).
388
+ return new Promise((resolve) => {
389
+ const registered = prompt.options.map((o) => choiceKey(chatId, o.id));
390
+ const settle = (choice) => {
391
+ clearTimeout(timer);
392
+ for (const key of registered)
393
+ this.pendingChoices.delete(key);
394
+ resolve({ choice, messageId: encodeMessageRef(chatId, messageId) });
395
+ };
396
+ const timer = setTimeout(() => {
397
+ void this.client
398
+ .editMessageText(Number(chatId), messageId, `<i>${escapeHtml(this.t.menuExpired)}</i>`, { parse_mode: "HTML" })
399
+ .catch(() => undefined);
400
+ settle(undefined);
401
+ }, CHOICE_TIMEOUT_MS);
402
+ for (const key of registered) {
403
+ this.pendingChoices.set(key, { chatId, keys: registered, resolve: settle, timer });
404
+ }
405
+ });
406
+ }
407
+ async closeMenu(messageId, summary) {
408
+ const ref = decodeMessageRef(messageId);
409
+ if (Number.isNaN(ref.messageId))
410
+ return;
411
+ try {
412
+ await this.client.editMessageText(ref.chatId, ref.messageId, escapeHtml(summary), { parse_mode: "HTML" });
413
+ }
414
+ catch {
415
+ // Best-effort: the menu may already be gone.
416
+ }
417
+ }
418
+ }
419
+ /** True when the message mentions this bot: a reply to it, or an @-mention of its username. */
420
+ export function isBotMentioned(message, text, botUsername, botId) {
421
+ // A reply counts as a mention only when it targets this bot (or any bot,
422
+ // when the bot's own id is unknown) — replying to an arbitrary user in a
423
+ // group must not trigger the agent.
424
+ if (message.reply_to_message !== undefined) {
425
+ const replied = message.reply_to_message.from;
426
+ if (botId !== undefined)
427
+ return replied?.id === botId;
428
+ return replied?.is_bot === true;
429
+ }
430
+ // @-mention entities: match against the bot's username when known; otherwise
431
+ // accept any mention entity (permissive fallback).
432
+ const entities = message.entities ?? [];
433
+ for (const e of entities) {
434
+ if (e.type !== "mention")
435
+ continue;
436
+ const mention = text.slice(e.offset, e.offset + e.length);
437
+ if (botUsername === undefined)
438
+ return true;
439
+ if (mention.toLowerCase() === `@${botUsername.toLowerCase()}`)
440
+ return true;
441
+ }
442
+ // Clients without entities (rare): a leading @-mention that names the bot.
443
+ if (/^\s*@/.test(text)) {
444
+ if (botUsername === undefined)
445
+ return true;
446
+ const m = text.match(/^\s*@([A-Za-z0-9_]+)/);
447
+ return m !== null && m[1].toLowerCase() === botUsername.toLowerCase();
448
+ }
449
+ return false;
450
+ }
451
+ function sleep(ms) {
452
+ return new Promise((resolve) => setTimeout(resolve, ms));
453
+ }
454
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/channels/telegram/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /** Raw Telegram update (subset of the full schema we use). */
2
+ export interface TelegramUpdate {
3
+ update_id: number;
4
+ message?: TelegramMessage;
5
+ callback_query?: TelegramCallbackQuery;
6
+ }
7
+ export interface TelegramMessage {
8
+ message_id: number;
9
+ chat: {
10
+ id: number;
11
+ type: string;
12
+ title?: string;
13
+ };
14
+ from?: {
15
+ id: number;
16
+ is_bot?: boolean;
17
+ first_name?: string;
18
+ username?: string;
19
+ };
20
+ text?: string;
21
+ caption?: string;
22
+ reply_to_message?: TelegramMessage;
23
+ entities?: {
24
+ type: string;
25
+ offset: number;
26
+ length: number;
27
+ }[];
28
+ photo?: {
29
+ file_id: string;
30
+ file_unique_id: string;
31
+ width: number;
32
+ height: number;
33
+ }[];
34
+ document?: {
35
+ file_id: string;
36
+ file_name?: string;
37
+ };
38
+ voice?: {
39
+ file_id: string;
40
+ };
41
+ video?: {
42
+ file_id: string;
43
+ };
44
+ audio?: {
45
+ file_id: string;
46
+ };
47
+ sticker?: {
48
+ file_id: string;
49
+ };
50
+ }
51
+ export interface TelegramCallbackQuery {
52
+ id: string;
53
+ from: {
54
+ id: number;
55
+ username?: string;
56
+ };
57
+ message?: TelegramMessage;
58
+ data?: string;
59
+ }
60
+ /** Options accepted by `sendMessage` (parse_mode, reply_markup, …). */
61
+ export interface SendMessageOptions {
62
+ parse_mode?: "HTML" | "MarkdownV2";
63
+ reply_to_message_id?: number;
64
+ reply_markup?: unknown;
65
+ disable_web_page_preview?: boolean;
66
+ }
67
+ export interface TelegramClientConfig {
68
+ botToken: string;
69
+ /** getUpdates polling timeout (seconds). Default 50. */
70
+ pollingTimeoutSeconds?: number;
71
+ /** getUpdates long-poll gap after an error. Default 3s. */
72
+ retryDelayMs?: number;
73
+ /** HTTP timeout for each API call (ms). Default 15s. */
74
+ timeoutMs?: number;
75
+ /** Optional base URL override (e.g. for a local Bot API server). */
76
+ baseUrl?: string;
77
+ }
78
+ /** Normalized photo/file location after download. */
79
+ export interface DownloadedResource {
80
+ path: string;
81
+ kind: "image" | "file";
82
+ error?: string;
83
+ }
84
+ export declare class TelegramClient {
85
+ readonly config: TelegramClientConfig;
86
+ private offset;
87
+ constructor(config: TelegramClientConfig);
88
+ private base;
89
+ private call;
90
+ /** Long-poll for new updates. Does NOT advance the offset — the caller confirms each update via {@link confirmOffset} after processing it, so a failure mid-batch never loses the remaining updates. */
91
+ pollUpdates(): Promise<TelegramUpdate[]>;
92
+ /** Advance the polling offset past `updateId` — call only after the update was fully handled. */
93
+ confirmOffset(updateId: number): void;
94
+ /** Skip all pending updates (used on startup so we don't replay history). */
95
+ resetOffset(): Promise<void>;
96
+ /** Fetch the bot's own identity (id + username) — used for @-mention / reply-to checks. */
97
+ getMe(): Promise<{
98
+ id: number;
99
+ username?: string;
100
+ }>;
101
+ sendMessage(chatId: number | string, text: string, opts?: SendMessageOptions): Promise<TelegramMessage>;
102
+ editMessageText(chatId: number | string, messageId: number, text: string, opts?: SendMessageOptions): Promise<unknown>;
103
+ sendPhoto(chatId: number | string, photoPath: string, caption?: string, opts?: SendMessageOptions): Promise<TelegramMessage>;
104
+ sendDocument(chatId: number | string, documentPath: string, opts?: SendMessageOptions): Promise<TelegramMessage>;
105
+ answerCallbackQuery(callbackQueryId: string, text?: string): Promise<boolean>;
106
+ /** Download a file (photo / document / …) by file_id into a temp dir; returns the local path. */
107
+ downloadFile(fileId: string, dir: string, fileName?: string): Promise<DownloadedResource>;
108
+ /** Convenience: download to the OS temp dir. */
109
+ downloadFileToTemp(fileId: string, fileName?: string): Promise<DownloadedResource>;
110
+ }
111
+ /** Pick the Bot API method for a local file (sendPhoto vs sendDocument). */
112
+ export declare function telegramFileMethod(filename: string): "sendPhoto" | "sendDocument";
113
+ /** Strip path separators / control chars from a downloaded file's name. */
114
+ export declare function sanitizeFileName(name: string): string;
115
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/channels/telegram/client.ts"],"names":[],"mappings":"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"}