@framers/agentos 0.1.26 → 0.1.28

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 (79) hide show
  1. package/dist/api/AgentOSOrchestrator.js +1 -1
  2. package/dist/api/AgentOSOrchestrator.js.map +1 -1
  3. package/dist/channels/ChannelRouter.d.ts.map +1 -1
  4. package/dist/channels/ChannelRouter.js +1 -1
  5. package/dist/channels/ChannelRouter.js.map +1 -1
  6. package/dist/channels/IChannelAdapter.d.ts.map +1 -1
  7. package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
  8. package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
  9. package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
  10. package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
  11. package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
  12. package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
  13. package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
  14. package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
  15. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
  16. package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
  17. package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
  18. package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
  19. package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
  20. package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
  21. package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
  22. package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
  23. package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
  24. package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
  25. package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
  26. package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
  27. package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
  28. package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
  29. package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
  30. package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
  31. package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
  32. package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
  33. package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
  34. package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
  35. package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
  36. package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
  37. package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
  38. package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
  39. package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
  40. package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
  41. package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
  42. package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
  43. package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
  44. package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
  45. package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
  46. package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
  47. package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
  48. package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
  49. package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
  50. package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
  51. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
  52. package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
  53. package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
  54. package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
  55. package/dist/channels/adapters/index.d.ts +34 -0
  56. package/dist/channels/adapters/index.d.ts.map +1 -0
  57. package/dist/channels/adapters/index.js +25 -0
  58. package/dist/channels/adapters/index.js.map +1 -0
  59. package/dist/channels/index.d.ts +24 -0
  60. package/dist/channels/index.d.ts.map +1 -1
  61. package/dist/channels/index.js +16 -0
  62. package/dist/channels/index.js.map +1 -1
  63. package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -1
  64. package/dist/cognitive_substrate/personas/metaprompt_presets.js +0 -2
  65. package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -1
  66. package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -1
  67. package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -1
  68. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -1
  69. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +2 -1
  70. package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -1
  71. package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -1
  72. package/dist/core/safety/ToolExecutionGuard.d.ts.map +1 -1
  73. package/dist/core/safety/ToolExecutionGuard.js +0 -1
  74. package/dist/core/safety/ToolExecutionGuard.js.map +1 -1
  75. package/dist/extensions/ExtensionManager.d.ts.map +1 -1
  76. package/dist/extensions/ExtensionManager.js +3 -9
  77. package/dist/extensions/ExtensionManager.js.map +1 -1
  78. package/dist/rag/RetrievalAugmentor.js.map +1 -1
  79. package/package.json +1 -1
