@qwen-code/channel-telegram 0.21.0-preview.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/dist/TelegramAdapter.d.ts +34 -0
- package/dist/TelegramAdapter.js +356 -0
- package/dist/TelegramAdapter.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { ChannelBase } from '@qwen-code/channel-base';
|
|
2
|
+
import type { ChannelAgentBridge, ChannelBaseOptions, ChannelConfig, ChannelTaskLifecycleEvent, Envelope, SessionTarget } from '@qwen-code/channel-base';
|
|
3
|
+
export declare class TelegramChannel extends ChannelBase {
|
|
4
|
+
private bot;
|
|
5
|
+
private botId;
|
|
6
|
+
private botUsername;
|
|
7
|
+
private hasConnectedOnce;
|
|
8
|
+
private signalHandlersRegistered;
|
|
9
|
+
private readonly inboundRoute;
|
|
10
|
+
constructor(name: string, config: ChannelConfig, bridge: ChannelAgentBridge, options?: ChannelBaseOptions);
|
|
11
|
+
supportsProactiveSend(): boolean;
|
|
12
|
+
protected supportsProactiveTarget(target: SessionTarget): boolean;
|
|
13
|
+
private createBot;
|
|
14
|
+
private getFileUrl;
|
|
15
|
+
connect(): Promise<void>;
|
|
16
|
+
private registerBotCommands;
|
|
17
|
+
/** Per-chat typing interval — repeats every 4s since Telegram expires it after 5s. */
|
|
18
|
+
private typingIntervals;
|
|
19
|
+
private activeTypingSessions;
|
|
20
|
+
private sendTyping;
|
|
21
|
+
private startTyping;
|
|
22
|
+
private stopTyping;
|
|
23
|
+
protected onTaskLifecycle(event: ChannelTaskLifecycleEvent): void;
|
|
24
|
+
protected onPromptStart(chatId: string, sessionId?: string): void;
|
|
25
|
+
protected onPromptEnd(chatId: string, sessionId?: string): void;
|
|
26
|
+
onSessionDied(sessionId: string): void;
|
|
27
|
+
handleInbound(envelope: Envelope): Promise<void>;
|
|
28
|
+
sendMessage(chatId: string, text: string): Promise<void>;
|
|
29
|
+
protected sendResponseMessage(chatId: string, text: string, sessionId: string): Promise<void>;
|
|
30
|
+
protected pushProactive(target: SessionTarget, text: string): Promise<void>;
|
|
31
|
+
private sendTelegramMessage;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
private buildEnvelope;
|
|
34
|
+
}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
4
|
+
import { basename, join } from 'node:path';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { Bot } from 'grammy';
|
|
7
|
+
import { HttpsProxyAgent } from 'https-proxy-agent';
|
|
8
|
+
import { telegramFormat, splitHtmlForTelegram, } from 'telegram-markdown-formatter';
|
|
9
|
+
import { ChannelBase, isTerminalTaskLifecycleType, } from '@qwen-code/channel-base';
|
|
10
|
+
const TELEGRAM_BOT_COMMANDS = [
|
|
11
|
+
{ command: 'start', description: 'Show quick-start help' },
|
|
12
|
+
{ command: 'help', description: 'Show available commands' },
|
|
13
|
+
{ command: 'new', description: 'Start a fresh conversation' },
|
|
14
|
+
{ command: 'cancel', description: 'Cancel the running request' },
|
|
15
|
+
{ command: 'status', description: 'Show session info' },
|
|
16
|
+
];
|
|
17
|
+
const TELEGRAM_START_MESSAGE = [
|
|
18
|
+
'Qwen Code Telegram bot',
|
|
19
|
+
'',
|
|
20
|
+
'Send any message to chat with Qwen Code.',
|
|
21
|
+
'Use /new to start a fresh conversation.',
|
|
22
|
+
'Use /cancel to stop a running request.',
|
|
23
|
+
'Use /help to see available commands.',
|
|
24
|
+
].join('\n');
|
|
25
|
+
export class TelegramChannel extends ChannelBase {
|
|
26
|
+
bot;
|
|
27
|
+
botId = 0;
|
|
28
|
+
botUsername = '';
|
|
29
|
+
hasConnectedOnce = false;
|
|
30
|
+
signalHandlersRegistered = false;
|
|
31
|
+
inboundRoute = new AsyncLocalStorage();
|
|
32
|
+
constructor(name, config, bridge, options) {
|
|
33
|
+
super(name, config, bridge, options);
|
|
34
|
+
this.bot = this.createBot();
|
|
35
|
+
this.registerCommand('start', async (envelope) => {
|
|
36
|
+
await this.sendMessage(envelope.chatId, TELEGRAM_START_MESSAGE);
|
|
37
|
+
return true;
|
|
38
|
+
});
|
|
39
|
+
this.registerCancelCommand();
|
|
40
|
+
}
|
|
41
|
+
supportsProactiveSend() {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
supportsProactiveTarget(target) {
|
|
45
|
+
return target.threadId === undefined || /^\d+$/u.test(target.threadId);
|
|
46
|
+
}
|
|
47
|
+
createBot() {
|
|
48
|
+
const botConfig = this.proxy
|
|
49
|
+
? {
|
|
50
|
+
client: {
|
|
51
|
+
baseFetchConfig: { agent: new HttpsProxyAgent(this.proxy) },
|
|
52
|
+
},
|
|
53
|
+
}
|
|
54
|
+
: undefined;
|
|
55
|
+
return new Bot(this.config.token, botConfig);
|
|
56
|
+
}
|
|
57
|
+
getFileUrl(filePath) {
|
|
58
|
+
return `https://api.telegram.org/file/bot${this.bot.token}/${filePath}`;
|
|
59
|
+
}
|
|
60
|
+
async connect() {
|
|
61
|
+
if (this.hasConnectedOnce) {
|
|
62
|
+
this.bot = this.createBot();
|
|
63
|
+
}
|
|
64
|
+
this.hasConnectedOnce = true;
|
|
65
|
+
const botInfo = await this.bot.api.getMe();
|
|
66
|
+
this.botId = botInfo.id;
|
|
67
|
+
this.botUsername = botInfo.username ?? '';
|
|
68
|
+
await this.registerBotCommands();
|
|
69
|
+
// All messages (including slash commands) go through handleInbound
|
|
70
|
+
// where ChannelBase dispatches shared commands (/help, /clear, /status, etc.)
|
|
71
|
+
this.bot.on('message:text', async (ctx) => {
|
|
72
|
+
const msg = ctx.message;
|
|
73
|
+
const text = msg.text;
|
|
74
|
+
const envelope = this.buildEnvelope(msg, text, msg.entities);
|
|
75
|
+
// Don't await — long prompts would block the update loop
|
|
76
|
+
this.handleInbound(envelope).catch((err) => {
|
|
77
|
+
process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
|
|
78
|
+
ctx
|
|
79
|
+
.reply('Sorry, something went wrong processing your message.')
|
|
80
|
+
.catch(() => { });
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
// Photo messages
|
|
84
|
+
this.bot.on('message:photo', async (ctx) => {
|
|
85
|
+
const msg = ctx.message;
|
|
86
|
+
const envelope = this.buildEnvelope(msg, msg.caption || '(image)', msg.caption_entities);
|
|
87
|
+
// Pick the largest photo size (last in array)
|
|
88
|
+
const photo = msg.photo[msg.photo.length - 1];
|
|
89
|
+
if (!photo)
|
|
90
|
+
return;
|
|
91
|
+
try {
|
|
92
|
+
const file = await ctx.api.getFile(photo.file_id);
|
|
93
|
+
const fileUrl = this.getFileUrl(file.file_path);
|
|
94
|
+
const resp = await fetch(fileUrl);
|
|
95
|
+
if (!resp.ok)
|
|
96
|
+
throw new Error(`HTTP ${resp.status}`);
|
|
97
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
98
|
+
envelope.imageBase64 = buf.toString('base64');
|
|
99
|
+
envelope.imageMimeType = 'image/jpeg'; // Telegram always converts photos to JPEG
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
process.stderr.write(`[Telegram:${this.name}] Failed to download photo: ${err instanceof Error ? err.message : err}\n`);
|
|
103
|
+
}
|
|
104
|
+
this.handleInbound(envelope).catch((err) => {
|
|
105
|
+
process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
|
|
106
|
+
ctx
|
|
107
|
+
.reply('Sorry, something went wrong processing your message.')
|
|
108
|
+
.catch(() => { });
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// Document/file messages
|
|
112
|
+
this.bot.on('message:document', async (ctx) => {
|
|
113
|
+
const msg = ctx.message;
|
|
114
|
+
const doc = msg.document;
|
|
115
|
+
const fileName = doc.file_name || `file_${Date.now()}`;
|
|
116
|
+
const envelope = this.buildEnvelope(msg, msg.caption || `(file: ${fileName})`, msg.caption_entities);
|
|
117
|
+
try {
|
|
118
|
+
const file = await ctx.api.getFile(doc.file_id);
|
|
119
|
+
const fileUrl = this.getFileUrl(file.file_path);
|
|
120
|
+
const resp = await fetch(fileUrl);
|
|
121
|
+
if (!resp.ok)
|
|
122
|
+
throw new Error(`HTTP ${resp.status}`);
|
|
123
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
124
|
+
// Save to temp dir so the agent can read it via read-file tool
|
|
125
|
+
const dir = join(tmpdir(), 'channel-files', randomUUID());
|
|
126
|
+
mkdirSync(dir, { recursive: true });
|
|
127
|
+
const filePath = join(dir, basename(fileName) || `file_${Date.now()}`);
|
|
128
|
+
writeFileSync(filePath, buf);
|
|
129
|
+
envelope.text = msg.caption || '';
|
|
130
|
+
envelope.attachments = [
|
|
131
|
+
{
|
|
132
|
+
type: 'file',
|
|
133
|
+
filePath,
|
|
134
|
+
mimeType: doc.mime_type || 'application/octet-stream',
|
|
135
|
+
fileName,
|
|
136
|
+
},
|
|
137
|
+
];
|
|
138
|
+
}
|
|
139
|
+
catch (err) {
|
|
140
|
+
process.stderr.write(`[Telegram:${this.name}] Failed to download document: ${err instanceof Error ? err.message : err}\n`);
|
|
141
|
+
envelope.text =
|
|
142
|
+
(msg.caption || '') +
|
|
143
|
+
`\n\n(User sent a file "${fileName}" but download failed)`;
|
|
144
|
+
}
|
|
145
|
+
this.handleInbound(envelope).catch((err) => {
|
|
146
|
+
process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
|
|
147
|
+
ctx
|
|
148
|
+
.reply('Sorry, something went wrong processing your message.')
|
|
149
|
+
.catch(() => { });
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
// Voice messages
|
|
153
|
+
this.bot.on('message:voice', async (ctx) => {
|
|
154
|
+
const msg = ctx.message;
|
|
155
|
+
const voice = msg.voice;
|
|
156
|
+
const fileName = `voice_${Date.now()}.ogg`;
|
|
157
|
+
const envelope = this.buildEnvelope(msg, msg.caption || '(voice message)', msg.caption_entities);
|
|
158
|
+
try {
|
|
159
|
+
const file = await ctx.api.getFile(voice.file_id);
|
|
160
|
+
const fileUrl = this.getFileUrl(file.file_path);
|
|
161
|
+
const resp = await fetch(fileUrl);
|
|
162
|
+
if (!resp.ok)
|
|
163
|
+
throw new Error(`HTTP ${resp.status}`);
|
|
164
|
+
const buf = Buffer.from(await resp.arrayBuffer());
|
|
165
|
+
// Save to temp dir so the agent can read it via read-file tool
|
|
166
|
+
const dir = join(tmpdir(), 'channel-files', randomUUID());
|
|
167
|
+
mkdirSync(dir, { recursive: true });
|
|
168
|
+
const filePath = join(dir, fileName);
|
|
169
|
+
writeFileSync(filePath, buf);
|
|
170
|
+
envelope.text = msg.caption || '';
|
|
171
|
+
envelope.attachments = [
|
|
172
|
+
{
|
|
173
|
+
type: 'audio',
|
|
174
|
+
filePath,
|
|
175
|
+
mimeType: voice.mime_type || 'audio/ogg',
|
|
176
|
+
fileName,
|
|
177
|
+
},
|
|
178
|
+
];
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
process.stderr.write(`[Telegram:${this.name}] Failed to download voice message: ${err instanceof Error ? err.message : err}\n`);
|
|
182
|
+
envelope.text =
|
|
183
|
+
(msg.caption || '') +
|
|
184
|
+
`\n\n(User sent a voice message but download failed)`;
|
|
185
|
+
}
|
|
186
|
+
this.handleInbound(envelope).catch((err) => {
|
|
187
|
+
process.stderr.write(`[Telegram:${this.name}] Error handling message: ${err}\n`);
|
|
188
|
+
ctx
|
|
189
|
+
.reply('Sorry, something went wrong processing your message.')
|
|
190
|
+
.catch(() => { });
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
this.bot.start({ drop_pending_updates: true }).catch((err) => {
|
|
194
|
+
process.stderr.write(`[Telegram:${this.name}] Bot launch error: ${err}\n`);
|
|
195
|
+
});
|
|
196
|
+
if (!this.signalHandlersRegistered) {
|
|
197
|
+
process.once('SIGINT', () => this.bot.stop());
|
|
198
|
+
process.once('SIGTERM', () => this.bot.stop());
|
|
199
|
+
this.signalHandlersRegistered = true;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
async registerBotCommands() {
|
|
203
|
+
try {
|
|
204
|
+
await this.bot.api.setMyCommands(TELEGRAM_BOT_COMMANDS);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
process.stderr.write(`[Telegram:${this.name}] Failed to register bot commands: ${err instanceof Error ? err.message : err}\n`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
/** Per-chat typing interval — repeats every 4s since Telegram expires it after 5s. */
|
|
211
|
+
typingIntervals = new Map();
|
|
212
|
+
activeTypingSessions = new Map();
|
|
213
|
+
sendTyping(chatId) {
|
|
214
|
+
try {
|
|
215
|
+
void this.bot.api.sendChatAction(chatId, 'typing').catch(() => { });
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
// Best-effort typing indicator.
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
startTyping(chatId, sessionId = chatId) {
|
|
222
|
+
const sessions = this.activeTypingSessions.get(chatId) ?? new Set();
|
|
223
|
+
sessions.add(sessionId);
|
|
224
|
+
this.activeTypingSessions.set(chatId, sessions);
|
|
225
|
+
if (this.typingIntervals.has(chatId))
|
|
226
|
+
return;
|
|
227
|
+
this.sendTyping(chatId);
|
|
228
|
+
this.typingIntervals.set(chatId, setInterval(() => this.sendTyping(chatId), 4000));
|
|
229
|
+
}
|
|
230
|
+
stopTyping(chatId, sessionId = chatId) {
|
|
231
|
+
const sessions = this.activeTypingSessions.get(chatId);
|
|
232
|
+
if (sessions) {
|
|
233
|
+
sessions.delete(sessionId);
|
|
234
|
+
if (sessions.size > 0)
|
|
235
|
+
return;
|
|
236
|
+
this.activeTypingSessions.delete(chatId);
|
|
237
|
+
}
|
|
238
|
+
const interval = this.typingIntervals.get(chatId);
|
|
239
|
+
if (!interval)
|
|
240
|
+
return;
|
|
241
|
+
clearInterval(interval);
|
|
242
|
+
this.typingIntervals.delete(chatId);
|
|
243
|
+
}
|
|
244
|
+
onTaskLifecycle(event) {
|
|
245
|
+
if (event.type === 'started') {
|
|
246
|
+
this.startTyping(event.chatId, event.sessionId);
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (isTerminalTaskLifecycleType(event.type)) {
|
|
250
|
+
this.stopTyping(event.chatId, event.sessionId);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
onPromptStart(chatId, sessionId) {
|
|
254
|
+
this.startTyping(chatId, sessionId);
|
|
255
|
+
}
|
|
256
|
+
onPromptEnd(chatId, sessionId) {
|
|
257
|
+
this.stopTyping(chatId, sessionId);
|
|
258
|
+
}
|
|
259
|
+
onSessionDied(sessionId) {
|
|
260
|
+
for (const [chatId, sessions] of this.activeTypingSessions) {
|
|
261
|
+
if (sessions.has(sessionId)) {
|
|
262
|
+
this.stopTyping(chatId, sessionId);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
super.onSessionDied(sessionId);
|
|
266
|
+
}
|
|
267
|
+
async handleInbound(envelope) {
|
|
268
|
+
const route = envelope.threadId === undefined ? {} : { threadId: envelope.threadId };
|
|
269
|
+
await this.inboundRoute.run(route, () => super.handleInbound(envelope));
|
|
270
|
+
}
|
|
271
|
+
async sendMessage(chatId, text) {
|
|
272
|
+
await this.sendTelegramMessage(chatId, text, this.inboundRoute.getStore()?.threadId);
|
|
273
|
+
}
|
|
274
|
+
async sendResponseMessage(chatId, text, sessionId) {
|
|
275
|
+
const inboundRoute = this.inboundRoute.getStore();
|
|
276
|
+
const target = this.router.getTarget(sessionId);
|
|
277
|
+
const threadId = inboundRoute !== undefined
|
|
278
|
+
? inboundRoute.threadId
|
|
279
|
+
: target?.channelName === this.name && target.chatId === chatId
|
|
280
|
+
? target.threadId
|
|
281
|
+
: undefined;
|
|
282
|
+
await this.sendTelegramMessage(chatId, text, threadId);
|
|
283
|
+
}
|
|
284
|
+
async pushProactive(target, text) {
|
|
285
|
+
await this.sendTelegramMessage(target.chatId, text, target.threadId);
|
|
286
|
+
}
|
|
287
|
+
async sendTelegramMessage(chatId, text, threadId) {
|
|
288
|
+
const html = telegramFormat(text);
|
|
289
|
+
const chunks = splitHtmlForTelegram(html);
|
|
290
|
+
const options = threadId === undefined
|
|
291
|
+
? { parse_mode: 'HTML' }
|
|
292
|
+
: { parse_mode: 'HTML', message_thread_id: Number(threadId) };
|
|
293
|
+
for (const chunk of chunks) {
|
|
294
|
+
try {
|
|
295
|
+
await this.bot.api.sendMessage(chatId, chunk, options);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Fallback to plain text for the failed chunk only
|
|
299
|
+
await this.bot.api.sendMessage(chatId, chunk.replace(/<[^>]*>/g, ''), threadId === undefined
|
|
300
|
+
? undefined
|
|
301
|
+
: { message_thread_id: Number(threadId) });
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
disconnect() {
|
|
306
|
+
for (const interval of this.typingIntervals.values()) {
|
|
307
|
+
clearInterval(interval);
|
|
308
|
+
}
|
|
309
|
+
this.typingIntervals.clear();
|
|
310
|
+
this.activeTypingSessions.clear();
|
|
311
|
+
this.bot.stop();
|
|
312
|
+
}
|
|
313
|
+
buildEnvelope(msg, text, entities) {
|
|
314
|
+
const isGroup = msg.chat.type === 'group' || msg.chat.type === 'supergroup';
|
|
315
|
+
const isMentioned = entities?.some((e) => {
|
|
316
|
+
if (!this.botUsername)
|
|
317
|
+
return false;
|
|
318
|
+
const value = text.slice(e.offset, e.offset + e.length).toLowerCase();
|
|
319
|
+
const username = this.botUsername.toLowerCase();
|
|
320
|
+
if (e.type === 'mention') {
|
|
321
|
+
return value === `@${username}`;
|
|
322
|
+
}
|
|
323
|
+
if (e.type === 'bot_command') {
|
|
324
|
+
const mentionIndex = value.indexOf('@');
|
|
325
|
+
return (mentionIndex !== -1 && value.slice(mentionIndex + 1) === username);
|
|
326
|
+
}
|
|
327
|
+
return false;
|
|
328
|
+
}) ?? false;
|
|
329
|
+
const isReplyToBot = msg.reply_to_message?.from?.id === this.botId;
|
|
330
|
+
let cleanText = text;
|
|
331
|
+
if (isMentioned && this.botUsername) {
|
|
332
|
+
cleanText = text
|
|
333
|
+
.replace(new RegExp(`@${this.botUsername}`, 'gi'), '')
|
|
334
|
+
.trim();
|
|
335
|
+
}
|
|
336
|
+
// Extract referenced message text (when user replies to a message)
|
|
337
|
+
const referencedText = msg.reply_to_message?.text || undefined;
|
|
338
|
+
return {
|
|
339
|
+
channelName: this.name,
|
|
340
|
+
senderId: String(msg.from.id),
|
|
341
|
+
senderName: msg.from.first_name +
|
|
342
|
+
(msg.from.last_name ? ` ${msg.from.last_name}` : ''),
|
|
343
|
+
chatId: String(msg.chat.id),
|
|
344
|
+
...(isGroup && msg.chat.title ? { chatName: msg.chat.title } : {}),
|
|
345
|
+
threadId: typeof msg.message_thread_id === 'number'
|
|
346
|
+
? String(msg.message_thread_id)
|
|
347
|
+
: undefined,
|
|
348
|
+
text: cleanText,
|
|
349
|
+
isGroup,
|
|
350
|
+
isMentioned,
|
|
351
|
+
isReplyToBot,
|
|
352
|
+
referencedText,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=TelegramAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelegramAdapter.js","sourceRoot":"","sources":["../src/TelegramAdapter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { TelegramChannel } from './TelegramAdapter.js';
|
|
2
|
+
import { TelegramChannel } from './TelegramAdapter.js';
|
|
3
|
+
export const plugin = {
|
|
4
|
+
channelType: 'telegram',
|
|
5
|
+
displayName: 'Telegram',
|
|
6
|
+
requiredConfigFields: ['token'],
|
|
7
|
+
createChannel: (name, config, bridge, options) => new TelegramChannel(name, config, bridge, options),
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,MAAM,CAAC,MAAM,MAAM,GAAkB;IACnC,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,UAAU;IACvB,oBAAoB,EAAE,CAAC,OAAO,CAAC;IAC/B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAC/C,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC;CACrD,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@qwen-code/channel-telegram",
|
|
3
|
+
"version": "0.21.0-preview.0",
|
|
4
|
+
"description": "Telegram channel adapter for Qwen Code",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc --build",
|
|
19
|
+
"test": "vitest run",
|
|
20
|
+
"test:ci": "vitest run"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"@qwen-code/channel-base": "^0.21.0",
|
|
24
|
+
"grammy": "^1.41.1",
|
|
25
|
+
"https-proxy-agent": "^7.0.6",
|
|
26
|
+
"telegram-markdown-formatter": "^0.1.2"
|
|
27
|
+
},
|
|
28
|
+
"devDependencies": {
|
|
29
|
+
"typescript": "^5.0.0"
|
|
30
|
+
}
|
|
31
|
+
}
|