telegram-notify-mcp 1.0.0 → 2.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/.env.example +4 -0
- package/ARCHITECTURE-PHASE2.md +324 -0
- package/README.md +75 -23
- package/ROADMAP.md +18 -9
- package/dist/index.d.ts +4 -1
- package/dist/index.js +287 -15
- package/dist/index.js.map +1 -1
- package/dist/routing.d.ts +81 -0
- package/dist/routing.js +244 -0
- package/dist/routing.js.map +1 -0
- package/dist/store.d.ts +75 -0
- package/dist/store.js +157 -0
- package/dist/store.js.map +1 -0
- package/dist/telegram.d.ts +38 -0
- package/dist/telegram.js +47 -0
- package/dist/telegram.js.map +1 -1
- package/package.json +4 -3
- package/skill-snippet.md +59 -5
package/dist/index.js
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
3
|
* telegram-notify-mcp — stdio MCP server for Telegram Bot API notifications.
|
|
4
|
-
* Env: TELEGRAM_BOT_TOKEN (required for tool calls), TELEGRAM_CHAT_ID (optional default)
|
|
4
|
+
* Env: TELEGRAM_BOT_TOKEN (required for tool calls), TELEGRAM_CHAT_ID (optional default),
|
|
5
|
+
* TELEGRAM_CHAT_ALLOWLIST (optional inbound), TELEGRAM_NOTIFY_DATA_DIR (optional store path).
|
|
5
6
|
* Starts cleanly without a token; tools fail with a clear error when invoked.
|
|
6
7
|
* Public release is env-only — no disk/secret-store token loading.
|
|
8
|
+
* Phase 2: outbound mapping + inbound pending queue (host must poll + SendToAgent + ack).
|
|
9
|
+
* 2.1: inline approval buttons (Accept / Decline / Custom message) via callback_query.
|
|
7
10
|
*/
|
|
8
11
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
9
12
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
10
13
|
import { z } from 'zod';
|
|
11
|
-
import { TelegramApiError, TelegramClient, formatNotifyMessage, getDefaultChatId, } from './telegram.js';
|
|
14
|
+
import { TelegramApiError, TelegramClient, buildApprovalKeyboard, formatNotifyMessage, generateApprovalToken, getDefaultChatId, } from './telegram.js';
|
|
15
|
+
import { LocalStore } from './store.js';
|
|
16
|
+
import { formatAgentFooter, formatNotifyWithFooter, processUpdates, } from './routing.js';
|
|
12
17
|
const SERVER_NAME = 'telegram-notify-mcp';
|
|
13
|
-
const SERVER_VERSION = '1.0
|
|
18
|
+
const SERVER_VERSION = '2.1.0';
|
|
14
19
|
function textResult(text, isError = false) {
|
|
15
20
|
return {
|
|
16
21
|
content: [{ type: 'text', text }],
|
|
@@ -27,6 +32,59 @@ function errorResult(err) {
|
|
|
27
32
|
function getClient() {
|
|
28
33
|
return new TelegramClient(process.env.TELEGRAM_BOT_TOKEN);
|
|
29
34
|
}
|
|
35
|
+
function getStore() {
|
|
36
|
+
return new LocalStore();
|
|
37
|
+
}
|
|
38
|
+
async function handleCallbackActions(client, store, actions) {
|
|
39
|
+
let answered = 0;
|
|
40
|
+
let custom_prompts_sent = 0;
|
|
41
|
+
for (const action of actions) {
|
|
42
|
+
if (action.kind === 'answer') {
|
|
43
|
+
try {
|
|
44
|
+
await client.answerCallbackQuery({
|
|
45
|
+
callback_query_id: action.callback_query_id,
|
|
46
|
+
text: action.text,
|
|
47
|
+
});
|
|
48
|
+
answered += 1;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
// Best-effort: spinner may already be cleared
|
|
52
|
+
}
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
// custom_prompt: answer + ForceReply + putMapping so next reply routes to agent
|
|
56
|
+
try {
|
|
57
|
+
await client.answerCallbackQuery({
|
|
58
|
+
callback_query_id: action.callback_query_id,
|
|
59
|
+
text: 'Send your custom message',
|
|
60
|
+
});
|
|
61
|
+
answered += 1;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
/* ignore */
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const session = action.session;
|
|
68
|
+
const prompt = await client.sendMessage({
|
|
69
|
+
chat_id: session.chat_id,
|
|
70
|
+
text: 'Send your custom message as a reply to this prompt:',
|
|
71
|
+
reply_to_message_id: session.telegram_message_id,
|
|
72
|
+
reply_markup: { force_reply: true },
|
|
73
|
+
});
|
|
74
|
+
store.putMapping({
|
|
75
|
+
chat_id: String(prompt.chat.id),
|
|
76
|
+
telegram_message_id: prompt.message_id,
|
|
77
|
+
source_agent_id: session.source_agent_id,
|
|
78
|
+
source_agent_name: session.source_agent_name,
|
|
79
|
+
});
|
|
80
|
+
custom_prompts_sent += 1;
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
/* ignore send failures; poll summary still reports custom_prompts */
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return { answered, custom_prompts_sent };
|
|
87
|
+
}
|
|
30
88
|
function createServer() {
|
|
31
89
|
const server = new McpServer({
|
|
32
90
|
name: SERVER_NAME,
|
|
@@ -46,7 +104,7 @@ function createServer() {
|
|
|
46
104
|
return errorResult(err);
|
|
47
105
|
}
|
|
48
106
|
});
|
|
49
|
-
server.tool('telegram_send_message', 'Send a text message via the Bot API. chat_id is optional when TELEGRAM_CHAT_ID is set.', {
|
|
107
|
+
server.tool('telegram_send_message', 'Send a text message via the Bot API. chat_id is optional when TELEGRAM_CHAT_ID is set. Optional source_agent_id appends footer and persists reply mapping. Optional approval_buttons attach Accept/Decline/Custom keyboard.', {
|
|
50
108
|
text: z.string().min(1).describe('Message text to send'),
|
|
51
109
|
chat_id: z
|
|
52
110
|
.union([z.string(), z.number()])
|
|
@@ -56,52 +114,169 @@ function createServer() {
|
|
|
56
114
|
.enum(['Markdown', 'MarkdownV2', 'HTML'])
|
|
57
115
|
.optional()
|
|
58
116
|
.describe('Optional Telegram parse_mode'),
|
|
59
|
-
|
|
117
|
+
source_agent_id: z
|
|
118
|
+
.string()
|
|
119
|
+
.min(1)
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('Originating agent id — when set, append footer and store mapping for replies'),
|
|
122
|
+
source_agent_name: z
|
|
123
|
+
.string()
|
|
124
|
+
.optional()
|
|
125
|
+
.describe('Optional display name for footer'),
|
|
126
|
+
approval_buttons: z
|
|
127
|
+
.boolean()
|
|
128
|
+
.optional()
|
|
129
|
+
.describe('Attach Accept/Decline/Custom inline keyboard (requires source_agent_id; default false)'),
|
|
130
|
+
accept_command: z
|
|
131
|
+
.string()
|
|
132
|
+
.optional()
|
|
133
|
+
.describe('Text enqueued on Accept (default "Accept")'),
|
|
134
|
+
decline_command: z
|
|
135
|
+
.string()
|
|
136
|
+
.optional()
|
|
137
|
+
.describe('Text enqueued on Decline (default "Decline")'),
|
|
138
|
+
}, async ({ text, chat_id, parse_mode, source_agent_id, source_agent_name, approval_buttons, accept_command, decline_command, }) => {
|
|
60
139
|
try {
|
|
61
140
|
const chatId = getDefaultChatId(chat_id);
|
|
141
|
+
let outbound = text;
|
|
142
|
+
if (source_agent_id) {
|
|
143
|
+
outbound = text + formatAgentFooter(source_agent_id, source_agent_name);
|
|
144
|
+
}
|
|
145
|
+
const wantButtons = approval_buttons === true && !!source_agent_id;
|
|
146
|
+
const acceptCmd = (accept_command ?? 'Accept').trim() || 'Accept';
|
|
147
|
+
const declineCmd = (decline_command ?? 'Decline').trim() || 'Decline';
|
|
148
|
+
let token;
|
|
149
|
+
let reply_markup = undefined;
|
|
150
|
+
if (wantButtons) {
|
|
151
|
+
token = generateApprovalToken();
|
|
152
|
+
reply_markup = buildApprovalKeyboard(token);
|
|
153
|
+
}
|
|
62
154
|
const msg = await getClient().sendMessage({
|
|
63
155
|
chat_id: chatId,
|
|
64
|
-
text,
|
|
156
|
+
text: outbound,
|
|
65
157
|
parse_mode,
|
|
158
|
+
reply_markup,
|
|
66
159
|
});
|
|
160
|
+
let mapped = false;
|
|
161
|
+
if (source_agent_id) {
|
|
162
|
+
getStore().putMapping({
|
|
163
|
+
chat_id: String(msg.chat.id),
|
|
164
|
+
telegram_message_id: msg.message_id,
|
|
165
|
+
source_agent_id,
|
|
166
|
+
source_agent_name: source_agent_name || undefined,
|
|
167
|
+
accept_command: wantButtons ? acceptCmd : undefined,
|
|
168
|
+
decline_command: wantButtons ? declineCmd : undefined,
|
|
169
|
+
});
|
|
170
|
+
mapped = true;
|
|
171
|
+
}
|
|
172
|
+
if (wantButtons && token && source_agent_id) {
|
|
173
|
+
getStore().putApproval({
|
|
174
|
+
token,
|
|
175
|
+
chat_id: String(msg.chat.id),
|
|
176
|
+
telegram_message_id: msg.message_id,
|
|
177
|
+
source_agent_id,
|
|
178
|
+
source_agent_name: source_agent_name || undefined,
|
|
179
|
+
accept_command: acceptCmd,
|
|
180
|
+
decline_command: declineCmd,
|
|
181
|
+
});
|
|
182
|
+
}
|
|
67
183
|
return textResult(JSON.stringify({
|
|
68
184
|
ok: true,
|
|
69
185
|
message_id: msg.message_id,
|
|
70
186
|
chat_id: msg.chat.id,
|
|
71
|
-
text: msg.text ??
|
|
187
|
+
text: msg.text ?? outbound,
|
|
188
|
+
mapped,
|
|
189
|
+
source_agent_id: source_agent_id ?? null,
|
|
190
|
+
approval_buttons: wantButtons,
|
|
191
|
+
approval_token: token ?? null,
|
|
72
192
|
}, null, 2));
|
|
73
193
|
}
|
|
74
194
|
catch (err) {
|
|
75
195
|
return errorResult(err);
|
|
76
196
|
}
|
|
77
197
|
});
|
|
78
|
-
server.tool('telegram_notify', 'Send a short completion-style notification (title + body)
|
|
198
|
+
server.tool('telegram_notify', 'Send a short completion-style notification (title + body) with required source_agent_id. Appends agent footer and persists message→agent mapping. Optional approval_buttons attach Accept/Decline/Custom keyboard (default false).', {
|
|
79
199
|
body: z.string().min(1).describe('Notification body / details'),
|
|
80
200
|
title: z.string().optional().describe('Optional short title (e.g. "Build finished")'),
|
|
81
201
|
chat_id: z
|
|
82
202
|
.union([z.string(), z.number()])
|
|
83
203
|
.optional()
|
|
84
204
|
.describe('Telegram chat id (falls back to TELEGRAM_CHAT_ID)'),
|
|
85
|
-
|
|
205
|
+
source_agent_id: z
|
|
206
|
+
.string()
|
|
207
|
+
.min(1)
|
|
208
|
+
.describe('Required stable id of the originating agent (for reply routing)'),
|
|
209
|
+
source_agent_name: z
|
|
210
|
+
.string()
|
|
211
|
+
.optional()
|
|
212
|
+
.describe('Optional short human label for the footer'),
|
|
213
|
+
approval_buttons: z
|
|
214
|
+
.boolean()
|
|
215
|
+
.optional()
|
|
216
|
+
.describe('Attach Accept/Decline/Custom inline keyboard (default false; opt-in)'),
|
|
217
|
+
accept_command: z
|
|
218
|
+
.string()
|
|
219
|
+
.optional()
|
|
220
|
+
.describe('Text enqueued as pending command when Accept is pressed (e.g. "asmj11 بفرست"). Default: "Accept"'),
|
|
221
|
+
decline_command: z
|
|
222
|
+
.string()
|
|
223
|
+
.optional()
|
|
224
|
+
.describe('Text enqueued when Decline is pressed. Default: "Decline"'),
|
|
225
|
+
}, async ({ body, title, chat_id, source_agent_id, source_agent_name, approval_buttons, accept_command, decline_command, }) => {
|
|
86
226
|
try {
|
|
87
227
|
const chatId = getDefaultChatId(chat_id);
|
|
88
|
-
const text =
|
|
228
|
+
const text = formatNotifyWithFooter(title, body, source_agent_id, source_agent_name, formatNotifyMessage);
|
|
229
|
+
const wantButtons = approval_buttons === true;
|
|
230
|
+
const acceptCmd = (accept_command ?? 'Accept').trim() || 'Accept';
|
|
231
|
+
const declineCmd = (decline_command ?? 'Decline').trim() || 'Decline';
|
|
232
|
+
let token;
|
|
233
|
+
let reply_markup = undefined;
|
|
234
|
+
if (wantButtons) {
|
|
235
|
+
token = generateApprovalToken();
|
|
236
|
+
reply_markup = buildApprovalKeyboard(token);
|
|
237
|
+
}
|
|
89
238
|
const msg = await getClient().sendMessage({
|
|
90
239
|
chat_id: chatId,
|
|
91
240
|
text,
|
|
241
|
+
reply_markup,
|
|
242
|
+
});
|
|
243
|
+
const store = getStore();
|
|
244
|
+
store.putMapping({
|
|
245
|
+
chat_id: String(msg.chat.id),
|
|
246
|
+
telegram_message_id: msg.message_id,
|
|
247
|
+
source_agent_id,
|
|
248
|
+
source_agent_name: source_agent_name || undefined,
|
|
249
|
+
accept_command: wantButtons ? acceptCmd : undefined,
|
|
250
|
+
decline_command: wantButtons ? declineCmd : undefined,
|
|
92
251
|
});
|
|
252
|
+
if (wantButtons && token) {
|
|
253
|
+
store.putApproval({
|
|
254
|
+
token,
|
|
255
|
+
chat_id: String(msg.chat.id),
|
|
256
|
+
telegram_message_id: msg.message_id,
|
|
257
|
+
source_agent_id,
|
|
258
|
+
source_agent_name: source_agent_name || undefined,
|
|
259
|
+
accept_command: acceptCmd,
|
|
260
|
+
decline_command: declineCmd,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
93
263
|
return textResult(JSON.stringify({
|
|
94
264
|
ok: true,
|
|
95
265
|
message_id: msg.message_id,
|
|
96
266
|
chat_id: msg.chat.id,
|
|
97
267
|
text,
|
|
268
|
+
mapped: true,
|
|
269
|
+
source_agent_id,
|
|
270
|
+
source_agent_name: source_agent_name ?? null,
|
|
271
|
+
approval_buttons: wantButtons,
|
|
272
|
+
approval_token: token ?? null,
|
|
98
273
|
}, null, 2));
|
|
99
274
|
}
|
|
100
275
|
catch (err) {
|
|
101
276
|
return errorResult(err);
|
|
102
277
|
}
|
|
103
278
|
});
|
|
104
|
-
server.tool('telegram_get_updates', 'Fetch recent bot updates so you can discover chat_id after messaging the bot with /start.', {
|
|
279
|
+
server.tool('telegram_get_updates', 'Fetch recent bot updates so you can discover chat_id after messaging the bot with /start. Does not enqueue pending commands (use telegram_poll_inbound for that).', {
|
|
105
280
|
limit: z
|
|
106
281
|
.number()
|
|
107
282
|
.int()
|
|
@@ -114,7 +289,7 @@ function createServer() {
|
|
|
114
289
|
const updates = await getClient().getUpdates({ limit: limit ?? 10 });
|
|
115
290
|
const chats = new Map();
|
|
116
291
|
for (const u of updates) {
|
|
117
|
-
const m = u.message ?? u.edited_message ?? u.channel_post;
|
|
292
|
+
const m = u.message ?? u.edited_message ?? u.channel_post ?? u.callback_query?.message;
|
|
118
293
|
if (!m?.chat)
|
|
119
294
|
continue;
|
|
120
295
|
const c = m.chat;
|
|
@@ -128,12 +303,20 @@ function createServer() {
|
|
|
128
303
|
update_count: updates.length,
|
|
129
304
|
discovered_chats: [...chats.values()],
|
|
130
305
|
updates: updates.map((u) => {
|
|
131
|
-
const m = u.message ??
|
|
306
|
+
const m = u.message ??
|
|
307
|
+
u.edited_message ??
|
|
308
|
+
u.channel_post ??
|
|
309
|
+
u.callback_query?.message;
|
|
132
310
|
return {
|
|
133
311
|
update_id: u.update_id,
|
|
134
312
|
chat_id: m?.chat?.id ?? null,
|
|
135
|
-
from:
|
|
313
|
+
from: u.callback_query?.from?.username ??
|
|
314
|
+
u.callback_query?.from?.first_name ??
|
|
315
|
+
m?.from?.username ??
|
|
316
|
+
m?.from?.first_name ??
|
|
317
|
+
null,
|
|
136
318
|
text: m?.text ?? null,
|
|
319
|
+
callback_data: u.callback_query?.data ?? null,
|
|
137
320
|
};
|
|
138
321
|
}),
|
|
139
322
|
}, null, 2));
|
|
@@ -142,6 +325,93 @@ function createServer() {
|
|
|
142
325
|
return errorResult(err);
|
|
143
326
|
}
|
|
144
327
|
});
|
|
328
|
+
server.tool('telegram_poll_inbound', 'Poll Telegram getUpdates, allowlist-filter, route replies/mappings, /to commands, and approval button callbacks into the pending queue. Answers callback_query; Custom sends a ForceReply prompt. Host must then list + SendToAgent + ack.', {
|
|
329
|
+
limit: z
|
|
330
|
+
.number()
|
|
331
|
+
.int()
|
|
332
|
+
.min(1)
|
|
333
|
+
.max(100)
|
|
334
|
+
.optional()
|
|
335
|
+
.describe('Max updates to fetch (default 50)'),
|
|
336
|
+
timeout: z
|
|
337
|
+
.number()
|
|
338
|
+
.int()
|
|
339
|
+
.min(0)
|
|
340
|
+
.max(50)
|
|
341
|
+
.optional()
|
|
342
|
+
.describe('Long-poll timeout seconds (default 0)'),
|
|
343
|
+
}, async ({ limit, timeout }) => {
|
|
344
|
+
try {
|
|
345
|
+
const store = getStore();
|
|
346
|
+
const client = getClient();
|
|
347
|
+
const offset = store.getUpdateOffset();
|
|
348
|
+
const updates = await client.getUpdates({
|
|
349
|
+
limit: limit ?? 50,
|
|
350
|
+
timeout: timeout ?? 0,
|
|
351
|
+
offset,
|
|
352
|
+
allowed_updates: ['message', 'edited_message', 'callback_query'],
|
|
353
|
+
});
|
|
354
|
+
const summary = processUpdates(store, updates);
|
|
355
|
+
if (summary.next_offset !== undefined) {
|
|
356
|
+
store.setUpdateOffset(summary.next_offset);
|
|
357
|
+
}
|
|
358
|
+
const cb = await handleCallbackActions(client, store, summary.callback_actions);
|
|
359
|
+
const { callback_actions: _actions, ...publicSummary } = summary;
|
|
360
|
+
return textResult(JSON.stringify({
|
|
361
|
+
ok: true,
|
|
362
|
+
...publicSummary,
|
|
363
|
+
callbacks_answered: cb.answered,
|
|
364
|
+
custom_prompts_sent: cb.custom_prompts_sent,
|
|
365
|
+
note: 'Unroutable messages (no reply-to mapping and no /to <agent_id> …) are ignored. Approval Accept/Decline enqueue accept_command/decline_command. Custom prompts a ForceReply. Host should call telegram_list_pending_commands, deliver via SendToAgent, then telegram_ack_command.',
|
|
366
|
+
}, null, 2));
|
|
367
|
+
}
|
|
368
|
+
catch (err) {
|
|
369
|
+
return errorResult(err);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
server.tool('telegram_list_pending_commands', 'List pending inbound commands (status=pending). Optional filter by source_agent_id. Host delivers each then calls telegram_ack_command.', {
|
|
373
|
+
source_agent_id: z
|
|
374
|
+
.string()
|
|
375
|
+
.optional()
|
|
376
|
+
.describe('If set, only list commands for this agent'),
|
|
377
|
+
}, async ({ source_agent_id }) => {
|
|
378
|
+
try {
|
|
379
|
+
const store = getStore();
|
|
380
|
+
const commands = store.listPending(source_agent_id ? { source_agent_id } : undefined);
|
|
381
|
+
return textResult(JSON.stringify({
|
|
382
|
+
ok: true,
|
|
383
|
+
count: commands.length,
|
|
384
|
+
commands,
|
|
385
|
+
}, null, 2));
|
|
386
|
+
}
|
|
387
|
+
catch (err) {
|
|
388
|
+
return errorResult(err);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
server.tool('telegram_ack_command', 'Acknowledge (delete) a pending command by id after the host has delivered it to the target agent. Idempotent: unknown id returns ok=false.', {
|
|
392
|
+
command_id: z.string().min(1).describe('Pending command id from list/poll'),
|
|
393
|
+
}, async ({ command_id }) => {
|
|
394
|
+
try {
|
|
395
|
+
const store = getStore();
|
|
396
|
+
const cmd = store.ackCommand(command_id);
|
|
397
|
+
if (!cmd) {
|
|
398
|
+
return textResult(JSON.stringify({
|
|
399
|
+
ok: false,
|
|
400
|
+
error: 'unknown_command_id',
|
|
401
|
+
command_id,
|
|
402
|
+
}), true);
|
|
403
|
+
}
|
|
404
|
+
return textResult(JSON.stringify({
|
|
405
|
+
ok: true,
|
|
406
|
+
acked: true,
|
|
407
|
+
command_id: cmd.id,
|
|
408
|
+
source_agent_id: cmd.source_agent_id,
|
|
409
|
+
}), false);
|
|
410
|
+
}
|
|
411
|
+
catch (err) {
|
|
412
|
+
return errorResult(err);
|
|
413
|
+
}
|
|
414
|
+
});
|
|
145
415
|
return server;
|
|
146
416
|
}
|
|
147
417
|
async function main() {
|
|
@@ -149,7 +419,9 @@ async function main() {
|
|
|
149
419
|
const transport = new StdioServerTransport();
|
|
150
420
|
await server.connect(transport);
|
|
151
421
|
console.error(`${SERVER_NAME} v${SERVER_VERSION} running on stdio` +
|
|
152
|
-
(process.env.TELEGRAM_BOT_TOKEN
|
|
422
|
+
(process.env.TELEGRAM_BOT_TOKEN
|
|
423
|
+
? ''
|
|
424
|
+
: ' (TELEGRAM_BOT_TOKEN not set — tools will error until configured)'));
|
|
153
425
|
}
|
|
154
426
|
main().catch((err) => {
|
|
155
427
|
console.error('Fatal:', err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback, approval callbacks.
|
|
3
|
+
* Unroutable allowlisted messages are ignored (counted); never executed as shell.
|
|
4
|
+
*/
|
|
5
|
+
import type { ApprovalSession, PendingCommand, LocalStore } from './store.js';
|
|
6
|
+
import type { TelegramCallbackQuery, TelegramMessage, TelegramUpdate } from './telegram.js';
|
|
7
|
+
export interface AllowlistResult {
|
|
8
|
+
allowed: boolean;
|
|
9
|
+
chatId: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Allowed chats from TELEGRAM_CHAT_ALLOWLIST (comma-separated) or TELEGRAM_CHAT_ID.
|
|
13
|
+
* If neither is set, no chat is allowed for inbound commands.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getAllowedChatIds(env?: NodeJS.ProcessEnv): Set<string>;
|
|
16
|
+
export declare function isChatAllowed(chatId: string | number, env?: NodeJS.ProcessEnv): boolean;
|
|
17
|
+
/** Parse `/to <agent_id> <rest…>` — agent_id is the first whitespace-delimited token after /to. */
|
|
18
|
+
export declare function parseToAgentCommand(text: string): {
|
|
19
|
+
agentId: string;
|
|
20
|
+
body: string;
|
|
21
|
+
} | undefined;
|
|
22
|
+
export declare function truncateAgentLabel(idOrName: string, maxLen?: number): string;
|
|
23
|
+
/**
|
|
24
|
+
* Footer appended to outbound notify text (UX only; routing uses reply_to mapping).
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatAgentFooter(sourceAgentId: string, sourceAgentName?: string): string;
|
|
27
|
+
export declare function formatNotifyWithFooter(title: string | undefined, body: string, sourceAgentId: string, sourceAgentName?: string, formatBase?: (title: string | undefined, body: string) => string): string;
|
|
28
|
+
export type CallbackAction = 'ok' | 'no' | 'cu';
|
|
29
|
+
/** Parse callback_data: ok:TOKEN | no:TOKEN | cu:TOKEN */
|
|
30
|
+
export declare function parseApprovalCallbackData(data: string | undefined): {
|
|
31
|
+
action: CallbackAction;
|
|
32
|
+
token: string;
|
|
33
|
+
} | undefined;
|
|
34
|
+
export type InboundDisposition = {
|
|
35
|
+
kind: 'enqueued';
|
|
36
|
+
command: PendingCommand;
|
|
37
|
+
via: 'reply' | 'to_command' | 'approval';
|
|
38
|
+
} | {
|
|
39
|
+
kind: 'ignored_not_allowlisted';
|
|
40
|
+
} | {
|
|
41
|
+
kind: 'ignored_unroutable';
|
|
42
|
+
} | {
|
|
43
|
+
kind: 'ignored_no_text';
|
|
44
|
+
} | {
|
|
45
|
+
kind: 'custom_prompt';
|
|
46
|
+
session: ApprovalSession;
|
|
47
|
+
callback_query_id: string;
|
|
48
|
+
via: 'approval';
|
|
49
|
+
} | {
|
|
50
|
+
kind: 'ignored_unknown_callback';
|
|
51
|
+
} | {
|
|
52
|
+
kind: 'callback_answered_only';
|
|
53
|
+
callback_query_id: string;
|
|
54
|
+
};
|
|
55
|
+
export declare function routeInboundMessage(store: LocalStore, message: TelegramMessage, env?: NodeJS.ProcessEnv): InboundDisposition;
|
|
56
|
+
/**
|
|
57
|
+
* Route an inline-keyboard callback_query into pending queue or custom_prompt disposition.
|
|
58
|
+
*/
|
|
59
|
+
export declare function routeCallbackQuery(store: LocalStore, callback: TelegramCallbackQuery, env?: NodeJS.ProcessEnv): InboundDisposition;
|
|
60
|
+
export interface PollSummary {
|
|
61
|
+
updates_seen: number;
|
|
62
|
+
enqueued: number;
|
|
63
|
+
ignored_not_allowlisted: number;
|
|
64
|
+
ignored_unroutable: number;
|
|
65
|
+
ignored_no_text: number;
|
|
66
|
+
ignored_unknown_callback: number;
|
|
67
|
+
custom_prompts: number;
|
|
68
|
+
commands: PendingCommand[];
|
|
69
|
+
/** Callbacks that need answerCallbackQuery + optional ForceReply follow-up. */
|
|
70
|
+
callback_actions: Array<{
|
|
71
|
+
kind: 'answer';
|
|
72
|
+
callback_query_id: string;
|
|
73
|
+
text?: string;
|
|
74
|
+
} | {
|
|
75
|
+
kind: 'custom_prompt';
|
|
76
|
+
callback_query_id: string;
|
|
77
|
+
session: ApprovalSession;
|
|
78
|
+
}>;
|
|
79
|
+
next_offset?: number;
|
|
80
|
+
}
|
|
81
|
+
export declare function processUpdates(store: LocalStore, updates: TelegramUpdate[], env?: NodeJS.ProcessEnv): PollSummary;
|