adaptoclaw 1.0.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/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/channels/amocrm.d.ts +20 -0
- package/dist/channels/amocrm.d.ts.map +1 -0
- package/dist/channels/amocrm.js +233 -0
- package/dist/channels/amocrm.js.map +1 -0
- package/dist/channels/factory.d.ts +24 -0
- package/dist/channels/factory.d.ts.map +1 -0
- package/dist/channels/factory.js +41 -0
- package/dist/channels/factory.js.map +1 -0
- package/dist/channels/telegram.d.ts +28 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +432 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +88 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +502 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config-types.d.ts +43 -0
- package/dist/config-types.d.ts.map +1 -0
- package/dist/config-types.js +2 -0
- package/dist/config-types.js.map +1 -0
- package/dist/config.d.ts +32 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +71 -0
- package/dist/config.js.map +1 -0
- package/dist/container-runner.d.ts +47 -0
- package/dist/container-runner.d.ts.map +1 -0
- package/dist/container-runner.js +494 -0
- package/dist/container-runner.js.map +1 -0
- package/dist/container-runtime.d.ts +13 -0
- package/dist/container-runtime.d.ts.map +1 -0
- package/dist/container-runtime.js +90 -0
- package/dist/container-runtime.js.map +1 -0
- package/dist/core/engine.d.ts +64 -0
- package/dist/core/engine.d.ts.map +1 -0
- package/dist/core/engine.js +782 -0
- package/dist/core/engine.js.map +1 -0
- package/dist/create.d.ts +4 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +5 -0
- package/dist/create.js.map +1 -0
- package/dist/db.d.ts +67 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +454 -0
- package/dist/db.js.map +1 -0
- package/dist/env.d.ts +8 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +40 -0
- package/dist/env.js.map +1 -0
- package/dist/group-folder.d.ts +5 -0
- package/dist/group-folder.d.ts.map +1 -0
- package/dist/group-folder.js +44 -0
- package/dist/group-folder.js.map +1 -0
- package/dist/group-queue.d.ts +52 -0
- package/dist/group-queue.d.ts.map +1 -0
- package/dist/group-queue.js +321 -0
- package/dist/group-queue.js.map +1 -0
- package/dist/health.d.ts +5 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +70 -0
- package/dist/health.js.map +1 -0
- package/dist/hooks/runner.d.ts +13 -0
- package/dist/hooks/runner.d.ts.map +1 -0
- package/dist/hooks/runner.js +42 -0
- package/dist/hooks/runner.js.map +1 -0
- package/dist/hooks/types.d.ts +33 -0
- package/dist/hooks/types.d.ts.map +1 -0
- package/dist/hooks/types.js +2 -0
- package/dist/hooks/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/ipc.d.ts +36 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +441 -0
- package/dist/ipc.js.map +1 -0
- package/dist/logger.d.ts +3 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +14 -0
- package/dist/logger.js.map +1 -0
- package/dist/media-cleanup.d.ts +2 -0
- package/dist/media-cleanup.d.ts.map +1 -0
- package/dist/media-cleanup.js +51 -0
- package/dist/media-cleanup.js.map +1 -0
- package/dist/media.d.ts +2 -0
- package/dist/media.d.ts.map +1 -0
- package/dist/media.js +22 -0
- package/dist/media.js.map +1 -0
- package/dist/mount-security.d.ts +34 -0
- package/dist/mount-security.d.ts.map +1 -0
- package/dist/mount-security.js +321 -0
- package/dist/mount-security.js.map +1 -0
- package/dist/rate-limiter.d.ts +10 -0
- package/dist/rate-limiter.d.ts.map +1 -0
- package/dist/rate-limiter.js +31 -0
- package/dist/rate-limiter.js.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +79 -0
- package/dist/router.js.map +1 -0
- package/dist/rqlite.d.ts +36 -0
- package/dist/rqlite.d.ts.map +1 -0
- package/dist/rqlite.js +98 -0
- package/dist/rqlite.js.map +1 -0
- package/dist/runtime-config.d.ts +9 -0
- package/dist/runtime-config.d.ts.map +1 -0
- package/dist/runtime-config.js +14 -0
- package/dist/runtime-config.js.map +1 -0
- package/dist/task-scheduler.d.ts +14 -0
- package/dist/task-scheduler.d.ts.map +1 -0
- package/dist/task-scheduler.js +189 -0
- package/dist/task-scheduler.js.map +1 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/whatsapp-auth.d.ts +2 -0
- package/dist/whatsapp-auth.d.ts.map +1 -0
- package/dist/whatsapp-auth.js +141 -0
- package/dist/whatsapp-auth.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,432 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { Bot, InputFile, InlineKeyboard } from 'grammy';
|
|
4
|
+
import { telegramFormat, splitHtmlForTelegram } from 'telegram-markdown-formatter';
|
|
5
|
+
import { ASSISTANT_NAME, TRIGGER_PATTERN, MEDIA_DIR } from '../config.js';
|
|
6
|
+
import { logger } from '../logger.js';
|
|
7
|
+
import { transcribeVoice } from '../media.js';
|
|
8
|
+
/** Convert markdown to Telegram-compatible HTML. */
|
|
9
|
+
export function toTelegramHtml(text) {
|
|
10
|
+
return telegramFormat(text);
|
|
11
|
+
}
|
|
12
|
+
export class TelegramChannel {
|
|
13
|
+
name = 'telegram';
|
|
14
|
+
bot = null;
|
|
15
|
+
opts;
|
|
16
|
+
botToken;
|
|
17
|
+
pairingHandler = null;
|
|
18
|
+
pendingPairingPhone = new Map();
|
|
19
|
+
constructor(botToken, opts) {
|
|
20
|
+
this.botToken = botToken;
|
|
21
|
+
this.opts = opts;
|
|
22
|
+
}
|
|
23
|
+
/** Set handler for WhatsApp pairing requests from /linkwhatsapp command */
|
|
24
|
+
onWhatsAppPairing(handler) {
|
|
25
|
+
this.pairingHandler = handler;
|
|
26
|
+
}
|
|
27
|
+
async connect() {
|
|
28
|
+
this.bot = new Bot(this.botToken);
|
|
29
|
+
// Command to get chat ID (useful for registration)
|
|
30
|
+
this.bot.command('chatid', (ctx) => {
|
|
31
|
+
const chatId = ctx.chat.id;
|
|
32
|
+
const chatType = ctx.chat.type;
|
|
33
|
+
const chatName = chatType === 'private'
|
|
34
|
+
? ctx.from?.first_name || 'Private'
|
|
35
|
+
: ctx.chat.title || 'Unknown';
|
|
36
|
+
ctx.reply(`Chat ID: \`tg:${chatId}\`\nName: ${chatName}\nType: ${chatType}`, { parse_mode: 'Markdown' });
|
|
37
|
+
});
|
|
38
|
+
// Command to check bot status
|
|
39
|
+
this.bot.command('ping', (ctx) => {
|
|
40
|
+
ctx.reply(`${ASSISTANT_NAME} is online.`);
|
|
41
|
+
});
|
|
42
|
+
// WhatsApp linking via pairing code
|
|
43
|
+
this.bot.command('linkwhatsapp', async (ctx) => {
|
|
44
|
+
if (!this.pairingHandler) {
|
|
45
|
+
await ctx.reply('WhatsApp pairing is not available (TELEGRAM_ONLY mode or already connected).');
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
// Parse phone number from command argument
|
|
49
|
+
const rawArg = ctx.match?.toString().trim();
|
|
50
|
+
if (!rawArg) {
|
|
51
|
+
await ctx.reply('Укажите номер: <code>/linkwhatsapp 77XXXXXXXXX</code>', { parse_mode: 'HTML' });
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// Normalize: strip +, replace leading 8 with 7
|
|
55
|
+
let phone = rawArg.replace(/\+/g, '').replace(/[\s-()]/g, '');
|
|
56
|
+
if (phone.startsWith('8') && phone.length === 11) {
|
|
57
|
+
phone = '7' + phone.slice(1);
|
|
58
|
+
}
|
|
59
|
+
const chatId = ctx.chat.id;
|
|
60
|
+
this.pendingPairingPhone.set(chatId, phone);
|
|
61
|
+
const keyboard = new InlineKeyboard()
|
|
62
|
+
.text('Я готов, отправь код', 'wa_pair_start');
|
|
63
|
+
await ctx.reply(`📱 <b>Подключение WhatsApp</b> (номер: <code>${phone}</code>)\n\n` +
|
|
64
|
+
'1. Откройте WhatsApp на телефоне\n' +
|
|
65
|
+
'2. Настройки → <b>Связанные устройства</b> → <b>Привязка устройства</b>\n' +
|
|
66
|
+
'3. Внизу нажмите <b>Привязка по номеру телефона</b>\n' +
|
|
67
|
+
'4. Когда увидите поле для ввода кода — нажмите кнопку ниже\n\n' +
|
|
68
|
+
'⚡ После нажатия у вас будет ~30 секунд чтобы ввести код.', { parse_mode: 'HTML', reply_markup: keyboard });
|
|
69
|
+
});
|
|
70
|
+
// Handle pairing button press
|
|
71
|
+
this.bot.callbackQuery('wa_pair_start', async (ctx) => {
|
|
72
|
+
await ctx.answerCallbackQuery();
|
|
73
|
+
if (!this.pairingHandler) {
|
|
74
|
+
await ctx.editMessageText('WhatsApp pairing is not available.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const chatId = ctx.chat?.id;
|
|
78
|
+
if (!chatId)
|
|
79
|
+
return;
|
|
80
|
+
const phone = this.pendingPairingPhone.get(chatId);
|
|
81
|
+
if (!phone) {
|
|
82
|
+
await ctx.editMessageText('Номер не найден. Отправьте /linkwhatsapp 77XXXXXXXXX заново.');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
this.pendingPairingPhone.delete(chatId);
|
|
86
|
+
await ctx.editMessageText('⏳ Получаю код привязки...');
|
|
87
|
+
this.pairingHandler(phone, (code) => {
|
|
88
|
+
this.bot?.api.sendMessage(chatId, `🔑 <b>Код привязки:</b> <code>${code}</code>\n\nВведите этот код в WhatsApp прямо сейчас!`, { parse_mode: 'HTML' }).catch((err) => logger.error({ err }, 'Failed to send pairing code'));
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
// Inline keyboard menu for skill discovery
|
|
92
|
+
this.bot.command('menu', (ctx) => {
|
|
93
|
+
const keyboard = new InlineKeyboard()
|
|
94
|
+
.text('Справки eGov', 'skill:egov-spravki')
|
|
95
|
+
.text('Проверить контрагента', 'skill:kontragent-check')
|
|
96
|
+
.row()
|
|
97
|
+
.text('Налоговая 910', 'skill:salyk-910')
|
|
98
|
+
.text('Кредитный отчет', 'skill:credit-report')
|
|
99
|
+
.row()
|
|
100
|
+
.text('Авто проверка', 'skill:auto-check')
|
|
101
|
+
.text('Страховка авто', 'skill:auto-insurance')
|
|
102
|
+
.row()
|
|
103
|
+
.text('Коммунальные счетчики', 'skill:utility-meters')
|
|
104
|
+
.text('Погода', 'skill:weather')
|
|
105
|
+
.row()
|
|
106
|
+
.text('Пенсия ЕНПФ', 'skill:enpf-pension')
|
|
107
|
+
.text('ОСМС проверка', 'skill:osms-check')
|
|
108
|
+
.row()
|
|
109
|
+
.text('Мониторинг судов', 'skill:sud-monitor')
|
|
110
|
+
.text('Госзакупки', 'skill:goszakup-monitor')
|
|
111
|
+
.row()
|
|
112
|
+
.text('Задачи', 'action:tasks')
|
|
113
|
+
.text('Статус', 'action:status');
|
|
114
|
+
ctx.reply('Выберите действие:', { reply_markup: keyboard });
|
|
115
|
+
});
|
|
116
|
+
// Handle inline keyboard button presses
|
|
117
|
+
this.bot.on('callback_query:data', async (ctx) => {
|
|
118
|
+
const data = ctx.callbackQuery.data;
|
|
119
|
+
await ctx.answerCallbackQuery();
|
|
120
|
+
const chatJid = `tg:${ctx.chat?.id}`;
|
|
121
|
+
const group = this.opts.registeredGroups()[chatJid];
|
|
122
|
+
if (!group) {
|
|
123
|
+
await ctx.reply('Этот чат не зарегистрирован.');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const timestamp = new Date().toISOString();
|
|
127
|
+
const senderName = ctx.from?.first_name || ctx.from?.username || 'Unknown';
|
|
128
|
+
const sender = ctx.from?.id?.toString() || '';
|
|
129
|
+
let content = '';
|
|
130
|
+
if (data.startsWith('skill:')) {
|
|
131
|
+
const skill = data.replace('skill:', '');
|
|
132
|
+
content = `@${ASSISTANT_NAME} /${skill}`;
|
|
133
|
+
}
|
|
134
|
+
else if (data === 'action:tasks') {
|
|
135
|
+
content = `@${ASSISTANT_NAME} покажи задачи`;
|
|
136
|
+
}
|
|
137
|
+
else if (data === 'action:status') {
|
|
138
|
+
content = `@${ASSISTANT_NAME} статус`;
|
|
139
|
+
}
|
|
140
|
+
if (content) {
|
|
141
|
+
this.opts.onChatMetadata(chatJid, timestamp);
|
|
142
|
+
this.opts.onMessage(chatJid, {
|
|
143
|
+
id: `menu-${Date.now()}`,
|
|
144
|
+
chat_jid: chatJid,
|
|
145
|
+
sender,
|
|
146
|
+
sender_name: senderName,
|
|
147
|
+
content,
|
|
148
|
+
timestamp,
|
|
149
|
+
is_from_me: false,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
this.bot.on('message:text', async (ctx) => {
|
|
154
|
+
// Skip commands
|
|
155
|
+
if (ctx.message.text.startsWith('/'))
|
|
156
|
+
return;
|
|
157
|
+
const chatJid = `tg:${ctx.chat.id}`;
|
|
158
|
+
let content = ctx.message.text;
|
|
159
|
+
const timestamp = new Date(ctx.message.date * 1000).toISOString();
|
|
160
|
+
const senderName = ctx.from?.first_name ||
|
|
161
|
+
ctx.from?.username ||
|
|
162
|
+
ctx.from?.id.toString() ||
|
|
163
|
+
'Unknown';
|
|
164
|
+
const sender = ctx.from?.id.toString() || '';
|
|
165
|
+
const msgId = ctx.message.message_id.toString();
|
|
166
|
+
// Determine chat name
|
|
167
|
+
const chatName = ctx.chat.type === 'private'
|
|
168
|
+
? senderName
|
|
169
|
+
: ctx.chat.title || chatJid;
|
|
170
|
+
// Translate Telegram @bot_username mentions into TRIGGER_PATTERN format.
|
|
171
|
+
// Telegram @mentions (e.g., @andy_ai_bot) won't match TRIGGER_PATTERN
|
|
172
|
+
// (e.g., ^@Andy\b), so we prepend the trigger when the bot is @mentioned.
|
|
173
|
+
const botUsername = ctx.me?.username?.toLowerCase();
|
|
174
|
+
if (botUsername) {
|
|
175
|
+
const entities = ctx.message.entities || [];
|
|
176
|
+
const isBotMentioned = entities.some((entity) => {
|
|
177
|
+
if (entity.type === 'mention') {
|
|
178
|
+
const mentionText = content
|
|
179
|
+
.substring(entity.offset, entity.offset + entity.length)
|
|
180
|
+
.toLowerCase();
|
|
181
|
+
return mentionText === `@${botUsername}`;
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
});
|
|
185
|
+
if (isBotMentioned && !TRIGGER_PATTERN.test(content)) {
|
|
186
|
+
content = `@${ASSISTANT_NAME} ${content}`;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// Store chat metadata for discovery
|
|
190
|
+
this.opts.onChatMetadata(chatJid, timestamp, chatName);
|
|
191
|
+
// Only deliver full message for registered groups
|
|
192
|
+
const group = this.opts.registeredGroups()[chatJid];
|
|
193
|
+
if (!group) {
|
|
194
|
+
logger.debug({ chatJid, chatName }, 'Message from unregistered Telegram chat');
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
// Deliver message — startMessageLoop() will pick it up
|
|
198
|
+
this.opts.onMessage(chatJid, {
|
|
199
|
+
id: msgId,
|
|
200
|
+
chat_jid: chatJid,
|
|
201
|
+
sender,
|
|
202
|
+
sender_name: senderName,
|
|
203
|
+
content,
|
|
204
|
+
timestamp,
|
|
205
|
+
is_from_me: false,
|
|
206
|
+
});
|
|
207
|
+
logger.info({ chatJid, chatName, sender: senderName }, 'Telegram message stored');
|
|
208
|
+
});
|
|
209
|
+
// Handle media messages — download file and pass to agent
|
|
210
|
+
const downloadAndStore = async (ctx, type, placeholder) => {
|
|
211
|
+
const chatJid = `tg:${ctx.chat.id}`;
|
|
212
|
+
const group = this.opts.registeredGroups()[chatJid];
|
|
213
|
+
if (!group)
|
|
214
|
+
return;
|
|
215
|
+
const timestamp = new Date(ctx.message.date * 1000).toISOString();
|
|
216
|
+
const senderName = ctx.from?.first_name || ctx.from?.username || ctx.from?.id?.toString() || 'Unknown';
|
|
217
|
+
const caption = ctx.message.caption || undefined;
|
|
218
|
+
this.opts.onChatMetadata(chatJid, timestamp);
|
|
219
|
+
let media = undefined;
|
|
220
|
+
try {
|
|
221
|
+
let fileId;
|
|
222
|
+
let fileName;
|
|
223
|
+
let mimeType;
|
|
224
|
+
if (type === 'image' && ctx.message.photo) {
|
|
225
|
+
const largest = ctx.message.photo[ctx.message.photo.length - 1];
|
|
226
|
+
fileId = largest.file_id;
|
|
227
|
+
mimeType = 'image/jpeg';
|
|
228
|
+
}
|
|
229
|
+
else if (type === 'voice' && ctx.message.voice) {
|
|
230
|
+
fileId = ctx.message.voice.file_id;
|
|
231
|
+
mimeType = ctx.message.voice.mime_type || 'audio/ogg';
|
|
232
|
+
}
|
|
233
|
+
else if (type === 'audio' && ctx.message.audio) {
|
|
234
|
+
fileId = ctx.message.audio.file_id;
|
|
235
|
+
mimeType = ctx.message.audio.mime_type;
|
|
236
|
+
fileName = ctx.message.audio.file_name;
|
|
237
|
+
}
|
|
238
|
+
else if (type === 'video' && ctx.message.video) {
|
|
239
|
+
fileId = ctx.message.video.file_id;
|
|
240
|
+
mimeType = ctx.message.video.mime_type;
|
|
241
|
+
}
|
|
242
|
+
else if (type === 'document' && ctx.message.document) {
|
|
243
|
+
fileId = ctx.message.document.file_id;
|
|
244
|
+
mimeType = ctx.message.document.mime_type;
|
|
245
|
+
fileName = ctx.message.document.file_name;
|
|
246
|
+
}
|
|
247
|
+
if (fileId) {
|
|
248
|
+
const file = await ctx.api.getFile(fileId);
|
|
249
|
+
const url = `https://api.telegram.org/file/bot${this.botToken}/${file.file_path}`;
|
|
250
|
+
const resp = await fetch(url);
|
|
251
|
+
const buffer = Buffer.from(await resp.arrayBuffer());
|
|
252
|
+
const ext = file.file_path?.split('.').pop() || 'bin';
|
|
253
|
+
const mediaFileName = `${Date.now()}-${ctx.message.message_id}.${ext}`;
|
|
254
|
+
const mediaDir = path.join(MEDIA_DIR, chatJid.replace(/[^a-zA-Z0-9-]/g, '_'));
|
|
255
|
+
fs.mkdirSync(mediaDir, { recursive: true });
|
|
256
|
+
const filePath = path.join(mediaDir, mediaFileName);
|
|
257
|
+
fs.writeFileSync(filePath, buffer);
|
|
258
|
+
let transcription;
|
|
259
|
+
if (type === 'voice') {
|
|
260
|
+
transcription = (await transcribeVoice(buffer)) || undefined;
|
|
261
|
+
}
|
|
262
|
+
media = { type, filePath, mimeType, fileName, caption, transcription };
|
|
263
|
+
logger.info({ type, size: buffer.length, chatJid }, 'TG media downloaded');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
logger.error({ err, chatJid, type }, 'Failed to download TG media');
|
|
268
|
+
}
|
|
269
|
+
let content = placeholder;
|
|
270
|
+
if (media?.transcription) {
|
|
271
|
+
content = `[Voice message]: ${media.transcription}`;
|
|
272
|
+
}
|
|
273
|
+
else if (caption) {
|
|
274
|
+
content = `${placeholder} ${caption}`;
|
|
275
|
+
}
|
|
276
|
+
this.opts.onMessage(chatJid, {
|
|
277
|
+
id: ctx.message.message_id.toString(),
|
|
278
|
+
chat_jid: chatJid,
|
|
279
|
+
sender: ctx.from?.id?.toString() || '',
|
|
280
|
+
sender_name: senderName,
|
|
281
|
+
content,
|
|
282
|
+
timestamp,
|
|
283
|
+
is_from_me: false,
|
|
284
|
+
media,
|
|
285
|
+
});
|
|
286
|
+
};
|
|
287
|
+
this.bot.on('message:photo', (ctx) => downloadAndStore(ctx, 'image', '[Photo]'));
|
|
288
|
+
this.bot.on('message:video', (ctx) => downloadAndStore(ctx, 'video', '[Video]'));
|
|
289
|
+
this.bot.on('message:voice', (ctx) => downloadAndStore(ctx, 'voice', '[Voice message]'));
|
|
290
|
+
this.bot.on('message:audio', (ctx) => downloadAndStore(ctx, 'audio', '[Audio]'));
|
|
291
|
+
this.bot.on('message:document', (ctx) => {
|
|
292
|
+
const name = ctx.message.document?.file_name || 'file';
|
|
293
|
+
downloadAndStore(ctx, 'document', `[Document: ${name}]`);
|
|
294
|
+
});
|
|
295
|
+
// Keep simple placeholders for types without file download
|
|
296
|
+
const storeNonText = (ctx, placeholder) => {
|
|
297
|
+
const chatJid = `tg:${ctx.chat.id}`;
|
|
298
|
+
const group = this.opts.registeredGroups()[chatJid];
|
|
299
|
+
if (!group)
|
|
300
|
+
return;
|
|
301
|
+
const timestamp = new Date(ctx.message.date * 1000).toISOString();
|
|
302
|
+
const senderName = ctx.from?.first_name || ctx.from?.username || ctx.from?.id?.toString() || 'Unknown';
|
|
303
|
+
this.opts.onChatMetadata(chatJid, timestamp);
|
|
304
|
+
this.opts.onMessage(chatJid, {
|
|
305
|
+
id: ctx.message.message_id.toString(),
|
|
306
|
+
chat_jid: chatJid,
|
|
307
|
+
sender: ctx.from?.id?.toString() || '',
|
|
308
|
+
sender_name: senderName,
|
|
309
|
+
content: placeholder,
|
|
310
|
+
timestamp,
|
|
311
|
+
is_from_me: false,
|
|
312
|
+
});
|
|
313
|
+
};
|
|
314
|
+
this.bot.on('message:sticker', (ctx) => {
|
|
315
|
+
const emoji = ctx.message.sticker?.emoji || '';
|
|
316
|
+
storeNonText(ctx, `[Sticker ${emoji}]`);
|
|
317
|
+
});
|
|
318
|
+
this.bot.on('message:location', (ctx) => storeNonText(ctx, '[Location]'));
|
|
319
|
+
this.bot.on('message:contact', (ctx) => storeNonText(ctx, '[Contact]'));
|
|
320
|
+
// Handle errors gracefully
|
|
321
|
+
this.bot.catch((err) => {
|
|
322
|
+
logger.error({ err: err.message }, 'Telegram bot error');
|
|
323
|
+
});
|
|
324
|
+
// Start polling — returns a Promise that resolves when started
|
|
325
|
+
return new Promise((resolve) => {
|
|
326
|
+
this.bot.start({
|
|
327
|
+
onStart: (botInfo) => {
|
|
328
|
+
logger.info({ username: botInfo.username, id: botInfo.id }, 'Telegram bot connected');
|
|
329
|
+
console.log(`\n Telegram bot: @${botInfo.username}`);
|
|
330
|
+
console.log(` Send /chatid to the bot to get a chat's registration ID\n`);
|
|
331
|
+
resolve();
|
|
332
|
+
},
|
|
333
|
+
}).catch((err) => {
|
|
334
|
+
logger.error({ err: err.message }, 'Telegram bot failed to start (invalid token?) — continuing without Telegram');
|
|
335
|
+
this.bot = null;
|
|
336
|
+
resolve();
|
|
337
|
+
});
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
async sendMessage(jid, text) {
|
|
341
|
+
if (!this.bot) {
|
|
342
|
+
logger.warn('Telegram bot not initialized');
|
|
343
|
+
return;
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
const numericId = jid.replace(/^tg:/, '');
|
|
347
|
+
// Telegram has a 4096 character limit per message — split if needed
|
|
348
|
+
const html = toTelegramHtml(text);
|
|
349
|
+
const MAX_LENGTH = 4096;
|
|
350
|
+
// splitHtmlForTelegram handles tag-aware splitting
|
|
351
|
+
let parts = splitHtmlForTelegram(html);
|
|
352
|
+
// Fallback: if any part still exceeds limit, split naively
|
|
353
|
+
const finalParts = [];
|
|
354
|
+
for (const part of parts) {
|
|
355
|
+
if (part.length <= MAX_LENGTH) {
|
|
356
|
+
finalParts.push(part);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
for (let i = 0; i < part.length; i += MAX_LENGTH) {
|
|
360
|
+
finalParts.push(part.slice(i, i + MAX_LENGTH));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
for (const part of finalParts) {
|
|
365
|
+
await this.bot.api.sendMessage(numericId, part, { parse_mode: 'HTML' });
|
|
366
|
+
}
|
|
367
|
+
logger.info({ jid, length: text.length }, 'Telegram message sent');
|
|
368
|
+
}
|
|
369
|
+
catch (err) {
|
|
370
|
+
logger.error({ jid, err }, 'Failed to send Telegram message');
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
async sendMedia(jid, filePath, caption, mimeType) {
|
|
374
|
+
if (!this.bot)
|
|
375
|
+
return;
|
|
376
|
+
const numericId = jid.replace(/^tg:/, '');
|
|
377
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
378
|
+
const isImage = mimeType?.startsWith('image/') || ['.jpg', '.jpeg', '.png', '.gif', '.webp'].includes(ext);
|
|
379
|
+
try {
|
|
380
|
+
const source = new InputFile(filePath);
|
|
381
|
+
const htmlCaption = caption ? toTelegramHtml(caption) : undefined;
|
|
382
|
+
if (isImage) {
|
|
383
|
+
try {
|
|
384
|
+
await this.bot.api.sendPhoto(numericId, source, { caption: htmlCaption, parse_mode: 'HTML' });
|
|
385
|
+
}
|
|
386
|
+
catch (photoErr) {
|
|
387
|
+
// Fallback to document if photo dimensions are invalid (e.g. tall screenshots)
|
|
388
|
+
if (photoErr?.description?.includes('PHOTO_INVALID_DIMENSIONS') || photoErr?.description?.includes('PHOTO_')) {
|
|
389
|
+
logger.info({ jid }, 'Photo rejected, sending as document');
|
|
390
|
+
const docSource = new InputFile(filePath);
|
|
391
|
+
await this.bot.api.sendDocument(numericId, docSource, { caption: htmlCaption, parse_mode: 'HTML' });
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
throw photoErr;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
await this.bot.api.sendDocument(numericId, source, { caption: htmlCaption, parse_mode: 'HTML' });
|
|
400
|
+
}
|
|
401
|
+
logger.info({ jid, filePath }, 'TG media sent');
|
|
402
|
+
}
|
|
403
|
+
catch (err) {
|
|
404
|
+
logger.error({ jid, err }, 'Failed to send TG media');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
isConnected() {
|
|
408
|
+
return this.bot !== null;
|
|
409
|
+
}
|
|
410
|
+
ownsJid(jid) {
|
|
411
|
+
return jid.startsWith('tg:');
|
|
412
|
+
}
|
|
413
|
+
async disconnect() {
|
|
414
|
+
if (this.bot) {
|
|
415
|
+
this.bot.stop();
|
|
416
|
+
this.bot = null;
|
|
417
|
+
logger.info('Telegram bot stopped');
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
async setTyping(jid, isTyping) {
|
|
421
|
+
if (!this.bot || !isTyping)
|
|
422
|
+
return;
|
|
423
|
+
try {
|
|
424
|
+
const numericId = jid.replace(/^tg:/, '');
|
|
425
|
+
await this.bot.api.sendChatAction(numericId, 'typing');
|
|
426
|
+
}
|
|
427
|
+
catch (err) {
|
|
428
|
+
logger.debug({ jid, err }, 'Failed to send Telegram typing indicator');
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
//# sourceMappingURL=telegram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../src/channels/telegram.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Channel, OnInboundMessage, OnChatMetadata, RegisteredGroup } from '../types.js';
|
|
2
|
+
export interface WaRule {
|
|
3
|
+
id: string;
|
|
4
|
+
match: {
|
|
5
|
+
from?: string;
|
|
6
|
+
chatJid?: string;
|
|
7
|
+
contains?: string;
|
|
8
|
+
};
|
|
9
|
+
action: 'trigger_agent';
|
|
10
|
+
prompt: string;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type OnPairingCode = (code: string) => void;
|
|
14
|
+
export interface WhatsAppChannelOpts {
|
|
15
|
+
onMessage: OnInboundMessage;
|
|
16
|
+
onChatMetadata: OnChatMetadata;
|
|
17
|
+
registeredGroups: () => Record<string, RegisteredGroup>;
|
|
18
|
+
}
|
|
19
|
+
export declare class WhatsAppChannel implements Channel {
|
|
20
|
+
name: string;
|
|
21
|
+
private sock;
|
|
22
|
+
private connected;
|
|
23
|
+
private lidToPhoneMap;
|
|
24
|
+
private outgoingQueue;
|
|
25
|
+
private flushing;
|
|
26
|
+
private groupSyncTimerStarted;
|
|
27
|
+
private presencePingTimer;
|
|
28
|
+
private reconnectAttempt;
|
|
29
|
+
private pairingInProgress;
|
|
30
|
+
private pairingPhoneNumber;
|
|
31
|
+
private onPairingCode;
|
|
32
|
+
private opts;
|
|
33
|
+
constructor(opts: WhatsAppChannelOpts);
|
|
34
|
+
/**
|
|
35
|
+
* Start pairing flow. Call this before connect() or while waiting for auth.
|
|
36
|
+
* When a QR is received, it will request a pairing code for the given phone
|
|
37
|
+
* and call onCode with the result.
|
|
38
|
+
*/
|
|
39
|
+
requestPairing(phoneNumber: string, onCode: OnPairingCode): void;
|
|
40
|
+
get isPairing(): boolean;
|
|
41
|
+
/** Check if WhatsApp auth credentials exist on disk. */
|
|
42
|
+
hasAuth(): boolean;
|
|
43
|
+
connect(): Promise<void>;
|
|
44
|
+
private connectInternal;
|
|
45
|
+
sendMessage(jid: string, text: string): Promise<void>;
|
|
46
|
+
sendMedia(jid: string, filePath: string, caption?: string, mimeType?: string): Promise<void>;
|
|
47
|
+
isConnected(): boolean;
|
|
48
|
+
ownsJid(jid: string): boolean;
|
|
49
|
+
disconnect(): Promise<void>;
|
|
50
|
+
setTyping(jid: string, isTyping: boolean): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Sync group metadata from WhatsApp.
|
|
53
|
+
* Fetches all participating groups and stores their names in the database.
|
|
54
|
+
* Called on startup, daily, and on-demand via IPC.
|
|
55
|
+
*/
|
|
56
|
+
syncGroupMetadata(force?: boolean): Promise<void>;
|
|
57
|
+
private translateJid;
|
|
58
|
+
/** Send a message to any WA JID (no bot prefix — this is a tool, not a channel) */
|
|
59
|
+
sendWaMessage(jid: string, text: string): Promise<void>;
|
|
60
|
+
markRead(keys: {
|
|
61
|
+
remoteJid: string;
|
|
62
|
+
id: string;
|
|
63
|
+
participant?: string;
|
|
64
|
+
}[]): Promise<void>;
|
|
65
|
+
checkNumber(phone: string): Promise<{
|
|
66
|
+
exists: boolean;
|
|
67
|
+
jid?: string;
|
|
68
|
+
}>;
|
|
69
|
+
getProfilePicUrl(jid: string): Promise<string | undefined>;
|
|
70
|
+
blockUnblock(jid: string, action: 'block' | 'unblock'): Promise<void>;
|
|
71
|
+
getGroupMetadata(jid: string): Promise<import("@whiskeysockets/baileys").GroupMetadata>;
|
|
72
|
+
createGroup(subject: string, participants: string[]): Promise<import("@whiskeysockets/baileys").GroupMetadata>;
|
|
73
|
+
updateGroupSubject(jid: string, subject: string): Promise<void>;
|
|
74
|
+
updateGroupDescription(jid: string, description: string): Promise<void>;
|
|
75
|
+
updateGroupParticipants(jid: string, participants: string[], action: 'add' | 'remove' | 'promote' | 'demote'): Promise<{
|
|
76
|
+
status: string;
|
|
77
|
+
jid: string | undefined;
|
|
78
|
+
content: import("@whiskeysockets/baileys").BinaryNode;
|
|
79
|
+
}[]>;
|
|
80
|
+
getGroupInviteCode(jid: string): Promise<string | undefined>;
|
|
81
|
+
leaveGroup(jid: string): Promise<void>;
|
|
82
|
+
updateGroupSettings(jid: string, setting: 'announcement' | 'not_announcement' | 'locked' | 'unlocked'): Promise<void>;
|
|
83
|
+
updateProfileStatus(status: string): Promise<void>;
|
|
84
|
+
updateProfileName(name: string): Promise<void>;
|
|
85
|
+
setPresence(type: 'available' | 'unavailable'): Promise<void>;
|
|
86
|
+
private flushOutgoingQueue;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=whatsapp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"whatsapp.d.ts","sourceRoot":"","sources":["../../src/channels/whatsapp.ts"],"names":[],"mappings":"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"}
|