telegram-notify-mcp 2.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/README.md +17 -5
- package/ROADMAP.md +2 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +154 -14
- package/dist/index.js.map +1 -1
- package/dist/routing.d.ts +36 -4
- package/dist/routing.js +99 -1
- package/dist/routing.js.map +1 -1
- package/dist/store.d.ts +19 -0
- package/dist/store.js +32 -1
- package/dist/store.js.map +1 -1
- package/dist/telegram.d.ts +37 -0
- package/dist/telegram.js +47 -0
- package/dist/telegram.js.map +1 -1
- package/package.json +2 -2
- package/skill-snippet.md +8 -2
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
This package is **not** a chat persona or hosted SaaS. It is a local Model Context Protocol server you run under Cursor, Grok Bot, or any MCP host. No secrets ship in the repo; configuration is environment-only.
|
|
6
6
|
|
|
7
7
|
**Publisher:** Ehsan Eskandari pour
|
|
8
|
-
**Version:** 2.
|
|
8
|
+
**Version:** 2.1.0 (Phase 2 + inline approval buttons — Accept / Decline / Custom)
|
|
9
9
|
|
|
10
10
|
## How it works
|
|
11
11
|
|
|
@@ -31,7 +31,7 @@ MCP alone cannot wake agents asynchronously (stdio is pull-only). See [ARCHITECT
|
|
|
31
31
|
|
|
32
32
|
| Tool | Purpose |
|
|
33
33
|
|------|---------|
|
|
34
|
-
| `telegram_notify` | Completion notification (`title?` + `body`). **Requires** `source_agent_id`; optional `source_agent_name`. Appends footer; persists mapping |
|
|
34
|
+
| `telegram_notify` | Completion notification (`title?` + `body`). **Requires** `source_agent_id`; optional `source_agent_name`. Appends footer; persists mapping. Optional opt-in approval buttons (`approval_buttons`, `accept_command`, `decline_command`) |
|
|
35
35
|
| `telegram_poll_inbound` | `getUpdates` + allowlist + route into pending queue; returns summary counts |
|
|
36
36
|
| `telegram_list_pending_commands` | List pending commands (optional `source_agent_id` filter) |
|
|
37
37
|
| `telegram_ack_command` | Ack/delete by `command_id` after host delivery |
|
|
@@ -41,7 +41,17 @@ MCP alone cannot wake agents asynchronously (stdio is pull-only). See [ARCHITECT
|
|
|
41
41
|
1. Only messages from allowlisted chats (`TELEGRAM_CHAT_ALLOWLIST` or `TELEGRAM_CHAT_ID`) are considered.
|
|
42
42
|
2. If the message is a **Telegram reply** to a mapped outbound `message_id`, enqueue for that `source_agent_id`.
|
|
43
43
|
3. Else if text starts with `/to <agent_id> <command…>`, enqueue for that agent (fallback).
|
|
44
|
-
4.
|
|
44
|
+
4. **Approval callbacks** (`callback_query`): Accept → enqueue `accept_command`; Decline → enqueue `decline_command`; Custom → bot sends a ForceReply prompt mapped to the same agent (next reply becomes a normal pending command).
|
|
45
|
+
5. Else **ignore** (counted as `ignored_unroutable` in the poll result). No shell execution inside MCP.
|
|
46
|
+
|
|
47
|
+
### Optional approval buttons (2.1, opt-in)
|
|
48
|
+
|
|
49
|
+
Pass `approval_buttons: true` on `telegram_notify` or on `telegram_send_message` (with `source_agent_id`) to attach an inline keyboard. **Default is off** — plain notify / reply mapping only.
|
|
50
|
+
|
|
51
|
+
- **Accept** / **Decline** — enqueue the configured command text for the originating agent (same pending queue as text replies).
|
|
52
|
+
- **Custom message** — prompts you to reply with free text (ForceReply); that reply is routed like a normal reply.
|
|
53
|
+
|
|
54
|
+
Pass the agent instruction on Accept via `accept_command`, e.g. `"asmj11 بفرست"`. Defaults: `"Accept"` / `"Decline"`. Pending queue format is unchanged — host bridge still list → deliver → ack.
|
|
45
55
|
|
|
46
56
|
## Host poller responsibilities (M3 bridge)
|
|
47
57
|
|
|
@@ -157,7 +167,9 @@ If your host UI has **Add MCP** fields instead of raw JSON:
|
|
|
157
167
|
"title": "Deploy finished",
|
|
158
168
|
"body": "staging is live; smoke tests passed.",
|
|
159
169
|
"source_agent_id": "agent-deploy-1",
|
|
160
|
-
"source_agent_name": "Deploy helper"
|
|
170
|
+
"source_agent_name": "Deploy helper",
|
|
171
|
+
"accept_command": "proceed with smoke tests",
|
|
172
|
+
"decline_command": "abort deploy follow-up"
|
|
161
173
|
}
|
|
162
174
|
```
|
|
163
175
|
|
|
@@ -172,7 +184,7 @@ staging is live; smoke tests passed.
|
|
|
172
184
|
Reply to this message to continue with this agent.
|
|
173
185
|
```
|
|
174
186
|
|
|
175
|
-
4. User **replies** to that message
|
|
187
|
+
4. User taps **Accept** / **Decline** / **Custom**, or **replies** to that message (or sends `/to agent-deploy-1 …`).
|
|
176
188
|
5. Host poller: `telegram_poll_inbound` → list → SendToAgent → `telegram_ack_command`.
|
|
177
189
|
|
|
178
190
|
## Security notes
|
package/ROADMAP.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
- [x] `telegram_get_me`, `telegram_send_message`, `telegram_notify`, `telegram_get_updates`
|
|
7
7
|
- [x] BYOB BotFather token via env only
|
|
8
8
|
- [x] Unit tests with mocked fetch
|
|
9
|
-
- [x] Publish to npm (`telegram-notify-mcp`) — 1.0.0 shipped; 2.0.0 Phase 2 text MVP
|
|
9
|
+
- [x] Publish to npm (`telegram-notify-mcp`) — 1.0.0 shipped; 2.0.0 Phase 2 text MVP; 2.1.0 approval buttons
|
|
10
10
|
- [ ] Optional Cursor / MCP marketplace plugin listing
|
|
11
11
|
|
|
12
12
|
## Phase 2 — inbound / control (text MVP)
|
|
@@ -16,6 +16,7 @@ Architecture: [ARCHITECTURE-PHASE2.md](./ARCHITECTURE-PHASE2.md).
|
|
|
16
16
|
- [x] **M1** — Mapping store + required `source_agent_id` on `telegram_notify` + footer attribution
|
|
17
17
|
- [x] **M2** — Pending commands queue + `telegram_poll_inbound` / `telegram_list_pending_commands` / `telegram_ack_command`; reply + `/to` routing; chat allowlist
|
|
18
18
|
- [x] **M3** — Host routine/skill (or daemon) poll → SendToAgent → ack (documented; host-provided)
|
|
19
|
+
- [x] **M3.5** — Inline approval buttons (Accept / Decline / Custom) via `callback_query` → pending queue (2.1.0)
|
|
19
20
|
- [ ] **M4** — Voice Phase 2b: `telegram_get_file` + host transcription into same queue
|
|
20
21
|
|
|
21
22
|
Notes:
|
package/dist/index.d.ts
CHANGED
|
@@ -6,5 +6,6 @@
|
|
|
6
6
|
* Starts cleanly without a token; tools fail with a clear error when invoked.
|
|
7
7
|
* Public release is env-only — no disk/secret-store token loading.
|
|
8
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.
|
|
9
10
|
*/
|
|
10
11
|
export {};
|
package/dist/index.js
CHANGED
|
@@ -6,15 +6,16 @@
|
|
|
6
6
|
* Starts cleanly without a token; tools fail with a clear error when invoked.
|
|
7
7
|
* Public release is env-only — no disk/secret-store token loading.
|
|
8
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.
|
|
9
10
|
*/
|
|
10
11
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
12
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
12
13
|
import { z } from 'zod';
|
|
13
|
-
import { TelegramApiError, TelegramClient, formatNotifyMessage, getDefaultChatId, } from './telegram.js';
|
|
14
|
+
import { TelegramApiError, TelegramClient, buildApprovalKeyboard, formatNotifyMessage, generateApprovalToken, getDefaultChatId, } from './telegram.js';
|
|
14
15
|
import { LocalStore } from './store.js';
|
|
15
16
|
import { formatAgentFooter, formatNotifyWithFooter, processUpdates, } from './routing.js';
|
|
16
17
|
const SERVER_NAME = 'telegram-notify-mcp';
|
|
17
|
-
const SERVER_VERSION = '2.
|
|
18
|
+
const SERVER_VERSION = '2.1.0';
|
|
18
19
|
function textResult(text, isError = false) {
|
|
19
20
|
return {
|
|
20
21
|
content: [{ type: 'text', text }],
|
|
@@ -34,6 +35,56 @@ function getClient() {
|
|
|
34
35
|
function getStore() {
|
|
35
36
|
return new LocalStore();
|
|
36
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
|
+
}
|
|
37
88
|
function createServer() {
|
|
38
89
|
const server = new McpServer({
|
|
39
90
|
name: SERVER_NAME,
|
|
@@ -53,7 +104,7 @@ function createServer() {
|
|
|
53
104
|
return errorResult(err);
|
|
54
105
|
}
|
|
55
106
|
});
|
|
56
|
-
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.', {
|
|
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.', {
|
|
57
108
|
text: z.string().min(1).describe('Message text to send'),
|
|
58
109
|
chat_id: z
|
|
59
110
|
.union([z.string(), z.number()])
|
|
@@ -72,17 +123,39 @@ function createServer() {
|
|
|
72
123
|
.string()
|
|
73
124
|
.optional()
|
|
74
125
|
.describe('Optional display name for footer'),
|
|
75
|
-
|
|
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, }) => {
|
|
76
139
|
try {
|
|
77
140
|
const chatId = getDefaultChatId(chat_id);
|
|
78
141
|
let outbound = text;
|
|
79
142
|
if (source_agent_id) {
|
|
80
143
|
outbound = text + formatAgentFooter(source_agent_id, source_agent_name);
|
|
81
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
|
+
}
|
|
82
154
|
const msg = await getClient().sendMessage({
|
|
83
155
|
chat_id: chatId,
|
|
84
156
|
text: outbound,
|
|
85
157
|
parse_mode,
|
|
158
|
+
reply_markup,
|
|
86
159
|
});
|
|
87
160
|
let mapped = false;
|
|
88
161
|
if (source_agent_id) {
|
|
@@ -91,9 +164,22 @@ function createServer() {
|
|
|
91
164
|
telegram_message_id: msg.message_id,
|
|
92
165
|
source_agent_id,
|
|
93
166
|
source_agent_name: source_agent_name || undefined,
|
|
167
|
+
accept_command: wantButtons ? acceptCmd : undefined,
|
|
168
|
+
decline_command: wantButtons ? declineCmd : undefined,
|
|
94
169
|
});
|
|
95
170
|
mapped = true;
|
|
96
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
|
+
}
|
|
97
183
|
return textResult(JSON.stringify({
|
|
98
184
|
ok: true,
|
|
99
185
|
message_id: msg.message_id,
|
|
@@ -101,13 +187,15 @@ function createServer() {
|
|
|
101
187
|
text: msg.text ?? outbound,
|
|
102
188
|
mapped,
|
|
103
189
|
source_agent_id: source_agent_id ?? null,
|
|
190
|
+
approval_buttons: wantButtons,
|
|
191
|
+
approval_token: token ?? null,
|
|
104
192
|
}, null, 2));
|
|
105
193
|
}
|
|
106
194
|
catch (err) {
|
|
107
195
|
return errorResult(err);
|
|
108
196
|
}
|
|
109
197
|
});
|
|
110
|
-
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
|
|
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).', {
|
|
111
199
|
body: z.string().min(1).describe('Notification body / details'),
|
|
112
200
|
title: z.string().optional().describe('Optional short title (e.g. "Build finished")'),
|
|
113
201
|
chat_id: z
|
|
@@ -122,20 +210,56 @@ function createServer() {
|
|
|
122
210
|
.string()
|
|
123
211
|
.optional()
|
|
124
212
|
.describe('Optional short human label for the footer'),
|
|
125
|
-
|
|
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, }) => {
|
|
126
226
|
try {
|
|
127
227
|
const chatId = getDefaultChatId(chat_id);
|
|
128
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
|
+
}
|
|
129
238
|
const msg = await getClient().sendMessage({
|
|
130
239
|
chat_id: chatId,
|
|
131
240
|
text,
|
|
241
|
+
reply_markup,
|
|
132
242
|
});
|
|
133
|
-
getStore()
|
|
243
|
+
const store = getStore();
|
|
244
|
+
store.putMapping({
|
|
134
245
|
chat_id: String(msg.chat.id),
|
|
135
246
|
telegram_message_id: msg.message_id,
|
|
136
247
|
source_agent_id,
|
|
137
248
|
source_agent_name: source_agent_name || undefined,
|
|
249
|
+
accept_command: wantButtons ? acceptCmd : undefined,
|
|
250
|
+
decline_command: wantButtons ? declineCmd : undefined,
|
|
138
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
|
+
}
|
|
139
263
|
return textResult(JSON.stringify({
|
|
140
264
|
ok: true,
|
|
141
265
|
message_id: msg.message_id,
|
|
@@ -144,6 +268,8 @@ function createServer() {
|
|
|
144
268
|
mapped: true,
|
|
145
269
|
source_agent_id,
|
|
146
270
|
source_agent_name: source_agent_name ?? null,
|
|
271
|
+
approval_buttons: wantButtons,
|
|
272
|
+
approval_token: token ?? null,
|
|
147
273
|
}, null, 2));
|
|
148
274
|
}
|
|
149
275
|
catch (err) {
|
|
@@ -163,7 +289,7 @@ function createServer() {
|
|
|
163
289
|
const updates = await getClient().getUpdates({ limit: limit ?? 10 });
|
|
164
290
|
const chats = new Map();
|
|
165
291
|
for (const u of updates) {
|
|
166
|
-
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;
|
|
167
293
|
if (!m?.chat)
|
|
168
294
|
continue;
|
|
169
295
|
const c = m.chat;
|
|
@@ -177,12 +303,20 @@ function createServer() {
|
|
|
177
303
|
update_count: updates.length,
|
|
178
304
|
discovered_chats: [...chats.values()],
|
|
179
305
|
updates: updates.map((u) => {
|
|
180
|
-
const m = u.message ??
|
|
306
|
+
const m = u.message ??
|
|
307
|
+
u.edited_message ??
|
|
308
|
+
u.channel_post ??
|
|
309
|
+
u.callback_query?.message;
|
|
181
310
|
return {
|
|
182
311
|
update_id: u.update_id,
|
|
183
312
|
chat_id: m?.chat?.id ?? null,
|
|
184
|
-
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,
|
|
185
318
|
text: m?.text ?? null,
|
|
319
|
+
callback_data: u.callback_query?.data ?? null,
|
|
186
320
|
};
|
|
187
321
|
}),
|
|
188
322
|
}, null, 2));
|
|
@@ -191,7 +325,7 @@ function createServer() {
|
|
|
191
325
|
return errorResult(err);
|
|
192
326
|
}
|
|
193
327
|
});
|
|
194
|
-
server.tool('telegram_poll_inbound', 'Poll Telegram getUpdates, allowlist-filter, route replies/mappings
|
|
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.', {
|
|
195
329
|
limit: z
|
|
196
330
|
.number()
|
|
197
331
|
.int()
|
|
@@ -209,20 +343,26 @@ function createServer() {
|
|
|
209
343
|
}, async ({ limit, timeout }) => {
|
|
210
344
|
try {
|
|
211
345
|
const store = getStore();
|
|
346
|
+
const client = getClient();
|
|
212
347
|
const offset = store.getUpdateOffset();
|
|
213
|
-
const updates = await
|
|
348
|
+
const updates = await client.getUpdates({
|
|
214
349
|
limit: limit ?? 50,
|
|
215
350
|
timeout: timeout ?? 0,
|
|
216
351
|
offset,
|
|
352
|
+
allowed_updates: ['message', 'edited_message', 'callback_query'],
|
|
217
353
|
});
|
|
218
354
|
const summary = processUpdates(store, updates);
|
|
219
355
|
if (summary.next_offset !== undefined) {
|
|
220
356
|
store.setUpdateOffset(summary.next_offset);
|
|
221
357
|
}
|
|
358
|
+
const cb = await handleCallbackActions(client, store, summary.callback_actions);
|
|
359
|
+
const { callback_actions: _actions, ...publicSummary } = summary;
|
|
222
360
|
return textResult(JSON.stringify({
|
|
223
361
|
ok: true,
|
|
224
|
-
...
|
|
225
|
-
|
|
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.',
|
|
226
366
|
}, null, 2));
|
|
227
367
|
}
|
|
228
368
|
catch (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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"}
|
package/dist/routing.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback.
|
|
2
|
+
* Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback, approval callbacks.
|
|
3
3
|
* Unroutable allowlisted messages are ignored (counted); never executed as shell.
|
|
4
4
|
*/
|
|
5
|
-
import type { PendingCommand, LocalStore } from './store.js';
|
|
6
|
-
import type { TelegramMessage, TelegramUpdate } from './telegram.js';
|
|
5
|
+
import type { ApprovalSession, PendingCommand, LocalStore } from './store.js';
|
|
6
|
+
import type { TelegramCallbackQuery, TelegramMessage, TelegramUpdate } from './telegram.js';
|
|
7
7
|
export interface AllowlistResult {
|
|
8
8
|
allowed: boolean;
|
|
9
9
|
chatId: string;
|
|
@@ -25,25 +25,57 @@ export declare function truncateAgentLabel(idOrName: string, maxLen?: number): s
|
|
|
25
25
|
*/
|
|
26
26
|
export declare function formatAgentFooter(sourceAgentId: string, sourceAgentName?: string): string;
|
|
27
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;
|
|
28
34
|
export type InboundDisposition = {
|
|
29
35
|
kind: 'enqueued';
|
|
30
36
|
command: PendingCommand;
|
|
31
|
-
via: 'reply' | 'to_command';
|
|
37
|
+
via: 'reply' | 'to_command' | 'approval';
|
|
32
38
|
} | {
|
|
33
39
|
kind: 'ignored_not_allowlisted';
|
|
34
40
|
} | {
|
|
35
41
|
kind: 'ignored_unroutable';
|
|
36
42
|
} | {
|
|
37
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;
|
|
38
54
|
};
|
|
39
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;
|
|
40
60
|
export interface PollSummary {
|
|
41
61
|
updates_seen: number;
|
|
42
62
|
enqueued: number;
|
|
43
63
|
ignored_not_allowlisted: number;
|
|
44
64
|
ignored_unroutable: number;
|
|
45
65
|
ignored_no_text: number;
|
|
66
|
+
ignored_unknown_callback: number;
|
|
67
|
+
custom_prompts: number;
|
|
46
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
|
+
}>;
|
|
47
79
|
next_offset?: number;
|
|
48
80
|
}
|
|
49
81
|
export declare function processUpdates(store: LocalStore, updates: TelegramUpdate[], env?: NodeJS.ProcessEnv): PollSummary;
|
package/dist/routing.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback.
|
|
2
|
+
* Inbound routing: allowlist, reply→mapping, /to <agent_id> fallback, approval callbacks.
|
|
3
3
|
* Unroutable allowlisted messages are ignored (counted); never executed as shell.
|
|
4
4
|
*/
|
|
5
5
|
/**
|
|
@@ -62,6 +62,19 @@ function defaultFormatBase(title, body) {
|
|
|
62
62
|
return `✅ ${t}\n\n${b}`;
|
|
63
63
|
return `✅ ${b}`;
|
|
64
64
|
}
|
|
65
|
+
/** Parse callback_data: ok:TOKEN | no:TOKEN | cu:TOKEN */
|
|
66
|
+
export function parseApprovalCallbackData(data) {
|
|
67
|
+
if (!data)
|
|
68
|
+
return undefined;
|
|
69
|
+
const match = data.match(/^(ok|no|cu):(.+)$/);
|
|
70
|
+
if (!match)
|
|
71
|
+
return undefined;
|
|
72
|
+
const action = match[1];
|
|
73
|
+
const token = match[2];
|
|
74
|
+
if (!token)
|
|
75
|
+
return undefined;
|
|
76
|
+
return { action, token };
|
|
77
|
+
}
|
|
65
78
|
export function routeInboundMessage(store, message, env = process.env) {
|
|
66
79
|
const chatId = message.chat?.id;
|
|
67
80
|
if (chatId === undefined || chatId === null) {
|
|
@@ -104,6 +117,48 @@ export function routeInboundMessage(store, message, env = process.env) {
|
|
|
104
117
|
// Prefer ignore with count (documented): no mapping and no /to → drop
|
|
105
118
|
return { kind: 'ignored_unroutable' };
|
|
106
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Route an inline-keyboard callback_query into pending queue or custom_prompt disposition.
|
|
122
|
+
*/
|
|
123
|
+
export function routeCallbackQuery(store, callback, env = process.env) {
|
|
124
|
+
const chatId = callback.message?.chat?.id;
|
|
125
|
+
if (chatId === undefined || chatId === null) {
|
|
126
|
+
return { kind: 'ignored_unroutable' };
|
|
127
|
+
}
|
|
128
|
+
if (!isChatAllowed(chatId, env)) {
|
|
129
|
+
return { kind: 'ignored_not_allowlisted' };
|
|
130
|
+
}
|
|
131
|
+
const parsed = parseApprovalCallbackData(callback.data);
|
|
132
|
+
if (!parsed) {
|
|
133
|
+
return { kind: 'ignored_unknown_callback' };
|
|
134
|
+
}
|
|
135
|
+
const session = store.getApproval(parsed.token);
|
|
136
|
+
if (!session) {
|
|
137
|
+
return { kind: 'ignored_unknown_callback' };
|
|
138
|
+
}
|
|
139
|
+
const originalMessageId = session.telegram_message_id;
|
|
140
|
+
const callbackMessageId = callback.message?.message_id ?? 0;
|
|
141
|
+
if (parsed.action === 'cu') {
|
|
142
|
+
return {
|
|
143
|
+
kind: 'custom_prompt',
|
|
144
|
+
session,
|
|
145
|
+
callback_query_id: callback.id,
|
|
146
|
+
via: 'approval',
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const text = parsed.action === 'ok' ? session.accept_command : session.decline_command;
|
|
150
|
+
const command = store.enqueuePending({
|
|
151
|
+
source_agent_id: session.source_agent_id,
|
|
152
|
+
source_agent_name: session.source_agent_name,
|
|
153
|
+
chat_id: String(chatId),
|
|
154
|
+
telegram_message_id: callbackMessageId,
|
|
155
|
+
reply_to_telegram_message_id: originalMessageId,
|
|
156
|
+
text,
|
|
157
|
+
});
|
|
158
|
+
// One-shot: remove session after Accept/Decline so re-presses don't re-enqueue
|
|
159
|
+
store.deleteApproval(parsed.token);
|
|
160
|
+
return { kind: 'enqueued', command, via: 'approval' };
|
|
161
|
+
}
|
|
107
162
|
export function processUpdates(store, updates, env = process.env) {
|
|
108
163
|
const summary = {
|
|
109
164
|
updates_seen: updates.length,
|
|
@@ -111,13 +166,56 @@ export function processUpdates(store, updates, env = process.env) {
|
|
|
111
166
|
ignored_not_allowlisted: 0,
|
|
112
167
|
ignored_unroutable: 0,
|
|
113
168
|
ignored_no_text: 0,
|
|
169
|
+
ignored_unknown_callback: 0,
|
|
170
|
+
custom_prompts: 0,
|
|
114
171
|
commands: [],
|
|
172
|
+
callback_actions: [],
|
|
115
173
|
};
|
|
116
174
|
let maxUpdateId;
|
|
117
175
|
for (const u of updates) {
|
|
118
176
|
if (maxUpdateId === undefined || u.update_id > maxUpdateId) {
|
|
119
177
|
maxUpdateId = u.update_id;
|
|
120
178
|
}
|
|
179
|
+
if (u.callback_query) {
|
|
180
|
+
const result = routeCallbackQuery(store, u.callback_query, env);
|
|
181
|
+
switch (result.kind) {
|
|
182
|
+
case 'enqueued':
|
|
183
|
+
summary.enqueued += 1;
|
|
184
|
+
summary.commands.push(result.command);
|
|
185
|
+
summary.callback_actions.push({
|
|
186
|
+
kind: 'answer',
|
|
187
|
+
callback_query_id: u.callback_query.id,
|
|
188
|
+
text: result.command.text.slice(0, 200),
|
|
189
|
+
});
|
|
190
|
+
break;
|
|
191
|
+
case 'custom_prompt':
|
|
192
|
+
summary.custom_prompts += 1;
|
|
193
|
+
summary.callback_actions.push({
|
|
194
|
+
kind: 'custom_prompt',
|
|
195
|
+
callback_query_id: result.callback_query_id,
|
|
196
|
+
session: result.session,
|
|
197
|
+
});
|
|
198
|
+
break;
|
|
199
|
+
case 'ignored_not_allowlisted':
|
|
200
|
+
summary.ignored_not_allowlisted += 1;
|
|
201
|
+
break;
|
|
202
|
+
case 'ignored_unroutable':
|
|
203
|
+
summary.ignored_unroutable += 1;
|
|
204
|
+
break;
|
|
205
|
+
case 'ignored_unknown_callback':
|
|
206
|
+
summary.ignored_unknown_callback += 1;
|
|
207
|
+
// Still answer so Telegram stops the spinner
|
|
208
|
+
summary.callback_actions.push({
|
|
209
|
+
kind: 'answer',
|
|
210
|
+
callback_query_id: u.callback_query.id,
|
|
211
|
+
text: 'Unknown or expired approval',
|
|
212
|
+
});
|
|
213
|
+
break;
|
|
214
|
+
default:
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
121
219
|
const message = u.message ?? u.edited_message;
|
|
122
220
|
if (!message)
|
|
123
221
|
continue;
|
package/dist/routing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"routing.js","sourceRoot":"","sources":["../src/routing.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -10,6 +10,20 @@ export interface OutboundMapping {
|
|
|
10
10
|
source_agent_name?: string;
|
|
11
11
|
conversation_hint?: string;
|
|
12
12
|
created_at: string;
|
|
13
|
+
/** Optional: command text enqueued when Accept is pressed on this message. */
|
|
14
|
+
accept_command?: string;
|
|
15
|
+
/** Optional: command text enqueued when Decline is pressed on this message. */
|
|
16
|
+
decline_command?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface ApprovalSession {
|
|
19
|
+
token: string;
|
|
20
|
+
chat_id: string;
|
|
21
|
+
telegram_message_id: number;
|
|
22
|
+
source_agent_id: string;
|
|
23
|
+
source_agent_name?: string;
|
|
24
|
+
accept_command: string;
|
|
25
|
+
decline_command: string;
|
|
26
|
+
created_at: string;
|
|
13
27
|
}
|
|
14
28
|
export type PendingCommandStatus = 'pending' | 'acked';
|
|
15
29
|
export interface PendingCommand {
|
|
@@ -37,6 +51,11 @@ export declare class LocalStore {
|
|
|
37
51
|
created_at?: string;
|
|
38
52
|
}): OutboundMapping;
|
|
39
53
|
getMapping(chatId: string | number, messageId: number): OutboundMapping | undefined;
|
|
54
|
+
putApproval(entry: Omit<ApprovalSession, 'created_at'> & {
|
|
55
|
+
created_at?: string;
|
|
56
|
+
}): ApprovalSession;
|
|
57
|
+
getApproval(token: string): ApprovalSession | undefined;
|
|
58
|
+
deleteApproval(token: string): boolean;
|
|
40
59
|
enqueuePending(input: Omit<PendingCommand, 'id' | 'created_at' | 'status'> & {
|
|
41
60
|
id?: string;
|
|
42
61
|
created_at?: string;
|
package/dist/store.js
CHANGED
|
@@ -16,7 +16,7 @@ export function getDataDir(env = process.env) {
|
|
|
16
16
|
return join(process.cwd(), '.telegram-notify-data');
|
|
17
17
|
}
|
|
18
18
|
function emptyStore() {
|
|
19
|
-
return { mappings: {}, pending: [], update_offset: undefined };
|
|
19
|
+
return { mappings: {}, pending: [], approvals: {}, update_offset: undefined };
|
|
20
20
|
}
|
|
21
21
|
export class LocalStore {
|
|
22
22
|
dataDir;
|
|
@@ -41,6 +41,7 @@ export class LocalStore {
|
|
|
41
41
|
return {
|
|
42
42
|
mappings: parsed.mappings ?? {},
|
|
43
43
|
pending: Array.isArray(parsed.pending) ? parsed.pending : [],
|
|
44
|
+
approvals: parsed.approvals ?? {},
|
|
44
45
|
update_offset: parsed.update_offset,
|
|
45
46
|
};
|
|
46
47
|
}
|
|
@@ -61,6 +62,8 @@ export class LocalStore {
|
|
|
61
62
|
source_agent_name: entry.source_agent_name,
|
|
62
63
|
conversation_hint: entry.conversation_hint,
|
|
63
64
|
created_at: entry.created_at ?? new Date().toISOString(),
|
|
65
|
+
accept_command: entry.accept_command,
|
|
66
|
+
decline_command: entry.decline_command,
|
|
64
67
|
};
|
|
65
68
|
data.mappings[mappingKey(full.chat_id, full.telegram_message_id)] = full;
|
|
66
69
|
this.write(data);
|
|
@@ -70,6 +73,34 @@ export class LocalStore {
|
|
|
70
73
|
const data = this.read();
|
|
71
74
|
return data.mappings[mappingKey(chatId, messageId)];
|
|
72
75
|
}
|
|
76
|
+
putApproval(entry) {
|
|
77
|
+
const data = this.read();
|
|
78
|
+
const full = {
|
|
79
|
+
token: entry.token,
|
|
80
|
+
chat_id: String(entry.chat_id),
|
|
81
|
+
telegram_message_id: entry.telegram_message_id,
|
|
82
|
+
source_agent_id: entry.source_agent_id,
|
|
83
|
+
source_agent_name: entry.source_agent_name,
|
|
84
|
+
accept_command: entry.accept_command,
|
|
85
|
+
decline_command: entry.decline_command,
|
|
86
|
+
created_at: entry.created_at ?? new Date().toISOString(),
|
|
87
|
+
};
|
|
88
|
+
data.approvals[full.token] = full;
|
|
89
|
+
this.write(data);
|
|
90
|
+
return full;
|
|
91
|
+
}
|
|
92
|
+
getApproval(token) {
|
|
93
|
+
const data = this.read();
|
|
94
|
+
return data.approvals[token];
|
|
95
|
+
}
|
|
96
|
+
deleteApproval(token) {
|
|
97
|
+
const data = this.read();
|
|
98
|
+
if (!(token in data.approvals))
|
|
99
|
+
return false;
|
|
100
|
+
delete data.approvals[token];
|
|
101
|
+
this.write(data);
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
73
104
|
enqueuePending(input) {
|
|
74
105
|
const data = this.read();
|
|
75
106
|
const cmd = {
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/telegram.d.ts
CHANGED
|
@@ -32,11 +32,18 @@ export interface TelegramMessage {
|
|
|
32
32
|
from?: TelegramUser;
|
|
33
33
|
reply_to_message?: TelegramMessage;
|
|
34
34
|
}
|
|
35
|
+
export interface TelegramCallbackQuery {
|
|
36
|
+
id: string;
|
|
37
|
+
from?: TelegramUser;
|
|
38
|
+
data?: string;
|
|
39
|
+
message?: TelegramMessage;
|
|
40
|
+
}
|
|
35
41
|
export interface TelegramUpdate {
|
|
36
42
|
update_id: number;
|
|
37
43
|
message?: TelegramMessage;
|
|
38
44
|
edited_message?: TelegramMessage;
|
|
39
45
|
channel_post?: TelegramMessage;
|
|
46
|
+
callback_query?: TelegramCallbackQuery;
|
|
40
47
|
}
|
|
41
48
|
export interface TelegramApiResponse<T> {
|
|
42
49
|
ok: boolean;
|
|
@@ -45,19 +52,48 @@ export interface TelegramApiResponse<T> {
|
|
|
45
52
|
error_code?: number;
|
|
46
53
|
}
|
|
47
54
|
export type ParseMode = 'Markdown' | 'MarkdownV2' | 'HTML';
|
|
55
|
+
export interface InlineKeyboardButton {
|
|
56
|
+
text: string;
|
|
57
|
+
callback_data?: string;
|
|
58
|
+
url?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface InlineKeyboardMarkup {
|
|
61
|
+
inline_keyboard: InlineKeyboardButton[][];
|
|
62
|
+
}
|
|
63
|
+
export interface ForceReplyMarkup {
|
|
64
|
+
force_reply: true;
|
|
65
|
+
selective?: boolean;
|
|
66
|
+
input_field_placeholder?: string;
|
|
67
|
+
}
|
|
68
|
+
export type ReplyMarkup = InlineKeyboardMarkup | ForceReplyMarkup;
|
|
48
69
|
export interface SendMessageParams {
|
|
49
70
|
chat_id: string | number;
|
|
50
71
|
text: string;
|
|
51
72
|
parse_mode?: ParseMode;
|
|
52
73
|
disable_notification?: boolean;
|
|
74
|
+
reply_markup?: ReplyMarkup;
|
|
75
|
+
reply_to_message_id?: number;
|
|
76
|
+
}
|
|
77
|
+
export interface AnswerCallbackQueryParams {
|
|
78
|
+
callback_query_id: string;
|
|
79
|
+
text?: string;
|
|
80
|
+
show_alert?: boolean;
|
|
53
81
|
}
|
|
54
82
|
export interface GetUpdatesParams {
|
|
55
83
|
limit?: number;
|
|
56
84
|
timeout?: number;
|
|
57
85
|
offset?: number;
|
|
86
|
+
allowed_updates?: string[];
|
|
58
87
|
}
|
|
59
88
|
export declare function getDefaultChatId(explicit?: string | number): string | number;
|
|
60
89
|
export declare function formatNotifyMessage(title: string | undefined, body: string): string;
|
|
90
|
+
/** Short random token for callback_data (keeps ok:/no:/cu: + token ≤ 64 bytes). */
|
|
91
|
+
export declare function generateApprovalToken(byteLength?: number): string;
|
|
92
|
+
/**
|
|
93
|
+
* Inline keyboard: Accept / Decline / Custom message.
|
|
94
|
+
* callback_data prefixes: ok: | no: | cu: + TOKEN
|
|
95
|
+
*/
|
|
96
|
+
export declare function buildApprovalKeyboard(token: string): InlineKeyboardMarkup;
|
|
61
97
|
export declare class TelegramClient {
|
|
62
98
|
private readonly fetchImpl;
|
|
63
99
|
private readonly baseUrl;
|
|
@@ -65,6 +101,7 @@ export declare class TelegramClient {
|
|
|
65
101
|
private call;
|
|
66
102
|
getMe(): Promise<TelegramUser>;
|
|
67
103
|
sendMessage(params: SendMessageParams): Promise<TelegramMessage>;
|
|
104
|
+
answerCallbackQuery(params: AnswerCallbackQueryParams): Promise<boolean>;
|
|
68
105
|
getUpdates(params?: GetUpdatesParams): Promise<TelegramUpdate[]>;
|
|
69
106
|
}
|
|
70
107
|
export declare function createClientFromEnv(fetchImpl?: typeof fetch): TelegramClient;
|
package/dist/telegram.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* Thin Telegram Bot HTTP API client (api.telegram.org).
|
|
3
3
|
* Uses Node 20+ global fetch. No secrets are hardcoded.
|
|
4
4
|
*/
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
5
6
|
export class TelegramApiError extends Error {
|
|
6
7
|
status;
|
|
7
8
|
description;
|
|
@@ -37,6 +38,34 @@ export function formatNotifyMessage(title, body) {
|
|
|
37
38
|
}
|
|
38
39
|
return `✅ ${b}`;
|
|
39
40
|
}
|
|
41
|
+
/** Short random token for callback_data (keeps ok:/no:/cu: + token ≤ 64 bytes). */
|
|
42
|
+
export function generateApprovalToken(byteLength = 6) {
|
|
43
|
+
return randomBytes(byteLength).toString('base64url').slice(0, 12);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Inline keyboard: Accept / Decline / Custom message.
|
|
47
|
+
* callback_data prefixes: ok: | no: | cu: + TOKEN
|
|
48
|
+
*/
|
|
49
|
+
export function buildApprovalKeyboard(token) {
|
|
50
|
+
const t = token.trim();
|
|
51
|
+
if (!t) {
|
|
52
|
+
throw new Error('approval token must be non-empty');
|
|
53
|
+
}
|
|
54
|
+
for (const prefix of ['ok:', 'no:', 'cu:']) {
|
|
55
|
+
if (Buffer.byteLength(prefix + t, 'utf8') > 64) {
|
|
56
|
+
throw new Error(`callback_data exceeds 64 bytes for prefix ${prefix}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
inline_keyboard: [
|
|
61
|
+
[
|
|
62
|
+
{ text: 'Accept', callback_data: `ok:${t}` },
|
|
63
|
+
{ text: 'Decline', callback_data: `no:${t}` },
|
|
64
|
+
],
|
|
65
|
+
[{ text: 'Custom message', callback_data: `cu:${t}` }],
|
|
66
|
+
],
|
|
67
|
+
};
|
|
68
|
+
}
|
|
40
69
|
export class TelegramClient {
|
|
41
70
|
fetchImpl;
|
|
42
71
|
baseUrl;
|
|
@@ -84,8 +113,24 @@ export class TelegramClient {
|
|
|
84
113
|
if (params.disable_notification !== undefined) {
|
|
85
114
|
payload.disable_notification = params.disable_notification;
|
|
86
115
|
}
|
|
116
|
+
if (params.reply_markup !== undefined) {
|
|
117
|
+
payload.reply_markup = params.reply_markup;
|
|
118
|
+
}
|
|
119
|
+
if (params.reply_to_message_id !== undefined) {
|
|
120
|
+
payload.reply_to_message_id = params.reply_to_message_id;
|
|
121
|
+
}
|
|
87
122
|
return this.call('sendMessage', payload);
|
|
88
123
|
}
|
|
124
|
+
answerCallbackQuery(params) {
|
|
125
|
+
const payload = {
|
|
126
|
+
callback_query_id: params.callback_query_id,
|
|
127
|
+
};
|
|
128
|
+
if (params.text !== undefined)
|
|
129
|
+
payload.text = params.text;
|
|
130
|
+
if (params.show_alert !== undefined)
|
|
131
|
+
payload.show_alert = params.show_alert;
|
|
132
|
+
return this.call('answerCallbackQuery', payload);
|
|
133
|
+
}
|
|
89
134
|
getUpdates(params = {}) {
|
|
90
135
|
const payload = {};
|
|
91
136
|
if (params.limit !== undefined)
|
|
@@ -94,6 +139,8 @@ export class TelegramClient {
|
|
|
94
139
|
payload.timeout = params.timeout;
|
|
95
140
|
if (params.offset !== undefined)
|
|
96
141
|
payload.offset = params.offset;
|
|
142
|
+
if (params.allowed_updates !== undefined)
|
|
143
|
+
payload.allowed_updates = params.allowed_updates;
|
|
97
144
|
return this.call('getUpdates', Object.keys(payload).length ? payload : undefined);
|
|
98
145
|
}
|
|
99
146
|
}
|
package/dist/telegram.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IAGvB;IACA;IAHlB,YACE,OAAe,EACC,MAAe,EACf,WAAoB;QAEpC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,WAAM,GAAN,MAAM,CAAS;QACf,gBAAW,GAAX,WAAW,CAAS;QAGpC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "telegram-notify-mcp",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "MCP connector/server that sends Telegram notifications via your own BotFather bot (BYOB), with Phase 2 inbound reply routing
|
|
3
|
+
"version": "2.1.0",
|
|
4
|
+
"description": "MCP connector/server that sends Telegram notifications via your own BotFather bot (BYOB), with Phase 2 inbound reply routing and inline approval buttons.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"bin": {
|
package/skill-snippet.md
CHANGED
|
@@ -25,16 +25,21 @@ Call `telegram_notify` with:
|
|
|
25
25
|
- `source_agent_id`: **required** — stable id of this agent (used for reply routing)
|
|
26
26
|
- `source_agent_name`: optional short label for the Telegram footer
|
|
27
27
|
- `chat_id`: only if no default env chat
|
|
28
|
+
- `approval_buttons`: optional boolean — default **true** (Accept / Decline / Custom keyboard)
|
|
29
|
+
- `accept_command`: optional string — text enqueued when user taps Accept (e.g. `asmj11 بفرست`). Default: `Accept`
|
|
30
|
+
- `decline_command`: optional string — text enqueued on Decline. Default: `Decline`
|
|
28
31
|
|
|
29
32
|
Keep messages short. Do not put tokens or passwords in the body.
|
|
30
33
|
|
|
34
|
+
When the user taps **Custom message**, the bot asks for a ForceReply; their next reply is enqueued for the same `source_agent_id` like a normal reply.
|
|
35
|
+
|
|
31
36
|
## Verify bot
|
|
32
37
|
|
|
33
38
|
Call `telegram_get_me` if sends fail or after rotating the token.
|
|
34
39
|
|
|
35
40
|
## Raw send
|
|
36
41
|
|
|
37
|
-
Use `telegram_send_message` when you need a custom `parse_mode` or non-notify wording. Pass optional `source_agent_id` if you want footer + reply mapping.
|
|
42
|
+
Use `telegram_send_message` when you need a custom `parse_mode` or non-notify wording. Pass optional `source_agent_id` if you want footer + reply mapping. Optional `approval_buttons` (default false), `accept_command`, `decline_command` work the same as on `telegram_notify` when `source_agent_id` is set.
|
|
38
43
|
|
|
39
44
|
---
|
|
40
45
|
|
|
@@ -75,8 +80,9 @@ async function telegramInboundTick(mcp, sendToAgent) {
|
|
|
75
80
|
|
|
76
81
|
### Routing reminders for the user
|
|
77
82
|
|
|
78
|
-
- Prefer **replying** to the notify message
|
|
83
|
+
- Prefer **Accept / Decline / Custom** buttons, or **replying** to the notify message (maps to the originating agent).
|
|
79
84
|
- Fallback: `/to <agent_id> <natural language command>`.
|
|
80
85
|
- Unroutable messages are ignored (not executed).
|
|
86
|
+
- Pending queue shape is unchanged — bridge/daemon needs no format change.
|
|
81
87
|
|
|
82
88
|
Do **not** put `TELEGRAM_BOT_TOKEN` in prompts or Telegram bodies. Do **not** treat Telegram text as shell inside the MCP server — the **agent** decides actions under normal host policies.
|