@@ -0,0 +1,83 @@
1
+ /**
2
+ * @fileoverview Telegram Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the `telegraf` (or `grammy`) npm package to connect agents to
5
+ * Telegram bots. Supports rich messaging including text, images, video,
6
+ * audio, voice notes, stickers, reactions, inline keyboards, and more.
7
+ *
8
+ * **Dependencies**: Requires `telegraf` to be installed. The adapter uses
9
+ * a dynamic import so the package is only loaded at connection time,
10
+ * avoiding hard failures if it is not present.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const telegram = new TelegramChannelAdapter();
15
+ * await telegram.initialize({
16
+ * platform: 'telegram',
17
+ * credential: 'BOT_TOKEN_FROM_BOTFATHER',
18
+ * params: {
19
+ * botToken: 'BOT_TOKEN_FROM_BOTFATHER',
20
+ * },
21
+ * });
22
+ * ```
23
+ *
24
+ * @module @framers/agentos/channels/adapters/TelegramChannelAdapter
25
+ */
26
+ import type { ChannelAuthConfig, ChannelCapability, ChannelPlatform, ChannelSendResult, MessageContent } from '../types.js';
27
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
28
+ /** Platform-specific parameters for Telegram connections. */
29
+ export interface TelegramAuthParams extends Record<string, string | undefined> {
30
+ /** Bot token from BotFather. If provided, overrides credential. */
31
+ botToken?: string;
32
+ /** Webhook URL. If not provided, long polling is used. */
33
+ webhookUrl?: string;
34
+ /** Webhook secret token for verifying incoming updates. */
35
+ webhookSecret?: string;
36
+ }
37
+ /**
38
+ * Channel adapter for Telegram using the Telegraf SDK.
39
+ *
40
+ * Uses dynamic import so `telegraf` is only required at runtime when the
41
+ * adapter is actually initialized. Falls back to `grammy` if `telegraf`
42
+ * is not available.
43
+ *
44
+ * Capabilities: text, rich_text, images, video, audio, voice_notes,
45
+ * stickers, reactions, buttons, inline_keyboard, group_chat, channels,
46
+ * editing, deletion.
47
+ */
48
+ export declare class TelegramChannelAdapter extends BaseChannelAdapter<TelegramAuthParams> {
49
+ readonly platform: ChannelPlatform;
50
+ readonly displayName = "Telegram";
51
+ readonly capabilities: readonly ChannelCapability[];
52
+ /** Telegraf Bot instance. Typed as `any` because the package is
53
+ * dynamically imported and may not be installed. */
54
+ private bot;
55
+ /** SDK module reference for helper access (e.g. Markup). */
56
+ private sdk;
57
+ /** Whether we are using grammy instead of telegraf. */
58
+ private useGrammy;
59
+ /** Track whether bot.launch() was called (for cleanup). */
60
+ private launched;
61
+ protected doConnect(auth: ChannelAuthConfig & {
62
+ params?: TelegramAuthParams;
63
+ }): Promise<void>;
64
+ protected doSendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
65
+ protected doShutdown(): Promise<void>;
66
+ editMessage(conversationId: string, messageId: string, content: MessageContent): Promise<void>;
67
+ deleteMessage(conversationId: string, messageId: string): Promise<void>;
68
+ addReaction(conversationId: string, messageId: string, emoji: string): Promise<void>;
69
+ sendTypingIndicator(conversationId: string, _isTyping: boolean): Promise<void>;
70
+ /**
71
+ * Send a single content block to a Telegram chat.
72
+ */
73
+ private sendBlock;
74
+ /**
75
+ * Handle inbound messages from Telegram and emit channel events.
76
+ */
77
+ private handleInboundMessage;
78
+ /**
79
+ * Handle inline keyboard callback queries.
80
+ */
81
+ private handleCallbackQuery;
82
+ }
83
+ //# sourceMappingURL=TelegramChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChannelAdapter.d.ts","sourceRoot":"","sources":["../../../src/channels/adapters/TelegramChannelAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAEjB,eAAe,EACf,iBAAiB,EACjB,cAAc,EAEf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAM7D,6DAA6D;AAC7D,MAAM,WAAW,kBAAmB,SAAQ,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5E,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,SAAQ,kBAAkB,CAAC,kBAAkB,CAAC;IAChF,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAc;IAChD,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAexC;IAEX;yDACqD;IAErD,OAAO,CAAC,GAAG,CAAkB;IAE7B,4DAA4D;IAE5D,OAAO,CAAC,GAAG,CAAkB;IAE7B,uDAAuD;IACvD,OAAO,CAAC,SAAS,CAAS;IAE1B,2DAA2D;IAC3D,OAAO,CAAC,QAAQ,CAAS;cAIT,SAAS,CACvB,IAAI,EAAE,iBAAiB,GAAG;QAAE,MAAM,CAAC,EAAE,kBAAkB,CAAA;KAAE,GACxD,OAAO,CAAC,IAAI,CAAC;cAuFA,aAAa,CAC3B,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,iBAAiB,CAAC;cAqCb,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBrC,WAAW,CACf,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,IAAI,CAAC;IAgBV,aAAa,CACjB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAOV,WAAW,CACf,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC;IAaV,mBAAmB,CACvB,cAAc,EAAE,MAAM,EACtB,SAAS,EAAE,OAAO,GACjB,OAAO,CAAC,IAAI,CAAC;IAahB;;OAEG;YAEW,SAAS;IAiHvB;;OAEG;IAEH,OAAO,CAAC,oBAAoB;IA2G5B;;OAEG;IAEH,OAAO,CAAC,mBAAmB;CAoC5B"}
@@ -0,0 +1,463 @@
1
+ /**
2
+ * @fileoverview Telegram Channel Adapter for AgentOS.
3
+ *
4
+ * Wraps the `telegraf` (or `grammy`) npm package to connect agents to
5
+ * Telegram bots. Supports rich messaging including text, images, video,
6
+ * audio, voice notes, stickers, reactions, inline keyboards, and more.
7
+ *
8
+ * **Dependencies**: Requires `telegraf` to be installed. The adapter uses
9
+ * a dynamic import so the package is only loaded at connection time,
10
+ * avoiding hard failures if it is not present.
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const telegram = new TelegramChannelAdapter();
15
+ * await telegram.initialize({
16
+ * platform: 'telegram',
17
+ * credential: 'BOT_TOKEN_FROM_BOTFATHER',
18
+ * params: {
19
+ * botToken: 'BOT_TOKEN_FROM_BOTFATHER',
20
+ * },
21
+ * });
22
+ * ```
23
+ *
24
+ * @module @framers/agentos/channels/adapters/TelegramChannelAdapter
25
+ */
26
+ import { BaseChannelAdapter } from './BaseChannelAdapter.js';
27
+ // ============================================================================
28
+ // TelegramChannelAdapter
29
+ // ============================================================================
30
+ /**
31
+ * Channel adapter for Telegram using the Telegraf SDK.
32
+ *
33
+ * Uses dynamic import so `telegraf` is only required at runtime when the
34
+ * adapter is actually initialized. Falls back to `grammy` if `telegraf`
35
+ * is not available.
36
+ *
37
+ * Capabilities: text, rich_text, images, video, audio, voice_notes,
38
+ * stickers, reactions, buttons, inline_keyboard, group_chat, channels,
39
+ * editing, deletion.
40
+ */
41
+ export class TelegramChannelAdapter extends BaseChannelAdapter {
42
+ constructor() {
43
+ super(...arguments);
44
+ this.platform = 'telegram';
45
+ this.displayName = 'Telegram';
46
+ this.capabilities = [
47
+ 'text',
48
+ 'rich_text',
49
+ 'images',
50
+ 'video',
51
+ 'audio',
52
+ 'voice_notes',
53
+ 'stickers',
54
+ 'reactions',
55
+ 'buttons',
56
+ 'inline_keyboard',
57
+ 'group_chat',
58
+ 'channels',
59
+ 'editing',
60
+ 'deletion',
61
+ ];
62
+ /** Whether we are using grammy instead of telegraf. */
63
+ this.useGrammy = false;
64
+ /** Track whether bot.launch() was called (for cleanup). */
65
+ this.launched = false;
66
+ }
67
+ // ── Abstract hook implementations ──
68
+ async doConnect(auth) {
69
+ const botToken = auth.params?.botToken ?? auth.credential;
70
+ if (!botToken) {
71
+ throw new Error('Telegram bot token is required. Provide it as credential or params.botToken.');
72
+ }
73
+ // Dynamic import — try telegraf first, fall back to grammy
74
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
75
+ let TelegrafModule;
76
+ try {
77
+ TelegrafModule = await import('telegraf');
78
+ this.useGrammy = false;
79
+ }
80
+ catch {
81
+ try {
82
+ TelegrafModule = await import('grammy');
83
+ this.useGrammy = true;
84
+ }
85
+ catch {
86
+ throw new Error('Either "telegraf" or "grammy" package is required for the Telegram adapter. ' +
87
+ 'Install one with: npm install telegraf OR npm install grammy');
88
+ }
89
+ }
90
+ // Create bot instance
91
+ const BotClass = TelegrafModule.Telegraf ??
92
+ TelegrafModule.Bot ??
93
+ TelegrafModule.default?.Telegraf ??
94
+ TelegrafModule.default?.Bot ??
95
+ TelegrafModule.default;
96
+ this.sdk = TelegrafModule;
97
+ this.bot = new BotClass(botToken);
98
+ // Set up inbound message handler
99
+ this.bot.on('message', (ctx) => {
100
+ this.handleInboundMessage(ctx);
101
+ });
102
+ // Set up callback query handler (inline keyboard buttons)
103
+ this.bot.on('callback_query', (ctx) => {
104
+ this.handleCallbackQuery(ctx);
105
+ });
106
+ // Launch the bot
107
+ const webhookUrl = auth.params?.webhookUrl;
108
+ if (webhookUrl) {
109
+ // Webhook mode
110
+ const webhookConfig = {
111
+ domain: new URL(webhookUrl).origin,
112
+ hookPath: new URL(webhookUrl).pathname,
113
+ };
114
+ if (auth.params?.webhookSecret) {
115
+ webhookConfig.secretToken = auth.params.webhookSecret;
116
+ }
117
+ await this.bot.launch({ webhook: webhookConfig });
118
+ }
119
+ else {
120
+ // Long polling mode
121
+ await this.bot.launch();
122
+ }
123
+ this.launched = true;
124
+ // Fetch bot info for platformInfo
125
+ try {
126
+ const me = this.useGrammy
127
+ ? this.bot.botInfo
128
+ : await this.bot.telegram?.getMe?.();
129
+ this.platformInfo = {
130
+ botId: me?.id,
131
+ botUsername: me?.username,
132
+ botName: me?.first_name,
133
+ mode: webhookUrl ? 'webhook' : 'polling',
134
+ };
135
+ console.log(`[Telegram] Connected as @${me?.username ?? 'unknown'} (${webhookUrl ? 'webhook' : 'polling'} mode)`);
136
+ }
137
+ catch {
138
+ this.platformInfo = { mode: webhookUrl ? 'webhook' : 'polling' };
139
+ console.log(`[Telegram] Connected (${webhookUrl ? 'webhook' : 'polling'} mode)`);
140
+ }
141
+ }
142
+ async doSendMessage(conversationId, content) {
143
+ if (!this.bot) {
144
+ throw new Error('[Telegram] Bot is not connected.');
145
+ }
146
+ const telegram = this.bot.telegram ?? this.bot.api;
147
+ if (!telegram) {
148
+ throw new Error('[Telegram] Bot API handle not available.');
149
+ }
150
+ const chatId = conversationId;
151
+ const replyParams = {};
152
+ if (content.replyToMessageId) {
153
+ replyParams.reply_to_message_id = parseInt(content.replyToMessageId, 10);
154
+ }
155
+ let lastMessageId;
156
+ let lastTimestamp;
157
+ for (const block of content.blocks) {
158
+ const result = await this.sendBlock(telegram, chatId, block, replyParams, content);
159
+ if (result) {
160
+ lastMessageId = result.messageId;
161
+ lastTimestamp = result.timestamp;
162
+ }
163
+ }
164
+ if (!lastMessageId) {
165
+ throw new Error('[Telegram] No content blocks produced a sent message.');
166
+ }
167
+ return {
168
+ messageId: lastMessageId,
169
+ timestamp: lastTimestamp,
170
+ };
171
+ }
172
+ async doShutdown() {
173
+ if (this.bot && this.launched) {
174
+ try {
175
+ if (typeof this.bot.stop === 'function') {
176
+ this.bot.stop('AgentOS shutting down');
177
+ }
178
+ }
179
+ catch {
180
+ // Best effort — bot may already be stopped
181
+ }
182
+ }
183
+ this.bot = undefined;
184
+ this.sdk = undefined;
185
+ this.launched = false;
186
+ console.log('[Telegram] Adapter shut down.');
187
+ }
188
+ // ── IChannelAdapter optional methods ──
189
+ async editMessage(conversationId, messageId, content) {
190
+ if (!this.bot)
191
+ throw new Error('[Telegram] Bot is not connected.');
192
+ const telegram = this.bot.telegram ?? this.bot.api;
193
+ const textBlock = content.blocks.find((b) => b.type === 'text');
194
+ if (textBlock && textBlock.type === 'text') {
195
+ await telegram.editMessageText(conversationId, parseInt(messageId, 10), undefined, textBlock.text, { parse_mode: 'HTML' });
196
+ }
197
+ }
198
+ async deleteMessage(conversationId, messageId) {
199
+ if (!this.bot)
200
+ throw new Error('[Telegram] Bot is not connected.');
201
+ const telegram = this.bot.telegram ?? this.bot.api;
202
+ await telegram.deleteMessage(conversationId, parseInt(messageId, 10));
203
+ }
204
+ async addReaction(conversationId, messageId, emoji) {
205
+ if (!this.bot)
206
+ throw new Error('[Telegram] Bot is not connected.');
207
+ const telegram = this.bot.telegram ?? this.bot.api;
208
+ try {
209
+ await telegram.setMessageReaction(conversationId, parseInt(messageId, 10), [
210
+ { type: 'emoji', emoji },
211
+ ]);
212
+ }
213
+ catch (err) {
214
+ console.warn(`[Telegram] Failed to set reaction: ${err}`);
215
+ }
216
+ }
217
+ async sendTypingIndicator(conversationId, _isTyping) {
218
+ if (!this.bot)
219
+ return;
220
+ const telegram = this.bot.telegram ?? this.bot.api;
221
+ try {
222
+ await telegram.sendChatAction(conversationId, 'typing');
223
+ }
224
+ catch {
225
+ // Non-critical — typing indicators are best-effort
226
+ }
227
+ }
228
+ // ── Private helpers ──
229
+ /**
230
+ * Send a single content block to a Telegram chat.
231
+ */
232
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
233
+ async sendBlock(telegram, // eslint-disable-line @typescript-eslint/no-explicit-any
234
+ chatId, block, replyParams, content) {
235
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
236
+ let msg;
237
+ const extra = { ...replyParams, ...(content.platformOptions ?? {}) };
238
+ switch (block.type) {
239
+ case 'text': {
240
+ msg = await telegram.sendMessage(chatId, block.text, {
241
+ ...extra,
242
+ parse_mode: 'HTML',
243
+ });
244
+ break;
245
+ }
246
+ case 'image': {
247
+ msg = await telegram.sendPhoto(chatId, block.url, {
248
+ ...extra,
249
+ caption: block.caption,
250
+ });
251
+ break;
252
+ }
253
+ case 'video': {
254
+ msg = await telegram.sendVideo(chatId, block.url, {
255
+ ...extra,
256
+ caption: block.caption,
257
+ });
258
+ break;
259
+ }
260
+ case 'audio': {
261
+ msg = await telegram.sendAudio(chatId, block.url, {
262
+ ...extra,
263
+ duration: block.duration,
264
+ });
265
+ break;
266
+ }
267
+ case 'document': {
268
+ msg = await telegram.sendDocument(chatId, block.url, {
269
+ ...extra,
270
+ caption: block.filename,
271
+ });
272
+ break;
273
+ }
274
+ case 'sticker': {
275
+ msg = await telegram.sendSticker(chatId, block.stickerId, extra);
276
+ break;
277
+ }
278
+ case 'location': {
279
+ msg = await telegram.sendLocation(chatId, block.latitude, block.longitude, extra);
280
+ break;
281
+ }
282
+ case 'button_group': {
283
+ // Build inline keyboard from buttons
284
+ const inlineKeyboard = block.buttons.map((btn) => {
285
+ if (btn.action === 'url') {
286
+ return [{ text: btn.label, url: btn.value }];
287
+ }
288
+ return [{ text: btn.label, callback_data: btn.id }];
289
+ });
290
+ msg = await telegram.sendMessage(chatId, content.blocks.find((b) => b.type === 'text')?.type === 'text'
291
+ ? content.blocks.find((b) => b.type === 'text').text
292
+ : 'Choose an option:', {
293
+ ...extra,
294
+ reply_markup: { inline_keyboard: inlineKeyboard },
295
+ });
296
+ break;
297
+ }
298
+ case 'poll': {
299
+ msg = await telegram.sendPoll(chatId, block.question, block.options, extra);
300
+ break;
301
+ }
302
+ default: {
303
+ // Unsupported block type — skip silently
304
+ console.warn(`[Telegram] Unsupported content block type: ${block.type}`); // eslint-disable-line @typescript-eslint/no-explicit-any
305
+ return undefined;
306
+ }
307
+ }
308
+ if (msg) {
309
+ return {
310
+ messageId: String(msg.message_id),
311
+ timestamp: msg.date
312
+ ? new Date(msg.date * 1000).toISOString()
313
+ : new Date().toISOString(),
314
+ };
315
+ }
316
+ return undefined;
317
+ }
318
+ /**
319
+ * Handle inbound messages from Telegram and emit channel events.
320
+ */
321
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
322
+ handleInboundMessage(ctx) {
323
+ const msg = ctx.message ?? ctx.update?.message;
324
+ if (!msg)
325
+ return;
326
+ const chatId = String(msg.chat?.id ?? '');
327
+ const isGroup = msg.chat?.type === 'group' ||
328
+ msg.chat?.type === 'supergroup';
329
+ const isChannel = msg.chat?.type === 'channel';
330
+ // Build content blocks from the Telegram message
331
+ const contentBlocks = [];
332
+ if (msg.text) {
333
+ contentBlocks.push({ type: 'text', text: msg.text });
334
+ }
335
+ if (msg.caption) {
336
+ contentBlocks.push({ type: 'text', text: msg.caption });
337
+ }
338
+ if (msg.photo && msg.photo.length > 0) {
339
+ // Use largest photo
340
+ const photo = msg.photo[msg.photo.length - 1];
341
+ contentBlocks.push({
342
+ type: 'image',
343
+ url: photo.file_id,
344
+ caption: msg.caption,
345
+ });
346
+ }
347
+ if (msg.video) {
348
+ contentBlocks.push({
349
+ type: 'video',
350
+ url: msg.video.file_id,
351
+ caption: msg.caption,
352
+ });
353
+ }
354
+ if (msg.audio) {
355
+ contentBlocks.push({
356
+ type: 'audio',
357
+ url: msg.audio.file_id,
358
+ duration: msg.audio.duration,
359
+ });
360
+ }
361
+ if (msg.voice) {
362
+ contentBlocks.push({
363
+ type: 'audio',
364
+ url: msg.voice.file_id,
365
+ duration: msg.voice.duration,
366
+ });
367
+ }
368
+ if (msg.document) {
369
+ contentBlocks.push({
370
+ type: 'document',
371
+ url: msg.document.file_id,
372
+ filename: msg.document.file_name ?? 'document',
373
+ });
374
+ }
375
+ if (msg.sticker) {
376
+ contentBlocks.push({
377
+ type: 'sticker',
378
+ stickerId: msg.sticker.file_id,
379
+ });
380
+ }
381
+ if (msg.location) {
382
+ contentBlocks.push({
383
+ type: 'location',
384
+ latitude: msg.location.latitude,
385
+ longitude: msg.location.longitude,
386
+ });
387
+ }
388
+ // Fallback to empty text if no content blocks were extracted
389
+ if (contentBlocks.length === 0) {
390
+ contentBlocks.push({ type: 'text', text: '' });
391
+ }
392
+ const channelMessage = {
393
+ messageId: String(msg.message_id),
394
+ platform: 'telegram',
395
+ conversationId: chatId,
396
+ conversationType: isChannel ? 'channel' : isGroup ? 'group' : 'direct',
397
+ sender: {
398
+ id: String(msg.from?.id ?? ''),
399
+ displayName: [msg.from?.first_name, msg.from?.last_name]
400
+ .filter(Boolean)
401
+ .join(' ') || undefined,
402
+ username: msg.from?.username,
403
+ },
404
+ content: contentBlocks,
405
+ text: msg.text ?? msg.caption ?? '',
406
+ timestamp: msg.date
407
+ ? new Date(msg.date * 1000).toISOString()
408
+ : new Date().toISOString(),
409
+ replyToMessageId: msg.reply_to_message
410
+ ? String(msg.reply_to_message.message_id)
411
+ : undefined,
412
+ rawEvent: msg,
413
+ };
414
+ this.emit({
415
+ type: 'message',
416
+ platform: 'telegram',
417
+ conversationId: chatId,
418
+ timestamp: channelMessage.timestamp,
419
+ data: channelMessage,
420
+ });
421
+ }
422
+ /**
423
+ * Handle inline keyboard callback queries.
424
+ */
425
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
426
+ handleCallbackQuery(ctx) {
427
+ const query = ctx.callbackQuery ?? ctx.update?.callback_query;
428
+ if (!query)
429
+ return;
430
+ const chatId = String(query.message?.chat?.id ?? '');
431
+ this.emit({
432
+ type: 'button_callback',
433
+ platform: 'telegram',
434
+ conversationId: chatId,
435
+ timestamp: new Date().toISOString(),
436
+ data: {
437
+ callbackId: query.id,
438
+ buttonId: query.data ?? '',
439
+ sender: {
440
+ id: String(query.from?.id ?? ''),
441
+ displayName: [query.from?.first_name, query.from?.last_name]
442
+ .filter(Boolean)
443
+ .join(' ') || undefined,
444
+ username: query.from?.username,
445
+ },
446
+ messageId: String(query.message?.message_id ?? ''),
447
+ },
448
+ });
449
+ // Answer the callback query to dismiss the loading spinner
450
+ try {
451
+ if (typeof ctx.answerCbQuery === 'function') {
452
+ ctx.answerCbQuery();
453
+ }
454
+ else if (typeof ctx.answerCallbackQuery === 'function') {
455
+ ctx.answerCallbackQuery();
456
+ }
457
+ }
458
+ catch {
459
+ // Non-critical
460
+ }
461
+ }
462
+ }
463
+ //# sourceMappingURL=TelegramChannelAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChannelAdapter.js","sourceRoot":"","sources":["../../../src/channels/adapters/TelegramChannelAdapter.ts"],"names":[],"mappings":"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"}