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.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +3 -0
  3. package/dist/channels/amocrm.d.ts +20 -0
  4. package/dist/channels/amocrm.d.ts.map +1 -0
  5. package/dist/channels/amocrm.js +233 -0
  6. package/dist/channels/amocrm.js.map +1 -0
  7. package/dist/channels/factory.d.ts +24 -0
  8. package/dist/channels/factory.d.ts.map +1 -0
  9. package/dist/channels/factory.js +41 -0
  10. package/dist/channels/factory.js.map +1 -0
  11. package/dist/channels/telegram.d.ts +28 -0
  12. package/dist/channels/telegram.d.ts.map +1 -0
  13. package/dist/channels/telegram.js +432 -0
  14. package/dist/channels/telegram.js.map +1 -0
  15. package/dist/channels/whatsapp.d.ts +88 -0
  16. package/dist/channels/whatsapp.d.ts.map +1 -0
  17. package/dist/channels/whatsapp.js +502 -0
  18. package/dist/channels/whatsapp.js.map +1 -0
  19. package/dist/config-types.d.ts +43 -0
  20. package/dist/config-types.d.ts.map +1 -0
  21. package/dist/config-types.js +2 -0
  22. package/dist/config-types.js.map +1 -0
  23. package/dist/config.d.ts +32 -0
  24. package/dist/config.d.ts.map +1 -0
  25. package/dist/config.js +71 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/container-runner.d.ts +47 -0
  28. package/dist/container-runner.d.ts.map +1 -0
  29. package/dist/container-runner.js +494 -0
  30. package/dist/container-runner.js.map +1 -0
  31. package/dist/container-runtime.d.ts +13 -0
  32. package/dist/container-runtime.d.ts.map +1 -0
  33. package/dist/container-runtime.js +90 -0
  34. package/dist/container-runtime.js.map +1 -0
  35. package/dist/core/engine.d.ts +64 -0
  36. package/dist/core/engine.d.ts.map +1 -0
  37. package/dist/core/engine.js +782 -0
  38. package/dist/core/engine.js.map +1 -0
  39. package/dist/create.d.ts +4 -0
  40. package/dist/create.d.ts.map +1 -0
  41. package/dist/create.js +5 -0
  42. package/dist/create.js.map +1 -0
  43. package/dist/db.d.ts +67 -0
  44. package/dist/db.d.ts.map +1 -0
  45. package/dist/db.js +454 -0
  46. package/dist/db.js.map +1 -0
  47. package/dist/env.d.ts +8 -0
  48. package/dist/env.d.ts.map +1 -0
  49. package/dist/env.js +40 -0
  50. package/dist/env.js.map +1 -0
  51. package/dist/group-folder.d.ts +5 -0
  52. package/dist/group-folder.d.ts.map +1 -0
  53. package/dist/group-folder.js +44 -0
  54. package/dist/group-folder.js.map +1 -0
  55. package/dist/group-queue.d.ts +52 -0
  56. package/dist/group-queue.d.ts.map +1 -0
  57. package/dist/group-queue.js +321 -0
  58. package/dist/group-queue.js.map +1 -0
  59. package/dist/health.d.ts +5 -0
  60. package/dist/health.d.ts.map +1 -0
  61. package/dist/health.js +70 -0
  62. package/dist/health.js.map +1 -0
  63. package/dist/hooks/runner.d.ts +13 -0
  64. package/dist/hooks/runner.d.ts.map +1 -0
  65. package/dist/hooks/runner.js +42 -0
  66. package/dist/hooks/runner.js.map +1 -0
  67. package/dist/hooks/types.d.ts +33 -0
  68. package/dist/hooks/types.d.ts.map +1 -0
  69. package/dist/hooks/types.js +2 -0
  70. package/dist/hooks/types.js.map +1 -0
  71. package/dist/index.d.ts +10 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +38 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/ipc.d.ts +36 -0
  76. package/dist/ipc.d.ts.map +1 -0
  77. package/dist/ipc.js +441 -0
  78. package/dist/ipc.js.map +1 -0
  79. package/dist/logger.d.ts +3 -0
  80. package/dist/logger.d.ts.map +1 -0
  81. package/dist/logger.js +14 -0
  82. package/dist/logger.js.map +1 -0
  83. package/dist/media-cleanup.d.ts +2 -0
  84. package/dist/media-cleanup.d.ts.map +1 -0
  85. package/dist/media-cleanup.js +51 -0
  86. package/dist/media-cleanup.js.map +1 -0
  87. package/dist/media.d.ts +2 -0
  88. package/dist/media.d.ts.map +1 -0
  89. package/dist/media.js +22 -0
  90. package/dist/media.js.map +1 -0
  91. package/dist/mount-security.d.ts +34 -0
  92. package/dist/mount-security.d.ts.map +1 -0
  93. package/dist/mount-security.js +321 -0
  94. package/dist/mount-security.js.map +1 -0
  95. package/dist/rate-limiter.d.ts +10 -0
  96. package/dist/rate-limiter.d.ts.map +1 -0
  97. package/dist/rate-limiter.js +31 -0
  98. package/dist/rate-limiter.js.map +1 -0
  99. package/dist/router.d.ts +11 -0
  100. package/dist/router.d.ts.map +1 -0
  101. package/dist/router.js +79 -0
  102. package/dist/router.js.map +1 -0
  103. package/dist/rqlite.d.ts +36 -0
  104. package/dist/rqlite.d.ts.map +1 -0
  105. package/dist/rqlite.js +98 -0
  106. package/dist/rqlite.js.map +1 -0
  107. package/dist/runtime-config.d.ts +9 -0
  108. package/dist/runtime-config.d.ts.map +1 -0
  109. package/dist/runtime-config.js +14 -0
  110. package/dist/runtime-config.js.map +1 -0
  111. package/dist/task-scheduler.d.ts +14 -0
  112. package/dist/task-scheduler.d.ts.map +1 -0
  113. package/dist/task-scheduler.js +189 -0
  114. package/dist/task-scheduler.js.map +1 -0
  115. package/dist/types.d.ts +96 -0
  116. package/dist/types.d.ts.map +1 -0
  117. package/dist/types.js +2 -0
  118. package/dist/types.js.map +1 -0
  119. package/dist/whatsapp-auth.d.ts +2 -0
  120. package/dist/whatsapp-auth.d.ts.map +1 -0
  121. package/dist/whatsapp-auth.js +141 -0
  122. package/dist/whatsapp-auth.js.map +1 -0
  123. 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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"}