@suzuke/agend 0.0.1 → 1.0.2

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.
Files changed (157) hide show
  1. package/README.md +78 -0
  2. package/README.zh-TW.md +79 -0
  3. package/dist/access-path.d.ts +7 -0
  4. package/dist/access-path.js +12 -0
  5. package/dist/access-path.js.map +1 -0
  6. package/dist/backend/claude-code.d.ts +13 -0
  7. package/dist/backend/claude-code.js +114 -0
  8. package/dist/backend/claude-code.js.map +1 -0
  9. package/dist/backend/codex.d.ts +10 -0
  10. package/dist/backend/codex.js +58 -0
  11. package/dist/backend/codex.js.map +1 -0
  12. package/dist/backend/factory.d.ts +2 -0
  13. package/dist/backend/factory.js +19 -0
  14. package/dist/backend/factory.js.map +1 -0
  15. package/dist/backend/gemini-cli.d.ts +10 -0
  16. package/dist/backend/gemini-cli.js +68 -0
  17. package/dist/backend/gemini-cli.js.map +1 -0
  18. package/dist/backend/index.d.ts +6 -0
  19. package/dist/backend/index.js +6 -0
  20. package/dist/backend/index.js.map +1 -0
  21. package/dist/backend/opencode.d.ts +10 -0
  22. package/dist/backend/opencode.js +63 -0
  23. package/dist/backend/opencode.js.map +1 -0
  24. package/dist/backend/types.d.ts +26 -0
  25. package/dist/backend/types.js +2 -0
  26. package/dist/backend/types.js.map +1 -0
  27. package/dist/channel/access-manager.d.ts +18 -0
  28. package/dist/channel/access-manager.js +149 -0
  29. package/dist/channel/access-manager.js.map +1 -0
  30. package/dist/channel/adapters/discord.d.ts +45 -0
  31. package/dist/channel/adapters/discord.js +366 -0
  32. package/dist/channel/adapters/discord.js.map +1 -0
  33. package/dist/channel/adapters/telegram.d.ts +58 -0
  34. package/dist/channel/adapters/telegram.js +569 -0
  35. package/dist/channel/adapters/telegram.js.map +1 -0
  36. package/dist/channel/attachment-handler.d.ts +15 -0
  37. package/dist/channel/attachment-handler.js +55 -0
  38. package/dist/channel/attachment-handler.js.map +1 -0
  39. package/dist/channel/factory.d.ts +12 -0
  40. package/dist/channel/factory.js +38 -0
  41. package/dist/channel/factory.js.map +1 -0
  42. package/dist/channel/ipc-bridge.d.ts +26 -0
  43. package/dist/channel/ipc-bridge.js +170 -0
  44. package/dist/channel/ipc-bridge.js.map +1 -0
  45. package/dist/channel/mcp-server.d.ts +10 -0
  46. package/dist/channel/mcp-server.js +196 -0
  47. package/dist/channel/mcp-server.js.map +1 -0
  48. package/dist/channel/mcp-tools.d.ts +909 -0
  49. package/dist/channel/mcp-tools.js +346 -0
  50. package/dist/channel/mcp-tools.js.map +1 -0
  51. package/dist/channel/message-bus.d.ts +17 -0
  52. package/dist/channel/message-bus.js +86 -0
  53. package/dist/channel/message-bus.js.map +1 -0
  54. package/dist/channel/message-queue.d.ts +39 -0
  55. package/dist/channel/message-queue.js +248 -0
  56. package/dist/channel/message-queue.js.map +1 -0
  57. package/dist/channel/tool-router.d.ts +6 -0
  58. package/dist/channel/tool-router.js +69 -0
  59. package/dist/channel/tool-router.js.map +1 -0
  60. package/dist/channel/tool-tracker.d.ts +13 -0
  61. package/dist/channel/tool-tracker.js +58 -0
  62. package/dist/channel/tool-tracker.js.map +1 -0
  63. package/dist/channel/types.d.ts +116 -0
  64. package/dist/channel/types.js +2 -0
  65. package/dist/channel/types.js.map +1 -0
  66. package/dist/cli.d.ts +2 -0
  67. package/dist/cli.js +782 -0
  68. package/dist/cli.js.map +1 -0
  69. package/dist/config.d.ts +8 -0
  70. package/dist/config.js +85 -0
  71. package/dist/config.js.map +1 -0
  72. package/dist/context-guardian.d.ts +29 -0
  73. package/dist/context-guardian.js +123 -0
  74. package/dist/context-guardian.js.map +1 -0
  75. package/dist/cost-guard.d.ts +21 -0
  76. package/dist/cost-guard.js +113 -0
  77. package/dist/cost-guard.js.map +1 -0
  78. package/dist/daemon-entry.d.ts +1 -0
  79. package/dist/daemon-entry.js +29 -0
  80. package/dist/daemon-entry.js.map +1 -0
  81. package/dist/daemon.d.ts +88 -0
  82. package/dist/daemon.js +821 -0
  83. package/dist/daemon.js.map +1 -0
  84. package/dist/daily-summary.d.ts +13 -0
  85. package/dist/daily-summary.js +55 -0
  86. package/dist/daily-summary.js.map +1 -0
  87. package/dist/event-log.d.ts +22 -0
  88. package/dist/event-log.js +66 -0
  89. package/dist/event-log.js.map +1 -0
  90. package/dist/export-import.d.ts +2 -0
  91. package/dist/export-import.js +110 -0
  92. package/dist/export-import.js.map +1 -0
  93. package/dist/fleet-context.d.ts +36 -0
  94. package/dist/fleet-context.js +4 -0
  95. package/dist/fleet-context.js.map +1 -0
  96. package/dist/fleet-manager.d.ts +115 -0
  97. package/dist/fleet-manager.js +1739 -0
  98. package/dist/fleet-manager.js.map +1 -0
  99. package/dist/fleet-system-prompt.d.ts +11 -0
  100. package/dist/fleet-system-prompt.js +60 -0
  101. package/dist/fleet-system-prompt.js.map +1 -0
  102. package/dist/hang-detector.d.ts +16 -0
  103. package/dist/hang-detector.js +53 -0
  104. package/dist/hang-detector.js.map +1 -0
  105. package/dist/index.d.ts +8 -0
  106. package/dist/index.js +6 -0
  107. package/dist/index.js.map +1 -0
  108. package/dist/logger.d.ts +3 -0
  109. package/dist/logger.js +63 -0
  110. package/dist/logger.js.map +1 -0
  111. package/dist/plugin/agend/.claude-plugin/plugin.json +5 -0
  112. package/dist/scheduler/db.d.ts +16 -0
  113. package/dist/scheduler/db.js +132 -0
  114. package/dist/scheduler/db.js.map +1 -0
  115. package/dist/scheduler/db.test.d.ts +1 -0
  116. package/dist/scheduler/db.test.js +92 -0
  117. package/dist/scheduler/db.test.js.map +1 -0
  118. package/dist/scheduler/index.d.ts +4 -0
  119. package/dist/scheduler/index.js +4 -0
  120. package/dist/scheduler/index.js.map +1 -0
  121. package/dist/scheduler/scheduler.d.ts +25 -0
  122. package/dist/scheduler/scheduler.js +119 -0
  123. package/dist/scheduler/scheduler.js.map +1 -0
  124. package/dist/scheduler/scheduler.test.d.ts +1 -0
  125. package/dist/scheduler/scheduler.test.js +119 -0
  126. package/dist/scheduler/scheduler.test.js.map +1 -0
  127. package/dist/scheduler/types.d.ts +47 -0
  128. package/dist/scheduler/types.js +7 -0
  129. package/dist/scheduler/types.js.map +1 -0
  130. package/dist/service-installer.d.ts +14 -0
  131. package/dist/service-installer.js +91 -0
  132. package/dist/service-installer.js.map +1 -0
  133. package/dist/setup-wizard.d.ts +14 -0
  134. package/dist/setup-wizard.js +517 -0
  135. package/dist/setup-wizard.js.map +1 -0
  136. package/dist/stt.d.ts +10 -0
  137. package/dist/stt.js +33 -0
  138. package/dist/stt.js.map +1 -0
  139. package/dist/tmux-manager.d.ts +22 -0
  140. package/dist/tmux-manager.js +132 -0
  141. package/dist/tmux-manager.js.map +1 -0
  142. package/dist/topic-commands.d.ts +22 -0
  143. package/dist/topic-commands.js +176 -0
  144. package/dist/topic-commands.js.map +1 -0
  145. package/dist/transcript-monitor.d.ts +21 -0
  146. package/dist/transcript-monitor.js +149 -0
  147. package/dist/transcript-monitor.js.map +1 -0
  148. package/dist/types.d.ts +153 -0
  149. package/dist/types.js +2 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/webhook-emitter.d.ts +15 -0
  152. package/dist/webhook-emitter.js +41 -0
  153. package/dist/webhook-emitter.js.map +1 -0
  154. package/package.json +58 -4
  155. package/templates/launchd.plist.ejs +29 -0
  156. package/templates/systemd.service.ejs +15 -0
  157. package/index.js +0 -1
