@assemblyline-agents/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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenEve contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # @assemblyline-agents/telegram
2
+
3
+ Official Assembly Line Telegram channel plugin.
4
+
5
+ It exports `defineTelegramChannel(options)`, which ingests Telegram bot webhook updates and delivers agent replies through the Telegram Bot API, plus `defineTelegramConnection` for direct API access and channel tools for richer interactions. A bundled skill under `skills/` teaches agents Telegram-specific behavior.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install @assemblyline-agents/telegram
11
+ ```
12
+
13
+ ## Part of Assembly Line
14
+
15
+ This package is part of [Assembly Line](https://github.com/jasonbadeaux/openeve), a vendor-neutral, filesystem-first framework for durable AI agents. See the developer documentation in [docs/developers/](https://github.com/jasonbadeaux/openeve/tree/main/docs/developers) for setup, agent authoring, and deployment guides.
16
+
17
+ ## License
18
+
19
+ MIT
@@ -0,0 +1,8 @@
1
+ import type { JsonObject } from "@assemblyline-agents/core";
2
+ export declare function telegramUpdateFromPayload(payload: JsonObject): {
3
+ type: string;
4
+ payload: JsonObject;
5
+ } | undefined;
6
+ export declare function telegramText(payload: JsonObject): string;
7
+ export declare function telegramAttachments(payload: JsonObject, sourceId: string): JsonObject[];
8
+ //# sourceMappingURL=inbound.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.d.ts","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,2BAA2B,CAAC;AAGvE,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GAAG,SAAS,CAMhH;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAIxD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CASvF"}
@@ -0,0 +1,88 @@
1
+ import { numberValue, recordValue, safeJson, stringValue } from "./util.js";
2
+ export function telegramUpdateFromPayload(payload) {
3
+ for (const type of ["message", "edited_message", "callback_query", "channel_post", "business_message"]) {
4
+ const value = recordValue(payload[type]);
5
+ if (value)
6
+ return { type, payload: value };
7
+ }
8
+ return undefined;
9
+ }
10
+ export function telegramText(payload) {
11
+ const direct = stringValue(payload.text) ?? stringValue(payload.caption) ?? stringValue(payload.data);
12
+ const nested = recordValue(payload.message);
13
+ return direct ?? stringValue(nested?.text) ?? stringValue(nested?.caption) ?? "";
14
+ }
15
+ export function telegramAttachments(payload, sourceId) {
16
+ const attachments = [];
17
+ for (const key of ["photo", "document", "video", "audio", "voice", "sticker"]) {
18
+ const value = payload[key];
19
+ if (!value)
20
+ continue;
21
+ const info = telegramAttachmentInfo(key, value, sourceId);
22
+ attachments.push(info);
23
+ }
24
+ return attachments;
25
+ }
26
+ function telegramAttachmentInfo(kind, value, sourceId) {
27
+ const record = Array.isArray(value)
28
+ ? value.map(recordValue).filter(Boolean).at(-1)
29
+ : recordValue(value);
30
+ const fileId = stringValue(record?.file_id);
31
+ const filename = stringValue(record?.file_name) || telegramDefaultFilename(kind, sourceId, record);
32
+ const mimeType = stringValue(record?.mime_type) || telegramDefaultMimeType(kind, filename);
33
+ const attachment = {
34
+ provider: "telegram",
35
+ sourceId,
36
+ kind,
37
+ metadata: safeJson(value),
38
+ mimeType,
39
+ contentType: mimeType,
40
+ name: filename,
41
+ filename
42
+ };
43
+ if (fileId) {
44
+ attachment.id = fileId;
45
+ attachment.fileId = fileId;
46
+ attachment.telegramFileId = fileId;
47
+ attachment.remote = { provider: "telegram", auth: "telegram", trusted: true, fileId };
48
+ }
49
+ const size = numberValue(record?.file_size);
50
+ if (size !== undefined)
51
+ attachment.size = size;
52
+ return attachment;
53
+ }
54
+ function telegramDefaultFilename(kind, sourceId, record) {
55
+ if (kind === "photo")
56
+ return `telegram-photo-${sourceId}.jpg`;
57
+ if (kind === "voice")
58
+ return `telegram-voice-${sourceId}.ogg`;
59
+ if (kind === "sticker")
60
+ return `telegram-sticker-${sourceId}.webp`;
61
+ if (kind === "video")
62
+ return `telegram-video-${sourceId}.mp4`;
63
+ if (kind === "audio") {
64
+ const title = stringValue(record?.title);
65
+ return title ? `${title}.mp3` : `telegram-audio-${sourceId}.mp3`;
66
+ }
67
+ return `telegram-file-${sourceId}`;
68
+ }
69
+ function telegramDefaultMimeType(kind, filename) {
70
+ if (kind === "photo")
71
+ return "image/jpeg";
72
+ if (kind === "voice")
73
+ return "audio/ogg";
74
+ if (kind === "sticker")
75
+ return "image/webp";
76
+ if (kind === "video")
77
+ return "video/mp4";
78
+ if (kind === "audio")
79
+ return "audio/mpeg";
80
+ if (filename.endsWith(".md"))
81
+ return "text/markdown";
82
+ if (filename.endsWith(".txt"))
83
+ return "text/plain";
84
+ if (filename.endsWith(".zip"))
85
+ return "application/zip";
86
+ return "application/octet-stream";
87
+ }
88
+ //# sourceMappingURL=inbound.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound.js","sourceRoot":"","sources":["../src/inbound.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { type ChannelDefinition, type JsonObject, type McpPluginConnectionOptions } from "@assemblyline-agents/core";
2
+ import { type ChannelAttachmentRequest, type ChannelContext, type ChannelDelivery, type ChannelHttpRequest, type ChannelHttpResult, type ChannelTurn, type ChannelTurnLifecycle } from "@assemblyline-agents/runtime";
3
+ export { defineTelegramCallbackAnswerTool, defineTelegramInlineKeyboardTool, defineTelegramMediaTool, telegramContextFromToolContext, telegramDestinationFromToolContext, type TelegramToolOptions } from "./tools.js";
4
+ export type { TelegramDestination } from "./util.js";
5
+ export declare const TELEGRAM_REQUIRED_ENV: readonly ["TELEGRAM_BOT_TOKEN"];
6
+ export declare const TELEGRAM_OPTIONAL_ENV: readonly ["TELEGRAM_WEBHOOK_SECRET"];
7
+ /** Production ingress-auth requirement (any-of groups): the webhook secret token. */
8
+ export declare const TELEGRAM_INGRESS_SECRET_ENV: string[][];
9
+ export type TelegramConnectionOptions = McpPluginConnectionOptions;
10
+ export declare function defineTelegramConnection(options: TelegramConnectionOptions): import("@assemblyline-agents/core").McpHttpClientConnectionDefinition;
11
+ export declare const openevePlugin: import("@assemblyline-agents/core").PluginModule;
12
+ export interface TelegramChannelOptions {
13
+ route?: string;
14
+ description?: string;
15
+ methods?: string[];
16
+ connection?: string;
17
+ parseMode?: "MarkdownV2" | "HTML";
18
+ disableWebPagePreview?: boolean;
19
+ replyToMessage?: boolean;
20
+ allowedUpdates?: string[];
21
+ metadata?: JsonObject;
22
+ }
23
+ export declare function defineTelegramChannel(options?: TelegramChannelOptions): ChannelDefinition;
24
+ /**
25
+ * Resolve a Telegram turn attachment (a Bot API `file_id`) into a download
26
+ * request through `getFile`. The runtime only calls this for turns this
27
+ * Telegram channel produced.
28
+ */
29
+ export declare function resolveAttachment(attachment: JsonObject, ctx: ChannelContext): Promise<ChannelAttachmentRequest | undefined>;
30
+ export declare function normalizeHttp(request: ChannelHttpRequest, ctx: ChannelContext): ChannelHttpResult;
31
+ export declare function startTurn(turn: ChannelTurn, ctx: ChannelContext): ChannelTurnLifecycle;
32
+ export declare function augmentContext(turn: ChannelTurn, ctx: ChannelContext): Promise<{
33
+ recentHistory?: string[];
34
+ channelContext?: JsonObject;
35
+ } | void>;
36
+ export declare function send(delivery: ChannelDelivery, ctx: ChannelContext): Promise<JsonObject>;
37
+ export declare function setTelegramWebhook(ctx: Pick<ChannelContext, "env" | "fetch">, url: string, secretToken?: string): Promise<JsonObject>;
38
+ export declare function deleteTelegramWebhook(ctx: Pick<ChannelContext, "env" | "fetch">): Promise<JsonObject>;
39
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoF,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAkB,KAAK,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACvN,OAAO,EAAoG,KAAK,wBAAwB,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,oBAAoB,EAA+C,MAAM,8BAA8B,CAAC;AAKrW,OAAO,EAAE,gCAAgC,EAAE,gCAAgC,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,kCAAkC,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACvN,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,eAAO,MAAM,qBAAqB,iCAAkC,CAAC;AACrE,eAAO,MAAM,qBAAqB,sCAAuC,CAAC;AAC1E,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,EAAE,MAAM,EAAE,EAAkC,CAAC;AAErF,MAAM,MAAM,yBAAyB,GAAG,0BAA0B,CAAC;AACnE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,yEAE1E;AACD,eAAO,MAAM,aAAa,kDAA8D,CAAC;AAOzF,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC;IAClC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,iBAAiB,CA2B7F;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,CAiBlI;AAmBD,wBAAgB,aAAa,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,EAAE,cAAc,GAAG,iBAAiB,CAkEjG;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,cAAc,GAAG,oBAAoB,CA0BtF;AAED,wBAAsB,cAAc,CAClC,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC;IAAE,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,UAAU,CAAA;CAAE,GAAG,IAAI,CAAC,CAqC3E;AAED,wBAAsB,IAAI,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAoB9F;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAM3I;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAE3G"}
package/dist/index.js ADDED
@@ -0,0 +1,318 @@
1
+ import { connectionPluginMetadata, defineChannel, defineMcpPluginConnection, definePlugin } from "@assemblyline-agents/core";
2
+ import { attachmentFetchTimeoutMs, attachmentTrustedForProvider, constantTimeSecretEqual, fetchWithPolicy } from "@assemblyline-agents/runtime";
3
+ import { telegramAttachments, telegramText, telegramUpdateFromPayload } from "./inbound.js";
4
+ import { sendTelegramMedia } from "./tools.js";
5
+ import { attachmentSummary, compactJsonObject, numberValue, recordValue, safeJson, stringOrNumber, stringValue, telegramApi, telegramDestinationFromDelivery, telegramDestinationFromTurn, truncate } from "./util.js";
6
+ export { defineTelegramCallbackAnswerTool, defineTelegramInlineKeyboardTool, defineTelegramMediaTool, telegramContextFromToolContext, telegramDestinationFromToolContext } from "./tools.js";
7
+ export const TELEGRAM_REQUIRED_ENV = ["TELEGRAM_BOT_TOKEN"];
8
+ export const TELEGRAM_OPTIONAL_ENV = ["TELEGRAM_WEBHOOK_SECRET"];
9
+ /** Production ingress-auth requirement (any-of groups): the webhook secret token. */
10
+ export const TELEGRAM_INGRESS_SECRET_ENV = [["TELEGRAM_WEBHOOK_SECRET"]];
11
+ const TELEGRAM_CONNECTION_PLUGIN = connectionPluginMetadata("telegram");
12
+ export function defineTelegramConnection(options) {
13
+ return defineMcpPluginConnection(TELEGRAM_CONNECTION_PLUGIN, options);
14
+ }
15
+ export const openevePlugin = definePlugin({ connections: [TELEGRAM_CONNECTION_PLUGIN] });
16
+ const TELEGRAM_TYPING_REFRESH_MS = 4_000;
17
+ const TELEGRAM_RECENT_HISTORY_LIMIT = 20;
18
+ const TELEGRAM_RECENT_ACTIVITY_HOURS = 24;
19
+ const TELEGRAM_RECENT_ACTIVITY_LIMIT = 3;
20
+ const TELEGRAM_SUMMARY_MAX_CHARS = 240;
21
+ export function defineTelegramChannel(options = {}) {
22
+ const definition = {
23
+ description: options.description ?? "Receive Telegram Bot API webhooks and deliver replies through sendMessage.",
24
+ transport: "http",
25
+ route: options.route ?? "/telegram/events",
26
+ methods: options.methods ?? ["POST"],
27
+ metadata: {
28
+ provider: "telegram",
29
+ telegram: compactJsonObject({
30
+ parseMode: options.parseMode,
31
+ disableWebPagePreview: options.disableWebPagePreview,
32
+ replyToMessage: options.replyToMessage,
33
+ allowedUpdates: options.allowedUpdates
34
+ }),
35
+ ...(options.metadata ?? {})
36
+ }
37
+ };
38
+ if (options.connection)
39
+ definition.connection = options.connection;
40
+ definition.ingress = { requiredSecretEnv: TELEGRAM_INGRESS_SECRET_ENV };
41
+ return Object.assign(defineChannel(definition), {
42
+ normalizeHttp,
43
+ startTurn,
44
+ augmentContext,
45
+ send,
46
+ resolveAttachment,
47
+ ingressAuth: { requiredSecretEnv: TELEGRAM_INGRESS_SECRET_ENV }
48
+ });
49
+ }
50
+ /**
51
+ * Resolve a Telegram turn attachment (a Bot API `file_id`) into a download
52
+ * request through `getFile`. The runtime only calls this for turns this
53
+ * Telegram channel produced.
54
+ */
55
+ export async function resolveAttachment(attachment, ctx) {
56
+ const fileId = telegramFileIdFromAttachment(attachment);
57
+ if (!fileId)
58
+ return undefined;
59
+ const token = ctx.env.TELEGRAM_BOT_TOKEN;
60
+ if (!token)
61
+ return undefined;
62
+ const infoUrl = `https://api.telegram.org/bot${encodeURIComponent(token)}/getFile?file_id=${encodeURIComponent(fileId)}`;
63
+ const response = await fetchWithPolicy(ctx.fetch, infoUrl, {}, { timeoutMs: attachmentFetchTimeoutMs(ctx.env) });
64
+ const payload = recordValue(await response.json().catch(() => ({})));
65
+ if (!response.ok || payload?.ok !== true) {
66
+ throw new Error(`Telegram file lookup failed: ${response.status}`);
67
+ }
68
+ const filePath = stringValue(recordValue(payload.result)?.file_path);
69
+ if (!filePath)
70
+ throw new Error("Telegram file lookup did not return file_path.");
71
+ return {
72
+ url: `https://api.telegram.org/file/bot${encodeURIComponent(token)}/${filePath}`,
73
+ headers: {}
74
+ };
75
+ }
76
+ function telegramFileIdFromAttachment(attachment) {
77
+ if (!attachmentTrustedForProvider(attachment, "telegram"))
78
+ return undefined;
79
+ const direct = stringValue(attachment.telegramFileId) ?? stringValue(attachment.fileId);
80
+ const provider = stringValue(attachment.provider)?.toLowerCase();
81
+ const remoteProvider = stringValue(attachment.remoteProvider)?.toLowerCase();
82
+ if (direct && (provider === "telegram" || remoteProvider === "telegram"))
83
+ return direct;
84
+ const remote = recordValue(attachment.remote) ?? recordValue(attachment.download);
85
+ const remoteFileId = stringValue(remote?.fileId);
86
+ if (remoteFileId && (stringValue(remote?.provider)?.toLowerCase() === "telegram" || stringValue(remote?.auth)?.toLowerCase() === "telegram"))
87
+ return remoteFileId;
88
+ const metadata = attachment.metadata;
89
+ if (Array.isArray(metadata)) {
90
+ const record = metadata.map(recordValue).filter((value) => Boolean(value)).at(-1);
91
+ return stringValue(record?.file_id);
92
+ }
93
+ return stringValue(recordValue(metadata)?.file_id);
94
+ }
95
+ export function normalizeHttp(request, ctx) {
96
+ const expectedSecret = ctx.env.TELEGRAM_WEBHOOK_SECRET?.trim();
97
+ if (expectedSecret) {
98
+ const actualSecret = request.headers["x-telegram-bot-api-secret-token"];
99
+ if (!actualSecret || !constantTimeSecretEqual(actualSecret, expectedSecret)) {
100
+ return { kind: "response", status: 401, body: { ok: false, error: "invalid_telegram_secret" } };
101
+ }
102
+ }
103
+ const updateId = numberValue(request.body.update_id);
104
+ if (updateId === undefined)
105
+ return { kind: "response", status: 400, body: { ok: false, error: "missing_update_id" } };
106
+ const update = telegramUpdateFromPayload(request.body);
107
+ if (!update) {
108
+ return { kind: "ignored", status: 200, body: { ok: true, ignored: true, reason: "unsupported_update", updateId } };
109
+ }
110
+ const chat = recordValue(update.payload.chat) ?? recordValue(recordValue(update.payload.message)?.chat);
111
+ const from = recordValue(update.payload.from) ?? recordValue(recordValue(update.payload.message)?.from);
112
+ const messageId = numberValue(update.payload.message_id) ?? numberValue(recordValue(update.payload.message)?.message_id);
113
+ const chatId = stringOrNumber(chat?.id);
114
+ const userId = stringOrNumber(from?.id);
115
+ if (!chatId)
116
+ return { kind: "ignored", status: 200, body: { ok: true, ignored: true, reason: "missing_chat_id", updateId } };
117
+ const threadId = numberValue(update.payload.message_thread_id) ?? numberValue(recordValue(update.payload.message)?.message_thread_id);
118
+ const conversationId = threadId === undefined
119
+ ? `telegram:chat:${chatId}`
120
+ : `telegram:chat:${chatId}:thread:${threadId}`;
121
+ const text = telegramText(update.payload);
122
+ const attachments = telegramAttachments(update.payload, String(updateId));
123
+ const turn = {
124
+ eventId: String(updateId),
125
+ channel: ctx.channel.name,
126
+ conversationId,
127
+ message: text || attachmentSummary(attachments) || "Telegram update",
128
+ attachments,
129
+ delivery: compactJsonObject({
130
+ provider: "telegram",
131
+ chatId,
132
+ messageId,
133
+ threadId,
134
+ callbackQueryId: stringValue(update.payload.id)
135
+ }),
136
+ metadata: {
137
+ provider: "telegram",
138
+ telegram: compactJsonObject({
139
+ updateId,
140
+ updateType: update.type,
141
+ chatId,
142
+ userId,
143
+ messageId,
144
+ threadId,
145
+ raw: safeJson(update.payload)
146
+ })
147
+ }
148
+ };
149
+ if (userId)
150
+ turn.userId = userId;
151
+ return {
152
+ kind: "accepted",
153
+ status: 200,
154
+ body: { ok: true, accepted: true, provider: "telegram" },
155
+ idempotencyKey: String(updateId),
156
+ idempotencyScope: `channel:${ctx.channel.name}:telegram`,
157
+ turn
158
+ };
159
+ }
160
+ export function startTurn(turn, ctx) {
161
+ const destination = telegramDestinationFromTurn(turn);
162
+ if (!destination.chatId)
163
+ return {};
164
+ let stopped = false;
165
+ const controller = new AbortController();
166
+ const sendTyping = () => telegramApi(ctx, "sendChatAction", compactJsonObject({
167
+ chat_id: destination.chatId,
168
+ message_thread_id: destination.threadId,
169
+ action: "typing"
170
+ })).catch(() => undefined);
171
+ void sendTyping();
172
+ const loop = (async () => {
173
+ while (!controller.signal.aborted) {
174
+ await sleep(TELEGRAM_TYPING_REFRESH_MS, controller.signal).catch(() => undefined);
175
+ if (!controller.signal.aborted)
176
+ await sendTyping();
177
+ }
178
+ })();
179
+ return {
180
+ async stop() {
181
+ if (stopped)
182
+ return { provider: "telegram", typing: "already-stopped" };
183
+ stopped = true;
184
+ controller.abort();
185
+ await loop.catch(() => undefined);
186
+ return { provider: "telegram", typing: "stopped" };
187
+ }
188
+ };
189
+ }
190
+ export async function augmentContext(turn, ctx) {
191
+ const recentHistory = (await ctx.state.listRecentMessages(turn.conversationId, TELEGRAM_RECENT_HISTORY_LIMIT)).map(messageHistoryLine);
192
+ const since = new Date(Date.now() - TELEGRAM_RECENT_ACTIVITY_HOURS * 60 * 60 * 1000).toISOString();
193
+ const relatedConversations = turn.userId && ctx.state.listRecentConversationsBySubject
194
+ ? await ctx.state.listRecentConversationsBySubject({
195
+ channel: turn.channel,
196
+ subject: turn.userId,
197
+ since,
198
+ limit: TELEGRAM_RECENT_ACTIVITY_LIMIT,
199
+ excludeId: turn.conversationId
200
+ })
201
+ : [];
202
+ const related = await Promise.all(relatedConversations.map((conversation) => summarizeConversation(ctx, conversation)));
203
+ const telegram = recordValue(turn.metadata?.telegram);
204
+ return {
205
+ recentHistory,
206
+ channelContext: compactJsonObject({
207
+ provider: "telegram",
208
+ chatId: stringValue(telegram?.chatId),
209
+ userId: stringValue(telegram?.userId),
210
+ messageId: numberValue(telegram?.messageId),
211
+ threadId: numberValue(telegram?.threadId),
212
+ updateType: stringValue(telegram?.updateType),
213
+ currentConversation: {
214
+ id: turn.conversationId,
215
+ userId: turn.userId ?? null,
216
+ eventId: turn.eventId
217
+ },
218
+ relatedConversations: related,
219
+ contextPolicy: {
220
+ source: "openeve_state",
221
+ maxRelatedConversations: TELEGRAM_RECENT_ACTIVITY_LIMIT,
222
+ maxAgeHours: TELEGRAM_RECENT_ACTIVITY_HOURS,
223
+ note: "Related Telegram context is bounded to this user's recent OpenEve conversations and contains summaries, not Telegram-wide chat history."
224
+ }
225
+ })
226
+ };
227
+ }
228
+ export async function send(delivery, ctx) {
229
+ const destination = telegramDestinationFromDelivery(delivery);
230
+ const chatId = destination.chatId;
231
+ if (!chatId)
232
+ throw new Error("Telegram delivery requires chatId.");
233
+ const media = recordValue(delivery.payload.media) ?? recordValue(recordValue(delivery.payload.delivery)?.media);
234
+ if (media)
235
+ return sendTelegramMedia(ctx, destination, media, delivery);
236
+ const body = compactJsonObject({
237
+ chat_id: chatId,
238
+ text: delivery.response.trim() || "Done.",
239
+ disable_web_page_preview: telegramDisableWebPagePreview(ctx),
240
+ reply_markup: recordValue(delivery.payload.replyMarkup) ?? recordValue(delivery.payload.reply_markup)
241
+ });
242
+ const parseMode = telegramParseMode(ctx, delivery.payload);
243
+ if (parseMode)
244
+ body.parse_mode = parseMode;
245
+ const threadId = destination.threadId;
246
+ if (threadId !== undefined)
247
+ body.message_thread_id = threadId;
248
+ const replyTo = telegramShouldReply(ctx, delivery.payload) ? destination.messageId : undefined;
249
+ if (replyTo !== undefined)
250
+ body.reply_parameters = { message_id: replyTo };
251
+ const response = await telegramApi(ctx, "sendMessage", body);
252
+ return { provider: "telegram", message: safeJson(response) };
253
+ }
254
+ export async function setTelegramWebhook(ctx, url, secretToken) {
255
+ const body = { url };
256
+ if (secretToken)
257
+ body.secret_token = secretToken;
258
+ const allowedUpdates = ctx.env.TELEGRAM_ALLOWED_UPDATES?.split(",").map((item) => item.trim()).filter(Boolean);
259
+ if (allowedUpdates?.length)
260
+ body.allowed_updates = allowedUpdates;
261
+ return telegramApi(ctx, "setWebhook", body);
262
+ }
263
+ export async function deleteTelegramWebhook(ctx) {
264
+ return telegramApi(ctx, "deleteWebhook", {});
265
+ }
266
+ function telegramParseMode(ctx, payload) {
267
+ return stringValue(payload.parseMode) ??
268
+ stringValue(payload.parse_mode) ??
269
+ stringValue(recordValue(ctx.channel.metadata?.telegram)?.parseMode) ??
270
+ ctx.env.TELEGRAM_PARSE_MODE;
271
+ }
272
+ function telegramDisableWebPagePreview(ctx) {
273
+ const configured = recordValue(ctx.channel.metadata?.telegram)?.disableWebPagePreview;
274
+ if (typeof configured === "boolean")
275
+ return configured;
276
+ return ctx.env.TELEGRAM_DISABLE_WEB_PAGE_PREVIEW === "1" || ctx.env.TELEGRAM_DISABLE_WEB_PAGE_PREVIEW === "true";
277
+ }
278
+ function telegramShouldReply(ctx, payload) {
279
+ const explicit = payload.replyToMessage ?? payload.reply_to_message;
280
+ if (typeof explicit === "boolean")
281
+ return explicit;
282
+ const configured = recordValue(ctx.channel.metadata?.telegram)?.replyToMessage;
283
+ if (typeof configured === "boolean")
284
+ return configured;
285
+ return true;
286
+ }
287
+ async function summarizeConversation(ctx, conversation) {
288
+ const messages = await ctx.state.listRecentMessages(conversation.id, 8);
289
+ const latestUser = latestText(messages, "user");
290
+ const latestAssistant = latestText(messages, "assistant");
291
+ return compactJsonObject({
292
+ conversationId: conversation.id,
293
+ updatedAt: conversation.updatedAt,
294
+ latestUser,
295
+ latestAssistant
296
+ });
297
+ }
298
+ function latestText(messages, role) {
299
+ const message = [...messages].reverse().find((candidate) => candidate.role === role);
300
+ const text = typeof message?.content.text === "string" ? message.content.text : undefined;
301
+ return text ? truncate(text, TELEGRAM_SUMMARY_MAX_CHARS) : undefined;
302
+ }
303
+ function messageHistoryLine(message) {
304
+ const text = typeof message.content.text === "string" ? message.content.text : JSON.stringify(message.content);
305
+ return `${message.role}: ${text}`;
306
+ }
307
+ function sleep(ms, signal) {
308
+ return new Promise((resolve) => {
309
+ const timeout = setTimeout(resolve, ms);
310
+ if (signal) {
311
+ signal.addEventListener("abort", () => {
312
+ clearTimeout(timeout);
313
+ resolve();
314
+ }, { once: true });
315
+ }
316
+ });
317
+ }
318
+ //# 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,14 @@
1
+ import { type ApprovalPolicy, type JsonObject, type ToolDefinition, type ToolExecutionContext } from "@assemblyline-agents/core";
2
+ import type { ChannelContext, ChannelDelivery } from "@assemblyline-agents/runtime";
3
+ import { type TelegramDestination } from "./util.js";
4
+ export interface TelegramToolOptions {
5
+ description?: string;
6
+ needsApproval?: boolean | ApprovalPolicy;
7
+ }
8
+ export declare function telegramDestinationFromToolContext(ctx: ToolExecutionContext): TelegramDestination;
9
+ export declare function telegramContextFromToolContext(ctx: ToolExecutionContext): Pick<ChannelContext, "env" | "fetch">;
10
+ export declare function defineTelegramInlineKeyboardTool(options?: TelegramToolOptions): ToolDefinition;
11
+ export declare function defineTelegramCallbackAnswerTool(options?: TelegramToolOptions): ToolDefinition;
12
+ export declare function defineTelegramMediaTool(options?: TelegramToolOptions): ToolDefinition;
13
+ export declare function sendTelegramMedia(ctx: Pick<ChannelContext, "env" | "fetch">, destination: TelegramDestination, media: JsonObject, delivery: Pick<ChannelDelivery, "response">): Promise<JsonObject>;
14
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAC7I,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAe,MAAM,8BAA8B,CAAC;AACjG,OAAO,EAAyF,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAE5I,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,GAAG,cAAc,CAAC;CAC1C;AAED,wBAAgB,kCAAkC,CAAC,GAAG,EAAE,oBAAoB,GAAG,mBAAmB,CAIjG;AAED,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,oBAAoB,GAAG,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,CAI/G;AAED,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,mBAAwB,GAAG,cAAc,CA+ClG;AAED,wBAAgB,gCAAgC,CAAC,OAAO,GAAE,mBAAwB,GAAG,cAAc,CAwBlG;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,mBAAwB,GAAG,cAAc,CA6BzF;AAQD,wBAAsB,iBAAiB,CACrC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,EAC1C,WAAW,EAAE,mBAAmB,EAChC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,UAAU,CAAC,GAC1C,OAAO,CAAC,UAAU,CAAC,CAiBrB"}
package/dist/tools.js ADDED
@@ -0,0 +1,169 @@
1
+ import { defineTool } from "@assemblyline-agents/core";
2
+ import { compactJsonObject, recordValue, stringValue, telegramApi, telegramDestinationFromTurn } from "./util.js";
3
+ export function telegramDestinationFromToolContext(ctx) {
4
+ const turn = ctx.channel?.turn;
5
+ if (!turn)
6
+ throw new Error("Telegram tools require a Telegram channel turn in context.");
7
+ return telegramDestinationFromTurn(turn);
8
+ }
9
+ export function telegramContextFromToolContext(ctx) {
10
+ const channel = ctx.channel;
11
+ if (!channel)
12
+ throw new Error("Telegram tools require a channel-scoped run.");
13
+ return { env: channel.env, fetch: channel.fetch ?? fetch };
14
+ }
15
+ export function defineTelegramInlineKeyboardTool(options = {}) {
16
+ return withToolDefaults(defineTool({
17
+ description: "Send a Telegram message with an inline keyboard in the current conversation.",
18
+ sideEffect: "external",
19
+ inputSchema: {
20
+ type: "object",
21
+ additionalProperties: false,
22
+ properties: {
23
+ text: { type: "string", description: "Message text to send with the inline keyboard." },
24
+ buttons: {
25
+ type: "array",
26
+ description: "Rows of inline keyboard buttons.",
27
+ items: {
28
+ type: "array",
29
+ items: {
30
+ type: "object",
31
+ additionalProperties: false,
32
+ properties: {
33
+ text: { type: "string" },
34
+ callbackData: { type: "string" },
35
+ url: { type: "string" }
36
+ },
37
+ required: ["text"]
38
+ }
39
+ }
40
+ }
41
+ },
42
+ required: ["text", "buttons"]
43
+ },
44
+ async execute(input, ctx) {
45
+ const request = input;
46
+ const transport = telegramContextFromToolContext(ctx);
47
+ const destination = telegramDestinationFromToolContext(ctx);
48
+ if (!destination.chatId)
49
+ throw new Error("Telegram inline keyboard requires a chatId.");
50
+ const inlineKeyboard = request.buttons.map((row) => row.map((button) => compactJsonObject({
51
+ text: button.text,
52
+ callback_data: button.callbackData,
53
+ url: button.url
54
+ })));
55
+ return telegramApi(transport, "sendMessage", compactJsonObject({
56
+ chat_id: destination.chatId,
57
+ message_thread_id: destination.threadId,
58
+ text: request.text,
59
+ reply_markup: { inline_keyboard: inlineKeyboard }
60
+ }));
61
+ }
62
+ }), options);
63
+ }
64
+ export function defineTelegramCallbackAnswerTool(options = {}) {
65
+ return withToolDefaults(defineTool({
66
+ description: "Answer the current Telegram callback query.",
67
+ sideEffect: "external",
68
+ inputSchema: {
69
+ type: "object",
70
+ additionalProperties: false,
71
+ properties: {
72
+ text: { type: "string", description: "Short callback answer text." },
73
+ showAlert: { type: "boolean", description: "Whether Telegram should show the answer as an alert." }
74
+ }
75
+ },
76
+ async execute(input, ctx) {
77
+ const request = input;
78
+ const transport = telegramContextFromToolContext(ctx);
79
+ const destination = telegramDestinationFromToolContext(ctx);
80
+ if (!destination.callbackQueryId)
81
+ throw new Error("Telegram callback answer requires callbackQueryId.");
82
+ return telegramApi(transport, "answerCallbackQuery", compactJsonObject({
83
+ callback_query_id: destination.callbackQueryId,
84
+ text: request.text,
85
+ show_alert: request.showAlert
86
+ }));
87
+ }
88
+ }), options);
89
+ }
90
+ export function defineTelegramMediaTool(options = {}) {
91
+ return withToolDefaults(defineTool({
92
+ description: "Send Telegram media to the current conversation.",
93
+ sideEffect: "external",
94
+ inputSchema: {
95
+ type: "object",
96
+ additionalProperties: false,
97
+ properties: {
98
+ kind: { type: "string", enum: ["photo", "document", "audio", "video", "voice"] },
99
+ mediaUrl: { type: "string", description: "Telegram-readable URL or file id." },
100
+ caption: { type: "string" }
101
+ },
102
+ required: ["kind", "mediaUrl"]
103
+ },
104
+ async execute(input, ctx) {
105
+ const request = input;
106
+ const transport = telegramContextFromToolContext(ctx);
107
+ const destination = telegramDestinationFromToolContext(ctx);
108
+ const delivery = {
109
+ id: ctx.idempotencyKey(`telegram:media:${request.kind}:${request.mediaUrl}`),
110
+ runId: "",
111
+ channel: "telegram",
112
+ response: request.caption ?? "",
113
+ payload: { media: request },
114
+ idempotencyKey: ctx.idempotencyKey(`telegram:media:${request.kind}:${request.mediaUrl}`)
115
+ };
116
+ return sendTelegramMedia(transport, destination, compactJsonObject({ kind: request.kind, mediaUrl: request.mediaUrl, caption: request.caption }), delivery);
117
+ }
118
+ }), options);
119
+ }
120
+ function withToolDefaults(definition, options) {
121
+ if (options.description)
122
+ definition.description = options.description;
123
+ if (options.needsApproval !== undefined)
124
+ definition.needsApproval = options.needsApproval;
125
+ return definition;
126
+ }
127
+ export async function sendTelegramMedia(ctx, destination, media, delivery) {
128
+ if (!destination.chatId)
129
+ throw new Error("Telegram media delivery requires chatId.");
130
+ const kind = stringValue(media.kind) ?? "document";
131
+ const method = telegramMediaMethod(kind);
132
+ const mediaField = telegramMediaField(kind);
133
+ const mediaUrl = stringValue(media.mediaUrl) ?? stringValue(media.url) ?? stringValue(media.fileId);
134
+ if (!mediaUrl)
135
+ throw new Error("Telegram media delivery requires mediaUrl or fileId.");
136
+ const caption = stringValue(media.caption) ?? (delivery.response.trim() || undefined);
137
+ const body = compactJsonObject({
138
+ chat_id: destination.chatId,
139
+ message_thread_id: destination.threadId,
140
+ [mediaField]: mediaUrl,
141
+ caption,
142
+ reply_parameters: destination.messageId !== undefined ? { message_id: destination.messageId } : undefined,
143
+ reply_markup: recordValue(media.replyMarkup) ?? recordValue(media.reply_markup)
144
+ });
145
+ return telegramApi(ctx, method, body);
146
+ }
147
+ function telegramMediaMethod(kind) {
148
+ if (kind === "photo")
149
+ return "sendPhoto";
150
+ if (kind === "audio")
151
+ return "sendAudio";
152
+ if (kind === "video")
153
+ return "sendVideo";
154
+ if (kind === "voice")
155
+ return "sendVoice";
156
+ return "sendDocument";
157
+ }
158
+ function telegramMediaField(kind) {
159
+ if (kind === "photo")
160
+ return "photo";
161
+ if (kind === "audio")
162
+ return "audio";
163
+ if (kind === "video")
164
+ return "video";
165
+ if (kind === "voice")
166
+ return "voice";
167
+ return "document";
168
+ }
169
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAwF,MAAM,2BAA2B,CAAC;AAE7I,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,2BAA2B,EAA4B,MAAM,WAAW,CAAC;AAO5I,MAAM,UAAU,kCAAkC,CAAC,GAAyB;IAC1E,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAA0C,CAAC;IACrE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IACzF,OAAO,2BAA2B,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,GAAyB;IACtE,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC9E,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,UAA+B,EAAE;IAChF,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,8EAA8E;QAC3F,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,gDAAgD,EAAE;gBACvF,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,WAAW,EAAE,kCAAkC;oBAC/C,KAAK,EAAE;wBACL,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,oBAAoB,EAAE,KAAK;4BAC3B,UAAU,EAAE;gCACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACxB,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCAChC,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BACxB;4BACD,QAAQ,EAAE,CAAC,MAAM,CAAC;yBACnB;qBACF;iBACF;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;SAC9B;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAAuG,CAAC;YACxH,MAAM,SAAS,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;YACxF,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC;gBACxF,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,aAAa,EAAE,MAAM,CAAC,YAAY;gBAClC,GAAG,EAAE,MAAM,CAAC,GAAG;aAChB,CAAC,CAAC,CAAC,CAAC;YACL,OAAO,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,iBAAiB,CAAC;gBAC7D,OAAO,EAAE,WAAW,CAAC,MAAM;gBAC3B,iBAAiB,EAAE,WAAW,CAAC,QAAQ;gBACvC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,YAAY,EAAE,EAAE,eAAe,EAAE,cAAc,EAAE;aAClD,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,gCAAgC,CAAC,UAA+B,EAAE;IAChF,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,6CAA6C;QAC1D,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,6BAA6B,EAAE;gBACpE,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,sDAAsD,EAAE;aACpG;SACF;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAA+C,CAAC;YAChE,MAAM,SAAS,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAC;YAC5D,IAAI,CAAC,WAAW,CAAC,eAAe;gBAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;YACxG,OAAO,WAAW,CAAC,SAAS,EAAE,qBAAqB,EAAE,iBAAiB,CAAC;gBACrE,iBAAiB,EAAE,WAAW,CAAC,eAAe;gBAC9C,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,UAAU,EAAE,OAAO,CAAC,SAAS;aAC9B,CAAC,CAAC,CAAC;QACN,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,UAA+B,EAAE;IACvE,OAAO,gBAAgB,CAAC,UAAU,CAAC;QACjC,WAAW,EAAE,kDAAkD;QAC/D,UAAU,EAAE,UAAU;QACtB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,oBAAoB,EAAE,KAAK;YAC3B,UAAU,EAAE;gBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;gBAChF,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,mCAAmC,EAAE;gBAC9E,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC5B;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;SAC/B;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,KAA6D,CAAC;YAC9E,MAAM,SAAS,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,kCAAkC,CAAC,GAAG,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAoB;gBAChC,EAAE,EAAE,GAAG,CAAC,cAAc,CAAC,kBAAkB,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5E,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,UAAU;gBACnB,QAAQ,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;gBAC/B,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;gBAC3B,cAAc,EAAE,GAAG,CAAC,cAAc,CAAC,kBAAkB,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;aACzF,CAAC;YACF,OAAO,iBAAiB,CAAC,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC9J,CAAC;KACF,CAAC,EAAE,OAAO,CAAC,CAAC;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAwD,EAAE,OAA4B;IAC9G,IAAI,OAAO,CAAC,WAAW;QAAE,UAAU,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACtE,IAAI,OAAO,CAAC,aAAa,KAAK,SAAS;QAAE,UAAU,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAC1F,OAAO,UAA4B,CAAC;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAA0C,EAC1C,WAAgC,EAChC,KAAiB,EACjB,QAA2C;IAE3C,IAAI,CAAC,WAAW,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC;IACnD,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpG,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,CAAC;IACtF,MAAM,IAAI,GAAG,iBAAiB,CAAC;QAC7B,OAAO,EAAE,WAAW,CAAC,MAAM;QAC3B,iBAAiB,EAAE,WAAW,CAAC,QAAQ;QACvC,CAAC,UAAU,CAAC,EAAE,QAAQ;QACtB,OAAO;QACP,gBAAgB,EAAE,WAAW,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;QACzG,YAAY,EAAE,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC;KAChF,CAAC,CAAC;IACH,OAAO,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC;IACzC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC;IACzC,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,UAAU,CAAC;AACpB,CAAC"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ import type { JsonObject, JsonValue } from "@assemblyline-agents/core";
2
+ import { type ChannelContext, type ChannelDelivery, type ChannelTurn } from "@assemblyline-agents/runtime";
3
+ export interface TelegramDestination {
4
+ chatId?: string;
5
+ messageId?: number;
6
+ threadId?: number;
7
+ callbackQueryId?: string;
8
+ }
9
+ export declare function telegramDestinationFromDelivery(delivery: ChannelDelivery): TelegramDestination;
10
+ export declare function telegramDestinationFromTurn(turn: ChannelTurn): TelegramDestination;
11
+ export declare function telegramApi(ctx: Pick<ChannelContext, "env" | "fetch">, method: string, body: JsonObject): Promise<JsonObject>;
12
+ export declare function attachmentSummary(attachments: JsonObject[]): string;
13
+ export declare function truncate(value: string, maxChars: number): string;
14
+ export declare function stringValue(value: unknown): string | undefined;
15
+ export declare function numberValue(value: unknown): number | undefined;
16
+ export declare function stringOrNumber(value: unknown): string | undefined;
17
+ export declare function recordValue(value: unknown): JsonObject | undefined;
18
+ export declare function compactJsonObject(input: Record<string, unknown>): JsonObject;
19
+ export declare function safeJson(value: unknown): JsonValue;
20
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,EAAmB,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE5H,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,eAAe,GAAG,mBAAmB,CAG9F;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,WAAW,GAAG,mBAAmB,CAElF;AAeD,wBAAsB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,KAAK,GAAG,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAcnI;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAGnE;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE9D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAE9D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAIjE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAElE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,UAAU,CAM5E;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,CASlD"}
package/dist/util.js ADDED
@@ -0,0 +1,100 @@
1
+ import { fetchWithPolicy } from "@assemblyline-agents/runtime";
2
+ export function telegramDestinationFromDelivery(delivery) {
3
+ const target = recordValue(delivery.turn?.delivery) ?? recordValue(delivery.payload.delivery);
4
+ return telegramDestinationFromRecord(target);
5
+ }
6
+ export function telegramDestinationFromTurn(turn) {
7
+ return telegramDestinationFromRecord(recordValue(turn.delivery));
8
+ }
9
+ function telegramDestinationFromRecord(target) {
10
+ const destination = {};
11
+ const chatId = stringValue(target?.chatId);
12
+ const messageId = numberValue(target?.messageId);
13
+ const threadId = numberValue(target?.threadId);
14
+ const callbackQueryId = stringValue(target?.callbackQueryId);
15
+ if (chatId)
16
+ destination.chatId = chatId;
17
+ if (messageId !== undefined)
18
+ destination.messageId = messageId;
19
+ if (threadId !== undefined)
20
+ destination.threadId = threadId;
21
+ if (callbackQueryId)
22
+ destination.callbackQueryId = callbackQueryId;
23
+ return destination;
24
+ }
25
+ export async function telegramApi(ctx, method, body) {
26
+ const token = ctx.env.TELEGRAM_BOT_TOKEN;
27
+ if (!token)
28
+ throw new Error("Telegram Bot API requires TELEGRAM_BOT_TOKEN.");
29
+ // Telegram flood control sends 429 with both a Retry-After header and `parameters.retry_after` in the
30
+ // JSON body. fetchWithPolicy retries before the body is readable, so we honor the header (same value)
31
+ // and keep body parsing below for error messages on the final response.
32
+ const response = await fetchWithPolicy(ctx.fetch, `https://api.telegram.org/bot${encodeURIComponent(token)}/${method}`, {
33
+ method: "POST",
34
+ headers: { "content-type": "application/json" },
35
+ body: JSON.stringify(body)
36
+ });
37
+ const parsed = await parseJson(response);
38
+ if (!response.ok)
39
+ throw new Error(`Telegram ${method} failed: ${response.status} ${JSON.stringify(parsed)}`);
40
+ return safeJson(parsed);
41
+ }
42
+ export function attachmentSummary(attachments) {
43
+ if (attachments.length === 0)
44
+ return "";
45
+ return attachments.map((attachment) => `[${String(attachment.kind ?? "attachment")}]`).join(" ");
46
+ }
47
+ export function truncate(value, maxChars) {
48
+ if (value.length <= maxChars)
49
+ return value;
50
+ return `${value.slice(0, Math.max(0, maxChars - 1))}...`;
51
+ }
52
+ export function stringValue(value) {
53
+ return typeof value === "string" && value.length > 0 ? value : undefined;
54
+ }
55
+ export function numberValue(value) {
56
+ return typeof value === "number" && Number.isFinite(value) ? value : undefined;
57
+ }
58
+ export function stringOrNumber(value) {
59
+ if (typeof value === "string" && value.length > 0)
60
+ return value;
61
+ if (typeof value === "number" && Number.isFinite(value))
62
+ return String(value);
63
+ return undefined;
64
+ }
65
+ export function recordValue(value) {
66
+ return Boolean(value && typeof value === "object" && !Array.isArray(value)) ? value : undefined;
67
+ }
68
+ export function compactJsonObject(input) {
69
+ const out = {};
70
+ for (const [key, value] of Object.entries(input)) {
71
+ if (value !== undefined)
72
+ out[key] = safeJson(value);
73
+ }
74
+ return out;
75
+ }
76
+ export function safeJson(value) {
77
+ if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean")
78
+ return value;
79
+ if (Array.isArray(value))
80
+ return value.map(safeJson);
81
+ if (value && typeof value === "object") {
82
+ const out = {};
83
+ for (const [key, child] of Object.entries(value))
84
+ out[key] = safeJson(child);
85
+ return out;
86
+ }
87
+ return null;
88
+ }
89
+ async function parseJson(response) {
90
+ const text = await response.text();
91
+ if (!text)
92
+ return {};
93
+ try {
94
+ return JSON.parse(text);
95
+ }
96
+ catch {
97
+ return { text };
98
+ }
99
+ }
100
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,50 @@
1
+ {
2
+ "name": "@assemblyline-agents/telegram",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "default": "./dist/index.js"
9
+ }
10
+ },
11
+ "dependencies": {
12
+ "@assemblyline-agents/core": "0.1.0",
13
+ "@assemblyline-agents/runtime": "0.1.0"
14
+ },
15
+ "description": "Official OpenEve Telegram channel plugin.",
16
+ "files": [
17
+ "dist",
18
+ "skills"
19
+ ],
20
+ "engines": {
21
+ "node": ">=22.19.0"
22
+ },
23
+ "license": "MIT",
24
+ "repository": {
25
+ "type": "git",
26
+ "url": "git+https://github.com/jasonbadeaux/openeve.git",
27
+ "directory": "packages/telegram"
28
+ },
29
+ "bugs": {
30
+ "url": "https://github.com/jasonbadeaux/openeve/issues"
31
+ },
32
+ "homepage": "https://github.com/jasonbadeaux/openeve#readme",
33
+ "author": "OpenEve contributors",
34
+ "keywords": [
35
+ "openeve",
36
+ "ai",
37
+ "agents",
38
+ "telegram",
39
+ "channel",
40
+ "chatbot",
41
+ "plugin"
42
+ ],
43
+ "publishConfig": {
44
+ "access": "public"
45
+ },
46
+ "scripts": {
47
+ "build": "tsc -p tsconfig.json",
48
+ "check": "tsc -p tsconfig.json --noEmit"
49
+ }
50
+ }
@@ -0,0 +1,8 @@
1
+ ---
2
+ name: telegram
3
+ description: Use a configured Telegram MCP bridge for read-only account and message context.
4
+ ---
5
+ # Telegram
6
+ Use bounded chat and date filters. Avoid repeating sensitive message content outside the requested task.
7
+
8
+ The deployment owner configures the Telegram session and `TELEGRAM_MCP_URL`; Assembly Line does not enroll or host an MTProto session. This plugin exposes read-classified tools only.