tg-claude 0.3.2 → 0.3.4

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 (125) hide show
  1. package/package.json +2 -3
  2. package/dist/claude/ClaudeProcess.d.ts +0 -83
  3. package/dist/claude/ClaudeProcess.d.ts.map +0 -1
  4. package/dist/claude/ClaudeProcess.js +0 -283
  5. package/dist/claude/ClaudeProcess.js.map +0 -1
  6. package/dist/claude/EventAdapter.d.ts +0 -45
  7. package/dist/claude/EventAdapter.d.ts.map +0 -1
  8. package/dist/claude/EventAdapter.js +0 -138
  9. package/dist/claude/EventAdapter.js.map +0 -1
  10. package/dist/claude/index.d.ts +0 -10
  11. package/dist/claude/index.d.ts.map +0 -1
  12. package/dist/claude/index.js +0 -9
  13. package/dist/claude/index.js.map +0 -1
  14. package/dist/claude/types.d.ts +0 -244
  15. package/dist/claude/types.d.ts.map +0 -1
  16. package/dist/claude/types.js +0 -8
  17. package/dist/claude/types.js.map +0 -1
  18. package/dist/env.d.ts +0 -21
  19. package/dist/env.d.ts.map +0 -1
  20. package/dist/env.js +0 -49
  21. package/dist/env.js.map +0 -1
  22. package/dist/index.d.ts +0 -2
  23. package/dist/index.d.ts.map +0 -1
  24. package/dist/index.js +0 -433
  25. package/dist/index.js.map +0 -1
  26. package/dist/parser/AnsiStripper.d.ts +0 -54
  27. package/dist/parser/AnsiStripper.d.ts.map +0 -1
  28. package/dist/parser/AnsiStripper.js +0 -115
  29. package/dist/parser/AnsiStripper.js.map +0 -1
  30. package/dist/parser/OptionExtractor.d.ts +0 -31
  31. package/dist/parser/OptionExtractor.d.ts.map +0 -1
  32. package/dist/parser/OptionExtractor.js +0 -91
  33. package/dist/parser/OptionExtractor.js.map +0 -1
  34. package/dist/parser/OutputParser.d.ts +0 -121
  35. package/dist/parser/OutputParser.d.ts.map +0 -1
  36. package/dist/parser/OutputParser.js +0 -306
  37. package/dist/parser/OutputParser.js.map +0 -1
  38. package/dist/parser/PromptDetector.d.ts +0 -20
  39. package/dist/parser/PromptDetector.d.ts.map +0 -1
  40. package/dist/parser/PromptDetector.js +0 -68
  41. package/dist/parser/PromptDetector.js.map +0 -1
  42. package/dist/parser/index.d.ts +0 -7
  43. package/dist/parser/index.d.ts.map +0 -1
  44. package/dist/parser/index.js +0 -5
  45. package/dist/parser/index.js.map +0 -1
  46. package/dist/parser/types.d.ts +0 -73
  47. package/dist/parser/types.d.ts.map +0 -1
  48. package/dist/parser/types.js +0 -2
  49. package/dist/parser/types.js.map +0 -1
  50. package/dist/pty/OutputBuffer.d.ts +0 -39
  51. package/dist/pty/OutputBuffer.d.ts.map +0 -1
  52. package/dist/pty/OutputBuffer.js +0 -55
  53. package/dist/pty/OutputBuffer.js.map +0 -1
  54. package/dist/pty/PtyProcess.d.ts +0 -47
  55. package/dist/pty/PtyProcess.d.ts.map +0 -1
  56. package/dist/pty/PtyProcess.js +0 -94
  57. package/dist/pty/PtyProcess.js.map +0 -1
  58. package/dist/pty/PtyService.d.ts +0 -55
  59. package/dist/pty/PtyService.d.ts.map +0 -1
  60. package/dist/pty/PtyService.js +0 -115
  61. package/dist/pty/PtyService.js.map +0 -1
  62. package/dist/pty/index.d.ts +0 -5
  63. package/dist/pty/index.d.ts.map +0 -1
  64. package/dist/pty/index.js +0 -4
  65. package/dist/pty/index.js.map +0 -1
  66. package/dist/pty/types.d.ts +0 -36
  67. package/dist/pty/types.d.ts.map +0 -1
  68. package/dist/pty/types.js +0 -2
  69. package/dist/pty/types.js.map +0 -1
  70. package/dist/router/BoundedQueue.d.ts +0 -57
  71. package/dist/router/BoundedQueue.d.ts.map +0 -1
  72. package/dist/router/BoundedQueue.js +0 -86
  73. package/dist/router/BoundedQueue.js.map +0 -1
  74. package/dist/router/EventRouter.d.ts +0 -103
  75. package/dist/router/EventRouter.d.ts.map +0 -1
  76. package/dist/router/EventRouter.js +0 -169
  77. package/dist/router/EventRouter.js.map +0 -1
  78. package/dist/router/index.d.ts +0 -13
  79. package/dist/router/index.d.ts.map +0 -1
  80. package/dist/router/index.js +0 -12
  81. package/dist/router/index.js.map +0 -1
  82. package/dist/router/types.d.ts +0 -104
  83. package/dist/router/types.d.ts.map +0 -1
  84. package/dist/router/types.js +0 -6
  85. package/dist/router/types.js.map +0 -1
  86. package/dist/setup/envWriter.d.ts +0 -22
  87. package/dist/setup/envWriter.d.ts.map +0 -1
  88. package/dist/setup/envWriter.js +0 -68
  89. package/dist/setup/envWriter.js.map +0 -1
  90. package/dist/setup/index.d.ts +0 -4
  91. package/dist/setup/index.d.ts.map +0 -1
  92. package/dist/setup/index.js +0 -4
  93. package/dist/setup/index.js.map +0 -1
  94. package/dist/setup/validators.d.ts +0 -22
  95. package/dist/setup/validators.d.ts.map +0 -1
  96. package/dist/setup/validators.js +0 -47
  97. package/dist/setup/validators.js.map +0 -1
  98. package/dist/setup/wizard.d.ts +0 -7
  99. package/dist/setup/wizard.d.ts.map +0 -1
  100. package/dist/setup/wizard.js +0 -56
  101. package/dist/setup/wizard.js.map +0 -1
  102. package/dist/telegram/TelegramBot.d.ts +0 -163
  103. package/dist/telegram/TelegramBot.d.ts.map +0 -1
  104. package/dist/telegram/TelegramBot.js +0 -634
  105. package/dist/telegram/TelegramBot.js.map +0 -1
  106. package/dist/telegram/index.d.ts +0 -7
  107. package/dist/telegram/index.d.ts.map +0 -1
  108. package/dist/telegram/index.js +0 -6
  109. package/dist/telegram/index.js.map +0 -1
  110. package/dist/telegram/types.d.ts +0 -30
  111. package/dist/telegram/types.d.ts.map +0 -1
  112. package/dist/telegram/types.js +0 -5
  113. package/dist/telegram/types.js.map +0 -1
  114. package/dist/terminal/TerminalInterface.d.ts +0 -61
  115. package/dist/terminal/TerminalInterface.d.ts.map +0 -1
  116. package/dist/terminal/TerminalInterface.js +0 -218
  117. package/dist/terminal/TerminalInterface.js.map +0 -1
  118. package/dist/terminal/index.d.ts +0 -3
  119. package/dist/terminal/index.d.ts.map +0 -1
  120. package/dist/terminal/index.js +0 -2
  121. package/dist/terminal/index.js.map +0 -1
  122. package/dist/terminal/types.d.ts +0 -17
  123. package/dist/terminal/types.d.ts.map +0 -1
  124. package/dist/terminal/types.js +0 -2
  125. package/dist/terminal/types.js.map +0 -1
