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 +30 -9
- package/dist/dispatcher.d.ts +66 -0
- package/dist/dispatcher.d.ts.map +1 -0
- package/dist/dispatcher.js +278 -0
- package/dist/dispatcher.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +240 -92
- package/dist/index.js.map +1 -1
- package/dist/telegram.d.ts +54 -0
- package/dist/telegram.d.ts.map +1 -1
- package/dist/telegram.js +147 -16
- package/dist/telegram.js.map +1 -1
- package/package.json +1 -1
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
|
|
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.
|
|
12
|
-
| `remote_copilot_wait_for_instructions` | Blocks
|
|
13
|
-
| `report_progress` | Sends a progress update back to the operator
|
|
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
|
|
75
|
-
2.
|
|
76
|
-
3. When a message arrives the tool
|
|
77
|
-
4.
|
|
78
|
-
5.
|
|
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
|
|
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.
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
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
|
|
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 +
|
|
90
|
+
// Telegram client + dispatcher
|
|
86
91
|
// ---------------------------------------------------------------------------
|
|
87
92
|
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
let
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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:
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
-
"
|
|
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
|
|
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
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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 ${
|
|
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
|
-
//
|
|
277
|
-
//
|
|
278
|
-
const
|
|
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
|
|
281
|
-
if (
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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: `
|
|
319
|
-
|
|
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
|
-
|
|
325
|
-
|
|
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 ? `
|
|
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
|
|
430
|
-
if (
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
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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"}
|
package/dist/telegram.d.ts
CHANGED
|
@@ -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
|
package/dist/telegram.d.ts.map
CHANGED
|
@@ -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;
|
|
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
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
data
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
package/dist/telegram.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
|