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 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.0.0 (Phase 2 text MVPbreaking: `source_agent_id` required on `telegram_notify`)
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. Else **ignore** (counted as `ignored_unroutable` in the poll result). No shell execution inside MCP.
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 in Telegram (or sends `/to agent-deploy-1 …`).
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.0.0';
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
- }, async ({ text, chat_id, parse_mode, source_agent_id, source_agent_name }) => {
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 for reply routing.', {
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
- }, async ({ body, title, chat_id, source_agent_id, source_agent_name }) => {
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().putMapping({
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 ?? u.edited_message ?? u.channel_post;
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: m?.from?.username ?? m?.from?.first_name ?? null,
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 and /to commands into the pending queue. Unroutable allowlisted messages are ignored (counted). Host must then list + SendToAgent + ack.', {
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 getClient().getUpdates({
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
- ...summary,
225
- note: 'Unroutable messages (no reply-to mapping and no /to <agent_id> …) are ignored. Host should call telegram_list_pending_commands, deliver via SendToAgent, then telegram_ack_command.',
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;
@@ -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":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -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
  }
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,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;AA8FD,SAAS,YAAY,CAAC,KAAyB;IAC7C,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,gBAAgB,CACxB,gIAAgI,CACjI,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,QAA0B;IACzD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAClF,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,gBAAgB,CACxB,0IAA0I,CAC3I,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAyB,EAAE,IAAY;IACzE,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACtB,IAAI,CAAC,EAAE,CAAC;QACN,OAAO,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,UAAU,GAAG,CAAC;IAClD,OAAO,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,MAAM,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IACD,OAAO;QACL,eAAe,EAAE;YACf;gBACE,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE;gBAC5C,EAAE,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE;aAC9C;YACD,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC;SACvD;KACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,cAAc;IAKN;IAJF,OAAO,CAAS;IAEjC,YACE,QAA4B,OAAO,CAAC,GAAG,CAAC,kBAAkB,EACzC,YAA0B,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;QAA3D,cAAS,GAAT,SAAS,CAAkD;QAE5E,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,+BAA+B,CAAC,EAAE,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,IAAI,CAAI,MAAc,EAAE,IAA8B;QAClE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;QACxC,IAAI,GAAa,CAAC;QAClB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;gBAC9B,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK;gBAC7B,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,SAAS;gBAClE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,MAAM,IAAI,gBAAgB,CAAC,kCAAkC,MAAM,KAAK,GAAG,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,IAAI,IAA4B,CAAC;QACjC,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA2B,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,gBAAgB,CACxB,YAAY,MAAM,4BAA4B,GAAG,CAAC,MAAM,GAAG,EAC3D,GAAG,CAAC,MAAM,CACX,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,CACxB,YAAY,MAAM,YAAY,IAAI,CAAC,WAAW,IAAI,GAAG,CAAC,UAAU,IAAI,eAAe,EAAE,EACrF,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,EAC7B,IAAI,CAAC,WAAW,CACjB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,MAAW,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,CAAC,IAAI,CAAe,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,WAAW,CAAC,MAAyB;QACnC,MAAM,OAAO,GAA4B;YACvC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;SAClB,CAAC;QACF,IAAI,MAAM,CAAC,UAAU;YAAE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC9D,IAAI,MAAM,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,oBAAoB,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAC7D,CAAC;QACD,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;YAC7C,OAAO,CAAC,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAkB,aAAa,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,mBAAmB,CAAC,MAAiC;QACnD,MAAM,OAAO,GAA4B;YACvC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;SAC5C,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1D,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QAC5E,OAAO,IAAI,CAAC,IAAI,CAAU,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,UAAU,CAAC,SAA2B,EAAE;QACtC,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC7D,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QACnE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAChE,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC3F,OAAO,IAAI,CAAC,IAAI,CAAmB,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACtG,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CACjC,SAAwB;IAExB,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;AACvE,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "telegram-notify-mcp",
3
- "version": "2.0.0",
4
- "description": "MCP connector/server that sends Telegram notifications via your own BotFather bot (BYOB), with Phase 2 inbound reply routing to the originating agent.",
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 in Telegram (maps to the originating agent).
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.