@@ -1,634 +0,0 @@
1
- /**
2
- * TelegramBot class wrapping grammY Bot with composition pattern.
3
- * Implements AUTH-01 whitelist authentication for single-user access.
4
- */
5
- import { Bot, InlineKeyboard, GrammyError, HttpError } from 'grammy';
6
- import { AnsiStripper } from '../parser/AnsiStripper.js';
7
- // Log to stderr to avoid polluting Claude's TUI on stdout
8
- const log = (msg) => process.stderr.write(`${msg}\n`);
9
- const logWarn = (msg) => process.stderr.write(`${msg}\n`);
10
- const logError = (msg) => process.stderr.write(`${msg}\n`);
11
- /**
12
- * TelegramBot wraps grammY Bot with composition pattern.
13
- * Provides single-user authentication and graceful lifecycle management.
14
- *
15
- * @example
16
- * ```typescript
17
- * const bot = new TelegramBot({
18
- * token: process.env.TELEGRAM_BOT_TOKEN,
19
- * allowedUserId: Number(process.env.TELEGRAM_USER_ID),
20
- * });
21
- * await bot.start();
22
- * ```
23
- */
24
- export class TelegramBot {
25
- bot;
26
- allowedUserId;
27
- started = false;
28
- // Session-to-chat mapping (SESS-01)
29
- // For single-user bot, all sessions route to allowedUserId
30
- sessionChatMap = new Map();
31
- // External handlers for response routing (RESP-01, RESP-02)
32
- onCallback = null;
33
- onTextMessage = null;
34
- // Track which session is awaiting input (single-user simplification)
35
- awaitingSession = null;
36
- // Multi-select state keyed by message ID
37
- multiSelectState = new Map();
38
- constructor(options) {
39
- this.bot = new Bot(options.token);
40
- this.allowedUserId = options.allowedUserId;
41
- this.setupMiddleware();
42
- this.setupErrorHandler();
43
- }
44
- /**
45
- * Set up bot middleware and command handlers.
46
- */
47
- setupMiddleware() {
48
- // Auth middleware - first in chain (AUTH-01)
49
- this.bot.use(async (ctx, next) => {
50
- const userId = ctx.from?.id;
51
- if (userId !== this.allowedUserId) {
52
- logWarn(`[TELEGRAM] Unauthorized access attempt from user ${userId}`);
53
- return; // Silently ignore unauthorized users
54
- }
55
- await next();
56
- });
57
- // GSD underscore command handler - converts /gsd_foo_bar to /gsd:foo-bar
58
- // Must be before other command handlers to intercept gsd_* patterns
59
- this.bot.hears(/^\/gsd_([a-z0-9_]+)(.*)$/i, async (ctx) => {
60
- const match = ctx.match;
61
- const commandPart = match[1]; // e.g., "new_project"
62
- const argsPart = match[2]?.trim() || ''; // e.g., "5" or ""
63
- // Convert underscores to hyphens: new_project -> new-project
64
- const gsdCommand = commandPart.replace(/_/g, '-');
65
- const fullCommand = `/gsd:${gsdCommand}${argsPart ? ' ' + argsPart : ''}`;
66
- log(`[TELEGRAM] Converting ${ctx.message?.text} -> ${fullCommand}`);
67
- await this.handleGsdCommand(ctx, fullCommand);
68
- });
69
- // /start command handler
70
- this.bot.command('start', (ctx) => {
71
- ctx.reply('Claude Telegram Bridge is running. You will receive notifications when Claude sessions need input.');
72
- });
73
- // /help command handler
74
- this.bot.command('help', async (ctx) => {
75
- const helpText = `<b>Claude Telegram Bridge</b>
76
-
77
- <b>Send GSD commands as messages:</b>
78
- <code>/gsd:new-project</code> - Initialize new project
79
- <code>/gsd:plan-phase N</code> - Plan phase N
80
- <code>/gsd:execute-phase N</code> - Execute phase N
81
- <code>/gsd:progress</code> - Check progress
82
-
83
- <b>Bot commands:</b>
84
- /help - Show this message
85
- /status - Check session status
86
- /gsd - Show GSD command list
87
-
88
- <i>Type any text to send to Claude.</i>`;
89
- await ctx.reply(helpText, { parse_mode: 'HTML' });
90
- });
91
- // /status command handler
92
- this.bot.command('status', async (ctx) => {
93
- const statusText = this.awaitingSession
94
- ? `<b>Status:</b> Session <code>${this.escapeHtml(this.awaitingSession)}</code> awaiting input`
95
- : '<b>Status:</b> No active session awaiting input';
96
- await ctx.reply(statusText, { parse_mode: 'HTML' });
97
- });
98
- // /gsd command handler (reference for GSD commands)
99
- // Note: Telegram parses "/gsd:foo" as command "gsd" with ":foo" as argument
100
- // So we must check the full text to detect actual /gsd:* skill commands
101
- this.bot.command('gsd', async (ctx) => {
102
- const text = ctx.message?.text || '';
103
- // Check if this is actually a /gsd:* skill command
104
- if (text.startsWith('/gsd:')) {
105
- await this.handleGsdCommand(ctx, text);
106
- return;
107
- }
108
- // Otherwise show the GSD reference
109
- const gsdText = `<b>GSD Commands</b>
110
-
111
- Send these as messages (not from autocomplete):
112
-
113
- <b>Core Workflow:</b>
114
- <code>/gsd:new-project</code> - Initialize new project
115
- <code>/gsd:plan-phase N</code> - Plan phase N
116
- <code>/gsd:execute-phase N</code> - Execute phase N
117
-
118
- <b>Phase Management:</b>
119
- <code>/gsd:add-phase</code> - Add new phase
120
- <code>/gsd:insert-phase</code> - Insert urgent phase
121
- <code>/gsd:discuss-phase</code> - Discuss phase scope
122
-
123
- <b>Progress:</b>
124
- <code>/gsd:progress</code> - Check status
125
- <code>/gsd:help</code> - Full command reference
126
-
127
- <i>Type the full command as a message.</i>`;
128
- await ctx.reply(gsdText, { parse_mode: 'HTML' });
129
- });
130
- // Callback query handler for inline button clicks (RESP-01)
131
- this.bot.on('callback_query:data', async (ctx) => {
132
- const data = ctx.callbackQuery.data;
133
- // Detect callback type by format
134
- if (data.includes(':t:')) {
135
- // Multi-select toggle: sessionId:t:optionIndex
136
- await this.handleToggle(ctx, data);
137
- }
138
- else if (data.endsWith(':s')) {
139
- // Multi-select submit: sessionId:s
140
- await this.handleSubmit(ctx, data);
141
- }
142
- else {
143
- // Single-select: sessionId:optionIndex (existing behavior)
144
- await this.handleSingleSelect(ctx, data);
145
- }
146
- });
147
- // Text message handler for freeform responses (RESP-02)
148
- this.bot.on('message:text', async (ctx) => {
149
- const text = ctx.message.text;
150
- // Handle GSD skill commands (send to Claude as text input)
151
- if (text.startsWith('/gsd:')) {
152
- await this.handleGsdCommand(ctx, text);
153
- return;
154
- }
155
- // Ignore registered Telegram commands (handled by bot.command())
156
- // Note: Only /start is registered currently
157
- if (text.startsWith('/')) {
158
- // Check if it's a known command we handle elsewhere
159
- if (text.startsWith('/start') || text.startsWith('/help') || text.startsWith('/status') || text.startsWith('/gsd'))
160
- return;
161
- // Unknown slash commands - inform user
162
- await ctx.reply('<i>Unknown command. Type /help for available commands.</i>', { parse_mode: 'HTML' });
163
- return;
164
- }
165
- // Check for active awaiting session
166
- if (!this.awaitingSession) {
167
- await ctx.reply('No active Claude session awaiting input.');
168
- return;
169
- }
170
- log(`[TELEGRAM] Text message for session ${this.awaitingSession}: "${text.slice(0, 50)}..."`);
171
- this.onTextMessage?.(this.awaitingSession, text);
172
- // Send confirmation reply
173
- await ctx.reply('<i>Sent to Claude</i>', { parse_mode: 'HTML' });
174
- // Clear awaiting state after response sent
175
- this.awaitingSession = null;
176
- });
177
- }
178
- /**
179
- * Set up error handler for Telegram API and network errors.
180
- */
181
- setupErrorHandler() {
182
- this.bot.catch((err) => {
183
- const ctx = err.ctx;
184
- logError(`[TELEGRAM] Error handling update ${ctx.update.update_id}:`);
185
- const e = err.error;
186
- if (e instanceof GrammyError) {
187
- logError(`[TELEGRAM] Telegram API error: ${e.description}`);
188
- }
189
- else if (e instanceof HttpError) {
190
- logError(`[TELEGRAM] Network error: ${e}`);
191
- }
192
- else {
193
- logError(`[TELEGRAM] Unknown error: ${e}`);
194
- }
195
- });
196
- }
197
- /**
198
- * Handle single-select button click (existing behavior, refactored)
199
- */
200
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
201
- async handleSingleSelect(ctx, data) {
202
- await ctx.answerCallbackQuery({ text: 'Sending to Claude...' });
203
- const colonIdx = data.lastIndexOf(':');
204
- if (colonIdx === -1) {
205
- logWarn(`[TELEGRAM] Malformed callback data: ${data}`);
206
- return;
207
- }
208
- const sessionId = data.slice(0, colonIdx);
209
- const optionIndex = parseInt(data.slice(colonIdx + 1), 10);
210
- if (isNaN(optionIndex)) {
211
- logWarn(`[TELEGRAM] Invalid option index: ${data}`);
212
- return;
213
- }
214
- log(`[TELEGRAM] Button clicked: session=${sessionId}, option=${optionIndex}`);
215
- // Edit message to remove buttons and show confirmation
216
- const originalText = ctx.callbackQuery.message?.text || '';
217
- try {
218
- await ctx.editMessageText(`${originalText}\n\n<i>Selected: Option ${optionIndex}</i>`, { parse_mode: 'HTML' });
219
- }
220
- catch (err) {
221
- log(`[TELEGRAM] Could not edit message: ${err}`);
222
- }
223
- this.onCallback?.(sessionId, optionIndex);
224
- }
225
- /**
226
- * Handle multi-select toggle button click
227
- */
228
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
229
- async handleToggle(ctx, data) {
230
- const messageId = ctx.callbackQuery.message?.message_id;
231
- if (!messageId) {
232
- await ctx.answerCallbackQuery({ text: 'Error: no message' });
233
- return;
234
- }
235
- const state = this.multiSelectState.get(messageId);
236
- if (!state) {
237
- await ctx.answerCallbackQuery({ text: 'Selection expired' });
238
- return;
239
- }
240
- // Parse: sessionId:t:optionIndex
241
- const parts = data.split(':t:');
242
- const optionIndex = parseInt(parts[1], 10) - 1; // Convert to 0-based
243
- // Toggle selection
244
- if (state.selectedIndices.has(optionIndex)) {
245
- state.selectedIndices.delete(optionIndex);
246
- await ctx.answerCallbackQuery({ text: 'Deselected' });
247
- }
248
- else {
249
- state.selectedIndices.add(optionIndex);
250
- await ctx.answerCallbackQuery({ text: 'Selected' });
251
- }
252
- // Rebuild keyboard with updated checkmarks
253
- const keyboard = this.buildMultiSelectKeyboard(state.sessionId, state.options, state.selectedIndices);
254
- try {
255
- await ctx.editMessageReplyMarkup({ reply_markup: keyboard });
256
- }
257
- catch (err) {
258
- // "message is not modified" is OK if selection visually unchanged
259
- if (!String(err).includes('not modified')) {
260
- log(`[TELEGRAM] Could not update keyboard: ${err}`);
261
- }
262
- }
263
- }
264
- /**
265
- * Handle multi-select submit button click
266
- */
267
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
268
- async handleSubmit(ctx, data) {
269
- const messageId = ctx.callbackQuery.message?.message_id;
270
- if (!messageId) {
271
- await ctx.answerCallbackQuery({ text: 'Error: no message' });
272
- return;
273
- }
274
- const state = this.multiSelectState.get(messageId);
275
- if (!state) {
276
- await ctx.answerCallbackQuery({ text: 'Selection expired' });
277
- return;
278
- }
279
- await ctx.answerCallbackQuery({ text: 'Sending to Claude...' });
280
- // Build comma-separated labels from selected indices
281
- const selectedLabels = Array.from(state.selectedIndices)
282
- .sort((a, b) => a - b)
283
- .map(idx => {
284
- const opt = state.options[idx];
285
- // Extract just the label (before " - description")
286
- const labelPart = opt.text.split(' - ')[0];
287
- return labelPart;
288
- })
289
- .join(', ');
290
- const displayText = selectedLabels || 'None selected';
291
- log(`[TELEGRAM] Multi-select submit: session=${state.sessionId}, selected="${displayText}"`);
292
- // Edit message to show final selection
293
- const originalText = ctx.callbackQuery.message?.text || '';
294
- try {
295
- await ctx.editMessageText(`${originalText}\n\n<i>Selected: ${this.escapeHtml(displayText)}</i>`, { parse_mode: 'HTML' });
296
- }
297
- catch (err) {
298
- log(`[TELEGRAM] Could not edit message: ${err}`);
299
- }
300
- // Clean up state
301
- this.multiSelectState.delete(messageId);
302
- // Send response to Claude using the text handler (labels as comma-separated string)
303
- this.onTextMessage?.(state.sessionId, selectedLabels || 'None');
304
- }
305
- /**
306
- * Build multi-select keyboard with checkmarks for selected options
307
- */
308
- buildMultiSelectKeyboard(sessionId, options, selectedIndices) {
309
- const keyboard = new InlineKeyboard();
310
- for (const opt of options) {
311
- const idx = opt.index - 1; // Convert to 0-based for Set lookup
312
- const isSelected = selectedIndices.has(idx);
313
- const prefix = isSelected ? '\u2713 ' : ''; // Checkmark U+2713
314
- const buttonLabel = this.truncateButtonText(opt.text);
315
- const label = `${prefix}${opt.index}. ${buttonLabel}`;
316
- const callbackData = `${sessionId.slice(0, 48)}:t:${opt.index}`;
317
- keyboard.text(label, callbackData).row();
318
- }
319
- // Add Submit button
320
- keyboard.text('Submit', `${sessionId.slice(0, 50)}:s`);
321
- return keyboard;
322
- }
323
- /**
324
- * Start the bot with long polling.
325
- * Safe to call multiple times (idempotent).
326
- */
327
- /**
328
- * Register bot commands for Telegram autocomplete menu.
329
- * Only basic bot commands are registered. GSD commands are typed manually
330
- * as /gsd:command-name since they often need arguments.
331
- */
332
- async setupBotCommands() {
333
- try {
334
- await this.bot.api.setMyCommands([
335
- { command: 'start', description: 'Start the Claude bridge' },
336
- { command: 'help', description: 'Show usage information' },
337
- { command: 'status', description: 'Check current session status' },
338
- { command: 'gsd', description: 'Show GSD command reference' },
339
- ]);
340
- log('[TELEGRAM] Bot commands registered for autocomplete');
341
- }
342
- catch (error) {
343
- logWarn(`[TELEGRAM] Failed to register commands: ${error}`);
344
- }
345
- }
346
- async start() {
347
- if (this.started)
348
- return;
349
- this.started = true;
350
- // Register commands for autocomplete
351
- await this.setupBotCommands();
352
- // Graceful shutdown handlers
353
- process.once('SIGINT', () => this.stop());
354
- process.once('SIGTERM', () => this.stop());
355
- log('[TELEGRAM] Starting bot with long polling...');
356
- await this.bot.start({
357
- onStart: (botInfo) => {
358
- log(`[TELEGRAM] Bot @${botInfo.username} started`);
359
- },
360
- });
361
- }
362
- /**
363
- * Stop the bot gracefully.
364
- * Safe to call multiple times (idempotent).
365
- */
366
- stop() {
367
- if (!this.started)
368
- return;
369
- log('[TELEGRAM] Stopping bot...');
370
- this.bot.stop();
371
- this.started = false;
372
- }
373
- /**
374
- * Check if the bot is currently running.
375
- */
376
- get isStarted() {
377
- return this.started;
378
- }
379
- /**
380
- * Get the chat ID for the single whitelisted user.
381
- * For private chats, chat_id equals user_id.
382
- */
383
- get chatId() {
384
- return this.allowedUserId;
385
- }
386
- /**
387
- * Expose bot.api for proactive messaging.
388
- * Used by higher layers to send notifications.
389
- */
390
- get api() {
391
- return this.bot.api;
392
- }
393
- /**
394
- * Register a session for notifications.
395
- * Maps session to the whitelisted user's chat.
396
- */
397
- registerSession(sessionId) {
398
- this.sessionChatMap.set(sessionId, this.allowedUserId);
399
- log(`[TELEGRAM] Session ${sessionId} registered for notifications`);
400
- }
401
- /**
402
- * Unregister a session.
403
- */
404
- unregisterSession(sessionId) {
405
- this.sessionChatMap.delete(sessionId);
406
- log(`[TELEGRAM] Session ${sessionId} unregistered`);
407
- }
408
- /**
409
- * Check if a session is registered.
410
- */
411
- hasSession(sessionId) {
412
- return this.sessionChatMap.has(sessionId);
413
- }
414
- /**
415
- * Send a prompt notification to Telegram with inline keyboard.
416
- * @param payload - The notification payload with question and options
417
- * @returns Message ID if sent, undefined if session not registered
418
- */
419
- async sendNotification(payload) {
420
- const chatId = this.sessionChatMap.get(payload.sessionId);
421
- if (!chatId) {
422
- logWarn(`[TELEGRAM] No chat mapped for session ${payload.sessionId}`);
423
- return undefined;
424
- }
425
- // Build message text
426
- const escapedQuestion = this.escapeHtml(payload.question);
427
- let messageText = `<b>Claude needs input</b>\n\n${escapedQuestion}`;
428
- // Add full options list with descriptions in message body
429
- if (payload.options.length > 0) {
430
- messageText += '\n';
431
- for (const opt of payload.options) {
432
- messageText += `\n<b>${opt.index}.</b> ${this.escapeHtml(opt.text)}`;
433
- }
434
- }
435
- // Add context if provided (strip ANSI codes, then truncate)
436
- if (payload.rawContext) {
437
- const strippedContext = AnsiStripper.stripComplete(payload.rawContext);
438
- const truncatedContext = strippedContext.length > 500
439
- ? '...' + strippedContext.slice(-500)
440
- : strippedContext;
441
- messageText += `\n\n<pre>${this.escapeHtml(truncatedContext)}</pre>`;
442
- }
443
- // Build inline keyboard from options
444
- let replyMarkup = undefined;
445
- if (payload.options.length > 0) {
446
- const keyboard = new InlineKeyboard();
447
- if (payload.multiSelect) {
448
- // Multi-select: toggle buttons with Submit
449
- for (const opt of payload.options) {
450
- // Callback data: "sessionId:t:optionIndex" for toggle
451
- const callbackData = `${payload.sessionId.slice(0, 48)}:t:${opt.index}`;
452
- const buttonLabel = this.truncateButtonText(opt.text);
453
- keyboard.text(`${opt.index}. ${buttonLabel}`, callbackData).row();
454
- }
455
- // Add Submit button
456
- keyboard.text('Submit', `${payload.sessionId.slice(0, 50)}:s`);
457
- }
458
- else {
459
- // Single-select: immediate send (existing behavior)
460
- for (const opt of payload.options) {
461
- const callbackData = `${payload.sessionId.slice(0, 50)}:${opt.index}`;
462
- const buttonLabel = this.truncateButtonText(opt.text);
463
- keyboard.text(`${opt.index}. ${buttonLabel}`, callbackData).row();
464
- }
465
- }
466
- replyMarkup = keyboard;
467
- }
468
- try {
469
- const result = await this.bot.api.sendMessage(chatId, messageText, {
470
- parse_mode: 'HTML',
471
- reply_markup: replyMarkup,
472
- });
473
- log(`[TELEGRAM] Notification sent for session ${payload.sessionId}, message_id=${result.message_id}`);
474
- // Store multi-select state for this message
475
- if (payload.multiSelect && result) {
476
- this.multiSelectState.set(result.message_id, {
477
- sessionId: payload.sessionId,
478
- question: payload.question,
479
- options: payload.options,
480
- selectedIndices: new Set(),
481
- });
482
- }
483
- return result.message_id;
484
- }
485
- catch (error) {
486
- logError(`[TELEGRAM] Failed to send notification: ${error}`);
487
- return undefined;
488
- }
489
- }
490
- /**
491
- * Truncate button text for Telegram inline keyboards.
492
- * Extracts label (before " - ") and truncates to max length.
493
- * Telegram buttons have ~40-50 char visible width.
494
- */
495
- truncateButtonText(text, maxLength = 35) {
496
- // Extract label only (before " - description")
497
- const label = text.split(' - ')[0];
498
- if (label.length <= maxLength) {
499
- return label;
500
- }
501
- return label.slice(0, maxLength - 1) + '…';
502
- }
503
- /**
504
- * Escape HTML special characters for Telegram HTML parse mode.
505
- */
506
- escapeHtml(text) {
507
- return text
508
- .replace(/&/g, '&amp;')
509
- .replace(/</g, '&lt;')
510
- .replace(/>/g, '&gt;');
511
- }
512
- /**
513
- * Send a completion notification to Telegram.
514
- * Handles long messages by splitting into multiple messages.
515
- * @param payload - The completion payload with summary
516
- * @returns Message ID of last message if sent, undefined if session not registered
517
- */
518
- async sendCompletionNotification(payload) {
519
- const chatId = this.sessionChatMap.get(payload.sessionId);
520
- if (!chatId) {
521
- logWarn(`[TELEGRAM] No chat mapped for session ${payload.sessionId}`);
522
- return undefined;
523
- }
524
- // Format duration if provided
525
- const durationText = payload.duration
526
- ? ` <i>(${Math.round(payload.duration / 1000)}s)</i>`
527
- : '';
528
- // Strip ANSI from summary
529
- const cleanSummary = AnsiStripper.stripComplete(payload.summary);
530
- const escapedSummary = this.escapeHtml(cleanSummary);
531
- // Telegram max message length is 4096 chars
532
- // Header takes ~50 chars, leave room for formatting
533
- const MAX_CONTENT_LENGTH = 3900;
534
- const header = `<b>Claude finished</b>${durationText}\n\n`;
535
- try {
536
- let lastMessageId;
537
- if (escapedSummary.length <= MAX_CONTENT_LENGTH) {
538
- // Single message
539
- const messageText = `${header}<pre>${escapedSummary}</pre>`;
540
- const result = await this.bot.api.sendMessage(chatId, messageText, {
541
- parse_mode: 'HTML',
542
- });
543
- lastMessageId = result.message_id;
544
- }
545
- else {
546
- // Split into multiple messages
547
- const chunks = this.splitMessage(escapedSummary, MAX_CONTENT_LENGTH);
548
- for (let i = 0; i < chunks.length; i++) {
549
- const isFirst = i === 0;
550
- const isLast = i === chunks.length - 1;
551
- const partIndicator = chunks.length > 1 ? ` (${i + 1}/${chunks.length})` : '';
552
- const messageText = isFirst
553
- ? `${header}<pre>${chunks[i]}</pre>${partIndicator}`
554
- : `<pre>${chunks[i]}</pre>${partIndicator}`;
555
- const result = await this.bot.api.sendMessage(chatId, messageText, {
556
- parse_mode: 'HTML',
557
- });
558
- if (isLast) {
559
- lastMessageId = result.message_id;
560
- }
561
- }
562
- }
563
- log(`[TELEGRAM] Completion sent for session ${payload.sessionId}, message_id=${lastMessageId}`);
564
- // Clear awaiting state since task completed
565
- this.awaitingSession = null;
566
- return lastMessageId;
567
- }
568
- catch (error) {
569
- logError(`[TELEGRAM] Failed to send completion: ${error}`);
570
- return undefined;
571
- }
572
- }
573
- /**
574
- * Split a long message into chunks at natural break points.
575
- */
576
- splitMessage(text, maxLength) {
577
- const chunks = [];
578
- let remaining = text;
579
- while (remaining.length > 0) {
580
- if (remaining.length <= maxLength) {
581
- chunks.push(remaining);
582
- break;
583
- }
584
- // Find a good break point (newline, space, or just cut)
585
- let breakPoint = remaining.lastIndexOf('\n', maxLength);
586
- if (breakPoint < maxLength * 0.5) {
587
- breakPoint = remaining.lastIndexOf(' ', maxLength);
588
- }
589
- if (breakPoint < maxLength * 0.5) {
590
- breakPoint = maxLength;
591
- }
592
- chunks.push(remaining.slice(0, breakPoint));
593
- remaining = remaining.slice(breakPoint).trimStart();
594
- }
595
- return chunks;
596
- }
597
- /**
598
- * Mark a session as awaiting user input.
599
- * Called when a prompt notification is sent.
600
- */
601
- setAwaitingInput(sessionId) {
602
- this.awaitingSession = sessionId;
603
- log(`[TELEGRAM] Session ${sessionId} awaiting input`);
604
- }
605
- /**
606
- * Clear the awaiting input state.
607
- * Called when response is received or session ends.
608
- */
609
- clearAwaitingInput() {
610
- if (this.awaitingSession) {
611
- log(`[TELEGRAM] Cleared awaiting state for ${this.awaitingSession}`);
612
- }
613
- this.awaitingSession = null;
614
- }
615
- /**
616
- * Handle GSD skill commands.
617
- * Routes to Claude as text input (not as Telegram bot commands).
618
- * Handles cold-start scenario where no session is awaiting.
619
- */
620
- async handleGsdCommand(ctx, text) {
621
- // Parse command name for feedback (e.g., "new-project" from "/gsd:new-project")
622
- const match = text.match(/^\/gsd:([a-z][a-z0-9-]*)/);
623
- const commandName = match ? match[1] : 'unknown';
624
- log(`[TELEGRAM] GSD command received: /gsd:${commandName}`);
625
- // Send immediate processing feedback
626
- await ctx.reply(`<i>Processing /gsd:${this.escapeHtml(commandName)}...</i>`, { parse_mode: 'HTML' });
627
- // Route to Claude via text handler
628
- // For GSD commands, we route even without awaitingSession
629
- // The calling code (index.ts) will spawn a new ClaudeProcess
630
- const targetSession = this.awaitingSession || 'telegram-gsd';
631
- this.onTextMessage?.(targetSession, text);
632
- }
633
- }
634
- //# sourceMappingURL=TelegramBot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TelegramBot.js","sourceRoot":"","sources":["../../src/telegram/TelegramBot.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- /**
2
- * Telegram module exports.
3
- */
4
- export type { TelegramConfig, NotificationPayload } from './types.js';
5
- export { TelegramBot } from './TelegramBot.js';
6
- export type { TelegramBotOptions } from './TelegramBot.js';
7
- //# sourceMappingURL=index.d.ts.map