@framers/agentos-ext-channel-telegram 0.1.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.
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @fileoverview IChannelAdapter implementation for Telegram via grammY.
3
+ */
4
+ import type { IChannelAdapter, ChannelPlatform, ChannelCapability, ChannelAuthConfig, ChannelConnectionInfo, ChannelSendResult, MessageContent, ChannelEventHandler, ChannelEventType } from '@framers/agentos';
5
+ import { TelegramService } from './TelegramService';
6
+ export declare class TelegramChannelAdapter implements IChannelAdapter {
7
+ private readonly service;
8
+ readonly platform: ChannelPlatform;
9
+ readonly displayName = "Telegram";
10
+ readonly capabilities: readonly ChannelCapability[];
11
+ private handlers;
12
+ private ctxHandler;
13
+ constructor(service: TelegramService);
14
+ initialize(auth: ChannelAuthConfig): Promise<void>;
15
+ shutdown(): Promise<void>;
16
+ getConnectionInfo(): ChannelConnectionInfo;
17
+ sendMessage(conversationId: string, content: MessageContent): Promise<ChannelSendResult>;
18
+ sendTypingIndicator(conversationId: string, _isTyping: boolean): Promise<void>;
19
+ on(handler: ChannelEventHandler, eventTypes?: ChannelEventType[]): () => void;
20
+ editMessage(conversationId: string, messageId: string, content: MessageContent): Promise<void>;
21
+ deleteMessage(conversationId: string, messageId: string): Promise<void>;
22
+ addReaction(conversationId: string, messageId: string, emoji: string): Promise<void>;
23
+ getConversationInfo(conversationId: string): Promise<{
24
+ name?: string;
25
+ memberCount?: number;
26
+ isGroup: boolean;
27
+ metadata?: Record<string, unknown>;
28
+ }>;
29
+ private handleInboundMessage;
30
+ private emit;
31
+ }
32
+ //# sourceMappingURL=TelegramChannelAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChannelAdapter.d.ts","sourceRoot":"","sources":["../src/TelegramChannelAdapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAKjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,qBAAa,sBAAuB,YAAW,eAAe;IAwBhD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAvBpC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAc;IAChD,QAAQ,CAAC,WAAW,cAAc;IAClC,QAAQ,CAAC,YAAY,EAAE,SAAS,iBAAiB,EAAE,CAgBxC;IAEX,OAAO,CAAC,QAAQ,CAAkE;IAClF,OAAO,CAAC,UAAU,CAAyC;gBAE9B,OAAO,EAAE,eAAe;IAE/C,UAAU,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ/B,iBAAiB,IAAI,qBAAqB;IAMpC,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA+BxF,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpF,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,UAAU,CAAC,EAAE,gBAAgB,EAAE,GAAG,MAAM,IAAI;IAOvE,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9F,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpF,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACpC,CAAC;IAaF,OAAO,CAAC,oBAAoB;IA2C5B,OAAO,CAAC,IAAI;CASb"}
@@ -0,0 +1,164 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview IChannelAdapter implementation for Telegram via grammY.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TelegramChannelAdapter = void 0;
7
+ class TelegramChannelAdapter {
8
+ constructor(service) {
9
+ this.service = service;
10
+ this.platform = 'telegram';
11
+ this.displayName = 'Telegram';
12
+ this.capabilities = [
13
+ 'text',
14
+ 'rich_text',
15
+ 'images',
16
+ 'video',
17
+ 'audio',
18
+ 'documents',
19
+ 'stickers',
20
+ 'reactions',
21
+ 'inline_keyboard',
22
+ 'buttons',
23
+ 'typing_indicator',
24
+ 'group_chat',
25
+ 'editing',
26
+ 'deletion',
27
+ 'mentions',
28
+ ];
29
+ this.handlers = new Map();
30
+ this.ctxHandler = null;
31
+ }
32
+ async initialize(auth) {
33
+ // Service is initialized by the extension pack lifecycle, but
34
+ // if called directly (e.g., standalone usage), we wire up here.
35
+ this.ctxHandler = (ctx) => this.handleInboundMessage(ctx);
36
+ this.service.onMessage(this.ctxHandler);
37
+ }
38
+ async shutdown() {
39
+ if (this.ctxHandler) {
40
+ this.service.offMessage(this.ctxHandler);
41
+ this.ctxHandler = null;
42
+ }
43
+ this.handlers.clear();
44
+ }
45
+ getConnectionInfo() {
46
+ return {
47
+ status: this.service.isRunning ? 'connected' : 'disconnected',
48
+ };
49
+ }
50
+ async sendMessage(conversationId, content) {
51
+ const textBlock = content.blocks.find((b) => b.type === 'text');
52
+ const imageBlock = content.blocks.find((b) => b.type === 'image');
53
+ const documentBlock = content.blocks.find((b) => b.type === 'document');
54
+ let messageId;
55
+ if (imageBlock && imageBlock.type === 'image') {
56
+ const result = await this.service.sendPhoto(conversationId, imageBlock.url, {
57
+ caption: imageBlock.caption ?? textBlock?.text,
58
+ });
59
+ messageId = result.message_id;
60
+ }
61
+ else if (documentBlock && documentBlock.type === 'document') {
62
+ const result = await this.service.sendDocument(conversationId, documentBlock.url, {
63
+ caption: textBlock?.text,
64
+ filename: documentBlock.filename,
65
+ });
66
+ messageId = result.message_id;
67
+ }
68
+ else {
69
+ const text = textBlock?.text ?? '';
70
+ const result = await this.service.sendMessage(conversationId, text, {
71
+ replyToMessageId: content.replyToMessageId
72
+ ? Number(content.replyToMessageId)
73
+ : undefined,
74
+ });
75
+ messageId = result.message_id;
76
+ }
77
+ return { messageId: String(messageId), timestamp: new Date().toISOString() };
78
+ }
79
+ async sendTypingIndicator(conversationId, _isTyping) {
80
+ if (_isTyping) {
81
+ await this.service.sendChatAction(conversationId, 'typing');
82
+ }
83
+ // Telegram doesn't have a "stop typing" API — it auto-clears.
84
+ }
85
+ on(handler, eventTypes) {
86
+ this.handlers.set(handler, eventTypes);
87
+ return () => {
88
+ this.handlers.delete(handler);
89
+ };
90
+ }
91
+ async editMessage(conversationId, messageId, content) {
92
+ const textBlock = content.blocks.find((b) => b.type === 'text');
93
+ if (textBlock && textBlock.type === 'text') {
94
+ await this.service.api.editMessageText(conversationId, Number(messageId), textBlock.text);
95
+ }
96
+ }
97
+ async deleteMessage(conversationId, messageId) {
98
+ await this.service.api.deleteMessage(conversationId, Number(messageId));
99
+ }
100
+ async addReaction(conversationId, messageId, emoji) {
101
+ await this.service.api.setMessageReaction(conversationId, Number(messageId), [
102
+ { type: 'emoji', emoji },
103
+ ]);
104
+ }
105
+ async getConversationInfo(conversationId) {
106
+ const chat = await this.service.api.getChat(conversationId);
107
+ const isGroup = ['group', 'supergroup'].includes(chat.type);
108
+ return {
109
+ name: chat.title ?? chat.first_name,
110
+ memberCount: isGroup ? await this.service.api.getChatMemberCount(conversationId) : undefined,
111
+ isGroup,
112
+ metadata: { type: chat.type, username: chat.username },
113
+ };
114
+ }
115
+ // ── Private ──
116
+ handleInboundMessage(ctx) {
117
+ const msg = ctx.message;
118
+ if (!msg)
119
+ return;
120
+ const sender = {
121
+ id: String(msg.from?.id ?? 'unknown'),
122
+ displayName: [msg.from?.first_name, msg.from?.last_name].filter(Boolean).join(' ') || undefined,
123
+ username: msg.from?.username,
124
+ };
125
+ // grammY's message typings can be narrower than Telegram's full chat-type
126
+ // union; treat it as a string to support channel posts consistently.
127
+ const chatType = msg.chat.type;
128
+ const conversationType = chatType === 'private' ? 'direct' :
129
+ chatType === 'channel' ? 'channel' : 'group';
130
+ const channelMessage = {
131
+ messageId: String(msg.message_id),
132
+ platform: 'telegram',
133
+ conversationId: String(msg.chat.id),
134
+ conversationType,
135
+ sender,
136
+ content: [{ type: 'text', text: msg.text ?? '' }],
137
+ text: msg.text ?? '',
138
+ timestamp: new Date(msg.date * 1000).toISOString(),
139
+ replyToMessageId: msg.reply_to_message
140
+ ? String(msg.reply_to_message.message_id)
141
+ : undefined,
142
+ rawEvent: ctx,
143
+ };
144
+ const event = {
145
+ type: 'message',
146
+ platform: 'telegram',
147
+ conversationId: String(msg.chat.id),
148
+ timestamp: channelMessage.timestamp,
149
+ data: channelMessage,
150
+ };
151
+ this.emit(event);
152
+ }
153
+ emit(event) {
154
+ for (const [handler, filter] of this.handlers) {
155
+ if (!filter || filter.includes(event.type)) {
156
+ Promise.resolve(handler(event)).catch((err) => {
157
+ console.error('[TelegramChannelAdapter] Handler error:', err);
158
+ });
159
+ }
160
+ }
161
+ }
162
+ }
163
+ exports.TelegramChannelAdapter = TelegramChannelAdapter;
164
+ //# sourceMappingURL=TelegramChannelAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramChannelAdapter.js","sourceRoot":"","sources":["../src/TelegramChannelAdapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @fileoverview Telegram SDK wrapper using grammY.
3
+ * Handles bot lifecycle, message sending, and rate limiting.
4
+ */
5
+ import { type Api, type Context } from 'grammy';
6
+ export interface TelegramChannelConfig {
7
+ botToken: string;
8
+ webhookUrl?: string;
9
+ pollingTimeout?: number;
10
+ defaultParseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
11
+ rateLimit?: {
12
+ maxRequests: number;
13
+ windowMs: number;
14
+ };
15
+ }
16
+ export declare class TelegramService {
17
+ private bot;
18
+ private running;
19
+ private messageHandlers;
20
+ private rateMap;
21
+ private readonly config;
22
+ constructor(config: TelegramChannelConfig);
23
+ initialize(): Promise<void>;
24
+ shutdown(): Promise<void>;
25
+ get api(): Api;
26
+ get isRunning(): boolean;
27
+ onMessage(handler: (ctx: Context) => void): void;
28
+ offMessage(handler: (ctx: Context) => void): void;
29
+ sendMessage(chatId: string | number, text: string, options?: {
30
+ parseMode?: string;
31
+ replyToMessageId?: number;
32
+ replyMarkup?: unknown;
33
+ disableNotification?: boolean;
34
+ }): Promise<{
35
+ message_id: number;
36
+ chat: {
37
+ id: number;
38
+ };
39
+ date: number;
40
+ text?: string;
41
+ }>;
42
+ sendPhoto(chatId: string | number, photo: string, options?: {
43
+ caption?: string;
44
+ parseMode?: string;
45
+ }): Promise<{
46
+ message_id: number;
47
+ }>;
48
+ sendDocument(chatId: string | number, document: string, options?: {
49
+ caption?: string;
50
+ filename?: string;
51
+ }): Promise<{
52
+ message_id: number;
53
+ }>;
54
+ sendChatAction(chatId: string | number, action: string): Promise<void>;
55
+ getBotInfo(): Promise<{
56
+ id: number;
57
+ first_name: string;
58
+ username?: string;
59
+ }>;
60
+ private checkRateLimit;
61
+ }
62
+ //# sourceMappingURL=TelegramService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramService.d.ts","sourceRoot":"","sources":["../src/TelegramService.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAO,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,QAAQ,CAAC;AAErD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACtD,SAAS,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAOD,qBAAa,eAAe;IAC1B,OAAO,CAAC,GAAG,CAAoB;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,eAAe,CAAqC;IAC5D,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAEG;gBAEd,MAAM,EAAE,qBAAqB;IAQnC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAyB3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/B,IAAI,GAAG,IAAI,GAAG,CAGb;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAIhD,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IAK3C,WAAW,CACf,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,GACA,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAU/E,SAAS,CACb,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GACjD,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ5B,YAAY,CAChB,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAChD,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAO5B,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAItE,UAAU,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;YAKpE,cAAc;CAe7B"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Telegram SDK wrapper using grammY.
4
+ * Handles bot lifecycle, message sending, and rate limiting.
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TelegramService = void 0;
8
+ const grammy_1 = require("grammy");
9
+ class TelegramService {
10
+ constructor(config) {
11
+ this.bot = null;
12
+ this.running = false;
13
+ this.messageHandlers = [];
14
+ this.rateMap = new Map();
15
+ this.config = {
16
+ ...config,
17
+ defaultParseMode: config.defaultParseMode ?? 'HTML',
18
+ rateLimit: config.rateLimit ?? { maxRequests: 30, windowMs: 1000 },
19
+ };
20
+ }
21
+ async initialize() {
22
+ if (this.running)
23
+ return;
24
+ this.bot = new grammy_1.Bot(this.config.botToken);
25
+ // Wire up inbound message handler
26
+ this.bot.on('message', (ctx) => {
27
+ for (const handler of this.messageHandlers) {
28
+ handler(ctx);
29
+ }
30
+ });
31
+ if (this.config.webhookUrl) {
32
+ await this.bot.api.setWebhook(this.config.webhookUrl);
33
+ }
34
+ else {
35
+ // Fire-and-forget polling start
36
+ this.bot.start({
37
+ drop_pending_updates: true,
38
+ onStart: () => { this.running = true; },
39
+ });
40
+ }
41
+ this.running = true;
42
+ }
43
+ async shutdown() {
44
+ if (!this.running || !this.bot)
45
+ return;
46
+ await this.bot.stop();
47
+ this.running = false;
48
+ this.bot = null;
49
+ }
50
+ get api() {
51
+ if (!this.bot)
52
+ throw new Error('TelegramService not initialized');
53
+ return this.bot.api;
54
+ }
55
+ get isRunning() {
56
+ return this.running;
57
+ }
58
+ onMessage(handler) {
59
+ this.messageHandlers.push(handler);
60
+ }
61
+ offMessage(handler) {
62
+ const idx = this.messageHandlers.indexOf(handler);
63
+ if (idx >= 0)
64
+ this.messageHandlers.splice(idx, 1);
65
+ }
66
+ async sendMessage(chatId, text, options) {
67
+ await this.checkRateLimit(String(chatId));
68
+ return this.api.sendMessage(chatId, text, {
69
+ parse_mode: (options?.parseMode ?? this.config.defaultParseMode),
70
+ reply_to_message_id: options?.replyToMessageId,
71
+ reply_markup: options?.replyMarkup,
72
+ disable_notification: options?.disableNotification,
73
+ });
74
+ }
75
+ async sendPhoto(chatId, photo, options) {
76
+ await this.checkRateLimit(String(chatId));
77
+ return this.api.sendPhoto(chatId, photo, {
78
+ caption: options?.caption,
79
+ parse_mode: (options?.parseMode ?? this.config.defaultParseMode),
80
+ });
81
+ }
82
+ async sendDocument(chatId, document, options) {
83
+ await this.checkRateLimit(String(chatId));
84
+ return this.api.sendDocument(chatId, document, {
85
+ caption: options?.caption,
86
+ });
87
+ }
88
+ async sendChatAction(chatId, action) {
89
+ await this.api.sendChatAction(chatId, action);
90
+ }
91
+ async getBotInfo() {
92
+ const me = await this.api.getMe();
93
+ return { id: me.id, first_name: me.first_name, username: me.username };
94
+ }
95
+ async checkRateLimit(key) {
96
+ const now = Date.now();
97
+ const state = this.rateMap.get(key);
98
+ if (!state || now >= state.resetAt) {
99
+ this.rateMap.set(key, { count: 1, resetAt: now + this.config.rateLimit.windowMs });
100
+ return;
101
+ }
102
+ if (state.count >= this.config.rateLimit.maxRequests) {
103
+ const waitMs = state.resetAt - now;
104
+ await new Promise((resolve) => setTimeout(resolve, waitMs));
105
+ this.rateMap.set(key, { count: 1, resetAt: Date.now() + this.config.rateLimit.windowMs });
106
+ return;
107
+ }
108
+ state.count++;
109
+ }
110
+ }
111
+ exports.TelegramService = TelegramService;
112
+ //# sourceMappingURL=TelegramService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TelegramService.js","sourceRoot":"","sources":["../src/TelegramService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Telegram Channel Extension for AgentOS.
3
+ *
4
+ * Provides a bidirectional messaging channel adapter using grammY,
5
+ * plus ITool descriptors for programmatic message sending.
6
+ *
7
+ * @module @framers/agentos-ext-channel-telegram
8
+ */
9
+ import type { ExtensionContext, ExtensionPack } from '@framers/agentos';
10
+ import { TelegramService, type TelegramChannelConfig } from './TelegramService';
11
+ import { TelegramChannelAdapter } from './TelegramChannelAdapter';
12
+ import { TelegramSendMessageTool } from './tools/sendMessage';
13
+ import { TelegramSendMediaTool } from './tools/sendMedia';
14
+ export interface TelegramChannelOptions {
15
+ botToken?: string;
16
+ botTokenEnv?: string;
17
+ webhookUrl?: string;
18
+ pollingTimeout?: number;
19
+ defaultParseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
20
+ rateLimit?: {
21
+ maxRequests: number;
22
+ windowMs: number;
23
+ };
24
+ priority?: number;
25
+ }
26
+ export declare function createExtensionPack(context: ExtensionContext): ExtensionPack;
27
+ export { TelegramService, TelegramChannelAdapter, TelegramSendMessageTool, TelegramSendMediaTool };
28
+ export type { TelegramChannelConfig };
29
+ export default createExtensionPack;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,UAAU,GAAG,YAAY,GAAG,MAAM,CAAC;IACtD,SAAS,CAAC,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAuBD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,gBAAgB,GAAG,aAAa,CAuC5E;AAED,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,CAAC;AACnG,YAAY,EAAE,qBAAqB,EAAE,CAAC;AACtC,eAAe,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Telegram Channel Extension for AgentOS.
4
+ *
5
+ * Provides a bidirectional messaging channel adapter using grammY,
6
+ * plus ITool descriptors for programmatic message sending.
7
+ *
8
+ * @module @framers/agentos-ext-channel-telegram
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.TelegramSendMediaTool = exports.TelegramSendMessageTool = exports.TelegramChannelAdapter = exports.TelegramService = void 0;
12
+ exports.createExtensionPack = createExtensionPack;
13
+ const TelegramService_1 = require("./TelegramService");
14
+ Object.defineProperty(exports, "TelegramService", { enumerable: true, get: function () { return TelegramService_1.TelegramService; } });
15
+ const TelegramChannelAdapter_1 = require("./TelegramChannelAdapter");
16
+ Object.defineProperty(exports, "TelegramChannelAdapter", { enumerable: true, get: function () { return TelegramChannelAdapter_1.TelegramChannelAdapter; } });
17
+ const sendMessage_1 = require("./tools/sendMessage");
18
+ Object.defineProperty(exports, "TelegramSendMessageTool", { enumerable: true, get: function () { return sendMessage_1.TelegramSendMessageTool; } });
19
+ const sendMedia_1 = require("./tools/sendMedia");
20
+ Object.defineProperty(exports, "TelegramSendMediaTool", { enumerable: true, get: function () { return sendMedia_1.TelegramSendMediaTool; } });
21
+ function resolveBotToken(options, secrets) {
22
+ if (options.botToken)
23
+ return options.botToken;
24
+ // Check secrets map from registry
25
+ if (secrets?.['telegram.botToken'])
26
+ return secrets['telegram.botToken'];
27
+ // Environment variable fallback
28
+ const envName = options.botTokenEnv ?? 'TELEGRAM_BOT_TOKEN';
29
+ const envValue = process.env[envName];
30
+ if (envValue)
31
+ return envValue;
32
+ // Common variations
33
+ for (const v of ['TELEGRAM_BOT_TOKEN', 'TELEGRAM_TOKEN']) {
34
+ if (process.env[v])
35
+ return process.env[v];
36
+ }
37
+ throw new Error('Telegram bot token not found. Provide via options.botToken, secrets["telegram.botToken"], or TELEGRAM_BOT_TOKEN env var.');
38
+ }
39
+ function createExtensionPack(context) {
40
+ const options = (context.options ?? {});
41
+ const botToken = resolveBotToken(options, options.secrets);
42
+ const config = {
43
+ botToken,
44
+ webhookUrl: options.webhookUrl,
45
+ pollingTimeout: options.pollingTimeout,
46
+ defaultParseMode: options.defaultParseMode ?? 'HTML',
47
+ rateLimit: options.rateLimit ?? { maxRequests: 30, windowMs: 1000 },
48
+ };
49
+ const service = new TelegramService_1.TelegramService(config);
50
+ const adapter = new TelegramChannelAdapter_1.TelegramChannelAdapter(service);
51
+ const sendMessageTool = new sendMessage_1.TelegramSendMessageTool(service);
52
+ const sendMediaTool = new sendMedia_1.TelegramSendMediaTool(service);
53
+ const priority = options.priority ?? 50;
54
+ return {
55
+ name: '@framers/agentos-ext-channel-telegram',
56
+ version: '0.1.0',
57
+ descriptors: [
58
+ { id: 'telegramChannelSendMessage', kind: 'tool', priority, payload: sendMessageTool },
59
+ { id: 'telegramChannelSendMedia', kind: 'tool', priority, payload: sendMediaTool },
60
+ { id: 'telegramChannel', kind: 'messaging-channel', priority, payload: adapter },
61
+ ],
62
+ onActivate: async () => {
63
+ await service.initialize();
64
+ // Wire adapter event listeners after service is running
65
+ await adapter.initialize({ platform: 'telegram', credential: botToken });
66
+ context.logger?.info('[TelegramChannel] Extension activated');
67
+ },
68
+ onDeactivate: async () => {
69
+ await adapter.shutdown();
70
+ await service.shutdown();
71
+ context.logger?.info('[TelegramChannel] Extension deactivated');
72
+ },
73
+ };
74
+ }
75
+ exports.default = createExtensionPack;
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @fileoverview ITool for sending media (photo, document, video) via the Telegram channel adapter.
3
+ */
4
+ import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
5
+ import type { TelegramService } from '../TelegramService';
6
+ export declare class TelegramSendMediaTool implements ITool {
7
+ private readonly service;
8
+ readonly id = "telegramChannelSendMedia";
9
+ readonly name = "telegramChannelSendMedia";
10
+ readonly displayName = "Send Telegram Media";
11
+ readonly description = "Send a photo or document to a Telegram chat via the channel adapter.";
12
+ readonly category = "communication";
13
+ readonly version = "0.1.0";
14
+ readonly hasSideEffects = true;
15
+ readonly inputSchema: {
16
+ type: "object";
17
+ required: readonly ["chatId", "mediaType", "url"];
18
+ properties: {
19
+ chatId: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ mediaType: {
24
+ type: string;
25
+ enum: string[];
26
+ description: string;
27
+ };
28
+ url: {
29
+ type: string;
30
+ description: string;
31
+ };
32
+ caption: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ filename: {
37
+ type: string;
38
+ description: string;
39
+ };
40
+ };
41
+ };
42
+ readonly outputSchema: {
43
+ type: "object";
44
+ properties: {
45
+ messageId: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ };
51
+ constructor(service: TelegramService);
52
+ execute(args: {
53
+ chatId: string;
54
+ mediaType: 'photo' | 'document';
55
+ url: string;
56
+ caption?: string;
57
+ filename?: string;
58
+ }, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
59
+ validateArgs(args: Record<string, any>): {
60
+ isValid: boolean;
61
+ errors?: string[];
62
+ };
63
+ }
64
+ //# sourceMappingURL=sendMedia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMedia.d.ts","sourceRoot":"","sources":["../../src/tools/sendMedia.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,qBAAa,qBAAsB,YAAW,KAAK;IA4BrC,OAAO,CAAC,QAAQ,CAAC,OAAO;IA3BpC,SAAgB,EAAE,8BAA8B;IAChD,SAAgB,IAAI,8BAA8B;IAClD,SAAgB,WAAW,yBAAyB;IACpD,SAAgB,WAAW,0EAA0E;IACrG,SAAgB,QAAQ,mBAAmB;IAC3C,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,QAAQ;IAEtC,SAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;MAUzB;IAEF,SAAgB,YAAY;;;;;;;;MAK1B;gBAE2B,OAAO,EAAE,eAAe;IAE/C,OAAO,CACX,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,GAAG,UAAU,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAC3G,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IAmB/B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CASjF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview ITool for sending media (photo, document, video) via the Telegram channel adapter.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TelegramSendMediaTool = void 0;
7
+ class TelegramSendMediaTool {
8
+ constructor(service) {
9
+ this.service = service;
10
+ this.id = 'telegramChannelSendMedia';
11
+ this.name = 'telegramChannelSendMedia';
12
+ this.displayName = 'Send Telegram Media';
13
+ this.description = 'Send a photo or document to a Telegram chat via the channel adapter.';
14
+ this.category = 'communication';
15
+ this.version = '0.1.0';
16
+ this.hasSideEffects = true;
17
+ this.inputSchema = {
18
+ type: 'object',
19
+ required: ['chatId', 'mediaType', 'url'],
20
+ properties: {
21
+ chatId: { type: 'string', description: 'Target chat ID' },
22
+ mediaType: { type: 'string', enum: ['photo', 'document'], description: 'Type of media to send' },
23
+ url: { type: 'string', description: 'URL or file_id of the media' },
24
+ caption: { type: 'string', description: 'Optional caption' },
25
+ filename: { type: 'string', description: 'Filename (documents only)' },
26
+ },
27
+ };
28
+ this.outputSchema = {
29
+ type: 'object',
30
+ properties: {
31
+ messageId: { type: 'number', description: 'Sent message ID' },
32
+ },
33
+ };
34
+ }
35
+ async execute(args, _context) {
36
+ try {
37
+ let result;
38
+ if (args.mediaType === 'photo') {
39
+ result = await this.service.sendPhoto(args.chatId, args.url, { caption: args.caption });
40
+ }
41
+ else {
42
+ result = await this.service.sendDocument(args.chatId, args.url, {
43
+ caption: args.caption,
44
+ filename: args.filename,
45
+ });
46
+ }
47
+ return { success: true, output: { messageId: result.message_id } };
48
+ }
49
+ catch (error) {
50
+ return { success: false, error: error.message };
51
+ }
52
+ }
53
+ validateArgs(args) {
54
+ const errors = [];
55
+ if (!args.chatId)
56
+ errors.push('chatId is required');
57
+ if (!args.mediaType || !['photo', 'document'].includes(args.mediaType)) {
58
+ errors.push('mediaType must be "photo" or "document"');
59
+ }
60
+ if (!args.url)
61
+ errors.push('url is required');
62
+ return { isValid: errors.length === 0, errors };
63
+ }
64
+ }
65
+ exports.TelegramSendMediaTool = TelegramSendMediaTool;
66
+ //# sourceMappingURL=sendMedia.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMedia.js","sourceRoot":"","sources":["../../src/tools/sendMedia.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * @fileoverview ITool for sending text messages via the Telegram channel adapter.
3
+ */
4
+ import type { ITool, ToolExecutionContext, ToolExecutionResult } from '@framers/agentos';
5
+ import type { TelegramService } from '../TelegramService';
6
+ export declare class TelegramSendMessageTool implements ITool {
7
+ private readonly service;
8
+ readonly id = "telegramChannelSendMessage";
9
+ readonly name = "telegramChannelSendMessage";
10
+ readonly displayName = "Send Telegram Message";
11
+ readonly description = "Send a text message to a Telegram chat via the channel adapter.";
12
+ readonly category = "communication";
13
+ readonly version = "0.1.0";
14
+ readonly hasSideEffects = true;
15
+ readonly inputSchema: {
16
+ type: "object";
17
+ required: readonly ["chatId", "text"];
18
+ properties: {
19
+ chatId: {
20
+ type: string;
21
+ description: string;
22
+ };
23
+ text: {
24
+ type: string;
25
+ description: string;
26
+ };
27
+ parseMode: {
28
+ type: string;
29
+ enum: string[];
30
+ description: string;
31
+ };
32
+ replyToMessageId: {
33
+ type: string;
34
+ description: string;
35
+ };
36
+ };
37
+ };
38
+ readonly outputSchema: {
39
+ type: "object";
40
+ properties: {
41
+ messageId: {
42
+ type: string;
43
+ description: string;
44
+ };
45
+ chatId: {
46
+ type: string;
47
+ description: string;
48
+ };
49
+ };
50
+ };
51
+ constructor(service: TelegramService);
52
+ execute(args: {
53
+ chatId: string;
54
+ text: string;
55
+ parseMode?: string;
56
+ replyToMessageId?: number;
57
+ }, _context: ToolExecutionContext): Promise<ToolExecutionResult>;
58
+ validateArgs(args: Record<string, any>): {
59
+ isValid: boolean;
60
+ errors?: string[];
61
+ };
62
+ }
63
+ //# sourceMappingURL=sendMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMessage.d.ts","sourceRoot":"","sources":["../../src/tools/sendMessage.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACzF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1D,qBAAa,uBAAwB,YAAW,KAAK;IA4BvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IA3BpC,SAAgB,EAAE,gCAAgC;IAClD,SAAgB,IAAI,gCAAgC;IACpD,SAAgB,WAAW,2BAA2B;IACtD,SAAgB,WAAW,qEAAqE;IAChG,SAAgB,QAAQ,mBAAmB;IAC3C,SAAgB,OAAO,WAAW;IAClC,SAAgB,cAAc,QAAQ;IAEtC,SAAgB,WAAW;;;;;;;;;;;;;;;;;;;;;;MASzB;IAEF,SAAgB,YAAY;;;;;;;;;;;;MAM1B;gBAE2B,OAAO,EAAE,eAAe;IAE/C,OAAO,CACX,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EACrF,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,mBAAmB,CAAC;IAoB/B,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE;CAQjF"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview ITool for sending text messages via the Telegram channel adapter.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TelegramSendMessageTool = void 0;
7
+ class TelegramSendMessageTool {
8
+ constructor(service) {
9
+ this.service = service;
10
+ this.id = 'telegramChannelSendMessage';
11
+ this.name = 'telegramChannelSendMessage';
12
+ this.displayName = 'Send Telegram Message';
13
+ this.description = 'Send a text message to a Telegram chat via the channel adapter.';
14
+ this.category = 'communication';
15
+ this.version = '0.1.0';
16
+ this.hasSideEffects = true;
17
+ this.inputSchema = {
18
+ type: 'object',
19
+ required: ['chatId', 'text'],
20
+ properties: {
21
+ chatId: { type: 'string', description: 'Target chat ID' },
22
+ text: { type: 'string', description: 'Message text (max 4096 chars)' },
23
+ parseMode: { type: 'string', enum: ['Markdown', 'MarkdownV2', 'HTML'], description: 'Parse mode' },
24
+ replyToMessageId: { type: 'number', description: 'Reply to message ID' },
25
+ },
26
+ };
27
+ this.outputSchema = {
28
+ type: 'object',
29
+ properties: {
30
+ messageId: { type: 'number', description: 'Sent message ID' },
31
+ chatId: { type: 'string', description: 'Target chat ID' },
32
+ },
33
+ };
34
+ }
35
+ async execute(args, _context) {
36
+ try {
37
+ if (args.text.length > 4096) {
38
+ throw new Error('Message text exceeds 4096 character limit');
39
+ }
40
+ const result = await this.service.sendMessage(args.chatId, args.text, {
41
+ parseMode: args.parseMode,
42
+ replyToMessageId: args.replyToMessageId,
43
+ });
44
+ return {
45
+ success: true,
46
+ output: { messageId: result.message_id, chatId: args.chatId },
47
+ };
48
+ }
49
+ catch (error) {
50
+ return { success: false, error: error.message };
51
+ }
52
+ }
53
+ validateArgs(args) {
54
+ const errors = [];
55
+ if (!args.chatId)
56
+ errors.push('chatId is required');
57
+ if (!args.text)
58
+ errors.push('text is required');
59
+ else if (typeof args.text !== 'string')
60
+ errors.push('text must be a string');
61
+ else if (args.text.length > 4096)
62
+ errors.push('text exceeds 4096 character limit');
63
+ return { isValid: errors.length === 0, errors };
64
+ }
65
+ }
66
+ exports.TelegramSendMessageTool = TelegramSendMessageTool;
67
+ //# sourceMappingURL=sendMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMessage.js","sourceRoot":"","sources":["../../src/tools/sendMessage.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAKH,MAAa,uBAAuB;IA4BlC,YAA6B,OAAwB;QAAxB,YAAO,GAAP,OAAO,CAAiB;QA3BrC,OAAE,GAAG,4BAA4B,CAAC;QAClC,SAAI,GAAG,4BAA4B,CAAC;QACpC,gBAAW,GAAG,uBAAuB,CAAC;QACtC,gBAAW,GAAG,iEAAiE,CAAC;QAChF,aAAQ,GAAG,eAAe,CAAC;QAC3B,YAAO,GAAG,OAAO,CAAC;QAClB,mBAAc,GAAG,IAAI,CAAC;QAEtB,gBAAW,GAAG;YAC5B,IAAI,EAAE,QAAiB;YACvB,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAU;YACrC,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;gBACzD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,+BAA+B,EAAE;gBACtE,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE;gBAClG,gBAAgB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,qBAAqB,EAAE;aACzE;SACF,CAAC;QAEc,iBAAY,GAAG;YAC7B,IAAI,EAAE,QAAiB;YACvB,UAAU,EAAE;gBACV,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iBAAiB,EAAE;gBAC7D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE;aAC1D;SACF,CAAC;IAEsD,CAAC;IAEzD,KAAK,CAAC,OAAO,CACX,IAAqF,EACrF,QAA8B;QAE9B,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;YAC/D,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE;gBACpE,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;aACxC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;aAC9D,CAAC;QACJ,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,YAAY,CAAC,IAAyB;QACpC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;aAC3C,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;aACxE,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI;YAAE,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACnF,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IAClD,CAAC;CACF;AA7DD,0DA6DC"}
package/manifest.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://agentos.sh/schemas/extension-manifest-v1.json",
3
+ "id": "com.framers.channels.telegram",
4
+ "name": "Telegram Channel Extension",
5
+ "version": "0.1.0",
6
+ "description": "Bidirectional Telegram messaging via grammY — supports text, images, documents, inline keyboards, and groups.",
7
+ "categories": ["channel", "communication"],
8
+ "platforms": ["telegram"],
9
+ "sdk": "grammy",
10
+ "extensions": [
11
+ {
12
+ "kind": "tool",
13
+ "id": "telegramChannelSendMessage",
14
+ "displayName": "Send Telegram Message"
15
+ },
16
+ {
17
+ "kind": "tool",
18
+ "id": "telegramChannelSendMedia",
19
+ "displayName": "Send Telegram Media"
20
+ },
21
+ {
22
+ "kind": "messaging-channel",
23
+ "id": "telegramChannel",
24
+ "displayName": "Telegram Channel Adapter"
25
+ }
26
+ ],
27
+ "requiredSecrets": ["telegram.botToken"],
28
+ "features": [
29
+ "Text messages with Markdown/HTML formatting",
30
+ "Photo and document sending",
31
+ "Rate limiting with queue management",
32
+ "Webhook and polling support",
33
+ "Group chat and channel support",
34
+ "Message editing and deletion",
35
+ "Inline keyboard interactions",
36
+ "Typing indicators"
37
+ ]
38
+ }
package/package.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "@framers/agentos-ext-channel-telegram",
3
+ "version": "0.1.0",
4
+ "description": "Telegram messaging channel adapter for AgentOS — bidirectional messaging via grammY",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "dev": "tsc --watch",
10
+ "test": "vitest run",
11
+ "test:watch": "vitest watch",
12
+ "clean": "rm -rf dist"
13
+ },
14
+ "keywords": ["agentos", "extension", "channel", "telegram", "grammy", "messaging"],
15
+ "author": { "name": "Framers AI", "url": "https://frame.dev" },
16
+ "license": "MIT",
17
+ "files": ["dist", "manifest.json"],
18
+ "peerDependencies": {
19
+ "@framers/agentos": "^0.1.0"
20
+ },
21
+ "dependencies": {
22
+ "grammy": "^1.21.0"
23
+ },
24
+ "devDependencies": {
25
+ "@framers/agentos": "workspace:*",
26
+ "@types/node": "^20.0.0",
27
+ "typescript": "^5.0.0",
28
+ "vitest": "^1.0.0"
29
+ },
30
+ "engines": { "node": ">=18.0.0" }
31
+ }