remote-copilot-mcp 1.2.1 → 2.0.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
@@ -4,13 +4,22 @@ An MCP (Model Context Protocol) server for remote control of AI assistants via T
4
4
 
5
5
  ## Overview
6
6
 
7
- This server exposes three tools that allow an AI assistant (e.g. GitHub Copilot) to be operated remotely through a Telegram bot:
7
+ This server exposes four tools that allow an AI assistant (e.g. GitHub Copilot) to be operated remotely through a Telegram bot:
8
8
 
9
9
  | Tool | Description |
10
10
  |------|-------------|
11
- | `start_session` | Begin a remote-copilot session. Automatically creates a dedicated Telegram topic thread in the forum supergroup so each session is fully isolated. |
12
- | `remote_copilot_wait_for_instructions` | Blocks (long-polls Telegram) until a new message arrives in the active topic or the timeout elapses. |
13
- | `report_progress` | Sends a progress update back to the operator in the active topic thread, using standard Markdown (auto-converted to Telegram MarkdownV2). |
11
+ | `start_session` | Begin or resume a remote-copilot session. Creates a dedicated Telegram topic thread (or resumes an existing one by name or thread ID). |
12
+ | `remote_copilot_wait_for_instructions` | Blocks until a new message (text, photo, or document) arrives in the active topic or the timeout elapses. |
13
+ | `report_progress` | Sends a progress update back to the operator using standard Markdown (auto-converted to Telegram MarkdownV2). |
14
+ | `send_file` | Sends a file or image to the operator via Telegram (base64-encoded). Images are sent as photos; everything else as documents. |
15
+
16
+ ## Features
17
+
18
+ - **Concurrent sessions** — Multiple VS Code windows can run independent sessions simultaneously. A shared file-based dispatcher ensures only one process polls Telegram (`getUpdates`), while each session reads from its own per-thread message file. No 409 conflicts, no lost updates.
19
+ - **Named session persistence** — Sessions are mapped by name to Telegram thread IDs in `~/.remote-copilot-mcp-sessions.json`. Calling `start_session({ name: "Fix auth bug" })` always resumes the same thread, even across VS Code restarts.
20
+ - **Image & document support** — Send photos or documents to the agent from Telegram; the agent receives them as native MCP image content blocks or base64 text. The agent can also send files back via the `send_file` tool.
21
+ - **Automatic Markdown conversion** — Standard Markdown in `report_progress` is automatically converted to Telegram MarkdownV2, including code blocks, tables, blockquotes, and special characters.
22
+ - **Keep-alive pings** — Periodic heartbeat messages to Telegram so the operator knows the agent is still alive during long idle periods.
14
23
 
15
24
  ## Prerequisites
16
25
 
@@ -71,8 +80,20 @@ Add to your MCP configuration:
71
80
 
72
81
  ## How it works
73
82
 
