@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.
- package/dist/api/AgentOSOrchestrator.js +1 -1
- package/dist/api/AgentOSOrchestrator.js.map +1 -1
- package/dist/channels/ChannelRouter.d.ts.map +1 -1
- package/dist/channels/ChannelRouter.js +1 -1
- package/dist/channels/ChannelRouter.js.map +1 -1
- package/dist/channels/IChannelAdapter.d.ts.map +1 -1
- package/dist/channels/adapters/BaseChannelAdapter.d.ts +130 -0
- package/dist/channels/adapters/BaseChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/BaseChannelAdapter.js +257 -0
- package/dist/channels/adapters/BaseChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/DiscordChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js +550 -0
- package/dist/channels/adapters/DiscordChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js +632 -0
- package/dist/channels/adapters/GoogleChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts +86 -0
- package/dist/channels/adapters/IRCChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/IRCChannelAdapter.js +253 -0
- package/dist/channels/adapters/IRCChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts +123 -0
- package/dist/channels/adapters/RedditChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/RedditChannelAdapter.js +516 -0
- package/dist/channels/adapters/RedditChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts +120 -0
- package/dist/channels/adapters/SignalChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SignalChannelAdapter.js +521 -0
- package/dist/channels/adapters/SignalChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts +96 -0
- package/dist/channels/adapters/SlackChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/SlackChannelAdapter.js +535 -0
- package/dist/channels/adapters/SlackChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts +138 -0
- package/dist/channels/adapters/TeamsChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js +639 -0
- package/dist/channels/adapters/TeamsChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts +83 -0
- package/dist/channels/adapters/TelegramChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js +463 -0
- package/dist/channels/adapters/TelegramChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts +117 -0
- package/dist/channels/adapters/TwitterChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js +489 -0
- package/dist/channels/adapters/TwitterChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts +141 -0
- package/dist/channels/adapters/WebChatChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js +539 -0
- package/dist/channels/adapters/WebChatChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts +122 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.d.ts.map +1 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js +643 -0
- package/dist/channels/adapters/WhatsAppChannelAdapter.js.map +1 -0
- package/dist/channels/adapters/index.d.ts +34 -0
- package/dist/channels/adapters/index.d.ts.map +1 -0
- package/dist/channels/adapters/index.js +25 -0
- package/dist/channels/adapters/index.js.map +1 -0
- package/dist/channels/index.d.ts +24 -0
- package/dist/channels/index.d.ts.map +1 -1
- package/dist/channels/index.js +16 -0
- package/dist/channels/index.js.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.d.ts.map +1 -1
- package/dist/cognitive_substrate/personas/metaprompt_presets.js +0 -2
- package/dist/cognitive_substrate/personas/metaprompt_presets.js.map +1 -1
- package/dist/core/provenance/crypto/HashChain.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/AutonomyGuard.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.d.ts.map +1 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js +2 -1
- package/dist/core/provenance/enforcement/ProvenanceStorageHooks.js.map +1 -1
- package/dist/core/provenance/ledger/EventTypes.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.d.ts.map +1 -1
- package/dist/core/safety/ToolExecutionGuard.js +0 -1
- package/dist/core/safety/ToolExecutionGuard.js.map +1 -1
- package/dist/extensions/ExtensionManager.d.ts.map +1 -1
- package/dist/extensions/ExtensionManager.js +3 -9
- package/dist/extensions/ExtensionManager.js.map +1 -1
- package/dist/rag/RetrievalAugmentor.js.map +1 -1
- 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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"}
|