@@ -0,0 +1,58 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { Bot } from "grammy";
3
+ import type { ChannelAdapter, ApprovalHandle, SendOpts, SentMessage, PermissionPrompt, Choice, AlertData } from "../types.js";
4
+ import type { AccessManager } from "../access-manager.js";
5
+ export interface TelegramAdapterOptions {
6
+ id: string;
7
+ botToken: string;
8
+ accessManager: AccessManager;
9
+ inboxDir: string;
10
+ }
11
+ export declare class TelegramAdapter extends EventEmitter implements ChannelAdapter {
12
+ readonly type = "telegram";
13
+ readonly topology: "topics";
14
+ readonly id: string;
15
+ private bot;
16
+ private accessManager;
17
+ private inboxDir;
18
+ private queue;
19
+ private cleanupTimer;
20
+ constructor(opts: TelegramAdapterOptions);
21
+ private _registerHandlers;
22
+ private _extractAttachments;
23
+ /** Returns true if the message is a Telegram service event with no user content. */
24
+ private _isServiceMessage;
25
+ private _handlePairCommand;
26
+ /** Expose bot for fleet manager operations (topic existence checks etc.) */
27
+ getBot(): Bot;
28
+ start(): Promise<void>;
29
+ stop(): Promise<void>;
30
+ /** Delete inbox files older than 1 hour */
31
+ private _pruneInbox;
32
+ sendText(chatId: string, text: string, opts?: SendOpts): Promise<SentMessage>;
33
+ sendFile(chatId: string, filePath: string, opts?: SendOpts): Promise<SentMessage>;
34
+ editMessage(chatId: string, messageId: string, text: string): Promise<void>;
35
+ react(chatId: string, messageId: string, emoji: string): Promise<void>;
36
+ sendApproval(prompt: PermissionPrompt, callback: (decision: "approve" | "approve_always" | "deny") => void, signal?: AbortSignal, threadId?: string): Promise<ApprovalHandle>;
37
+ /** Get the last known chatId (group ID for topic mode) */
38
+ private lastChatId;
39
+ getChatId(): string | null;
40
+ setChatId(chatId: string): void;
41
+ downloadAttachment(fileId: string): Promise<string>;
42
+ promptUser(chatId: string, text: string, choices: Choice[], opts?: SendOpts): Promise<string>;
43
+ notifyAlert(chatId: string, alert: AlertData, opts?: SendOpts): Promise<SentMessage>;
44
+ createTopic(name: string): Promise<number>;
45
+ topicExists(topicId: number): Promise<boolean>;
46
+ closeForumTopic(threadId: number): Promise<void>;
47
+ reopenForumTopic(threadId: number): Promise<void>;
48
+ editForumTopic(threadId: number, opts: {
49
+ name?: string;
50
+ iconCustomEmojiId?: string;
51
+ }): Promise<void>;
52
+ getTopicIconStickers(): Promise<{
53
+ customEmojiId: string;
54
+ emoji: string;
55
+ }[]>;
56
+ handlePairing(chatId: string, userId: string): Promise<string>;
57
+ confirmPairing(code: string): Promise<boolean>;
58
+ }
@@ -0,0 +1,569 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { randomBytes } from "node:crypto";
3
+ import { createReadStream, mkdirSync, readdirSync, statSync, unlinkSync } from "node:fs";
4
+ import { join, extname, basename } from "node:path";
5
+ import { Bot, GrammyError, InputFile } from "grammy";
6
+ import { InlineKeyboard } from "grammy";
7
+ import { MessageQueue } from "../message-queue.js";
8
+ const IMAGE_EXTENSIONS = new Set([".jpg", ".jpeg", ".png", ".gif", ".webp", ".bmp"]);
9
+ export class TelegramAdapter extends EventEmitter {
10
+ type = "telegram";
11
+ topology = "topics";
12
+ id;
13
+ bot;
14
+ accessManager;
15
+ inboxDir;
16
+ queue;
17
+ cleanupTimer = null;
18
+ constructor(opts) {
19
+ super();
20
+ this.id = opts.id;
21
+ this.accessManager = opts.accessManager;
22
+ this.inboxDir = opts.inboxDir;
23
+ mkdirSync(this.inboxDir, { recursive: true });
24
+ this.bot = new Bot(opts.botToken);
25
+ // Build MessageQueue backed by this bot
26
+ this.queue = new MessageQueue({
27
+ send: async (chatId, threadId, text) => {
28
+ const msg = await this.bot.api.sendMessage(Number(chatId), text, {
29
+ message_thread_id: threadId != null ? Number(threadId) : undefined,
30
+ });
31
+ return { messageId: String(msg.message_id) };
32
+ },
33
+ edit: async (chatId, messageId, text) => {
34
+ await this.bot.api.editMessageText(Number(chatId), Number(messageId), text);
35
+ },
36
+ sendFile: async (chatId, threadId, filePath) => {
37
+ const ext = extname(filePath).toLowerCase();
38
+ const filename = basename(filePath);
39
+ if (IMAGE_EXTENSIONS.has(ext)) {
40
+ const msg = await this.bot.api.sendPhoto(Number(chatId), new InputFile(createReadStream(filePath), filename), { message_thread_id: threadId != null ? Number(threadId) : undefined });
41
+ return { messageId: String(msg.message_id) };
42
+ }
43
+ else {
44
+ const msg = await this.bot.api.sendDocument(Number(chatId), new InputFile(createReadStream(filePath), filename), { message_thread_id: threadId != null ? Number(threadId) : undefined });
45
+ return { messageId: String(msg.message_id) };
46
+ }
47
+ },
48
+ });
49
+ this._registerHandlers();
50
+ }
51
+ _registerHandlers() {
52
+ this.bot.on("message", async (ctx) => {
53
+ const msg = ctx.message;
54
+ if (!msg)
55
+ return;
56
+ const userId = msg.from?.id;
57
+ if (userId == null)
58
+ return;
59
+ // Access control
60
+ if (!this.accessManager.isAllowed(userId)) {
61
+ // In pairing mode, allow /pair commands through
62
+ if (msg.text?.startsWith("/pair")) {
63
+ await this._handlePairCommand(ctx);
64
+ }
65
+ return;
66
+ }
67
+ // Skip service messages (topic rename, pin, member join/leave, etc.)
68
+ if (this._isServiceMessage(msg))
69
+ return;
70
+ const chatId = String(msg.chat.id);
71
+ const threadId = msg.message_thread_id != null
72
+ ? String(msg.message_thread_id)
73
+ : undefined;
74
+ const messageId = String(msg.message_id);
75
+ const username = msg.from?.username ?? msg.from?.first_name ?? String(userId);
76
+ const text = msg.text ?? msg.caption ?? "";
77
+ // Collect attachments
78
+ const attachments = this._extractAttachments(msg);
79
+ const replyToText = msg.reply_to_message?.text ?? msg.reply_to_message?.caption;
80
+ this.emit("message", {
81
+ source: "telegram",
82
+ adapterId: this.id,
83
+ chatId,
84
+ threadId,
85
+ messageId,
86
+ userId: String(userId),
87
+ username,
88
+ text,
89
+ timestamp: new Date(msg.date * 1000),
90
+ attachments: attachments.length > 0 ? attachments : undefined,
91
+ replyTo: msg.reply_to_message?.message_id != null
92
+ ? String(msg.reply_to_message.message_id)
93
+ : undefined,
94
+ replyToText: replyToText || undefined,
95
+ });
96
+ });
97
+ // Handle callback queries from approval inline keyboards and directory browser
98
+ this.bot.on("callback_query:data", async (ctx) => {
99
+ if (!ctx.callbackQuery?.data)
100
+ return;
101
+ await ctx.answerCallbackQuery();
102
+ this.emit("callback_query", {
103
+ callbackData: ctx.callbackQuery.data,
104
+ chatId: String(ctx.callbackQuery.message?.chat.id ?? ""),
105
+ threadId: ctx.callbackQuery.message?.message_thread_id != null
106
+ ? String(ctx.callbackQuery.message.message_thread_id)
107
+ : undefined,
108
+ messageId: String(ctx.callbackQuery.message?.message_id ?? ""),
109
+ });
110
+ });
111
+ // Handle topic closed/deleted events (for auto-unbind)
112
+ this.bot.on("message:forum_topic_closed", (ctx) => {
113
+ const chatId = String(ctx.message?.chat.id ?? "");
114
+ const threadId = ctx.message?.message_thread_id != null
115
+ ? String(ctx.message.message_thread_id)
116
+ : undefined;
117
+ if (threadId) {
118
+ this.emit("topic_closed", { chatId, threadId });
119
+ }
120
+ });
121
+ }
122
+ _extractAttachments(msg) {
123
+ const result = [];
124
+ if (msg.photo && msg.photo.length > 0) {
125
+ const largest = msg.photo[msg.photo.length - 1];
126
+ result.push({ kind: "photo", fileId: largest.file_id, size: largest.file_size });
127
+ }
128
+ if (msg.document) {
129
+ result.push({
130
+ kind: "document",
131
+ fileId: msg.document.file_id,
132
+ mime: msg.document.mime_type,
133
+ size: msg.document.file_size,
134
+ filename: msg.document.file_name,
135
+ });
136
+ }
137
+ if (msg.audio) {
138
+ result.push({
139
+ kind: "audio",
140
+ fileId: msg.audio.file_id,
141
+ mime: msg.audio.mime_type,
142
+ size: msg.audio.file_size,
143
+ });
144
+ }
145
+ if (msg.voice) {
146
+ result.push({
147
+ kind: "voice",
148
+ fileId: msg.voice.file_id,
149
+ mime: msg.voice.mime_type,
150
+ size: msg.voice.file_size,
151
+ });
152
+ }
153
+ if (msg.video) {
154
+ result.push({
155
+ kind: "video",
156
+ fileId: msg.video.file_id,
157
+ mime: msg.video.mime_type,
158
+ size: msg.video.file_size,
159
+ });
160
+ }
161
+ if (msg.sticker) {
162
+ result.push({ kind: "sticker", fileId: msg.sticker.file_id });
163
+ }
164
+ return result;
165
+ }
166
+ /** Returns true if the message is a Telegram service event with no user content. */
167
+ _isServiceMessage(msg) {
168
+ const hasText = !!(msg.text || msg.caption);
169
+ const hasMedia = !!(msg.photo || msg.document || msg.audio || msg.voice || msg.video || msg.sticker || msg.video_note);
170
+ if (hasText || hasMedia)
171
+ return false;
172
+ // If there's no text and no media, it's a service message
173
+ // (e.g. new_chat_title, pinned_message, new_chat_members, left_chat_member,
174
+ // forum_topic_created, forum_topic_edited, etc.)
175
+ return true;
176
+ }
177
+ async _handlePairCommand(ctx) {
178
+ const msg = ctx.message;
179
+ if (!msg || !msg.from)
180
+ return;
181
+ const userId = String(msg.from.id);
182
+ const chatId = String(msg.chat.id);
183
+ try {
184
+ const code = await this.handlePairing(chatId, userId);
185
+ await ctx.reply(`Your pairing code is: \`${code}\`\nShare it with the daemon owner to get access.`, {
186
+ parse_mode: "Markdown",
187
+ });
188
+ }
189
+ catch (err) {
190
+ const message = err instanceof Error ? err.message : String(err);
191
+ await ctx.reply(`Pairing failed: ${message}`);
192
+ }
193
+ }
194
+ // ── ChannelAdapter lifecycle ──────────────────────────────────────────────
195
+ /** Expose bot for fleet manager operations (topic existence checks etc.) */
196
+ getBot() { return this.bot; }
197
+ async start() {
198
+ this.queue.start();
199
+ this._pruneInbox();
200
+ this.cleanupTimer = setInterval(() => this._pruneInbox(), 60 * 60 * 1000);
201
+ // Grammy's default error handler calls bot.stop() on any throw — override
202
+ // to keep polling alive on handler errors
203
+ this.bot.catch((err) => {
204
+ this.emit("handler_error", err.error);
205
+ });
206
+ // 409 Conflict = another getUpdates consumer is active (official plugin zombie,
207
+ // or second Claude Code instance). Retry with backoff until the slot frees up.
208
+ // Pattern from official telegram plugin.
209
+ void (async () => {
210
+ for (let attempt = 1;; attempt++) {
211
+ try {
212
+ await this.bot.start({
213
+ drop_pending_updates: attempt === 1,
214
+ onStart: (info) => {
215
+ this.emit("started", info.username);
216
+ },
217
+ });
218
+ return; // bot.stop() was called — clean exit
219
+ }
220
+ catch (err) {
221
+ if (err instanceof GrammyError && err.error_code === 409) {
222
+ const delay = Math.min(1000 * attempt, 15000);
223
+ this.emit("polling_conflict", { attempt, delay });
224
+ await new Promise(r => setTimeout(r, delay));
225
+ continue;
226
+ }
227
+ if (err instanceof Error && err.message === "Aborted delay")
228
+ return;
229
+ this.emit("error", err);
230
+ return;
231
+ }
232
+ }
233
+ })();
234
+ }
235
+ async stop() {
236
+ if (this.cleanupTimer)
237
+ clearInterval(this.cleanupTimer);
238
+ this.queue.stop();
239
+ await this.bot.stop();
240
+ }
241
+ /** Delete inbox files older than 1 hour */
242
+ _pruneInbox() {
243
+ const maxAge = 60 * 60 * 1000;
244
+ const now = Date.now();
245
+ try {
246
+ for (const name of readdirSync(this.inboxDir)) {
247
+ const filePath = join(this.inboxDir, name);
248
+ try {
249
+ const mtime = statSync(filePath).mtimeMs;
250
+ if (now - mtime > maxAge)
251
+ unlinkSync(filePath);
252
+ }
253
+ catch { /* ignore per-file errors */ }
254
+ }
255
+ }
256
+ catch { /* ignore if dir doesn't exist */ }
257
+ }
258
+ // ── Text / file sending ───────────────────────────────────────────────────
259
+ async sendText(chatId, text, opts) {
260
+ return new Promise((resolve, reject) => {
261
+ // We enqueue and immediately capture the first sent messageId via a one-shot sender
262
+ // For simplicity we use the bot API directly for the first chunk resolution,
263
+ // and delegate subsequent chunks to the queue.
264
+ const threadId = opts?.threadId;
265
+ const chunkLimit = opts?.chunkLimit ?? 4096;
266
+ // Split text manually when caller needs the SentMessage back
267
+ const chunks = [];
268
+ let offset = 0;
269
+ while (offset < text.length) {
270
+ chunks.push(text.slice(offset, offset + chunkLimit));
271
+ offset += chunkLimit;
272
+ }
273
+ if (chunks.length === 0) {
274
+ reject(new Error("Empty text"));
275
+ return;
276
+ }
277
+ // Send first chunk directly to get the messageId; enqueue the rest
278
+ const parseMode = opts?.format === "markdown" ? "HTML" : undefined;
279
+ this.bot.api
280
+ .sendMessage(Number(chatId), chunks[0], {
281
+ message_thread_id: threadId != null ? Number(threadId) : undefined,
282
+ parse_mode: parseMode,
283
+ })
284
+ .then((msg) => {
285
+ const result = {
286
+ messageId: String(msg.message_id),
287
+ chatId,
288
+ threadId,
289
+ };
290
+ // Enqueue remaining chunks via the queue
291
+ for (let i = 1; i < chunks.length; i++) {
292
+ this.queue.enqueue(chatId, threadId, { type: "content", text: chunks[i] });
293
+ }
294
+ resolve(result);
295
+ })
296
+ .catch(reject);
297
+ });
298
+ }
299
+ async sendFile(chatId, filePath, opts) {
300
+ const threadId = opts?.threadId;
301
+ const ext = extname(filePath).toLowerCase();
302
+ const filename = basename(filePath);
303
+ let messageId;
304
+ if (IMAGE_EXTENSIONS.has(ext)) {
305
+ const msg = await this.bot.api.sendPhoto(Number(chatId), new InputFile(createReadStream(filePath), filename), { message_thread_id: threadId != null ? Number(threadId) : undefined });
306
+ messageId = String(msg.message_id);
307
+ }
308
+ else {
309
+ const msg = await this.bot.api.sendDocument(Number(chatId), new InputFile(createReadStream(filePath), filename), { message_thread_id: threadId != null ? Number(threadId) : undefined });
310
+ messageId = String(msg.message_id);
311
+ }
312
+ return { messageId, chatId, threadId };
313
+ }
314
+ async editMessage(chatId, messageId, text) {
315
+ await this.bot.api.editMessageText(Number(chatId), Number(messageId), text);
316
+ }
317
+ async react(chatId, messageId, emoji) {
318
+ await this.bot.api.setMessageReaction(Number(chatId), Number(messageId), [
319
+ { type: "emoji", emoji: emoji },
320
+ ]);
321
+ }
322
+ // ── Approval ─────────────────────────────────────────────────────────────
323
+ async sendApproval(prompt, callback, signal, threadId) {
324
+ const TIMEOUT_SECS = 120;
325
+ const COUNTDOWN_INTERVAL_MS = 30_000;
326
+ const nonce = randomBytes(5).toString("hex");
327
+ const approveData = `approval:approve:${nonce}`;
328
+ const alwaysData = `approval:approve_always:${nonce}`;
329
+ const denyData = `approval:deny:${nonce}`;
330
+ const makeKeyboard = (remainingSecs) => {
331
+ const mm = Math.floor(remainingSecs / 60);
332
+ const ss = remainingSecs % 60;
333
+ const ts = `${mm}:${String(ss).padStart(2, "0")}`;
334
+ return new InlineKeyboard()
335
+ .text(`✅ Allow (${ts})`, approveData)
336
+ .text("✅ Always", alwaysData)
337
+ .text(`❌ Deny`, denyData);
338
+ };
339
+ // Format the permission message
340
+ let text = `⚠️ *Permission Request*\nTool: \`${prompt.tool_name}\``;
341
+ if (prompt.input_preview) {
342
+ const preview = prompt.input_preview.length > 200
343
+ ? prompt.input_preview.slice(0, 200) + "…"
344
+ : prompt.input_preview;
345
+ text += `\n\`\`\`\n${preview}\n\`\`\``;
346
+ }
347
+ else if (prompt.description) {
348
+ text += `\n${prompt.description}`;
349
+ }
350
+ let sentChatId;
351
+ let sentMessageId;
352
+ let countdownTimer;
353
+ const startTime = Date.now();
354
+ const stopCountdown = () => {
355
+ if (countdownTimer) {
356
+ clearInterval(countdownTimer);
357
+ countdownTimer = undefined;
358
+ }
359
+ };
360
+ const cleanup = () => {
361
+ stopCountdown();
362
+ this.off("callback_query", handler);
363
+ };
364
+ const handler = (query) => {
365
+ if (!query.callbackData)
366
+ return;
367
+ const isApprove = query.callbackData === approveData;
368
+ const isAlways = query.callbackData === alwaysData;
369
+ const isDeny = query.callbackData === denyData;
370
+ if (!isApprove && !isAlways && !isDeny)
371
+ return;
372
+ cleanup();
373
+ // Post-decision feedback: update message with decision result
374
+ const editChatId = query.chatId ? Number(query.chatId) : sentChatId;
375
+ const editMsgId = query.messageId ? Number(query.messageId) : sentMessageId;
376
+ if (editChatId && editMsgId) {
377
+ const label = isDeny ? "❌ Denied" : isAlways ? "✅ Always Allowed" : "✅ Allowed";
378
+ this.bot.api.editMessageText(editChatId, editMsgId, `${label}\nTool: \`${prompt.tool_name}\``, { parse_mode: "Markdown" }).catch(() => { });
379
+ }
380
+ callback(isDeny ? "deny" : isAlways ? "approve_always" : "approve");
381
+ };
382
+ this.on("callback_query", handler);
383
+ if (signal) {
384
+ signal.addEventListener("abort", () => {
385
+ // On timeout/abort, update message to show expiry
386
+ stopCountdown();
387
+ if (sentChatId && sentMessageId) {
388
+ this.bot.api.editMessageText(sentChatId, sentMessageId, `⏱ Timed out\nTool: \`${prompt.tool_name}\``, { parse_mode: "Markdown" }).catch(() => { });
389
+ }
390
+ this.off("callback_query", handler);
391
+ });
392
+ }
393
+ const keyboard = makeKeyboard(TIMEOUT_SECS);
394
+ if (threadId) {
395
+ const chatId = this.getChatId();
396
+ if (chatId) {
397
+ const sent = await this.bot.api.sendMessage(Number(chatId), text, {
398
+ message_thread_id: Number(threadId),
399
+ reply_markup: keyboard,
400
+ parse_mode: "Markdown",
401
+ }).catch(() => {
402
+ return this.bot.api.sendMessage(Number(chatId), text, {
403
+ message_thread_id: Number(threadId),
404
+ reply_markup: keyboard,
405
+ });
406
+ });
407
+ sentChatId = sent.chat.id;
408
+ sentMessageId = sent.message_id;
409
+ }
410
+ }
411
+ else {
412
+ this.emit("approval_request", { prompt: text, keyboard, nonce });
413
+ }
414
+ // Start countdown timer — update buttons every 30s with remaining time
415
+ if (sentChatId && sentMessageId) {
416
+ const chatIdForEdit = sentChatId;
417
+ const msgIdForEdit = sentMessageId;
418
+ countdownTimer = setInterval(() => {
419
+ const elapsed = Math.floor((Date.now() - startTime) / 1000);
420
+ const remaining = Math.max(0, TIMEOUT_SECS - elapsed);
421
+ if (remaining <= 0) {
422
+ stopCountdown();
423
+ return;
424
+ }
425
+ const updatedKeyboard = makeKeyboard(remaining);
426
+ this.bot.api.editMessageReplyMarkup(chatIdForEdit, msgIdForEdit, {
427
+ reply_markup: updatedKeyboard,
428
+ }).catch(() => { });
429
+ }, COUNTDOWN_INTERVAL_MS);
430
+ }
431
+ return { cancel: cleanup };
432
+ }
433
+ /** Get the last known chatId (group ID for topic mode) */
434
+ lastChatId = null;
435
+ getChatId() { return this.lastChatId; }
436
+ setChatId(chatId) { this.lastChatId = chatId; }
437
+ // ── File download ─────────────────────────────────────────────────────────
438
+ async downloadAttachment(fileId) {
439
+ const file = await this.bot.api.getFile(fileId);
440
+ const filePath = file.file_path;
441
+ if (!filePath) {
442
+ throw new Error(`No file_path returned for fileId: ${fileId}`);
443
+ }
444
+ // Construct the download URL
445
+ const token = this.bot.token;
446
+ const url = `https://api.telegram.org/file/bot${token}/${filePath}`;
447
+ const filename = filePath.split("/").pop() ?? fileId;
448
+ const localPath = join(this.inboxDir, filename);
449
+ // Download using fetch
450
+ const response = await fetch(url);
451
+ if (!response.ok) {
452
+ throw new Error(`Failed to download file: ${response.status} ${response.statusText}`);
453
+ }
454
+ const { createWriteStream } = await import("node:fs");
455
+ const { pipeline } = await import("node:stream/promises");
456
+ const { Readable } = await import("node:stream");
457
+ const dest = createWriteStream(localPath);
458
+ const body = response.body;
459
+ if (!body)
460
+ throw new Error("No response body");
461
+ await pipeline(Readable.fromWeb(body), dest);
462
+ return localPath;
463
+ }
464
+ // ── Intent-oriented methods ──────────────────────────────────────────────
465
+ async promptUser(chatId, text, choices, opts) {
466
+ const keyboard = new InlineKeyboard();
467
+ for (const choice of choices) {
468
+ keyboard.text(choice.label, choice.id).row();
469
+ }
470
+ const threadId = opts?.threadId;
471
+ const msg = await this.bot.api.sendMessage(Number(chatId), text, {
472
+ message_thread_id: threadId != null ? Number(threadId) : undefined,
473
+ reply_markup: keyboard,
474
+ });
475
+ return String(msg.message_id);
476
+ }
477
+ async notifyAlert(chatId, alert, opts) {
478
+ const threadId = opts?.threadId;
479
+ if (alert.choices && alert.choices.length > 0) {
480
+ const keyboard = new InlineKeyboard();
481
+ for (const choice of alert.choices) {
482
+ keyboard.text(choice.label, choice.id);
483
+ }
484
+ const msg = await this.bot.api.sendMessage(Number(chatId), alert.message, {
485
+ message_thread_id: threadId != null ? Number(threadId) : undefined,
486
+ reply_markup: keyboard,
487
+ });
488
+ return { messageId: String(msg.message_id), chatId, threadId };
489
+ }
490
+ return this.sendText(chatId, alert.message, opts);
491
+ }
492
+ async createTopic(name) {
493
+ const chatId = this.getChatId();
494
+ if (!chatId)
495
+ throw new Error("No chat ID set — cannot create topic");
496
+ const res = await this.bot.api.createForumTopic(Number(chatId), name);
497
+ return res.message_thread_id;
498
+ }
499
+ async topicExists(topicId) {
500
+ const chatId = this.getChatId();
501
+ if (!chatId)
502
+ return false;
503
+ try {
504
+ const msg = await this.bot.api.sendMessage(Number(chatId), "\u200B", {
505
+ message_thread_id: topicId,
506
+ });
507
+ await this.bot.api.deleteMessage(Number(chatId), msg.message_id).catch(() => { });
508
+ return true;
509
+ }
510
+ catch (err) {
511
+ const errMsg = String(err);
512
+ if (errMsg.includes("thread not found") || errMsg.includes("TOPIC_ID_INVALID")) {
513
+ return false;
514
+ }
515
+ throw err;
516
+ }
517
+ }
518
+ // ── Pairing ───────────────────────────────────────────────────────────────
519
+ async closeForumTopic(threadId) {
520
+ const chatId = this.getChatId();
521
+ if (!chatId)
522
+ return;
523
+ try {
524
+ await this.bot.api.closeForumTopic(Number(chatId), threadId);
525
+ }
526
+ catch {
527
+ // Best-effort — topic may already be closed
528
+ }
529
+ }
530
+ async reopenForumTopic(threadId) {
531
+ const chatId = this.getChatId();
532
+ if (!chatId)
533
+ return;
534
+ try {
535
+ await this.bot.api.reopenForumTopic(Number(chatId), threadId);
536
+ }
537
+ catch {
538
+ // Best-effort — topic may already be open
539
+ }
540
+ }
541
+ async editForumTopic(threadId, opts) {
542
+ const chatId = this.getChatId();
543
+ if (!chatId)
544
+ return;
545
+ try {
546
+ await this.bot.api.editForumTopic(Number(chatId), threadId, {
547
+ name: opts.name,
548
+ icon_custom_emoji_id: opts.iconCustomEmojiId,
549
+ });
550
+ }
551
+ catch {
552
+ // Best-effort — icon change is cosmetic
553
+ }
554
+ }
555
+ async getTopicIconStickers() {
556
+ const stickers = await this.bot.api.getForumTopicIconStickers();
557
+ return stickers
558
+ .filter((s) => s.custom_emoji_id != null)
559
+ .map((s) => ({ customEmojiId: s.custom_emoji_id, emoji: s.emoji ?? "" }));
560
+ }
561
+ async handlePairing(chatId, userId) {
562
+ const code = this.accessManager.generateCode(Number(userId));
563
+ return code;
564
+ }
565
+ async confirmPairing(code) {
566
+ return this.accessManager.confirmCode(code);
567
+ }
568
+ }
569
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../../../src/channel/adapters/telegram.ts"],"names":[],"mappings":"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"}