74
- 1. The AI calls `start_session`, which **automatically creates a new Telegram topic** (e.g. *Copilot — 07 Mar 2026, 14:30*) in the forum supergroup. All sends and receives for this session are scoped to that thread, so multiple parallel sessions never interfere.
75
- 2. The server long-polls the Telegram Bot API (`getUpdates`) in 45-second windows, filtering messages by the active topic's `message_thread_id`.
76
- 3. When a message arrives the tool instructs the AI to act on it, then call `remote_copilot_wait_for_instructions` again to keep the loop alive.
77
- 4. If the timeout elapses with no message the tool tells the AI to call the tool again immediately (with a unique timestamp so VS Code's loop-detection heuristic is not triggered).
78
- 5. At any point the AI calls `report_progress` to post a status update to the active topic thread. The message is written in standard Markdown and automatically converted to Telegram MarkdownV2. Intermediate operator messages are also surfaced so they are not missed.
83
+ 1. The AI calls `start_session`, which creates a new Telegram topic (e.g. *Copilot — 07 Mar 2026, 14:30*) or resumes an existing one by name/thread ID.
84
+ 2. A shared **dispatcher** runs a single `getUpdates` poller (elected via a lock file at `~/.remote-copilot-mcp/poller.lock`). It writes incoming messages to per-thread JSONL files under `~/.remote-copilot-mcp/threads/`. Each MCP instance reads from its own thread file — no 409 conflicts between concurrent sessions.
85
+ 3. When a message arrives (text, photo, or document), the tool downloads any media, converts it to MCP content blocks (image or text with base64), and instructs the AI to act on it.
86
+ 4. The AI calls `report_progress` to post status updates and `send_file` to send files/images back to the operator.
87
+ 5. If the timeout elapses with no message, the tool tells the AI to call `remote_copilot_wait_for_instructions` again immediately.
88
+
89
+ ### Architecture
90
+
91
+ ```
92
+ ~/.remote-copilot-mcp/
93
+ poller.lock ← PID + timestamp; first instance becomes the poller
94
+ offset ← shared getUpdates offset
95
+ threads/
96
+ <threadId>.jsonl ← messages for each topic thread
97
+ general.jsonl ← messages with no thread ID
98
+ ~/.remote-copilot-mcp-sessions.json ← name → threadId mapping
99
+ ```
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Shared Telegram update dispatcher.
3
+ *
4
+ * Problem: Telegram's getUpdates API is exclusive — only one poller per bot
5
+ * token. When multiple MCP server instances run concurrently (multiple VS Code
6
+ * windows), they fight for the poll lock with 409 Conflict errors and silently
7
+ * lose updates meant for other sessions.
8
+ *
9
+ * Solution: A file-system–based message broker.
10
+ *
11
+ * 1. One MCP instance becomes the **poller** (elected via a lock file).
12
+ * It calls getUpdates and writes incoming messages to per-thread JSON
13
+ * files under ~/.remote-copilot-mcp/threads/<threadId>.jsonl.
14
+ * 2. All MCP instances (including the poller) **read** from their own
15
+ * thread file to retrieve messages. This is contention-free because
16
+ * each instance is scoped to its own thread ID.
17
+ * 3. The lock file is automatically released if the poller process dies
18
+ * (stale-lock detection via PID check). Another instance then takes over.
19
+ *
20
+ * The dispatcher exports two public functions:
21
+ * - startDispatcher(telegram, chatId) — call once on MCP server startup.
22
+ * - readThreadMessages(threadId) — non-blocking; returns and clears
23
+ * pending messages for a thread.
24
+ */
25
+ import type { TelegramClient } from "./telegram.js";
26
+ export interface StoredMessage {
27
+ update_id: number;
28
+ message: {
29
+ message_id: number;
30
+ chat_id: number;
31
+ text?: string;
32
+ caption?: string;
33
+ message_thread_id?: number;
34
+ photo?: Array<{
35
+ file_id: string;
36
+ width: number;
37
+ height: number;
38
+ }>;
39
+ document?: {
40
+ file_id: string;
41
+ file_name?: string;
42
+ mime_type?: string;
43
+ };
44
+ date: number;
45
+ };
46
+ }
47
+ /**
48
+ * Read and clear all pending messages for a thread.
49
+ * Uses rename for atomic read-and-clear to prevent message loss.
50
+ */
51
+ export declare function readThreadMessages(threadId: number | undefined): StoredMessage[];
52
+ /**
53
+ * Start the shared dispatcher.
54
+ * - Ensures directories exist.
55
+ * - Attempts to acquire the poller lock.
56
+ * - If acquired, starts a polling loop that writes to per-thread files.
57
+ * - If not acquired, this instance is a consumer only (reads from thread files).
58
+ *
59
+ * Returns: whether this instance became the poller.
60
+ */
61
+ export declare function startDispatcher(telegram: TelegramClient, chatId: string): Promise<boolean>;
62
+ /**
63
+ * Stop the poller loop (if this instance is the poller).
64
+ */
65
+ export declare function stopDispatcher(): void;
66
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAYH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AA2GpD,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;YACV,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAiBD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,CAkBhF;AAiED;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACjC,QAAQ,EAAE,cAAc,EACxB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CA4DlB;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Shared Telegram update dispatcher.
3
+ *
4
+ * Problem: Telegram's getUpdates API is exclusive — only one poller per bot
5
+ * token. When multiple MCP server instances run concurrently (multiple VS Code
6
+ * windows), they fight for the poll lock with 409 Conflict errors and silently
7
+ * lose updates meant for other sessions.
8
+ *
9
+ * Solution: A file-system–based message broker.
10
+ *
11
+ * 1. One MCP instance becomes the **poller** (elected via a lock file).
12
+ * It calls getUpdates and writes incoming messages to per-thread JSON
13
+ * files under ~/.remote-copilot-mcp/threads/<threadId>.jsonl.
14
+ * 2. All MCP instances (including the poller) **read** from their own
15
+ * thread file to retrieve messages. This is contention-free because
16
+ * each instance is scoped to its own thread ID.
17
+ * 3. The lock file is automatically released if the poller process dies
18
+ * (stale-lock detection via PID check). Another instance then takes over.
19
+ *
20
+ * The dispatcher exports two public functions:
21
+ * - startDispatcher(telegram, chatId) — call once on MCP server startup.
22
+ * - readThreadMessages(threadId) — non-blocking; returns and clears
23
+ * pending messages for a thread.
24
+ */
25
+ import { existsSync, mkdirSync, readFileSync, renameSync, unlinkSync, writeFileSync } from "fs";
26
+ import { homedir } from "os";
27
+ import { join } from "path";
28
+ // ---------------------------------------------------------------------------
29
+ // Paths
30
+ // ---------------------------------------------------------------------------
31
+ const BASE_DIR = join(homedir(), ".remote-copilot-mcp");
32
+ const THREADS_DIR = join(BASE_DIR, "threads");
33
+ const LOCK_FILE = join(BASE_DIR, "poller.lock");
34
+ const OFFSET_FILE = join(BASE_DIR, "offset");
35
+ function ensureDirs() {
36
+ mkdirSync(THREADS_DIR, { recursive: true });
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Lock helpers
40
+ // ---------------------------------------------------------------------------
41
+ function readLock() {
42
+ try {
43
+ const raw = readFileSync(LOCK_FILE, "utf8");
44
+ const parsed = JSON.parse(raw);
45
+ if (typeof parsed.pid === "number" && typeof parsed.ts === "number") {
46
+ return parsed;
47
+ }
48
+ return null;
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ function writeLock() {
55
+ writeFileSync(LOCK_FILE, JSON.stringify({ pid: process.pid, ts: Date.now() }), "utf8");
56
+ }
57
+ function removeLock() {
58
+ try {
59
+ unlinkSync(LOCK_FILE);
60
+ }
61
+ catch {
62
+ // Already gone.
63
+ }
64
+ }
65
+ /** Check whether a PID is still alive. */
66
+ function isPidAlive(pid) {
67
+ try {
68
+ process.kill(pid, 0); // Signal 0 = existence check, does not kill.
69
+ return true;
70
+ }
71
+ catch {
72
+ return false;
73
+ }
74
+ }
75
+ /**
76
+ * Try to become the poller. Returns true if this process now holds the lock.
77
+ * - If no lock file exists → take it.
78
+ * - If lock file exists but the PID is dead → take it.
79
+ * - If lock file exists, PID is alive, but lock is >5 min old → take it (stale).
80
+ * - Otherwise → someone else is the poller.
81
+ */
82
+ const STALE_LOCK_MS = 5 * 60 * 1000;
83
+ function tryAcquireLock() {
84
+ const existing = readLock();
85
+ if (existing) {
86
+ const alive = isPidAlive(existing.pid);
87
+ const stale = Date.now() - existing.ts > STALE_LOCK_MS;
88
+ if (alive && !stale) {
89
+ return false; // Someone else is actively polling.
90
+ }
91
+ // Dead or stale — take over.
92
+ }
93
+ writeLock();
94
+ return true;
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Offset persistence (shared across all instances)
98
+ // ---------------------------------------------------------------------------
99
+ function readOffset() {
100
+ try {
101
+ const raw = readFileSync(OFFSET_FILE, "utf8").trim();
102
+ const n = Number(raw);
103
+ return Number.isFinite(n) ? n : 0;
104
+ }
105
+ catch {
106
+ return 0;
107
+ }
108
+ }
109
+ function writeOffset(offset) {
110
+ try {
111
+ writeFileSync(OFFSET_FILE, String(offset), "utf8");
112
+ }
113
+ catch {
114
+ // Non-fatal.
115
+ }
116
+ }
117
+ function threadFilePath(threadId) {
118
+ return join(THREADS_DIR, `${threadId}.jsonl`);
119
+ }
120
+ function appendToThread(threadId, msg) {
121
+ const file = threadFilePath(threadId);
122
+ try {
123
+ const line = JSON.stringify(msg) + "\n";
124
+ // appendFileSync would be ideal, but writeFileSync with flag "a" works.
125
+ writeFileSync(file, line, { flag: "a", encoding: "utf8" });
126
+ }
127
+ catch {
128
+ // Non-fatal — message may be lost for this thread.
129
+ }
130
+ }
131
+ /**
132
+ * Read and clear all pending messages for a thread.
133
+ * Uses rename for atomic read-and-clear to prevent message loss.
134
+ */
135
+ export function readThreadMessages(threadId) {
136
+ const key = threadId ?? "general";
137
+ const file = threadFilePath(key);
138
+ const tmp = file + ".reading." + process.pid;
139
+ try {
140
+ // Atomically move the file so the poller appends to a fresh file.
141
+ renameSync(file, tmp);
142
+ }
143
+ catch {
144
+ return []; // File doesn't exist or is empty.
145
+ }
146
+ try {
147
+ const raw = readFileSync(tmp, "utf8").trim();
148
+ return raw ? raw.split("\n").map((line) => JSON.parse(line)) : [];
149
+ }
150
+ catch {
151
+ return [];
152
+ }
153
+ finally {
154
+ try {
155
+ unlinkSync(tmp);
156
+ }
157
+ catch { /* already gone */ }
158
+ }
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // Poller loop
162
+ // ---------------------------------------------------------------------------
163
+ let pollerRunning = false;
164
+ async function pollOnce(telegram, chatId) {
165
+ const POLL_TIMEOUT_SECONDS = 30;
166
+ let offset = readOffset();
167
+ try {
168
+ const updates = await telegram.getUpdates(offset, POLL_TIMEOUT_SECONDS);
169
+ if (updates.length === 0)
170
+ return;
171
+ offset = updates[updates.length - 1].update_id + 1;
172
+ for (const u of updates) {
173
+ if (!u.message)
174
+ continue;
175
+ if (String(u.message.chat.id) !== chatId)
176
+ continue;
177
+ const threadId = u.message.message_thread_id ?? "general";
178
+ const stored = {
179
+ update_id: u.update_id,
180
+ message: {
181
+ message_id: u.message.message_id,
182
+ chat_id: u.message.chat.id,
183
+ text: u.message.text,
184
+ caption: u.message.caption,
185
+ message_thread_id: u.message.message_thread_id,
186
+ photo: u.message.photo?.map((p) => ({
187
+ file_id: p.file_id,
188
+ width: p.width,
189
+ height: p.height,
190
+ })),
191
+ document: u.message.document ? {
192
+ file_id: u.message.document.file_id,
193
+ file_name: u.message.document.file_name,
194
+ mime_type: u.message.document.mime_type,
195
+ } : undefined,
196
+ date: u.message.date,
197
+ },
198
+ };
199
+ appendToThread(threadId, stored);
200
+ }
201
+ // Commit offset only after all messages have been written to disk.
202
+ writeOffset(offset);
203
+ }
204
+ catch (err) {
205
+ process.stderr.write(`[dispatcher] Poll error: ${err instanceof Error ? err.message : String(err)}\n`);
206
+ }
207
+ // Refresh lock timestamp so other instances know we're alive.
208
+ writeLock();
209
+ }
210
+ /**
211
+ * Start the shared dispatcher.
212
+ * - Ensures directories exist.
213
+ * - Attempts to acquire the poller lock.
214
+ * - If acquired, starts a polling loop that writes to per-thread files.
215
+ * - If not acquired, this instance is a consumer only (reads from thread files).
216
+ *
217
+ * Returns: whether this instance became the poller.
218
+ */
219
+ export async function startDispatcher(telegram, chatId) {
220
+ ensureDirs();
221
+ const isPoller = tryAcquireLock();
222
+ if (isPoller) {
223
+ process.stderr.write("[dispatcher] This instance is the poller.\n");
224
+ // Drain old updates before starting the poll loop to avoid replaying stale messages.
225
+ if (!existsSync(OFFSET_FILE)) {
226
+ try {
227
+ let off = 0;
228
+ for (;;) {
229
+ const updates = await telegram.getUpdates(off, 0);
230
+ if (updates.length === 0)
231
+ break;
232
+ off = updates[updates.length - 1].update_id + 1;
233
+ }
234
+ writeOffset(off);
235
+ process.stderr.write(`[dispatcher] Drained old updates. Offset set to ${off}.\n`);
236
+ }
237
+ catch (err) {
238
+ process.stderr.write(`[dispatcher] Warning: Could not drain old updates: ${err instanceof Error ? err.message : String(err)}\n`);
239
+ }
240
+ }
241
+ // Continuous poll loop.
242
+ pollerRunning = true;
243
+ const loop = async () => {
244
+ while (pollerRunning) {
245
+ await pollOnce(telegram, chatId);
246
+ // Small delay between polls to avoid tight-looping on errors.
247
+ await new Promise((r) => setTimeout(r, 500));
248
+ }
249
+ };
250
+ void loop();
251
+ // Clean up lock on process exit.
252
+ const cleanup = () => {
253
+ pollerRunning = false;
254
+ removeLock();
255
+ };
256
+ process.on("exit", cleanup);
257
+ process.on("SIGINT", () => {
258
+ cleanup();
259
+ process.exit(0);
260
+ });
261
+ process.on("SIGTERM", () => {
262
+ cleanup();
263
+ process.exit(0);
264
+ });
265
+ }
266
+ else {
267
+ process.stderr.write("[dispatcher] Another instance is the poller. This instance is a consumer only.\n");
268
+ }
269
+ return isPoller;
270
+ }
271
+ /**
272
+ * Stop the poller loop (if this instance is the poller).
273
+ */
274
+ export function stopDispatcher() {
275
+ pollerRunning = false;
276
+ removeLock();
277
+ }
278
+ //# sourceMappingURL=dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.js","sourceRoot":"","sources":["../src/dispatcher.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -2,10 +2,11 @@
2
2
  /**
3
3
  * Remote Copilot MCP Server
4
4
  *
5
- * Exposes three tools for AI assistants:
5
+ * Exposes four tools for AI assistants:
6
6
  * - start_session Begin a remote-copilot session.
7
7
  * - remote_copilot_wait_for_instructions Poll Telegram for new user messages.
8
8
  * - report_progress Send a progress update to Telegram.
9
+ * - send_file Send a file/image to the operator.
9
10
  *
10
11
  * Required environment variables:
11
12
  * TELEGRAM_TOKEN – Telegram Bot API token.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;GAoBG"}
package/dist/index.js CHANGED
@@ -2,10 +2,11 @@
2
2
  /**
3
3
  * Remote Copilot MCP Server
4
4
  *
5
- * Exposes three tools for AI assistants:
5
+ * Exposes four tools for AI assistants:
6
6
  * - start_session Begin a remote-copilot session.
7
7
  * - remote_copilot_wait_for_instructions Poll Telegram for new user messages.
8
8
  * - report_progress Send a progress update to Telegram.
9
+ * - send_file Send a file/image to the operator.
9
10
  *
10
11
  * Required environment variables:
11
12
  * TELEGRAM_TOKEN – Telegram Bot API token.
@@ -22,8 +23,12 @@
22
23
  import { Server } from "@modelcontextprotocol/sdk/server/index.js";
23
24
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
24
25
  import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
26
+ import { readFileSync, writeFileSync } from "fs";
25
27
  import { createRequire } from "module";
28
+ import { homedir } from "os";
29
+ import { join } from "path";
26
30
  import { TelegramClient } from "./telegram.js";
31
+ import { startDispatcher, readThreadMessages } from "./dispatcher.js";
27
32
  const _require = createRequire(import.meta.url);
28
33
  const { version: PKG_VERSION } = _require("../package.json");
29
34
  const telegramifyMarkdown = _require("telegramify-markdown");
@@ -82,37 +87,52 @@ if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
82
87
  process.exit(1);
83
88
  }
84
89
  // ---------------------------------------------------------------------------
85
- // Telegram client + update-offset tracking
90
+ // Telegram client + dispatcher
86
91
  // ---------------------------------------------------------------------------
87
92
  const telegram = new TelegramClient(TELEGRAM_TOKEN);
88
- /**
89
- * The next update_id we want to receive.
90
- * Persisted across tool calls within the same server process so we never
91
- * re-deliver a message that was already handled.
92
- *
93
- * Initialised by draining the existing Telegram update backlog on startup
94
- * so that old messages are not replayed as instructions.
95
- */
96
- let nextUpdateId = await (async () => {
93
+ // ---------------------------------------------------------------------------
94
+ // Start the shared dispatcher one process polls Telegram, all instances
95
+ // read from per-thread files. This eliminates 409 Conflict errors and
96
+ // ensures no updates are lost between concurrent sessions.
97
+ // ---------------------------------------------------------------------------
98
+ await startDispatcher(telegram, TELEGRAM_CHAT_ID);
99
+ // Monotonically increasing counter so every timeout response is unique,
100
+ // preventing VS Code Copilot's loop-detection heuristic from killing the agent.
101
+ let waitCallCount = 0;
102
+ // ---------------------------------------------------------------------------
103
+ // Session store — persists topic name → thread ID mappings to disk so the
104
+ // agent can resume a named session even after a VS Code restart.
105
+ // Format: { "<chatId>": { "<lowercased name>": threadId } }
106
+ // ---------------------------------------------------------------------------
107
+ const SESSION_STORE_PATH = join(homedir(), ".remote-copilot-mcp-sessions.json");
108
+ function loadSessionMap() {
97
109
  try {
98
- let offset = 0;
99
- for (;;) {
100
- const updates = await telegram.getUpdates(offset, 0);
101
- if (updates.length === 0)
102
- break;
103
- offset = updates[updates.length - 1].update_id + 1;
104
- }
105
- return offset;
110
+ const raw = readFileSync(SESSION_STORE_PATH, "utf8");
111
+ return JSON.parse(raw);
112
+ }
113
+ catch {
114
+ return {};
115
+ }
116
+ }
117
+ function saveSessionMap(map) {
118
+ try {
119
+ writeFileSync(SESSION_STORE_PATH, JSON.stringify(map, null, 2), "utf8");
106
120
  }
107
121
  catch (err) {
108
- process.stderr.write(`Warning: Failed to drain Telegram update backlog on startup: ${err instanceof Error ? err.message : String(err)}\n` +
109
- "Old messages may be replayed. Continuing with offset 0.\n");
110
- return 0;
122
+ process.stderr.write(`Warning: Could not save session map to ${SESSION_STORE_PATH}: ${err instanceof Error ? err.message : String(err)}\n`);
111
123
  }
112
- })();
113
- // Monotonically increasing counter so every timeout response is unique,
114
- // preventing VS Code Copilot's loop-detection heuristic from killing the agent.
115
- let waitCallCount = 0;
124
+ }
125
+ function lookupSession(chatId, name) {
126
+ const map = loadSessionMap();
127
+ return map[chatId]?.[name.toLowerCase()];
128
+ }
129
+ function persistSession(chatId, name, threadId) {
130
+ const map = loadSessionMap();
131
+ if (!map[chatId])
132
+ map[chatId] = {};
133
+ map[chatId][name.toLowerCase()] = threadId;
134
+ saveSessionMap(map);
135
+ }
116
136
  // Thread ID of the active session's forum topic. Set by start_session.
117
137
  // All sends and receives are scoped to this thread so concurrent sessions
118
138
  // in different topics never interfere with each other.
@@ -132,11 +152,12 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
132
152
  {
133
153
  name: "start_session",
134
154
  description: "Start or resume a remote-copilot session. " +
135
- "Creates a new dedicated Telegram topic thread for this session. " +
155
+ "When called with a name that was used before, the server looks up the " +
156
+ "existing Telegram topic for that name and resumes it instead of creating a new one. " +
136
157
  "If you are CONTINUING an existing chat (not a fresh conversation), " +
137
158
  "look back through the conversation history for a previous start_session " +
138
159
  "result that mentioned a Thread ID, then pass it as the threadId parameter " +
139
- "to resume that existing topic instead of creating a new one. " +
160
+ "to resume that existing topic. " +
140
161
  "Requires the Telegram chat to be a forum supergroup with the bot as admin. " +
141
162
  "Call this tool once, then call remote_copilot_wait_for_instructions.",
142
163
  inputSchema: {
@@ -184,6 +205,30 @@ server.setRequestHandler(ListToolsRequestSchema, async () => ({
184
205
  required: ["message"],
185
206
  },
186
207
  },
208
+ {
209
+ name: "send_file",
210
+ description: "Send a file (image or document) to the operator via Telegram. " +
211
+ "Provide the file content as a base64-encoded string. " +
212
+ "Images (JPEG, PNG, GIF, WebP) are sent as photos; other files as documents.",
213
+ inputSchema: {
214
+ type: "object",
215
+ properties: {
216
+ base64: {
217
+ type: "string",
218
+ description: "The file content encoded as a base64 string.",
219
+ },
220
+ filename: {
221
+ type: "string",
222
+ description: "The filename including extension (e.g. 'report.pdf', 'screenshot.png').",
223
+ },
224
+ caption: {
225
+ type: "string",
226
+ description: "Optional caption to display with the file.",
227
+ },
228
+ },
229
+ required: ["base64", "filename"],
230
+ },
231
+ },
187
232
  ],
188
233
  }));
189
234
  // ── Tool implementations ────────────────────────────────────────────────────
@@ -207,15 +252,33 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
207
252
  // ── start_session ─────────────────────────────────────────────────────────
208
253
  if (name === "start_session") {
209
254
  const typedArgs = (args ?? {});
210
- const resumeThreadId = typeof typedArgs.threadId === "number"
255
+ const explicitThreadId = typeof typedArgs.threadId === "number"
211
256
  ? typedArgs.threadId
212
257
  : undefined;
213
258
  const customName = typeof typedArgs.name === "string" && typedArgs.name.trim()
214
259
  ? typedArgs.name.trim()
215
260
  : undefined;
216
- if (resumeThreadId !== undefined) {
217
- // Resume mode: reuse an existing topic thread.
218
- currentThreadId = resumeThreadId;
261
+ // Determine the thread to use:
262
+ // 1. Explicit threadId beats everything.
263
+ // 2. A known name looks up the persisted mapping — resume if found.
264
+ // 3. Otherwise create a new topic.
265
+ let resolvedPreexisting = false;
266
+ if (explicitThreadId !== undefined) {
267
+ currentThreadId = explicitThreadId;
268
+ // If a name was also supplied, keep the mapping up to date.
269
+ if (customName)
270
+ persistSession(TELEGRAM_CHAT_ID, customName, explicitThreadId);
271
+ resolvedPreexisting = true;
272
+ }
273
+ else if (customName !== undefined) {
274
+ const stored = lookupSession(TELEGRAM_CHAT_ID, customName);
275
+ if (stored !== undefined) {
276
+ currentThreadId = stored;
277
+ resolvedPreexisting = true;
278
+ }
279
+ }
280
+ if (resolvedPreexisting) {
281
+ // Resume mode: send notification to the existing thread.
219
282
  lastKeepAliveSentAt = Date.now();
220
283
  try {
221
284
  const msg = convertMarkdown("🔄 **Session resumed.** Continuing in this thread.");
@@ -235,6 +298,8 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
235
298
  try {
236
299
  const topic = await telegram.createForumTopic(TELEGRAM_CHAT_ID, topicName);
237
300
  currentThreadId = topic.message_thread_id;
301
+ // Persist so the same name resumes this thread next time.
302
+ persistSession(TELEGRAM_CHAT_ID, topicName, currentThreadId);
238
303
  }
239
304
  catch (err) {
240
305
  // Forum topics not available (e.g. plain group or DM) — fall back to no thread.
@@ -261,7 +326,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
261
326
  content: [
262
327
  {
263
328
  type: "text",
264
- text: `Session ${resumeThreadId !== undefined ? "resumed" : "started"}.${threadNote}` +
329
+ text: `Session ${resolvedPreexisting ? "resumed" : "started"}.${threadNote}` +
265
330
  ` Call the remote_copilot_wait_for_instructions tool next.` +
266
331
  getReminders(currentThreadId),
267
332
  },
@@ -273,57 +338,88 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
273
338
  const callNumber = ++waitCallCount;
274
339
  const timeoutMs = WAIT_TIMEOUT_MINUTES * 60 * 1000;
275
340
  const deadline = Date.now() + timeoutMs;
276
- // Telegram's maximum long-poll timeout is 50 s; we loop until the
277
- // wall-clock deadline is reached.
278
- const POLL_TIMEOUT_SECONDS = 45;
341
+ // Poll the dispatcher's per-thread file instead of calling getUpdates
342
+ // directly. This avoids 409 conflicts between concurrent instances.
343
+ const POLL_INTERVAL_MS = 2000;
279
344
  while (Date.now() < deadline) {
280
- const remaining = deadline - Date.now();
281
- if (remaining <= 0)
282
- break;
283
- const pollSeconds = Math.min(POLL_TIMEOUT_SECONDS, Math.ceil(remaining / 1000));
284
- const controller = new AbortController();
285
- // Give the fetch a bit of extra headroom over the Telegram timeout.
286
- const fetchTimeoutId = setTimeout(() => controller.abort(), (pollSeconds + 10) * 1000);
287
- let updates;
288
- try {
289
- updates = await telegram.getUpdates(nextUpdateId, pollSeconds, controller.signal);
290
- }
291
- catch (err) {
292
- if (err instanceof Error && err.name === "AbortError") {
293
- // Fetch was aborted due to per-request timeout; retry if overall
294
- // deadline has not yet been reached.
295
- continue;
296
- }
297
- throw new Error(`Failed to fetch updates from Telegram: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
298
- }
299
- finally {
300
- clearTimeout(fetchTimeoutId);
301
- }
302
- if (updates.length > 0) {
303
- // Advance the offset so we don't see these updates again.
304
- nextUpdateId = updates[updates.length - 1].update_id + 1;
305
- // Collect text messages from the target chat, scoped to the active thread.
306
- const messages = updates
307
- .filter((u) => u.message?.text !== undefined &&
308
- String(u.message.chat.id) === TELEGRAM_CHAT_ID &&
309
- (currentThreadId === undefined ||
310
- u.message.message_thread_id === currentThreadId))
311
- .map((u) => u.message.text);
312
- if (messages.length > 0) {
313
- const prompt = messages.join("\n\n");
314
- return {
315
- content: [
316
- {
345
+ const stored = readThreadMessages(currentThreadId);
346
+ if (stored.length > 0) {
347
+ const contentBlocks = [];
348
+ for (const s of stored) {
349
+ // Photos: download the largest size and embed as base64.
350
+ if (s.message.photo && s.message.photo.length > 0) {
351
+ const largest = s.message.photo[s.message.photo.length - 1];
352
+ try {
353
+ const { base64, mimeType } = await telegram.downloadFileAsBase64(largest.file_id);
354
+ contentBlocks.push({ type: "image", data: base64, mimeType });
355
+ if (s.message.caption) {
356
+ contentBlocks.push({
357
+ type: "text",
358
+ text: `[Image caption]: ${s.message.caption}`,
359
+ });
360
+ }
361
+ }
362
+ catch (err) {
363
+ contentBlocks.push({
317
364
  type: "text",
318
- text: `Follow the instructions: ${prompt}. Create plan, use subagents.` +
319
- getReminders(currentThreadId),
320
- },
321
- ],
322
- };
365
+ text: `[Photo received but could not be downloaded: ${err instanceof Error ? err.message : String(err)}]`,
366
+ });
367
+ }
368
+ }
369
+ // Documents: download and embed as base64.
370
+ if (s.message.document) {
371
+ const doc = s.message.document;
372
+ try {
373
+ const { base64, mimeType } = await telegram.downloadFileAsBase64(doc.file_id);
374
+ const isImage = mimeType.startsWith("image/");
375
+ if (isImage) {
376
+ contentBlocks.push({ type: "image", data: base64, mimeType });
377
+ }
378
+ else {
379
+ // Non-image documents: include as text with base64 data.
380
+ contentBlocks.push({
381
+ type: "text",
382
+ text: `[Document: ${doc.file_name ?? "file"} (${doc.mime_type ?? mimeType})]\nBase64 content: ${base64}`,
383
+ });
384
+ }
385
+ if (s.message.caption) {
386
+ contentBlocks.push({
387
+ type: "text",
388
+ text: `[Document caption]: ${s.message.caption}`,
389
+ });
390
+ }
391
+ }
392
+ catch (err) {
393
+ contentBlocks.push({
394
+ type: "text",
395
+ text: `[Document "${doc.file_name ?? "file"}" received but could not be downloaded: ${err instanceof Error ? err.message : String(err)}]`,
396
+ });
397
+ }
398
+ }
399
+ // Text messages.
400
+ if (s.message.text) {
401
+ contentBlocks.push({ type: "text", text: s.message.text });
402
+ }
403
+ }
404
+ if (contentBlocks.length === 0) {
405
+ // All messages were unsupported types (stickers, voice, etc.);
406
+ // continue polling instead of returning empty instructions.
407
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
408
+ continue;
323
409
  }
324
- // Updates existed but none were relevant text messages from our chat;
325
- // continue polling.
410
+ return {
411
+ content: [
412
+ {
413
+ type: "text",
414
+ text: "Follow these operator instructions — create plan, use subagents:",
415
+ },
416
+ ...contentBlocks,
417
+ { type: "text", text: getReminders(currentThreadId) },
418
+ ],
419
+ };
326
420
  }
421
+ // No messages yet — sleep briefly and check again.
422
+ await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS));
327
423
  }
328
424
  // Timeout elapsed with no actionable message.
329
425
  const now = new Date().toISOString();
@@ -336,7 +432,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
336
432
  const ping = convertMarkdown(`🟢 **Session alive** — ${new Date().toLocaleString("en-GB", {
337
433
  day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit", hour12: false,
338
434
  })}` +
339
- (currentThreadId !== undefined ? ` \\(thread ${currentThreadId}\\)` : ""));
435
+ (currentThreadId !== undefined ? ` (thread ${currentThreadId})` : ""));
340
436
  await telegram.sendMessage(TELEGRAM_CHAT_ID, ping, "MarkdownV2", currentThreadId);
341
437
  keepAliveSent = true;
342
438
  }
@@ -426,15 +522,23 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
426
522
  // they are not missed when remote_copilot_wait_for_instructions is called.
427
523
  let pendingMessages = [];
428
524
  try {
429
- const pendingUpdates = await telegram.getUpdates(nextUpdateId, 0);
430
- if (pendingUpdates.length > 0) {
431
- nextUpdateId = pendingUpdates[pendingUpdates.length - 1].update_id + 1;
432
- pendingMessages = pendingUpdates
433
- .filter((u) => u.message?.text !== undefined &&
434
- String(u.message.chat.id) === TELEGRAM_CHAT_ID &&
435
- (currentThreadId === undefined ||
436
- u.message.message_thread_id === currentThreadId))
437
- .map((u) => u.message.text);
525
+ const pendingStored = readThreadMessages(currentThreadId);
526
+ if (pendingStored.length > 0) {
527
+ for (const s of pendingStored) {
528
+ if (s.message.photo && s.message.photo.length > 0) {
529
+ pendingMessages.push(s.message.caption
530
+ ? `[Photo received] ${s.message.caption}`
531
+ : "[Photo received from operator]");
532
+ }
533
+ else if (s.message.document) {
534
+ pendingMessages.push(s.message.caption
535
+ ? `[Document: ${s.message.document.file_name ?? "file"}] ${s.message.caption}`
536
+ : `[Document received: ${s.message.document.file_name ?? "file"}]`);
537
+ }
538
+ else if (s.message.text) {
539
+ pendingMessages.push(s.message.text);
540
+ }
541
+ }
438
542
  }
439
543
  }
440
544
  catch {
@@ -451,8 +555,7 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
451
555
  `You should:\n` +
452
556
  ` - Read and incorporate the operator's new messages.\n` +
453
557
  ` - Update or refine your plan as needed.\n` +
454
- ` - Continue your work. Keep using subagents.` +
455
- getReminders(currentThreadId)
558
+ ` - Continue your work. Keep using subagents.`
456
559
  : baseStatus;
457
560
  return {
458
561
  content: [
@@ -463,6 +566,51 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
463
566
  ],
464
567
  };
465
568
  }
569
+ // ── send_file ─────────────────────────────────────────────────────────────
570
+ if (name === "send_file") {
571
+ const typedArgs = (args ?? {});
572
+ const base64Data = typeof typedArgs.base64 === "string" ? typedArgs.base64 : "";
573
+ const filename = typeof typedArgs.filename === "string" ? typedArgs.filename : "file";
574
+ const caption = typeof typedArgs.caption === "string" ? typedArgs.caption : undefined;
575
+ if (!base64Data) {
576
+ return {
577
+ content: [{ type: "text", text: "Error: 'base64' argument is required for send_file." }],
578
+ isError: true,
579
+ };
580
+ }
581
+ try {
582
+ const buffer = Buffer.from(base64Data, "base64");
583
+ const ext = filename.split(".").pop()?.toLowerCase() ?? "";
584
+ const imageExts = new Set(["jpg", "jpeg", "png", "gif", "webp"]);
585
+ if (imageExts.has(ext)) {
586
+ await telegram.sendPhoto(TELEGRAM_CHAT_ID, buffer, filename, caption, currentThreadId);
587
+ }
588
+ else {
589
+ await telegram.sendDocument(TELEGRAM_CHAT_ID, buffer, filename, caption, currentThreadId);
590
+ }
591
+ return {
592
+ content: [
593
+ {
594
+ type: "text",
595
+ text: `File "${filename}" sent to Telegram successfully.` + getReminders(currentThreadId),
596
+ },
597
+ ],
598
+ };
599
+ }
600
+ catch (err) {
601
+ const errorMsg = err instanceof Error ? err.message : String(err);
602
+ process.stderr.write(`Failed to send file via Telegram: ${errorMsg}\n`);
603
+ return {
604
+ content: [
605
+ {
606
+ type: "text",
607
+ text: `Error: Failed to send file "${filename}" to Telegram: ${errorMsg}`,
608
+ },
609
+ ],
610
+ isError: true,
611
+ };
612
+ }
613
+ }
466
614
  // Unknown tool
467
615
  return {
468
616
  content: [
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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"}
@@ -8,8 +8,25 @@ export interface TelegramMessage {
8
8
  id: number;
9
9
  };
10
10
  text?: string;
11
+ caption?: string;
11
12
  date: number;
12
13
  message_thread_id?: number;
14
+ photo?: PhotoSize[];
15
+ document?: TelegramDocument;
16
+ }
17
+ export interface PhotoSize {
18
+ file_id: string;
19
+ file_unique_id: string;
20
+ width: number;
21
+ height: number;
22
+ file_size?: number;
23
+ }
24
+ export interface TelegramDocument {
25
+ file_id: string;
26
+ file_unique_id: string;
27
+ file_name?: string;
28
+ mime_type?: string;
29
+ file_size?: number;
13
30
  }
14
31
  export interface TelegramUpdate {
15
32
  update_id: number;
@@ -34,6 +51,15 @@ export interface CreateForumTopicResult {
34
51
  result?: ForumTopic;
35
52
  description?: string;
36
53
  }
54
+ export interface TelegramFile {
55
+ file_id: string;
56
+ file_path: string;
57
+ }
58
+ export interface GetFileResult {
59
+ ok: boolean;
60
+ result?: TelegramFile;
61
+ description?: string;
62
+ }
37
63
  export declare class TelegramClient {
38
64
  private readonly token;
39
65
  private readonly baseUrl;
@@ -56,5 +82,33 @@ export declare class TelegramClient {
56
82
  * @param threadId Optional message_thread_id for forum supergroups.
57
83
  */
58
84
  sendMessage(chatId: string, text: string, parseMode?: "MarkdownV2" | "Markdown" | "HTML", threadId?: number): Promise<void>;
85
+ /**
86
+ * Get metadata for a file stored on Telegram servers.
87
+ */
88
+ getFile(fileId: string): Promise<TelegramFile>;
89
+ /**
90
+ * Download a file from Telegram by file_id and return it as base64 with MIME type.
91
+ * Telegram Bot API supports files up to 20 MB.
92
+ */
93
+ downloadFileAsBase64(fileId: string): Promise<{
94
+ base64: string;
95
+ mimeType: string;
96
+ }>;
97
+ /**
98
+ * Send a document (file) to a chat via multipart/form-data.
99
+ * @param fileBuffer The file content as a Buffer.
100
+ * @param filename The filename to display in Telegram.
101
+ * @param caption Optional caption (plain text).
102
+ * @param threadId Optional message_thread_id for forum supergroups.
103
+ */
104
+ sendDocument(chatId: string, fileBuffer: Buffer, filename: string, caption?: string, threadId?: number): Promise<void>;
105
+ /**
106
+ * Send a photo to a chat via multipart/form-data.
107
+ * @param imageBuffer The image content as a Buffer.
108
+ * @param filename The filename (e.g. "screenshot.png").
109
+ * @param caption Optional caption.
110
+ * @param threadId Optional message_thread_id for forum supergroups.
111
+ */
112
+ sendPhoto(chatId: string, imageBuffer: Buffer, filename: string, caption?: string, threadId?: number): Promise<void>;
59
113
  }
60
114
  //# sourceMappingURL=telegram.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,KAAK,EAAE,MAAM;IAI1C;;;;OAIG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC;IA8B5B;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAoBzE;;;;OAIG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,EAC9C,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;CAwCjB"}
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
package/dist/telegram.js CHANGED
@@ -19,23 +19,37 @@ export class TelegramClient {
19
19
  url.searchParams.set("offset", String(offset));
20
20
  url.searchParams.set("timeout", String(timeout));
21
21
  url.searchParams.set("allowed_updates", JSON.stringify(["message"]));
22
- const response = await fetch(url.toString(), signal ? { signal } : {});
23
- let data;
24
- try {
25
- data = (await response.json());
26
- }
27
- catch (parseErr) {
28
- process.stderr.write(`Failed to parse Telegram getUpdates response: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}\n`);
29
- data = undefined;
30
- }
31
- if (!response.ok) {
32
- const description = data?.description ?? response.statusText;
33
- throw new Error(`Telegram getUpdates failed: ${response.status} ${description}`);
22
+ // Retry loop: Telegram returns 409 when another getUpdates poller is active
23
+ // (e.g. two VS Code windows with the same bot token). Back off and retry
24
+ // until the other instance releases the lock or the request is aborted.
25
+ const MAX_409_RETRIES = 12;
26
+ const RETRY_DELAY_MS = 5000;
27
+ for (let attempt = 0;; attempt++) {
28
+ const response = await fetch(url.toString(), signal ? { signal } : {});
29
+ let data;
30
+ try {
31
+ data = (await response.json());
32
+ }
33
+ catch (parseErr) {
34
+ process.stderr.write(`Failed to parse Telegram getUpdates response: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}\n`);
35
+ data = undefined;
36
+ }
37
+ // 409 Conflict: another poller is running. Wait and retry.
38
+ if (response.status === 409 && attempt < MAX_409_RETRIES) {
39
+ process.stderr.write(`Telegram getUpdates 409 Conflict (attempt ${attempt + 1}/${MAX_409_RETRIES}) — ` +
40
+ `another bot instance is polling. Retrying in ${RETRY_DELAY_MS / 1000}s...\n`);
41
+ await new Promise((resolve) => setTimeout(resolve, RETRY_DELAY_MS));
42
+ continue;
43
+ }
44
+ if (!response.ok) {
45
+ const description = data?.description ?? response.statusText;
46
+ throw new Error(`Telegram getUpdates failed: ${response.status} ${description}`);
47
+ }
48
+ if (!data || !data.ok) {
49
+ throw new Error(`Telegram API error in getUpdates${data?.description ? `: ${data.description}` : ""}`);
50
+ }
51
+ return data.result;
34
52
  }
35
- if (!data || !data.ok) {
36
- throw new Error(`Telegram API error in getUpdates${data?.description ? `: ${data.description}` : ""}`);
37
- }
38
- return data.result;
39
53
  }
40
54
  /**
41
55
  * Create a topic in a forum supergroup.
@@ -102,5 +116,122 @@ export class TelegramClient {
102
116
  throw new Error(`Telegram API error in sendMessage: ${description}`);
103
117
  }
104
118
  }
119
+ /**
120
+ * Get metadata for a file stored on Telegram servers.
121
+ */
122
+ async getFile(fileId) {
123
+ const url = `${this.baseUrl}/getFile`;
124
+ const response = await fetch(url, {
125
+ method: "POST",
126
+ headers: { "Content-Type": "application/json" },
127
+ body: JSON.stringify({ file_id: fileId }),
128
+ });
129
+ let data;
130
+ try {
131
+ data = (await response.json());
132
+ }
133
+ catch {
134
+ data = undefined;
135
+ }
136
+ if (!response.ok || !data?.ok || !data.result) {
137
+ const description = data?.description ?? response.statusText;
138
+ throw new Error(`Telegram getFile failed: ${description}`);
139
+ }
140
+ return data.result;
141
+ }
142
+ /**
143
+ * Download a file from Telegram by file_id and return it as base64 with MIME type.
144
+ * Telegram Bot API supports files up to 20 MB.
145
+ */
146
+ async downloadFileAsBase64(fileId) {
147
+ const file = await this.getFile(fileId);
148
+ const downloadUrl = `https://api.telegram.org/file/bot${this.token}/${file.file_path}`;
149
+ const response = await fetch(downloadUrl);
150
+ if (!response.ok) {
151
+ throw new Error(`Failed to download Telegram file: ${response.status} ${response.statusText}`);
152
+ }
153
+ const buffer = await response.arrayBuffer();
154
+ const base64 = Buffer.from(buffer).toString("base64");
155
+ const ext = file.file_path.split(".").pop()?.toLowerCase() ?? "";
156
+ const mimeMap = {
157
+ jpg: "image/jpeg",
158
+ jpeg: "image/jpeg",
159
+ png: "image/png",
160
+ gif: "image/gif",
161
+ webp: "image/webp",
162
+ bmp: "image/bmp",
163
+ pdf: "application/pdf",
164
+ txt: "text/plain",
165
+ json: "application/json",
166
+ xml: "application/xml",
167
+ csv: "text/csv",
168
+ zip: "application/zip",
169
+ svg: "image/svg+xml",
170
+ };
171
+ // Prefer Content-Type header from the response, fall back to extension map.
172
+ const contentType = response.headers.get("content-type")?.split(";")[0]?.trim();
173
+ const mimeType = contentType && contentType !== "application/octet-stream"
174
+ ? contentType
175
+ : (mimeMap[ext] ?? "application/octet-stream");
176
+ return { base64, mimeType };
177
+ }
178
+ /**
179
+ * Send a document (file) to a chat via multipart/form-data.
180
+ * @param fileBuffer The file content as a Buffer.
181
+ * @param filename The filename to display in Telegram.
182
+ * @param caption Optional caption (plain text).
183
+ * @param threadId Optional message_thread_id for forum supergroups.
184
+ */
185
+ async sendDocument(chatId, fileBuffer, filename, caption, threadId) {
186
+ const url = `${this.baseUrl}/sendDocument`;
187
+ const formData = new FormData();
188
+ formData.append("chat_id", chatId);
189
+ formData.append("document", new Blob([new Uint8Array(fileBuffer)]), filename);
190
+ if (caption)
191
+ formData.append("caption", caption);
192
+ if (threadId !== undefined)
193
+ formData.append("message_thread_id", String(threadId));
194
+ const response = await fetch(url, { method: "POST", body: formData });
195
+ let data;
196
+ try {
197
+ data = (await response.json());
198
+ }
199
+ catch {
200
+ data = undefined;
201
+ }
202
+ if (!response.ok || data?.ok !== true) {
203
+ const description = data?.description ?? response.statusText;
204
+ throw new Error(`Telegram sendDocument failed: ${response.status} ${description}`);
205
+ }
206
+ }
207
+ /**
208
+ * Send a photo to a chat via multipart/form-data.
209
+ * @param imageBuffer The image content as a Buffer.
210
+ * @param filename The filename (e.g. "screenshot.png").
211
+ * @param caption Optional caption.
212
+ * @param threadId Optional message_thread_id for forum supergroups.
213
+ */
214
+ async sendPhoto(chatId, imageBuffer, filename, caption, threadId) {
215
+ const url = `${this.baseUrl}/sendPhoto`;
216
+ const formData = new FormData();
217
+ formData.append("chat_id", chatId);
218
+ formData.append("photo", new Blob([new Uint8Array(imageBuffer)]), filename);
219
+ if (caption)
220
+ formData.append("caption", caption);
221
+ if (threadId !== undefined)
222
+ formData.append("message_thread_id", String(threadId));
223
+ const response = await fetch(url, { method: "POST", body: formData });
224
+ let data;
225
+ try {
226
+ data = (await response.json());
227
+ }
228
+ catch {
229
+ data = undefined;
230
+ }
231
+ if (!response.ok || data?.ok !== true) {
232
+ const description = data?.description ?? response.statusText;
233
+ throw new Error(`Telegram sendPhoto failed: ${response.status} ${description}`);
234
+ }
235
+ }
105
236
  }
106
237
  //# sourceMappingURL=telegram.js.map
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remote-copilot-mcp",
3
- "version": "1.2.1",
3
+ "version": "2.0.0",
4
4
  "description": "MCP server for remote control of AI assistants via Telegram",
5
5
  "main": "dist/index.js",
6
6
  "bin": {