iosm-cli 0.2.14 → 0.2.15
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/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.2.15] - 2026-04-04
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **Telegram stop/resume contour** — when bridge is stopped, Hub now switches to a dedicated stop-state action set (`Start`, `Refresh`, `Help`) instead of showing full active-run controls
|
|
15
|
+
- **Telegram quick keyboard state** — reply keyboard now also switches to stop-state layout (`Hub`, `Start`, `Help`) and restores full actions after resume
|
|
16
|
+
- **Telegram Hub navigation after restart** — `/start` now posts a fresh Hub card at the bottom of chat for immediate visibility
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
|
|
20
|
+
- **Telegram quick-action reliability** — removed over-aggressive quick-action debounce that could drop first button press and make actions appear to require a second tap
|
|
21
|
+
- **Slash command parsing in Telegram** — `/start@botname` and similar bot-suffixed slash commands now route correctly
|
|
22
|
+
- **Stopped-bridge menu routing** — command/model callbacks in stopped mode now return cleanly to Hub instead of leaving stale menu state
|
|
23
|
+
|
|
24
|
+
### Tests
|
|
25
|
+
|
|
26
|
+
- Revalidated telegram-related runtime changes with TypeScript check and interactive/command regression suites
|
|
27
|
+
|
|
10
28
|
## [0.2.14] - 2026-04-04
|
|
11
29
|
|
|
12
30
|
### Added
|
package/README.md
CHANGED
|
@@ -6,9 +6,9 @@ const COMMANDS_PAGE_SIZE = 8;
|
|
|
6
6
|
const COMMAND_MENU_TTL_MS = 5 * 60 * 1000;
|
|
7
7
|
const MODELS_PAGE_SIZE = 8;
|
|
8
8
|
const MODEL_MENU_TTL_MS = 2 * 60 * 1000;
|
|
9
|
-
const QUICK_ACTION_DEBOUNCE_MS = 800;
|
|
10
9
|
const LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS = 850;
|
|
11
10
|
const INPUT_BUTTON_HUB = "🧭 Hub";
|
|
11
|
+
const INPUT_BUTTON_START = "▶️ Start";
|
|
12
12
|
const INPUT_BUTTON_NEW = "🆕 New";
|
|
13
13
|
const INPUT_BUTTON_COMMANDS = "⚡ Cmd";
|
|
14
14
|
const INPUT_BUTTON_HELP = "❓ Help";
|
|
@@ -170,7 +170,6 @@ class TelegramBridgeRuntime {
|
|
|
170
170
|
this.hubMessageIdByChat = new Map();
|
|
171
171
|
this.hubViewByChat = new Map();
|
|
172
172
|
this.inputMenuEnabledByChat = new Set();
|
|
173
|
-
this.quickActionDebounceByChat = new Map();
|
|
174
173
|
this.nextUpdateOffset = 0;
|
|
175
174
|
this.nextTurnId = 1;
|
|
176
175
|
this.rpcConnected = false;
|
|
@@ -280,7 +279,15 @@ class TelegramBridgeRuntime {
|
|
|
280
279
|
isAuthorizedUser(userId) {
|
|
281
280
|
return typeof userId === "number" && this.allowedUserIds.has(userId);
|
|
282
281
|
}
|
|
283
|
-
buildInputMenuKeyboard() {
|
|
282
|
+
buildInputMenuKeyboard(stopped = this.bridgeStopped) {
|
|
283
|
+
if (stopped) {
|
|
284
|
+
return {
|
|
285
|
+
keyboard: [[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_START }], [{ text: INPUT_BUTTON_HELP }]],
|
|
286
|
+
resize_keyboard: true,
|
|
287
|
+
is_persistent: true,
|
|
288
|
+
input_field_placeholder: "Bridge stopped. Tap Start to resume",
|
|
289
|
+
};
|
|
290
|
+
}
|
|
284
291
|
return {
|
|
285
292
|
keyboard: [
|
|
286
293
|
[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_NEW }, { text: INPUT_BUTTON_COMMANDS }],
|
|
@@ -313,6 +320,11 @@ class TelegramBridgeRuntime {
|
|
|
313
320
|
mapInputMenuAction(text) {
|
|
314
321
|
const normalized = this.normalizeInputActionText(text);
|
|
315
322
|
switch (normalized) {
|
|
323
|
+
case "start":
|
|
324
|
+
case "resume":
|
|
325
|
+
case "старт":
|
|
326
|
+
case "запуск":
|
|
327
|
+
return "/start";
|
|
316
328
|
case "hub":
|
|
317
329
|
case "status":
|
|
318
330
|
case "хаб":
|
|
@@ -343,6 +355,8 @@ class TelegramBridgeRuntime {
|
|
|
343
355
|
case "стоп":
|
|
344
356
|
return "/stop";
|
|
345
357
|
}
|
|
358
|
+
if (normalized === this.normalizeInputActionText(INPUT_BUTTON_START))
|
|
359
|
+
return "/start";
|
|
346
360
|
if (normalized === this.normalizeInputActionText(INPUT_BUTTON_HUB))
|
|
347
361
|
return "/status";
|
|
348
362
|
if (normalized === this.normalizeInputActionText(INPUT_BUTTON_NEW))
|
|
@@ -357,12 +371,6 @@ class TelegramBridgeRuntime {
|
|
|
357
371
|
return "/stop";
|
|
358
372
|
return undefined;
|
|
359
373
|
}
|
|
360
|
-
isDebouncedQuickAction(chatId, command) {
|
|
361
|
-
const now = Date.now();
|
|
362
|
-
const previous = this.quickActionDebounceByChat.get(chatId);
|
|
363
|
-
this.quickActionDebounceByChat.set(chatId, { command, at: now });
|
|
364
|
-
return Boolean(previous && previous.command === command && now - previous.at < QUICK_ACTION_DEBOUNCE_MS);
|
|
365
|
-
}
|
|
366
374
|
async handleUpdate(update) {
|
|
367
375
|
if (update.callback_query) {
|
|
368
376
|
await this.handleCallbackQuery(update.callback_query);
|
|
@@ -385,9 +393,6 @@ class TelegramBridgeRuntime {
|
|
|
385
393
|
}
|
|
386
394
|
const quickActionCommand = this.mapInputMenuAction(text);
|
|
387
395
|
if (quickActionCommand) {
|
|
388
|
-
if (this.isDebouncedQuickAction(message.chat.id, quickActionCommand)) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
396
|
await this.handleCommandMessage(message.chat.id, quickActionCommand);
|
|
392
397
|
return;
|
|
393
398
|
}
|
|
@@ -453,12 +458,18 @@ class TelegramBridgeRuntime {
|
|
|
453
458
|
async handleHubAction(chatId, action) {
|
|
454
459
|
if (!chatId)
|
|
455
460
|
return;
|
|
456
|
-
const
|
|
457
|
-
if (this.bridgeStopped && !
|
|
458
|
-
await this.
|
|
461
|
+
const stoppedSafeActions = new Set(["status", "refresh", "details", "compact", "start", "help"]);
|
|
462
|
+
if (this.bridgeStopped && !stoppedSafeActions.has(action)) {
|
|
463
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
459
464
|
return;
|
|
460
465
|
}
|
|
461
466
|
switch (action) {
|
|
467
|
+
case "start":
|
|
468
|
+
await this.handleCommandMessage(chatId, "/start");
|
|
469
|
+
return;
|
|
470
|
+
case "help":
|
|
471
|
+
await this.sendHelp(chatId);
|
|
472
|
+
return;
|
|
462
473
|
case "prompt":
|
|
463
474
|
await this.bot.sendMessage(chatId, "Send any text to start a task.");
|
|
464
475
|
return;
|
|
@@ -573,6 +584,7 @@ class TelegramBridgeRuntime {
|
|
|
573
584
|
}
|
|
574
585
|
if (this.bridgeStopped && action !== "hub") {
|
|
575
586
|
await this.bot.answerCallbackQuery(callback.id, "Bridge is stopped");
|
|
587
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
576
588
|
return;
|
|
577
589
|
}
|
|
578
590
|
if (action === "hub") {
|
|
@@ -609,7 +621,7 @@ class TelegramBridgeRuntime {
|
|
|
609
621
|
}
|
|
610
622
|
async handleCommandMessage(chatId, text) {
|
|
611
623
|
const [commandRaw, ...rest] = text.split(/\s+/);
|
|
612
|
-
const command = commandRaw.toLowerCase();
|
|
624
|
+
const command = (commandRaw.toLowerCase().split("@")[0] ?? commandRaw.toLowerCase()).trim();
|
|
613
625
|
if (command === "/start") {
|
|
614
626
|
this.bridgeStopped = false;
|
|
615
627
|
await this.sendStart(chatId);
|
|
@@ -624,7 +636,7 @@ class TelegramBridgeRuntime {
|
|
|
624
636
|
return;
|
|
625
637
|
}
|
|
626
638
|
if (command === "/status") {
|
|
627
|
-
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub:
|
|
639
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
628
640
|
return;
|
|
629
641
|
}
|
|
630
642
|
if (command === "/stop") {
|
|
@@ -632,7 +644,8 @@ class TelegramBridgeRuntime {
|
|
|
632
644
|
return;
|
|
633
645
|
}
|
|
634
646
|
if (this.bridgeStopped) {
|
|
635
|
-
await this.
|
|
647
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
648
|
+
await this.ensureInputMenu(chatId, true);
|
|
636
649
|
return;
|
|
637
650
|
}
|
|
638
651
|
if (command === "/commands") {
|
|
@@ -691,9 +704,9 @@ class TelegramBridgeRuntime {
|
|
|
691
704
|
await this.sendStatusCard(chatId, {
|
|
692
705
|
header: `Control Hub · ${APP_NAME} v${VERSION}`,
|
|
693
706
|
includeKeyboard: true,
|
|
694
|
-
preferEditHub:
|
|
707
|
+
preferEditHub: false,
|
|
695
708
|
});
|
|
696
|
-
await this.ensureInputMenu(chatId,
|
|
709
|
+
await this.ensureInputMenu(chatId, true);
|
|
697
710
|
}
|
|
698
711
|
async sendHelp(chatId) {
|
|
699
712
|
const help = [
|
|
@@ -993,6 +1006,7 @@ class TelegramBridgeRuntime {
|
|
|
993
1006
|
}
|
|
994
1007
|
if (this.bridgeStopped) {
|
|
995
1008
|
await this.bot.answerCallbackQuery(callback.id, "Bridge is stopped");
|
|
1009
|
+
await this.switchMenuMessageToHub(chatId, messageId);
|
|
996
1010
|
return;
|
|
997
1011
|
}
|
|
998
1012
|
if (action === "view") {
|
|
@@ -1151,7 +1165,7 @@ class TelegramBridgeRuntime {
|
|
|
1151
1165
|
}
|
|
1152
1166
|
async sendModelMenu(chatId, page, options) {
|
|
1153
1167
|
if (this.bridgeStopped) {
|
|
1154
|
-
await this.
|
|
1168
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
1155
1169
|
return;
|
|
1156
1170
|
}
|
|
1157
1171
|
let entries = [];
|
|
@@ -1214,6 +1228,7 @@ class TelegramBridgeRuntime {
|
|
|
1214
1228
|
}
|
|
1215
1229
|
if (this.bridgeStopped) {
|
|
1216
1230
|
await this.bot.answerCallbackQuery(callback.id, "Bridge is stopped");
|
|
1231
|
+
await this.switchMenuMessageToHub(chatId, messageId);
|
|
1217
1232
|
return;
|
|
1218
1233
|
}
|
|
1219
1234
|
if (action === "page" || action === "refresh") {
|
|
@@ -1278,7 +1293,8 @@ class TelegramBridgeRuntime {
|
|
|
1278
1293
|
}
|
|
1279
1294
|
async stopBridge(chatId) {
|
|
1280
1295
|
if (this.bridgeStopped && !this.activeTurn && this.queue.length === 0 && !this.rpcConnected) {
|
|
1281
|
-
await this.
|
|
1296
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
1297
|
+
await this.ensureInputMenu(chatId, true);
|
|
1282
1298
|
return;
|
|
1283
1299
|
}
|
|
1284
1300
|
const droppedQueue = this.queue.length;
|
|
@@ -1339,6 +1355,8 @@ class TelegramBridgeRuntime {
|
|
|
1339
1355
|
parts.push(`Dropped queued tasks: ${droppedQueue}.`);
|
|
1340
1356
|
}
|
|
1341
1357
|
parts.push("Use /start to resume.");
|
|
1358
|
+
await this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });
|
|
1359
|
+
await this.ensureInputMenu(chatId, true);
|
|
1342
1360
|
await this.bot.sendMessage(chatId, parts.join(" "));
|
|
1343
1361
|
}
|
|
1344
1362
|
formatConnectionStatus() {
|
|
@@ -1387,6 +1405,17 @@ class TelegramBridgeRuntime {
|
|
|
1387
1405
|
return `${phase} ${elapsed}s`;
|
|
1388
1406
|
}
|
|
1389
1407
|
buildHubKeyboard(mode, view) {
|
|
1408
|
+
if (this.bridgeStopped) {
|
|
1409
|
+
return {
|
|
1410
|
+
inline_keyboard: [
|
|
1411
|
+
[
|
|
1412
|
+
{ text: "▶️ Start", callback_data: "hub:start" },
|
|
1413
|
+
{ text: "🔄 Refresh", callback_data: "hub:refresh" },
|
|
1414
|
+
],
|
|
1415
|
+
[{ text: "❓ Help", callback_data: "hub:help" }],
|
|
1416
|
+
],
|
|
1417
|
+
};
|
|
1418
|
+
}
|
|
1390
1419
|
const detailsToggle = view === "details"
|
|
1391
1420
|
? { text: "◀ Compact", callback_data: "hub:compact" }
|
|
1392
1421
|
: { text: "ℹ️ Details", callback_data: "hub:details" };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-bridge-mode.js","sourceRoot":"","sources":["../../../src/modes/telegram/telegram-bridge-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent } from \"@mariozechner/pi-agent-core\";\nimport { marked, type Token, type Tokens } from \"marked\";\nimport { setTimeout as sleepTimeout } from \"node:timers/promises\";\nimport { APP_NAME, VERSION } from \"../../config.js\";\nimport type { BuiltinCommandResult } from \"../../core/command-dispatcher.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { RpcClient } from \"../rpc/rpc-client.js\";\nimport type {\n\tRpcBuiltinSlashCommand,\n\tRpcExtensionUIRequest,\n\tRpcRequiresConfirmationEvent,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"../rpc/rpc-types.js\";\n\ntype TelegramChatId = number;\n\nexport interface TelegramBridgeModeOptions {\n\t/**\n\t * Original CLI argv (without node/script prefixes). Used to forward model/profile/session args to RPC child.\n\t */\n\trawArgs: string[];\n\t/** Loaded settings manager for telegram settings and runtime updates. */\n\tsettingsManager: SettingsManager;\n\t/** Optional explicit cli path for RPC child. Defaults to current process argv[1]. */\n\tcliPath?: string;\n\t/** Optional cwd override for RPC child. */\n\tcwd?: string;\n}\n\ninterface TelegramUser {\n\tid: number;\n\tusername?: string;\n}\n\ninterface TelegramChat {\n\tid: number;\n\ttype: string;\n}\n\ninterface TelegramMessage {\n\tmessage_id: number;\n\tfrom?: TelegramUser;\n\tchat: TelegramChat;\n\tdate: number;\n\ttext?: string;\n}\n\ninterface TelegramCallbackQuery {\n\tid: string;\n\tfrom: TelegramUser;\n\tdata?: string;\n\tmessage?: TelegramMessage;\n}\n\ninterface TelegramUpdate {\n\tupdate_id: number;\n\tmessage?: TelegramMessage;\n\tcallback_query?: TelegramCallbackQuery;\n}\n\ninterface TelegramApiEnvelope<T> {\n\tok: boolean;\n\tresult?: T;\n\tdescription?: string;\n\terror_code?: number;\n}\n\ninterface TelegramInlineKeyboardMarkup {\n\tinline_keyboard: Array<Array<{ text: string; callback_data: string }>>;\n}\n\ninterface TelegramReplyKeyboardMarkup {\n\tkeyboard: Array<Array<{ text: string }>>;\n\tresize_keyboard?: boolean;\n\tis_persistent?: boolean;\n\tone_time_keyboard?: boolean;\n\tinput_field_placeholder?: string;\n}\n\ntype TelegramReplyMarkup = TelegramInlineKeyboardMarkup | TelegramReplyKeyboardMarkup;\n\ninterface ActiveTurnState {\n\tturnId: number;\n\tchatId: TelegramChatId;\n\tprompt: string;\n\tstartedAt: number;\n\tstatusMessageId: number;\n\tphase: string;\n\tlastTool?: string;\n\taborted: boolean;\n\tstatusEditPending: boolean;\n\tstatusEditTimer?: NodeJS.Timeout;\n\tstatusEditInFlight?: Promise<void>;\n\tlastStatusEditAt: number;\n}\n\ninterface PendingConfirmation {\n\tchatId: TelegramChatId;\n\trequestId: string;\n\tlabel: string;\n\tgroupKey: string;\n}\n\ninterface CommandCatalogEntry {\n\tname: string;\n\tdescription?: string;\n\tsource: \"builtin\" | \"extension\" | \"prompt\" | \"skill\";\n\tcommandText: string;\n}\n\ntype CommandMenuView = \"main\" | \"all\";\n\ninterface ModelCatalogEntry {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\ntype HubView = \"compact\" | \"details\";\n\nconst COMMANDS_PAGE_SIZE = 8;\nconst COMMAND_MENU_TTL_MS = 5 * 60 * 1000;\nconst MODELS_PAGE_SIZE = 8;\nconst MODEL_MENU_TTL_MS = 2 * 60 * 1000;\nconst QUICK_ACTION_DEBOUNCE_MS = 800;\nconst LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS = 850;\nconst INPUT_BUTTON_HUB = \"🧭 Hub\";\nconst INPUT_BUTTON_NEW = \"🆕 New\";\nconst INPUT_BUTTON_COMMANDS = \"⚡ Cmd\";\nconst INPUT_BUTTON_HELP = \"❓ Help\";\nconst INPUT_BUTTON_ABORT = \"⛔ Abort\";\nconst INPUT_BUTTON_STOP = \"🛑 Stop\";\nconst MAIN_COMMAND_MENU: CommandCatalogEntry[] = [\n\t{\n\t\tname: \"model\",\n\t\tdescription: \"Choose active model\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/model\",\n\t},\n\t{\n\t\tname: \"status\",\n\t\tdescription: \"Show control hub status\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/status\",\n\t},\n\t{\n\t\tname: \"new\",\n\t\tdescription: \"Start a new session\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/new\",\n\t},\n\t{\n\t\tname: \"abort\",\n\t\tdescription: \"Abort active task\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/abort\",\n\t},\n\t{\n\t\tname: \"permissions\",\n\t\tdescription: \"Show permission mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/permissions status\",\n\t},\n\t{\n\t\tname: \"yolo\",\n\t\tdescription: \"Show YOLO mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/yolo status\",\n\t},\n\t{\n\t\tname: \"help\",\n\t\tdescription: \"Show command help\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/help\",\n\t},\n\t{\n\t\tname: \"stop\",\n\t\tdescription: \"Stop bridge and cancel active work\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/stop\",\n\t},\n];\n\nclass TelegramBotApi {\n\tconstructor(private readonly token: string) {}\n\n\tprivate get endpoint(): string {\n\t\treturn `https://api.telegram.org/bot${this.token}`;\n\t}\n\n\tasync getMe(): Promise<{ id: number; username?: string }> {\n\t\treturn this.call(\"getMe\", {});\n\t}\n\n\tasync getUpdates(offset: number, timeoutSeconds: number): Promise<TelegramUpdate[]> {\n\t\treturn this.call(\"getUpdates\", {\n\t\t\toffset,\n\t\t\ttimeout: timeoutSeconds,\n\t\t\tallowed_updates: [\"message\", \"callback_query\"],\n\t\t});\n\t}\n\n\tasync sendMessage(\n\t\tchatId: TelegramChatId,\n\t\ttext: string,\n\t\toptions?: {\n\t\t\treplyMarkup?: TelegramReplyMarkup;\n\t\t\tdisableNotification?: boolean;\n\t\t\tparseMode?: \"HTML\";\n\t\t},\n\t): Promise<TelegramMessage> {\n\t\treturn this.call(\"sendMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t\tdisable_notification: options?.disableNotification ?? false,\n\t\t\tparse_mode: options?.parseMode,\n\t\t});\n\t}\n\n\tasync editMessageText(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\ttext: string,\n\t\toptions?: { replyMarkup?: TelegramInlineKeyboardMarkup },\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageText\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t});\n\t}\n\n\tasync editMessageReplyMarkup(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\treplyMarkup?: TelegramInlineKeyboardMarkup,\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageReplyMarkup\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\treply_markup: replyMarkup,\n\t\t});\n\t}\n\n\tasync deleteMessage(chatId: TelegramChatId, messageId: number): Promise<boolean> {\n\t\treturn this.call(\"deleteMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t});\n\t}\n\n\tasync answerCallbackQuery(callbackQueryId: string, text?: string): Promise<boolean> {\n\t\treturn this.call(\"answerCallbackQuery\", {\n\t\t\tcallback_query_id: callbackQueryId,\n\t\t\ttext,\n\t\t\tshow_alert: false,\n\t\t});\n\t}\n\n\tasync sendTextDocument(chatId: TelegramChatId, filename: string, content: string, caption?: string): Promise<TelegramMessage> {\n\t\tconst form = new FormData();\n\t\tform.set(\"chat_id\", String(chatId));\n\t\tif (caption) {\n\t\t\tform.set(\"caption\", caption);\n\t\t}\n\t\tform.set(\"document\", new Blob([content], { type: \"text/plain\" }), filename);\n\t\treturn this.callMultipart(\"sendDocument\", form);\n\t}\n\n\tprivate async call<T>(method: string, payload: Record<string, unknown>): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n\n\tprivate async callMultipart<T>(method: string, form: FormData): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: form,\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n}\n\nexport async function runTelegramBridgeMode(options: TelegramBridgeModeOptions): Promise<never> {\n\tconst mode = new TelegramBridgeRuntime(options);\n\tawait mode.run();\n\t// run() loops forever unless it throws; keep Promise<never> contract explicit.\n\treturn new Promise(() => {});\n}\n\nclass TelegramBridgeRuntime {\n\tprivate readonly settingsManager: SettingsManager;\n\tprivate readonly bot: TelegramBotApi;\n\tprivate readonly allowedUserIds: Set<number>;\n\tprivate readonly statusEditThrottleMs: number;\n\tprivate readonly maxSummaryChars: number;\n\tprivate readonly rpcClient: RpcClient;\n\tprivate readonly queue: Array<{ chatId: TelegramChatId; text: string }> = [];\n\tprivate readonly pendingConfirmations = new Map<string, PendingConfirmation>();\n\tprivate readonly pendingConfirmationGroupIdsByKey = new Map<string, Set<string>>();\n\tprivate readonly commandCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: CommandCatalogEntry[] }>();\n\tprivate readonly modelCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: ModelCatalogEntry[] }>();\n\tprivate readonly hubMessageIdByChat = new Map<TelegramChatId, number>();\n\tprivate readonly hubViewByChat = new Map<TelegramChatId, HubView>();\n\tprivate readonly inputMenuEnabledByChat = new Set<TelegramChatId>();\n\tprivate readonly quickActionDebounceByChat = new Map<TelegramChatId, { command: string; at: number }>();\n\tprivate nextUpdateOffset = 0;\n\tprivate nextTurnId = 1;\n\tprivate activeTurn: ActiveTurnState | undefined;\n\tprivate activeSessionState: RpcSessionState | undefined;\n\tprivate lastAuthorizedChatId: TelegramChatId | undefined;\n\tprivate rpcConnected = false;\n\tprivate bridgeStopped = false;\n\n\tconstructor(private readonly options: TelegramBridgeModeOptions) {\n\t\tthis.settingsManager = options.settingsManager;\n\t\tconst telegramSettings = this.settingsManager.getTelegramSettings();\n\t\tif (!telegramSettings.enabled) {\n\t\t\tthrow new Error(\"Telegram bridge is disabled in settings (telegram.enabled=false).\");\n\t\t}\n\t\tif (!telegramSettings.botToken) {\n\t\t\tthrow new Error(\"Telegram bridge requires settings.telegram.botToken.\");\n\t\t}\n\t\tif (telegramSettings.allowedUserIds.length === 0) {\n\t\t\tthrow new Error(\"Telegram bridge requires at least one allowed user ID in settings.telegram.allowedUserIds.\");\n\t\t}\n\t\tif (telegramSettings.transport !== \"long-polling\") {\n\t\t\tthrow new Error(`Unsupported telegram transport: ${telegramSettings.transport}`);\n\t\t}\n\n\t\tthis.bot = new TelegramBotApi(telegramSettings.botToken);\n\t\tthis.allowedUserIds = new Set(telegramSettings.allowedUserIds);\n\t\tthis.statusEditThrottleMs = telegramSettings.chatDefaults.statusEditThrottleMs;\n\t\tthis.maxSummaryChars = telegramSettings.chatDefaults.maxSummaryChars;\n\t\tthis.rpcClient = new RpcClient({\n\t\t\tcliPath: options.cliPath,\n\t\t\tcwd: options.cwd,\n\t\t\targs: this.buildRpcForwardedArgs(options.rawArgs),\n\t\t});\n\t}\n\n\tasync run(): Promise<void> {\n\t\tconst me = await this.bot.getMe();\n\t\tawait this.startRpc();\n\t\tconsole.log(`[telegram] bridge online as @${me.username ?? \"unknown\"} (${me.id})`);\n\n\t\tconst shutdown = async (signal: string) => {\n\t\t\tconsole.log(`[telegram] received ${signal}, stopping bridge...`);\n\t\t\ttry {\n\t\t\t\tawait this.rpcClient.stop();\n\t\t\t} finally {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t};\n\t\tprocess.once(\"SIGINT\", () => {\n\t\t\tvoid shutdown(\"SIGINT\");\n\t\t});\n\t\tprocess.once(\"SIGTERM\", () => {\n\t\t\tvoid shutdown(\"SIGTERM\");\n\t\t});\n\n\t\tthis.rpcClient.onEvent((event) => {\n\t\t\tvoid this.onRpcEvent(event);\n\t\t});\n\t\tthis.rpcClient.onExtensionUIRequest((request) => {\n\t\t\tvoid this.onRpcExtensionUiRequest(request);\n\t\t});\n\t\tthis.rpcClient.onRequiresConfirmation((event) => {\n\t\t\tvoid this.onRpcConfirmationRequest(event);\n\t\t});\n\n\t\t// Keep polling forever.\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst updates = await this.bot.getUpdates(this.nextUpdateOffset, 25);\n\t\t\t\tfor (const update of updates) {\n\t\t\t\t\tthis.nextUpdateOffset = Math.max(this.nextUpdateOffset, update.update_id + 1);\n\t\t\t\t\tawait this.handleUpdate(update);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[telegram] polling error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\tawait sleepTimeout(2_000);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate buildRpcForwardedArgs(rawArgs: string[]): string[] {\n\t\tconst forwarded: string[] = [];\n\t\tfor (let i = 0; i < rawArgs.length; i++) {\n\t\t\tconst arg = rawArgs[i];\n\t\t\tif (i === 0 && arg === \"telegram\") continue;\n\t\t\tif (arg === \"--mode\") {\n\t\t\t\t// RPC mode is enforced by RpcClient; ignore any caller-provided mode.\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforwarded.push(arg);\n\t\t}\n\t\treturn forwarded;\n\t}\n\n\tprivate async startRpc(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rpcClient.start();\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tthrow new Error(`Failed to start RPC child: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async restartRpc(): Promise<void> {\n\t\tawait this.rpcClient.stop();\n\t\tawait this.startRpc();\n\t}\n\n\tprivate async ensureRpcConnected(): Promise<void> {\n\t\tif (this.rpcConnected) return;\n\t\tawait this.restartRpc();\n\t}\n\n\tprivate isAuthorizedUser(userId: number | undefined): userId is number {\n\t\treturn typeof userId === \"number\" && this.allowedUserIds.has(userId);\n\t}\n\n\tprivate buildInputMenuKeyboard(): TelegramReplyKeyboardMarkup {\n\t\treturn {\n\t\t\tkeyboard: [\n\t\t\t\t[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_NEW }, { text: INPUT_BUTTON_COMMANDS }],\n\t\t\t\t[{ text: INPUT_BUTTON_HELP }, { text: INPUT_BUTTON_ABORT }, { text: INPUT_BUTTON_STOP }],\n\t\t\t],\n\t\t\tresize_keyboard: true,\n\t\t\tis_persistent: true,\n\t\t\tinput_field_placeholder: \"Write a task or pick an action\",\n\t\t};\n\t}\n\n\tprivate async ensureInputMenu(chatId: TelegramChatId, force = false): Promise<void> {\n\t\tif (!force && this.inputMenuEnabledByChat.has(chatId)) return;\n\t\tconst notice = force ? \"Quick actions updated ↓\" : \"Quick actions ready ↓\";\n\t\tawait this.bot.sendMessage(chatId, notice, {\n\t\t\treplyMarkup: this.buildInputMenuKeyboard(),\n\t\t\tdisableNotification: true,\n\t\t});\n\t\tthis.inputMenuEnabledByChat.add(chatId);\n\t}\n\n\tprivate normalizeInputActionText(text: string): string {\n\t\treturn text\n\t\t\t.normalize(\"NFKC\")\n\t\t\t.replace(/\\uFE0F/g, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^\\p{Letter}\\p{Number} ]+/gu, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t}\n\n\tprivate mapInputMenuAction(text: string): string | undefined {\n\t\tconst normalized = this.normalizeInputActionText(text);\n\t\tswitch (normalized) {\n\t\t\tcase \"hub\":\n\t\t\tcase \"status\":\n\t\t\tcase \"хаб\":\n\t\t\tcase \"статус\":\n\t\t\t\treturn \"/status\";\n\t\t\tcase \"new\":\n\t\t\tcase \"new session\":\n\t\t\tcase \"новая\":\n\t\t\tcase \"новая сессия\":\n\t\t\tcase \"новый\":\n\t\t\t\treturn \"/new\";\n\t\t\tcase \"cmd\":\n\t\t\tcase \"command\":\n\t\t\tcase \"commands\":\n\t\t\tcase \"команда\":\n\t\t\tcase \"команды\":\n\t\t\t\treturn \"/commands\";\n\t\t\tcase \"help\":\n\t\t\tcase \"помощь\":\n\t\t\tcase \"хелп\":\n\t\t\t\treturn \"/help\";\n\t\t\tcase \"abort\":\n\t\t\tcase \"cancel\":\n\t\t\tcase \"прервать\":\n\t\t\tcase \"отмена\":\n\t\t\t\treturn \"/abort\";\n\t\t\tcase \"stop\":\n\t\t\tcase \"стоп\":\n\t\t\t\treturn \"/stop\";\n\t\t}\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HUB)) return \"/status\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_NEW)) return \"/new\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_COMMANDS)) return \"/commands\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HELP)) return \"/help\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_ABORT)) return \"/abort\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_STOP)) return \"/stop\";\n\t\treturn undefined;\n\t}\n\n\tprivate isDebouncedQuickAction(chatId: TelegramChatId, command: string): boolean {\n\t\tconst now = Date.now();\n\t\tconst previous = this.quickActionDebounceByChat.get(chatId);\n\t\tthis.quickActionDebounceByChat.set(chatId, { command, at: now });\n\t\treturn Boolean(previous && previous.command === command && now - previous.at < QUICK_ACTION_DEBOUNCE_MS);\n\t}\n\n\tprivate async handleUpdate(update: TelegramUpdate): Promise<void> {\n\t\tif (update.callback_query) {\n\t\t\tawait this.handleCallbackQuery(update.callback_query);\n\t\t\treturn;\n\t\t}\n\t\tif (!update.message?.text) return;\n\n\t\tconst message = update.message;\n\t\tconst userId = message.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tconsole.warn(\n\t\t\t\t`[telegram] unauthorized message ignored (user=${userId ?? \"unknown\"}, chat=${message.chat.id})`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastAuthorizedChatId = message.chat.id;\n\t\tconst text = (message.text ?? \"\").trim();\n\t\tif (text.length === 0) return;\n\t\tif (!this.inputMenuEnabledByChat.has(message.chat.id)) {\n\t\t\tawait this.ensureInputMenu(message.chat.id);\n\t\t}\n\n\t\tconst quickActionCommand = this.mapInputMenuAction(text);\n\t\tif (quickActionCommand) {\n\t\t\tif (this.isDebouncedQuickAction(message.chat.id, quickActionCommand)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.handleCommandMessage(message.chat.id, quickActionCommand);\n\t\t\treturn;\n\t\t}\n\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, text);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(message.chat.id, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.enqueuePrompt(message.chat.id, text);\n\t}\n\n\tprivate async handleCallbackQuery(callback: TelegramCallbackQuery): Promise<void> {\n\t\tconst userId = callback.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Unauthorized\");\n\t\t\tconsole.warn(`[telegram] unauthorized callback ignored (user=${userId ?? \"unknown\"})`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = callback.data?.trim();\n\t\tif (!data) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"confirm:\")) {\n\t\t\tconst [, requestId, decision] = data.split(\":\");\n\t\t\tif (!requestId || (decision !== \"yes\" && decision !== \"no\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Invalid confirmation payload\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst confirmed = decision === \"yes\";\n\t\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\t\tawait this.respondConfirmation(requestId, confirmed);\n\t\t\tconst confirmChatId = callback.message?.chat.id;\n\t\t\tconst confirmMessageId = callback.message?.message_id;\n\t\t\tif (confirmChatId && typeof confirmMessageId === \"number\") {\n\t\t\t\tawait this.updateConfirmationDecisionMessage(confirmChatId, confirmMessageId, confirmed, pending?.label);\n\t\t\t\tawait this.moveLiveStatusToBottom(confirmChatId);\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, confirmed ? \"Approved\" : \"Denied\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"hub:\")) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.handleHubAction(callback.message?.chat.id, data.slice(4));\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"live:\")) {\n\t\t\tawait this.handleLiveAction(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"cmd:\")) {\n\t\t\tawait this.handleCommandMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"model:\")) {\n\t\t\tawait this.handleModelMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleHubAction(chatId: TelegramChatId | undefined, action: string): Promise<void> {\n\t\tif (!chatId) return;\n\t\tconst statusOnlyActions = new Set([\"status\", \"refresh\", \"details\", \"compact\", \"permissions\"]);\n\t\tif (this.bridgeStopped && !statusOnlyActions.has(action)) {\n\t\t\tawait this.bot.sendMessage(chatId, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\t\tswitch (action) {\n\t\t\tcase \"prompt\":\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Send any text to start a task.\");\n\t\t\t\treturn;\n\t\t\tcase \"commands\":\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\tcase \"new\": {\n\t\t\t\tawait this.runNewSession(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"permissions\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"toggle_mode\":\n\t\t\t\tawait this.togglePermissionMode(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"model\":\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\tcase \"status\":\n\t\t\tcase \"refresh\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\tcase \"details\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"compact\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"compact\" });\n\t\t\t\treturn;\n\t\t\tcase \"abort\":\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Action is not implemented yet in Telegram bridge.\");\n\t\t}\n\t}\n\n\tprivate async runNewSession(chatId: TelegramChatId): Promise<void> {\n\t\tconst handled = await this.runBuiltinCommand(chatId, \"/new\");\n\t\tif (!handled) {\n\t\t\tawait this.enqueuePrompt(chatId, \"/new\");\n\t\t}\n\t}\n\n\tprivate async switchMenuMessageToHub(chatId: TelegramChatId, messageId?: number): Promise<void> {\n\t\tif (messageId) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, messageId);\n\t\t}\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t}\n\n\tprivate async clearInlineKeyboard(chatId: TelegramChatId, messageId: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bot.editMessageReplyMarkup(chatId, messageId, { inline_keyboard: [] });\n\t\t} catch {\n\t\t\t// Best-effort cleanup of stale buttons.\n\t\t}\n\t}\n\n\tprivate buildConfirmationResolvedText(confirmed: boolean, label?: string): string {\n\t\tconst status = confirmed ? \"✅ Allowed\" : \"❌ Denied\";\n\t\tif (!label) return status;\n\t\tconst lines = label\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t\tconst detail = lines.find((line) => !/^permission required$/i.test(line)) ?? lines[0];\n\t\tif (!detail) return status;\n\t\tconst clipped = detail.length > 120 ? `${detail.slice(0, 119)}…` : detail;\n\t\treturn `${status}\\n${clipped}`;\n\t}\n\n\tprivate async updateConfirmationDecisionMessage(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\tconfirmed: boolean,\n\t\tlabel?: string,\n\t): Promise<void> {\n\t\tconst text = this.buildConfirmationResolvedText(confirmed, label);\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(chatId, messageId, text, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\tawait this.clearInlineKeyboard(chatId, messageId);\n\t\t}\n\t}\n\n\tprivate async moveLiveStatusToBottom(chatId: TelegramChatId): Promise<void> {\n\t\tconst turn = this.activeTurn;\n\t\tif (!turn || turn.chatId !== chatId) return;\n\t\tconst previousStatusId = turn.statusMessageId;\n\t\ttry {\n\t\t\tconst fresh = await this.bot.sendMessage(chatId, this.formatLiveStatus());\n\t\t\tturn.statusMessageId = fresh.message_id;\n\t\t\tturn.lastStatusEditAt = Date.now();\n\t\t\tif (previousStatusId !== fresh.message_id) {\n\t\t\t\tawait this.bot.deleteMessage(chatId, previousStatusId).catch(() => {});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Best-effort relocation; keep existing status message on failure.\n\t\t}\n\t}\n\n\tprivate async handleLiveAction(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tconst [, action] = data.split(\":\");\n\t\tif (!action) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped && action !== \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"commands\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"model\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"new\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"New session\");\n\t\t\tawait this.runNewSession(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"abort\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Aborting...\");\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"stop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping...\");\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleCommandMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst [commandRaw, ...rest] = text.split(/\\s+/);\n\t\tconst command = commandRaw.toLowerCase();\n\n\t\tif (command === \"/start\") {\n\t\t\tthis.bridgeStopped = false;\n\t\t\tawait this.sendStart(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/help\") {\n\t\t\tawait this.sendHelp(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/menu\") {\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/status\") {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: false });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/stop\") {\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(chatId, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/commands\") {\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/abort\") {\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/yolo\") {\n\t\t\tawait this.handleYoloCommand(chatId, rest);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/model\" && rest.join(\" \").trim().length === 0) {\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst handled = await this.runBuiltinCommand(chatId, text);\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to raw slash prompt to support extension/prompt-template/skill slash commands.\n\t\tawait this.enqueuePrompt(chatId, text);\n\t}\n\n\tprivate async runBuiltinCommand(chatId: TelegramChatId, commandText: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst result = await this.rpcClient.runBuiltinCommand(commandText);\n\t\t\tthis.rpcConnected = true;\n\t\t\tif (!result.handled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tawait this.sendBuiltinCommandResult(chatId, result);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async sendBuiltinCommandResult(chatId: TelegramChatId, result: BuiltinCommandResult): Promise<void> {\n\t\tif (result.message) {\n\t\t\tconst prefix = result.level === \"error\" ? \"Error: \" : result.level === \"warning\" ? \"Warning: \" : \"\";\n\t\t\tawait this.bot.sendMessage(chatId, `${prefix}${result.message}`);\n\t\t}\n\t\tif (result.text) {\n\t\t\tawait this.sendFinalOutput(chatId, result.text);\n\t\t}\n\t\tif (result.filePath) {\n\t\t\tawait this.bot.sendMessage(chatId, `File: ${result.filePath}`);\n\t\t}\n\t}\n\n\tprivate async sendStart(chatId: TelegramChatId): Promise<void> {\n\t\tawait this.sendStatusCard(chatId, {\n\t\t\theader: `Control Hub · ${APP_NAME} v${VERSION}`,\n\t\t\tincludeKeyboard: true,\n\t\t\tpreferEditHub: true,\n\t\t});\n\t\tawait this.ensureInputMenu(chatId, false);\n\t}\n\n\tprivate async sendHelp(chatId: TelegramChatId): Promise<void> {\n\t\tconst help = [\n\t\t\t\"IOSM Telegram · Quick Guide\",\n\t\t\t\"\",\n\t\t\t\"What the agent can do\",\n\t\t\t\"- Analyze your codebase and explain behavior\",\n\t\t\t\"- Create/edit files and refactor code\",\n\t\t\t\"- Run shell commands, investigate failures, fix tests\",\n\t\t\t\"- Work with git changes and repository context\",\n\t\t\t\"- Prepare concise result summaries\",\n\t\t\t\"\",\n\t\t\t\"Tools the agent uses\",\n\t\t\t\"- Shell tools: bash/zsh commands for diagnostics and automation\",\n\t\t\t\"- Code tools: search (rg), read/edit files, refactor project code\",\n\t\t\t\"- Validation tools: run tests, linters, build checks\",\n\t\t\t\"- Git tools: inspect diffs/status, create safe code changes\",\n\t\t\t\"- In ASK mode, dangerous tool actions require Allow/Deny\",\n\t\t\t\"\",\n\t\t\t\"How to ask\",\n\t\t\t\"- Write a plain task: what to do + where + expected output\",\n\t\t\t\"- Example: \\\"Find why tests fail and fix them\\\"\",\n\t\t\t\"- Example: \\\"Find large files and propose safe cleanup\\\"\",\n\t\t\t\"\",\n\t\t\t\"Quick buttons\",\n\t\t\t\"- 🧭 Hub: current status/model/mode\",\n\t\t\t\"- ⚡ Cmd: command/action center\",\n\t\t\t\"- 🆕 New: start a new session\",\n\t\t\t\"- ⛔ Abort: stop current task\",\n\t\t\t\"- 🛑 Stop: stop bridge\",\n\t\t\t\"\",\n\t\t\t\"Models and permissions\",\n\t\t\t\"- /model: choose model\",\n\t\t\t\"- ASK mode: dangerous actions require Allow/Deny\",\n\t\t\t\"- /yolo on|off|status: confirmation mode control\",\n\t\t\t\"\",\n\t\t\t\"Useful commands\",\n\t\t\t\"/status /commands /model /menu /help\",\n\t\t\t\"\",\n\t\t\t\"Tip: phrase tasks like \\\"do X, verify Y, report result\\\".\",\n\t\t].join(\"\\n\");\n\t\tawait this.bot.sendMessage(chatId, help);\n\t}\n\n\tprivate buildDefaultCommandText(name: string): string {\n\t\tconst lower = name.toLowerCase();\n\t\tswitch (lower) {\n\t\t\tcase \"permissions\":\n\t\t\t\treturn \"/permissions status\";\n\t\t\tcase \"yolo\":\n\t\t\t\treturn \"/yolo status\";\n\t\t\tcase \"checkpoint\":\n\t\t\t\treturn \"/checkpoint list\";\n\t\t\tcase \"rollback\":\n\t\t\t\treturn \"/rollback list\";\n\t\t\tcase \"tree\":\n\t\t\t\treturn \"/tree list\";\n\t\t\tdefault:\n\t\t\t\treturn `/${name}`;\n\t\t}\n\t}\n\n\tprivate mapBuiltinCommands(commands: RpcBuiltinSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: \"builtin\" as const,\n\t\t\tcommandText: this.buildDefaultCommandText(command.name),\n\t\t}));\n\t}\n\n\tprivate mapExternalCommands(commands: RpcSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: command.source,\n\t\t\tcommandText: `/${command.name}`,\n\t\t}));\n\t}\n\n\tprivate getLocalBridgeCommands(): CommandCatalogEntry[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"commands\",\n\t\t\t\tdescription: \"Open paged command buttons\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/commands\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"model\",\n\t\t\t\tdescription: \"Open model picker\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/model\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"status\",\n\t\t\t\tdescription: \"Show runtime status\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/status\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abort\",\n\t\t\t\tdescription: \"Abort active task\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/abort\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"stop\",\n\t\t\t\tdescription: \"Stop bridge and cancel active work\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/stop\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate commandButtonLabel(entry: CommandCatalogEntry, view: CommandMenuView): string {\n\t\tif (view === \"all\") {\n\t\t\tconst raw = entry.commandText.startsWith(\"/\") ? entry.commandText : `/${entry.name}`;\n\t\t\treturn raw.length > 24 ? `${raw.slice(0, 23)}…` : raw;\n\t\t}\n\t\tconst key = entry.commandText.toLowerCase();\n\t\tswitch (key) {\n\t\t\tcase \"/model\":\n\t\t\t\treturn \"🤖 Model\";\n\t\t\tcase \"/status\":\n\t\t\t\treturn \"🔄 Status\";\n\t\t\tcase \"/new\":\n\t\t\t\treturn \"🆕 New\";\n\t\t\tcase \"/abort\":\n\t\t\t\treturn \"⛔ Abort\";\n\t\t\tcase \"/permissions status\":\n\t\t\t\treturn \"🛡 Mode\";\n\t\t\tcase \"/yolo status\":\n\t\t\t\treturn \"⚠️ YOLO\";\n\t\t\tcase \"/help\":\n\t\t\t\treturn \"❓ Help\";\n\t\t\tcase \"/stop\":\n\t\t\t\treturn \"🛑 Stop\";\n\t\t\tdefault:\n\t\t\t\treturn entry.commandText;\n\t\t}\n\t}\n\n\tprivate async getCommandCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<CommandCatalogEntry[]> {\n\t\tconst cached = this.commandCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < COMMAND_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst [builtin, dynamic] = await Promise.all([\n\t\t\tthis.rpcClient.getBuiltinCommands(),\n\t\t\tthis.rpcClient.getCommands(),\n\t\t]);\n\t\tthis.rpcConnected = true;\n\n\t\tconst entries: CommandCatalogEntry[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const entry of this.getLocalBridgeCommands()) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\t\tfor (const entry of this.mapBuiltinCommands(builtin)) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tconst dynamicEntries = this.mapExternalCommands(dynamic).sort((a, b) => a.name.localeCompare(b.name));\n\t\tfor (const entry of dynamicEntries) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tthis.commandCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildCommandMenuKeyboard(\n\t\tentries: CommandCatalogEntry[],\n\t\tpage: number,\n\t\tview: CommandMenuView,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * COMMANDS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + COMMANDS_PAGE_SIZE);\n\n\t\tconst commandRows: Array<Array<{ text: string; callback_data: string }>> = [];\n\t\tfor (let index = 0; index < pageEntries.length; index += 2) {\n\t\t\tconst left = pageEntries[index];\n\t\t\tconst right = pageEntries[index + 1];\n\t\t\tconst row: Array<{ text: string; callback_data: string }> = [];\n\t\t\tif (left) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(left, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (right) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(right, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index + 1}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (row.length > 0) {\n\t\t\t\tcommandRows.push(row);\n\t\t\t}\n\t\t}\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `cmd:page:${view}:${normalizedPage - 1}` : \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `cmd:page:${view}:${normalizedPage + 1}` : \"cmd:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...commandRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: view === \"main\" ? \"All Commands\" : \"Main Commands\",\n\t\t\t\t\t\tcallback_data: `cmd:view:${view === \"main\" ? \"all\" : \"main\"}:0`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: \"Refresh\",\n\t\t\t\t\t\tcallback_data: view === \"all\" ? `cmd:refresh:${view}:${normalizedPage}` : `cmd:view:${view}:0`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"cmd:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"cmd:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendCommandMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean; view?: CommandMenuView },\n\t): Promise<void> {\n\t\tlet entries: CommandCatalogEntry[] = [];\n\t\tconst view = options?.view ?? \"main\";\n\t\ttry {\n\t\t\tentries = view === \"main\" ? MAIN_COMMAND_MENU : await this.getCommandCatalog(chatId, options?.refreshCatalog === true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load commands: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t`Command Center · ${APP_NAME}`,\n\t\t\t`${view === \"main\" ? \"Main Actions\" : \"All Commands\"} · ${normalizedPage + 1}/${pageCount}`,\n\t\t\t`${entries.length} items`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildCommandMenuKeyboard(entries, normalizedPage, view);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback below: send a new message if editing failed.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleCommandMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst parts = data.split(\":\");\n\t\tconst action = parts[1] ?? \"\";\n\t\tconst rawView = parts[2];\n\t\tlet view: CommandMenuView = rawView === \"all\" ? \"all\" : \"main\";\n\t\tlet value = parts[3];\n\t\t// Backward compatibility with older callback payloads: cmd:<action>:<value>.\n\t\tif ((action === \"page\" || action === \"refresh\" || action === \"run\") && parts.length === 3) {\n\t\t\tview = \"main\";\n\t\t\tvalue = parts[2];\n\t\t}\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"view\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: view === \"all\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"run\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: CommandCatalogEntry[] = [];\n\t\t\tif (view === \"main\") {\n\t\t\t\tentries = MAIN_COMMAND_MENU;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tentries = await this.getCommandCatalog(chatId, false);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.rpcConnected = false;\n\t\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to load command catalog\");\n\t\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\t\tchatId,\n\t\t\t\t\t\t`Failed to load commands: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Command list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/model\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Open model picker\");\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/status\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/help\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/abort\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Abort signal sent\");\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText.startsWith(\"/yolo\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tconst parts = entry.commandText.split(/\\s+/).slice(1);\n\t\t\t\tawait this.handleYoloCommand(chatId, parts);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/stop\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping bridge\");\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/commands\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Run ${entry.commandText}`);\n\t\t\tconst handled = await this.runBuiltinCommand(chatId, entry.commandText);\n\t\t\tif (!handled) {\n\t\t\t\tawait this.enqueuePrompt(chatId, entry.commandText);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate modelKey(model: { provider: string; id: string } | undefined): string | undefined {\n\t\tif (!model) return undefined;\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate async getModelCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<ModelCatalogEntry[]> {\n\t\tconst cached = this.modelCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < MODEL_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst entries = (await this.rpcClient.getAvailableModels())\n\t\t\t.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tid: model.id,\n\t\t\t\tcontextWindow: model.contextWindow,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t}))\n\t\t\t.sort((a, b) => this.modelKey(a)!.localeCompare(this.modelKey(b)!));\n\t\tthis.rpcConnected = true;\n\t\tthis.modelCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildModelMenuKeyboard(\n\t\tentries: ModelCatalogEntry[],\n\t\tpage: number,\n\t\tcurrentModelKey: string | undefined,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * MODELS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + MODELS_PAGE_SIZE);\n\n\t\tconst modelRows = pageEntries.map((entry, index) => {\n\t\t\tconst key = this.modelKey(entry);\n\t\t\tconst selectedPrefix = key === currentModelKey ? \"✅ \" : \"\";\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\ttext: `${selectedPrefix}${entry.provider}/${entry.id}`,\n\t\t\t\t\tcallback_data: `model:set:${start + index}`,\n\t\t\t\t},\n\t\t\t];\n\t\t});\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `model:page:${normalizedPage - 1}` : \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `model:page:${normalizedPage + 1}` : \"model:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...modelRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Cycle\", callback_data: \"model:cycle\" },\n\t\t\t\t\t{ text: \"Refresh\", callback_data: `model:refresh:${normalizedPage}` },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"model:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"model:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendModelMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean },\n\t): Promise<void> {\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(chatId, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tlet entries: ModelCatalogEntry[] = [];\n\t\ttry {\n\t\t\tentries = await this.getModelCatalog(chatId, options?.refreshCatalog === true);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (entries.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No models available. Configure models in settings and retry.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentModelKey = this.modelKey(this.activeSessionState?.model);\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t\"Model Picker\",\n\t\t\t`Current: ${currentModelKey ?? \"not selected\"}`,\n\t\t\t`Available: ${entries.length}`,\n\t\t\t`Page: ${normalizedPage + 1}/${pageCount}`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildModelMenuKeyboard(entries, normalizedPage, currentModelKey);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback to sending a fresh message.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleModelMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst [, action, value] = data.split(\":\");\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"cycle\") {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tconst cycled = await this.rpcClient.cycleModel();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(\n\t\t\t\t\tcallback.id,\n\t\t\t\t\tcycled ? `Model: ${cycled.model.provider}/${cycled.model.id}` : \"No model candidates\",\n\t\t\t\t);\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { messageId, refreshCatalog: false });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to cycle model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to cycle model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"set\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: ModelCatalogEntry[] = [];\n\t\t\ttry {\n\t\t\t\tentries = await this.getModelCatalog(chatId, false);\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tawait this.rpcClient.setModel(entry.provider, entry.id);\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Selected ${entry.provider}/${entry.id}`);\n\t\t\t\tawait this.sendModelMenu(chatId, Math.floor(index / MODELS_PAGE_SIZE), { messageId, refreshCatalog: false });\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to set model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to set model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async stopBridge(chatId: TelegramChatId): Promise<void> {\n\t\tif (this.bridgeStopped && !this.activeTurn && this.queue.length === 0 && !this.rpcConnected) {\n\t\t\tawait this.bot.sendMessage(chatId, \"Bridge already stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst droppedQueue = this.queue.length;\n\t\tthis.queue.length = 0;\n\t\tthis.bridgeStopped = true;\n\t\tthis.commandCatalogByChat.clear();\n\t\tthis.modelCatalogByChat.clear();\n\n\t\tif (this.rpcConnected) {\n\t\t\tfor (const requestId of this.pendingConfirmations.keys()) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: requestId, confirmed: false });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore; bridge is stopping.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmations.clear();\n\t\tthis.pendingConfirmationGroupIdsByKey.clear();\n\n\t\tconst active = this.activeTurn;\n\t\tif (active?.statusEditTimer) {\n\t\t\tclearTimeout(active.statusEditTimer);\n\t\t}\n\t\tthis.activeTurn = undefined;\n\t\tif (active) {\n\t\t\tif (active.statusEditInFlight) {\n\t\t\t\ttry {\n\t\t\t\t\tawait active.statusEditInFlight;\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort; proceed with stop status.\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(active.chatId, active.statusMessageId, \"⛔ done (stopped)\");\n\t\t\t} catch {\n\t\t\t\t// Best-effort status close.\n\t\t\t}\n\t\t\tif (active.chatId !== chatId) {\n\t\t\t\tawait this.bot.sendMessage(active.chatId, \"Bridge stopped. Active task cancelled.\");\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.rpcClient.stop();\n\t\t} catch (error) {\n\t\t\tconsole.warn(`[telegram] rpc stop failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t} finally {\n\t\t\tthis.rpcConnected = false;\n\t\t}\n\n\t\tconst parts = [\"Bridge stopped.\"];\n\t\tif (active) {\n\t\t\tparts.push(\"Active task cancelled.\");\n\t\t}\n\t\tif (droppedQueue > 0) {\n\t\t\tparts.push(`Dropped queued tasks: ${droppedQueue}.`);\n\t\t}\n\t\tparts.push(\"Use /start to resume.\");\n\t\tawait this.bot.sendMessage(chatId, parts.join(\" \"));\n\t}\n\n\tprivate formatConnectionStatus(): string {\n\t\tif (this.bridgeStopped) return \"⛔ stopped\";\n\t\tif (!this.rpcConnected) return \"🟥 disconnected\";\n\t\tif (this.activeTurn) return \"🟩 connected\";\n\t\treturn \"🟦 idle\";\n\t}\n\n\tprivate formatPermissionShort(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"YOLO\";\n\t\tif (mode === \"auto\") return \"AUTO\";\n\t\treturn \"ASK\";\n\t}\n\n\tprivate formatPermissionButton(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"⚠️ YOLO\";\n\t\tif (mode === \"auto\") return \"🤖 AUTO\";\n\t\treturn \"🛡 ASK\";\n\t}\n\n\tprivate formatModelShort(model: string, maxLen = 42): string {\n\t\tif (model.length <= maxLen) return model;\n\t\treturn `${model.slice(0, maxLen - 1)}…`;\n\t}\n\n\tprivate formatSessionShort(sessionName: string | undefined, sessionId: string | undefined): string {\n\t\tif (sessionName && sessionName.trim().length > 0) return this.formatModelShort(sessionName.trim(), 24);\n\t\tif (!sessionId || sessionId.trim().length === 0) return \"unknown\";\n\t\tconst value = sessionId.trim();\n\t\tif (value.length <= 14) return value;\n\t\treturn `${value.slice(0, 8)}…${value.slice(-4)}`;\n\t}\n\n\tprivate formatCompactTurn(): string {\n\t\tif (!this.activeTurn) return \"idle\";\n\t\tconst elapsed = Math.max(0, Math.floor((Date.now() - this.activeTurn.startedAt) / 1000));\n\t\tconst phase = this.formatStatusPhase(this.activeTurn.phase);\n\t\treturn `${phase} ${elapsed}s`;\n\t}\n\n\tprivate buildHubKeyboard(mode: \"ask\" | \"auto\" | \"yolo\" | undefined, view: HubView): TelegramInlineKeyboardMarkup {\n\t\tconst detailsToggle =\n\t\t\tview === \"details\"\n\t\t\t\t? { text: \"◀ Compact\", callback_data: \"hub:compact\" }\n\t\t\t\t: { text: \"ℹ️ Details\", callback_data: \"hub:details\" };\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t[\n\t\t\t\t\t{ text: \"🆕 New\", callback_data: \"hub:new\" },\n\t\t\t\t\t{ text: \"⚡ Cmd\", callback_data: \"hub:commands\" },\n\t\t\t\t\t{ text: \"🤖 Model\", callback_data: \"hub:model\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: this.formatPermissionButton(mode), callback_data: \"hub:toggle_mode\" },\n\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\tdetailsToggle,\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"⛔ Abort\", callback_data: \"hub:abort\" },\n\t\t\t\t\t{ text: \"🛑 Stop\", callback_data: \"hub:stop\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendStatusCard(\n\t\tchatId: TelegramChatId,\n\t\toptions?: { header?: string; includeKeyboard?: boolean; preferEditHub?: boolean; view?: HubView },\n\t): Promise<void> {\n\t\tif (!this.bridgeStopped) {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\tchatId,\n\t\t\t\t\t`Status unavailable: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst state = this.activeSessionState;\n\t\tconst model = state?.model ? `${state.model.provider}/${state.model.id}` : \"not selected\";\n\t\tconst queueSize = this.queue.length;\n\t\tconst mcpState = \"RPC child\";\n\t\tconst permissionMode = state?.permissionMode ?? \"ask\";\n\t\tconst resolvedView = options?.view ?? this.hubViewByChat.get(chatId) ?? \"compact\";\n\t\tthis.hubViewByChat.set(chatId, resolvedView);\n\n\t\tconst header = options?.header ?? \"Control Hub\";\n\t\tconst compactText = [\n\t\t\theader,\n\t\t\t`${this.formatConnectionStatus()} · ${this.formatPermissionShort(permissionMode)} · q${queueSize} · ${this.formatCompactTurn()}`,\n\t\t\t`🤖 ${this.formatModelShort(model)}`,\n\t\t\t`💬 ${this.formatSessionShort(state?.sessionName, state?.sessionId)}`,\n\t\t].join(\"\\n\");\n\t\tconst detailsText = [\n\t\t\t`${header} · Details`,\n\t\t\t`Connection: ${this.formatConnectionStatus()}`,\n\t\t\t`Mode: ${permissionMode}`,\n\t\t\t`Model: ${model}`,\n\t\t\t`Session: ${state?.sessionName ?? state?.sessionId ?? \"unknown\"}`,\n\t\t\t`Turn: ${this.activeTurn ? `${this.activeTurn.phase} (${Math.floor((Date.now() - this.activeTurn.startedAt) / 1000)}s)` : \"idle\"}`,\n\t\t\t`Queue: ${queueSize}`,\n\t\t\t`MCP: ${mcpState}`,\n\t\t\t\"Telegram: active\",\n\t\t].join(\"\\n\");\n\t\tconst text = resolvedView === \"details\" ? detailsText : compactText;\n\t\tconst keyboard = options?.includeKeyboard ? this.buildHubKeyboard(permissionMode, resolvedView) : undefined;\n\n\t\tif (options?.includeKeyboard && options.preferEditHub) {\n\t\t\tconst hubMessageId = this.hubMessageIdByChat.get(chatId);\n\t\t\tif (hubMessageId) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.bot.editMessageText(chatId, hubMessageId, text, { replyMarkup: keyboard });\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback below: send a fresh hub card if original message is gone.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst message = await this.bot.sendMessage(chatId, text, { replyMarkup: keyboard });\n\t\tif (options?.includeKeyboard) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, message.message_id);\n\t\t}\n\t}\n\n\tprivate async togglePermissionMode(chatId: TelegramChatId): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst current = await this.rpcClient.getPermissionMode();\n\t\t\tconst next = current === \"yolo\" ? \"ask\" : \"yolo\";\n\t\t\tawait this.rpcClient.setPermissionMode(next);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to switch mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async handleYoloCommand(chatId: TelegramChatId, args: string[]): Promise<void> {\n\t\tconst desired = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tif (!desired || desired === \"status\") {\n\t\t\t\tconst mode = await this.rpcClient.getPermissionMode();\n\t\t\t\tawait this.bot.sendMessage(chatId, `YOLO mode: ${mode === \"yolo\" ? \"ON\" : \"OFF\"} (${mode})`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"on\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"yolo\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: ON (tool confirmations disabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"off\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"ask\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: OFF (tool confirmations enabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.sendMessage(chatId, \"Usage: /yolo [on|off|status]\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to update mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async abortActiveTurn(chatId: TelegramChatId): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No active task.\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tthis.activeTurn.aborted = true;\n\t\t\tawait this.rpcClient.abort();\n\t\t\tawait this.bot.sendMessage(chatId, \"Abort signal sent.\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Abort failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async enqueuePrompt(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.startTurn(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push({ chatId, text });\n\t\tawait this.bot.sendMessage(chatId, `⏸ queued · ${this.queue.length}`);\n\t\tvoid this.editLiveStatus();\n\t}\n\n\tprivate async startTurn(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst statusMessage = await this.bot.sendMessage(chatId, this.formatStartingStatus(text));\n\t\tthis.activeTurn = {\n\t\t\tturnId: this.nextTurnId++,\n\t\t\tchatId,\n\t\t\tprompt: text,\n\t\t\tstartedAt: Date.now(),\n\t\t\tstatusMessageId: statusMessage.message_id,\n\t\t\tphase: \"starting\",\n\t\t\taborted: false,\n\t\t\tstatusEditPending: false,\n\t\t\tlastStatusEditAt: 0,\n\t\t};\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tawait this.rpcClient.prompt(text);\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.editLiveStatus(true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.finishTurn({\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async onRpcEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\n\t\tswitch (event.type) {\n\t\t\tcase \"turn_start\":\n\t\t\t\tthis.activeTurn.phase = \"running\";\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName ?? this.activeTurn.lastTool;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"turn_end\": {\n\t\t\t\tconst turnEnd = event as AgentEvent;\n\t\t\t\tconst directText = this.extractAssistantTextFromTurnEnd(turnEnd);\n\t\t\t\tif (directText) {\n\t\t\t\t\t// Keep as fallback in case getLastAssistantText fails.\n\t\t\t\t\tthis.activeTurn.phase = \"finalizing\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent_end\":\n\t\t\t\tawait this.finishTurn();\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tawait this.editLiveStatus();\n\t}\n\n\tprivate async onRpcExtensionUiRequest(request: RpcExtensionUIRequest): Promise<void> {\n\t\tif (request.method === \"confirm_permission\" || request.method === \"confirm\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (!chatId) {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, confirmed: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = `${request.title}\\n${request.message}`;\n\t\t\tconst groupKey =\n\t\t\t\trequest.method === \"confirm_permission\"\n\t\t\t\t\t? this.buildPermissionGroupKey(chatId, request.request)\n\t\t\t\t\t: this.buildGenericConfirmationGroupKey(chatId, label);\n\t\t\tawait this.queueConfirmationPrompt(chatId, request.id, label, groupKey);\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.method === \"notify\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (chatId) {\n\t\t\t\tawait this.bot.sendMessage(chatId, request.message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unsupported interactive extension methods in telegram v1: cancel by default.\n\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, cancelled: true });\n\t}\n\n\tprivate async onRpcConfirmationRequest(event: RpcRequiresConfirmationEvent): Promise<void> {\n\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\tif (!chatId) {\n\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: event.id, confirmed: false });\n\t\t\treturn;\n\t\t}\n\t\tconst groupKey = this.buildPermissionGroupKey(chatId, event.request);\n\t\tawait this.queueConfirmationPrompt(chatId, event.id, event.message, groupKey);\n\t}\n\n\tprivate buildPermissionGroupKey(chatId: TelegramChatId, request: RpcRequiresConfirmationEvent[\"request\"]): string {\n\t\tconst requiredPermission = request.requiredPermission ?? \"unknown\";\n\t\tconst toolSource = request.toolSource ?? \"unknown\";\n\t\tconst inputJson = JSON.stringify(request.input ?? {});\n\t\treturn `${chatId}|perm|${request.toolName}|${requiredPermission}|${toolSource}|${request.summary}|${request.cwd}|${inputJson}`;\n\t}\n\n\tprivate buildGenericConfirmationGroupKey(chatId: TelegramChatId, label: string): string {\n\t\tconst normalized = label.replace(/\\s+/g, \" \").trim();\n\t\treturn `${chatId}|confirm|${normalized}`;\n\t}\n\n\tprivate async queueConfirmationPrompt(\n\t\tchatId: TelegramChatId,\n\t\trequestId: string,\n\t\tlabel: string,\n\t\tgroupKey: string,\n\t): Promise<void> {\n\t\tif (this.pendingConfirmations.has(requestId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.pendingConfirmationGroupIdsByKey.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.add(requestId);\n\t\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\t\tif (this.activeTurn) {\n\t\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\t\tawait this.editLiveStatus(true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = new Set<string>([requestId]);\n\t\tthis.pendingConfirmationGroupIdsByKey.set(groupKey, ids);\n\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\tawait this.bot.sendMessage(chatId, label, {\n\t\t\treplyMarkup: {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"Allow\", callback_data: `confirm:${requestId}:yes` },\n\t\t\t\t\t\t{ text: \"Deny\", callback_data: `confirm:${requestId}:no` },\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate async respondConfirmation(requestId: string, confirmed: boolean): Promise<void> {\n\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\tif (!pending) return;\n\n\t\tconst groupedIds = this.pendingConfirmationGroupIdsByKey.get(pending.groupKey);\n\t\tconst ids = groupedIds && groupedIds.size > 0 ? Array.from(groupedIds) : [requestId];\n\t\tfor (const id of ids) {\n\t\t\tthis.pendingConfirmations.delete(id);\n\t\t\ttry {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id, confirmed });\n\t\t\t} catch {\n\t\t\t\t// Best-effort for duplicated request IDs from different streams.\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmationGroupIdsByKey.delete(pending.groupKey);\n\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = confirmed ? \"running\" : \"permission denied\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate extractAssistantTextFromTurnEnd(event: AgentEvent): string | undefined {\n\t\tconst messageEvent = event as { message?: { role?: string; content?: Array<{ type: string; text?: string }> } };\n\t\tconst message = messageEvent.message;\n\t\tif (!message || message.role !== \"assistant\") return undefined;\n\t\tconst content = Array.isArray(message.content) ? message.content : [];\n\t\tconst textParts = content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text.trim())\n\t\t\t.filter((part) => part.length > 0);\n\t\tif (textParts.length === 0) return undefined;\n\t\treturn textParts.join(\"\\n\\n\");\n\t}\n\n\tprivate escapeTelegramHtml(text: string): string {\n\t\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \""\");\n\t}\n\n\tprivate stripHtmlTags(text: string): string {\n\t\treturn text.replace(/<[^>]*>/g, \"\");\n\t}\n\n\tprivate normalizeTelegramText(text: string): string {\n\t\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\t}\n\n\tprivate renderMarkdownInlineTokens(tokens: Token[] | undefined): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"strong\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"em\":\n\t\t\t\t\toutput += `<i>${this.renderMarkdownInlineTokens(token.tokens)}</i>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"del\":\n\t\t\t\t\toutput += `<s>${this.renderMarkdownInlineTokens(token.tokens)}</s>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codespan\":\n\t\t\t\t\toutput += `<code>${this.escapeTelegramHtml(token.text)}</code>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"br\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"link\": {\n\t\t\t\t\tconst labelRaw = this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\tconst label = labelRaw.length > 0 ? labelRaw : this.escapeTelegramHtml(token.text ?? token.href);\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^(https?:\\/\\/|mailto:|tg:\\/\\/)/i.test(href)) {\n\t\t\t\t\t\toutput += `<a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${label}</a>`;\n\t\t\t\t\t} else if (href) {\n\t\t\t\t\t\toutput += `${label} (${this.escapeTelegramHtml(href)})`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += label;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"image\": {\n\t\t\t\t\tconst captionRaw = token.text?.trim();\n\t\t\t\t\tconst caption = captionRaw && captionRaw.length > 0 ? captionRaw : \"image\";\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^https?:\\/\\//i.test(href)) {\n\t\t\t\t\t\toutput += `🖼 <a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${this.escapeTelegramHtml(caption)}</a>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `🖼 ${this.escapeTelegramHtml(caption)}`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"escape\":\n\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\");\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(htmlText);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.raw);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate renderMarkdownTableCell(cell: Tokens.TableCell): string {\n\t\tconst rendered = this.renderMarkdownInlineTokens(cell.tokens);\n\t\treturn rendered.replace(/\\s+/g, \" \").trim();\n\t}\n\n\tprivate renderMarkdownBlockTokens(tokens: Token[] | undefined, listDepth = 0): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"space\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"heading\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"paragraph\":\n\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"code\":\n\t\t\t\t\toutput += `<pre>${this.escapeTelegramHtml(token.text.replace(/\\r\\n/g, \"\\n\"))}</pre>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"blockquote\": {\n\t\t\t\t\tconst rawQuote = this.normalizeTelegramText(this.renderMarkdownBlockTokens(token.tokens, listDepth));\n\t\t\t\t\tif (rawQuote.length > 0) {\n\t\t\t\t\t\tconst quoted = rawQuote\n\t\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t\t.map((line) => (line.trim().length > 0 ? `> ${line}` : \">\"))\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\t\toutput += `${quoted}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst baseIndent = \" \".repeat(listDepth);\n\t\t\t\t\tconst start = token.ordered && typeof token.start === \"number\" ? token.start : 1;\n\t\t\t\t\ttoken.items.forEach((item: Tokens.ListItem, index: number) => {\n\t\t\t\t\t\tconst marker = token.ordered ? `${start + index}.` : \"•\";\n\t\t\t\t\t\tconst renderedItem = this.normalizeTelegramText(this.renderMarkdownBlockTokens(item.tokens, listDepth + 1));\n\t\t\t\t\t\tconst fallback = this.escapeTelegramHtml(item.text ?? \"\");\n\t\t\t\t\t\tconst body = renderedItem.length > 0 ? renderedItem : fallback;\n\t\t\t\t\t\tconst lines = body.split(\"\\n\");\n\t\t\t\t\t\tconst firstLine = lines.shift() ?? \"\";\n\t\t\t\t\t\toutput += `${baseIndent}${marker} ${firstLine}\\n`;\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (line.trim().length === 0) {\n\t\t\t\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput += `${baseIndent} ${line}\\n`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"hr\":\n\t\t\t\t\toutput += \"────────\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"table\": {\n\t\t\t\t\tconst headerLine = token.header\n\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t.trim();\n\t\t\t\t\tif (headerLine.length > 0) {\n\t\t\t\t\t\toutput += `${headerLine}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const row of token.rows) {\n\t\t\t\t\t\tconst rowLine = row\n\t\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tif (rowLine.length > 0) {\n\t\t\t\t\t\t\toutput += `${rowLine}\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\").trim();\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(htmlText)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownBlockTokens(token.tokens, listDepth)}\\n`;\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.raw)}\\n`;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate markdownToTelegramHtml(markdown: string): string {\n\t\tif (!markdown || markdown.trim().length === 0) return \"\";\n\t\tconst tokens = marked.lexer(markdown, { gfm: true, breaks: true }) as Token[];\n\t\tconst rendered = this.renderMarkdownBlockTokens(tokens);\n\t\treturn this.normalizeTelegramText(rendered);\n\t}\n\n\tprivate markdownToTelegramPlainText(markdown: string): string {\n\t\tconst html = this.markdownToTelegramHtml(markdown);\n\t\treturn this.normalizeTelegramText(\n\t\t\thtml\n\t\t\t\t.replace(/<a [^>]*>([\\s\\S]*?)<\\/a>/gi, \"$1\")\n\t\t\t\t.replace(/<\\/?(b|i|s|u|code|pre)>/gi, \"\")\n\t\t\t\t.replace(/"/g, \"\\\"\")\n\t\t\t\t.replace(/</g, \"<\")\n\t\t\t\t.replace(/>/g, \">\")\n\t\t\t\t.replace(/&/g, \"&\"),\n\t\t);\n\t}\n\n\tprivate async sendRichMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst html = this.markdownToTelegramHtml(text);\n\t\tif (!html || html.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.bot.sendMessage(chatId, html, { parseMode: \"HTML\" });\n\t\t} catch {\n\t\t\tconst plain = this.markdownToTelegramPlainText(text);\n\t\t\tawait this.bot.sendMessage(chatId, plain.length > 0 ? plain : text);\n\t\t}\n\t}\n\n\tprivate formatStatusPhase(phase: string): string {\n\t\tconst lower = phase.toLowerCase();\n\t\tif (lower.includes(\"awaiting\")) return \"confirm\";\n\t\tif (lower.includes(\"tool\")) return \"tool\";\n\t\tif (lower.includes(\"final\")) return \"final\";\n\t\tif (lower.includes(\"start\")) return \"start\";\n\t\tif (lower.includes(\"permission denied\")) return \"denied\";\n\t\tif (lower.includes(\"running\")) return \"run\";\n\t\treturn lower.replace(/\\s+/g, \"-\");\n\t}\n\n\tprivate formatPromptPreview(prompt: string, limit = 100): string {\n\t\tconst cleaned = prompt.replace(/\\s+/g, \" \").trim();\n\t\tif (cleaned.length <= limit) return cleaned;\n\t\treturn `${cleaned.slice(0, limit - 1)}…`;\n\t}\n\n\tprivate statusSpinnerFrame(elapsedMs: number): string {\n\t\tconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\t\treturn frames[Math.floor(elapsedMs / 250) % frames.length] ?? \"⠋\";\n\t}\n\n\tprivate statusPulseFrame(elapsedMs: number): string {\n\t\tconst frames = [\"◼···\", \"◼•··\", \"◼••·\", \"◼•••\", \"◼••·\", \"◼•··\"];\n\t\treturn frames[Math.floor(elapsedMs / 280) % frames.length] ?? \"◼···\";\n\t}\n\n\tprivate statusDotsFrame(elapsedMs: number): string {\n\t\tconst frames = [\".\", \"..\", \"...\"];\n\t\treturn frames[Math.floor(elapsedMs / 420) % frames.length] ?? \".\";\n\t}\n\n\tprivate statusActivityLabel(turn: ActiveTurnState | undefined): string {\n\t\tif (!turn) return \"idle\";\n\t\tconst phase = turn.phase.toLowerCase();\n\t\tif (phase.includes(\"awaiting\")) return \"awaiting confirm\";\n\t\tif (phase.includes(\"tool\")) {\n\t\t\tconst tool = turn.lastTool?.trim();\n\t\t\tif (tool && tool.length > 0) {\n\t\t\t\tconst shortTool = tool.length > 18 ? `${tool.slice(0, 17)}…` : tool;\n\t\t\t\treturn `tool:${shortTool}`;\n\t\t\t}\n\t\t\treturn \"tool:running\";\n\t\t}\n\t\tif (phase.includes(\"final\")) return \"finalizing\";\n\t\tif (phase.includes(\"start\")) return \"starting\";\n\t\tif (phase.includes(\"denied\")) return \"permission denied\";\n\t\treturn \"working\";\n\t}\n\n\tprivate formatToolBadge(toolName: string | undefined): string {\n\t\tif (!toolName) return \"\";\n\t\tconst compact = toolName.trim().replace(/\\s+/g, \" \");\n\t\tconst clipped = compact.length > 18 ? `${compact.slice(0, 17)}…` : compact;\n\t\treturn ` · ${clipped}`;\n\t}\n\n\tprivate formatStartingStatus(prompt: string): string {\n\t\treturn [`⏳ ${APP_NAME} · start · 0s · q${this.queue.length}`, `“${this.formatPromptPreview(prompt, 56)}”`].join(\"\\n\");\n\t}\n\n\tprivate formatLiveStatus(turn: ActiveTurnState | undefined = this.activeTurn): string {\n\t\tif (!turn) return \"No active task.\";\n\t\tconst elapsedMs = Date.now() - turn.startedAt;\n\t\tconst elapsed = `${Math.floor(elapsedMs / 1000)}s`;\n\t\tconst spinner = this.statusSpinnerFrame(elapsedMs);\n\t\tconst pulse = this.statusPulseFrame(elapsedMs);\n\t\tconst phaseLabel = this.formatStatusPhase(turn.phase);\n\t\tconst toolSegment = this.formatToolBadge(turn.lastTool);\n\t\tconst activity = this.statusActivityLabel(turn);\n\t\treturn [\n\t\t\t`${spinner} ${APP_NAME} · ${phaseLabel}${toolSegment} · ${elapsed} · q${this.queue.length}`,\n\t\t\t`${pulse} ${activity}`,\n\t\t\t`“${this.formatPromptPreview(turn.prompt, 56)}”`,\n\t\t].join(\"\\n\");\n\t}\n\n\tprivate async editLiveStatus(force = false): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\t\tif (this.activeTurn.statusEditPending) return;\n\t\tconst turnId = this.activeTurn.turnId;\n\t\tconst now = Date.now();\n\t\tconst effectiveThrottleMs = Math.min(this.statusEditThrottleMs, LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS);\n\t\tconst waitMs = this.activeTurn.lastStatusEditAt + effectiveThrottleMs - now;\n\t\tif (!force && waitMs > 0) {\n\t\t\tthis.activeTurn.statusEditPending = true;\n\t\t\tthis.activeTurn.statusEditTimer = setTimeout(() => {\n\t\t\t\tif (this.activeTurn && this.activeTurn.turnId === turnId) {\n\t\t\t\t\tthis.activeTurn.statusEditPending = false;\n\t\t\t\t\tvoid this.editLiveStatus(true);\n\t\t\t\t}\n\t\t\t}, waitMs);\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = this.activeTurn;\n\t\tconst statusText = this.formatLiveStatus(target);\n\t\tconst editPromise = this.bot\n\t\t\t.editMessageText(target.chatId, target.statusMessageId, statusText, {\n\t\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\ttarget.lastStatusEditAt = Date.now();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t// Ignore no-op edit errors and transient \"message is not modified\".\n\t\t\t\tif (!message.toLowerCase().includes(\"message is not modified\")) {\n\t\t\t\t\tconsole.warn(`[telegram] status edit failed: ${message}`);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (target.statusEditInFlight === editPromise) {\n\t\t\t\t\ttarget.statusEditInFlight = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\ttarget.statusEditInFlight = editPromise;\n\t\tawait editPromise;\n\t}\n\n\tprivate async finishTurn(options?: { error?: string }): Promise<void> {\n\t\tconst finishedTurn = this.activeTurn;\n\t\tif (!finishedTurn) return;\n\t\tthis.activeTurn = undefined;\n\t\tif (finishedTurn.statusEditTimer) {\n\t\t\tclearTimeout(finishedTurn.statusEditTimer);\n\t\t}\n\t\tfinishedTurn.statusEditPending = false;\n\t\tif (finishedTurn.statusEditInFlight) {\n\t\t\ttry {\n\t\t\t\tawait finishedTurn.statusEditInFlight;\n\t\t\t} catch {\n\t\t\t\t// Best-effort; still continue to final status update.\n\t\t\t}\n\t\t}\n\n\t\tlet finalText: string | null = null;\n\t\tif (!options?.error) {\n\t\t\ttry {\n\t\t\t\tfinalText = await this.rpcClient.getLastAssistantText();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\toptions = {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst statusLabel = options?.error\n\t\t\t? `❌ error · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s\\n${this.formatPromptPreview(options.error, 96)}`\n\t\t\t: finishedTurn.aborted\n\t\t\t\t? `⛔ aborted · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`\n\t\t\t\t: `✅ done · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`;\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(finishedTurn.chatId, finishedTurn.statusMessageId, statusLabel, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\t// Best-effort.\n\t\t}\n\n\t\tif (options?.error) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, `Task failed: ${options.error}`);\n\t\t} else if (finalText && finalText.trim().length > 0) {\n\t\t\tawait this.sendFinalOutput(finishedTurn.chatId, finalText);\n\t\t} else if (!finishedTurn.aborted) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, \"Task completed with no assistant text output.\");\n\t\t}\n\n\t\tawait this.drainQueue();\n\t}\n\n\tprivate async sendFinalOutput(chatId: TelegramChatId, finalText: string): Promise<void> {\n\t\tif (finalText.length <= this.maxSummaryChars) {\n\t\t\tawait this.sendRichMessage(chatId, finalText);\n\t\t\treturn;\n\t\t}\n\t\tconst summary = `${finalText.slice(0, this.maxSummaryChars).trimEnd()}\\n\\n[output truncated in chat]`;\n\t\tawait this.sendRichMessage(chatId, summary);\n\t\tawait this.bot.sendTextDocument(chatId, \"iosm-output.txt\", finalText, \"Full output\");\n\t}\n\n\tprivate async drainQueue(): Promise<void> {\n\t\tif (this.activeTurn) return;\n\t\tconst next = this.queue.shift();\n\t\tif (!next) return;\n\t\tawait this.startTurn(next.chatId, next.text);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"telegram-bridge-mode.js","sourceRoot":"","sources":["../../../src/modes/telegram/telegram-bridge-mode.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentEvent } from \"@mariozechner/pi-agent-core\";\nimport { marked, type Token, type Tokens } from \"marked\";\nimport { setTimeout as sleepTimeout } from \"node:timers/promises\";\nimport { APP_NAME, VERSION } from \"../../config.js\";\nimport type { BuiltinCommandResult } from \"../../core/command-dispatcher.js\";\nimport type { SettingsManager } from \"../../core/settings-manager.js\";\nimport { RpcClient } from \"../rpc/rpc-client.js\";\nimport type {\n\tRpcBuiltinSlashCommand,\n\tRpcExtensionUIRequest,\n\tRpcRequiresConfirmationEvent,\n\tRpcSessionState,\n\tRpcSlashCommand,\n} from \"../rpc/rpc-types.js\";\n\ntype TelegramChatId = number;\n\nexport interface TelegramBridgeModeOptions {\n\t/**\n\t * Original CLI argv (without node/script prefixes). Used to forward model/profile/session args to RPC child.\n\t */\n\trawArgs: string[];\n\t/** Loaded settings manager for telegram settings and runtime updates. */\n\tsettingsManager: SettingsManager;\n\t/** Optional explicit cli path for RPC child. Defaults to current process argv[1]. */\n\tcliPath?: string;\n\t/** Optional cwd override for RPC child. */\n\tcwd?: string;\n}\n\ninterface TelegramUser {\n\tid: number;\n\tusername?: string;\n}\n\ninterface TelegramChat {\n\tid: number;\n\ttype: string;\n}\n\ninterface TelegramMessage {\n\tmessage_id: number;\n\tfrom?: TelegramUser;\n\tchat: TelegramChat;\n\tdate: number;\n\ttext?: string;\n}\n\ninterface TelegramCallbackQuery {\n\tid: string;\n\tfrom: TelegramUser;\n\tdata?: string;\n\tmessage?: TelegramMessage;\n}\n\ninterface TelegramUpdate {\n\tupdate_id: number;\n\tmessage?: TelegramMessage;\n\tcallback_query?: TelegramCallbackQuery;\n}\n\ninterface TelegramApiEnvelope<T> {\n\tok: boolean;\n\tresult?: T;\n\tdescription?: string;\n\terror_code?: number;\n}\n\ninterface TelegramInlineKeyboardMarkup {\n\tinline_keyboard: Array<Array<{ text: string; callback_data: string }>>;\n}\n\ninterface TelegramReplyKeyboardMarkup {\n\tkeyboard: Array<Array<{ text: string }>>;\n\tresize_keyboard?: boolean;\n\tis_persistent?: boolean;\n\tone_time_keyboard?: boolean;\n\tinput_field_placeholder?: string;\n}\n\ntype TelegramReplyMarkup = TelegramInlineKeyboardMarkup | TelegramReplyKeyboardMarkup;\n\ninterface ActiveTurnState {\n\tturnId: number;\n\tchatId: TelegramChatId;\n\tprompt: string;\n\tstartedAt: number;\n\tstatusMessageId: number;\n\tphase: string;\n\tlastTool?: string;\n\taborted: boolean;\n\tstatusEditPending: boolean;\n\tstatusEditTimer?: NodeJS.Timeout;\n\tstatusEditInFlight?: Promise<void>;\n\tlastStatusEditAt: number;\n}\n\ninterface PendingConfirmation {\n\tchatId: TelegramChatId;\n\trequestId: string;\n\tlabel: string;\n\tgroupKey: string;\n}\n\ninterface CommandCatalogEntry {\n\tname: string;\n\tdescription?: string;\n\tsource: \"builtin\" | \"extension\" | \"prompt\" | \"skill\";\n\tcommandText: string;\n}\n\ntype CommandMenuView = \"main\" | \"all\";\n\ninterface ModelCatalogEntry {\n\tprovider: string;\n\tid: string;\n\tcontextWindow: number;\n\treasoning: boolean;\n}\n\ntype HubView = \"compact\" | \"details\";\n\nconst COMMANDS_PAGE_SIZE = 8;\nconst COMMAND_MENU_TTL_MS = 5 * 60 * 1000;\nconst MODELS_PAGE_SIZE = 8;\nconst MODEL_MENU_TTL_MS = 2 * 60 * 1000;\nconst LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS = 850;\nconst INPUT_BUTTON_HUB = \"🧭 Hub\";\nconst INPUT_BUTTON_START = \"▶️ Start\";\nconst INPUT_BUTTON_NEW = \"🆕 New\";\nconst INPUT_BUTTON_COMMANDS = \"⚡ Cmd\";\nconst INPUT_BUTTON_HELP = \"❓ Help\";\nconst INPUT_BUTTON_ABORT = \"⛔ Abort\";\nconst INPUT_BUTTON_STOP = \"🛑 Stop\";\nconst MAIN_COMMAND_MENU: CommandCatalogEntry[] = [\n\t{\n\t\tname: \"model\",\n\t\tdescription: \"Choose active model\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/model\",\n\t},\n\t{\n\t\tname: \"status\",\n\t\tdescription: \"Show control hub status\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/status\",\n\t},\n\t{\n\t\tname: \"new\",\n\t\tdescription: \"Start a new session\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/new\",\n\t},\n\t{\n\t\tname: \"abort\",\n\t\tdescription: \"Abort active task\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/abort\",\n\t},\n\t{\n\t\tname: \"permissions\",\n\t\tdescription: \"Show permission mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/permissions status\",\n\t},\n\t{\n\t\tname: \"yolo\",\n\t\tdescription: \"Show YOLO mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/yolo status\",\n\t},\n\t{\n\t\tname: \"help\",\n\t\tdescription: \"Show command help\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/help\",\n\t},\n\t{\n\t\tname: \"stop\",\n\t\tdescription: \"Stop bridge and cancel active work\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/stop\",\n\t},\n];\n\nclass TelegramBotApi {\n\tconstructor(private readonly token: string) {}\n\n\tprivate get endpoint(): string {\n\t\treturn `https://api.telegram.org/bot${this.token}`;\n\t}\n\n\tasync getMe(): Promise<{ id: number; username?: string }> {\n\t\treturn this.call(\"getMe\", {});\n\t}\n\n\tasync getUpdates(offset: number, timeoutSeconds: number): Promise<TelegramUpdate[]> {\n\t\treturn this.call(\"getUpdates\", {\n\t\t\toffset,\n\t\t\ttimeout: timeoutSeconds,\n\t\t\tallowed_updates: [\"message\", \"callback_query\"],\n\t\t});\n\t}\n\n\tasync sendMessage(\n\t\tchatId: TelegramChatId,\n\t\ttext: string,\n\t\toptions?: {\n\t\t\treplyMarkup?: TelegramReplyMarkup;\n\t\t\tdisableNotification?: boolean;\n\t\t\tparseMode?: \"HTML\";\n\t\t},\n\t): Promise<TelegramMessage> {\n\t\treturn this.call(\"sendMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t\tdisable_notification: options?.disableNotification ?? false,\n\t\t\tparse_mode: options?.parseMode,\n\t\t});\n\t}\n\n\tasync editMessageText(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\ttext: string,\n\t\toptions?: { replyMarkup?: TelegramInlineKeyboardMarkup },\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageText\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t});\n\t}\n\n\tasync editMessageReplyMarkup(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\treplyMarkup?: TelegramInlineKeyboardMarkup,\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageReplyMarkup\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\treply_markup: replyMarkup,\n\t\t});\n\t}\n\n\tasync deleteMessage(chatId: TelegramChatId, messageId: number): Promise<boolean> {\n\t\treturn this.call(\"deleteMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t});\n\t}\n\n\tasync answerCallbackQuery(callbackQueryId: string, text?: string): Promise<boolean> {\n\t\treturn this.call(\"answerCallbackQuery\", {\n\t\t\tcallback_query_id: callbackQueryId,\n\t\t\ttext,\n\t\t\tshow_alert: false,\n\t\t});\n\t}\n\n\tasync sendTextDocument(chatId: TelegramChatId, filename: string, content: string, caption?: string): Promise<TelegramMessage> {\n\t\tconst form = new FormData();\n\t\tform.set(\"chat_id\", String(chatId));\n\t\tif (caption) {\n\t\t\tform.set(\"caption\", caption);\n\t\t}\n\t\tform.set(\"document\", new Blob([content], { type: \"text/plain\" }), filename);\n\t\treturn this.callMultipart(\"sendDocument\", form);\n\t}\n\n\tprivate async call<T>(method: string, payload: Record<string, unknown>): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n\n\tprivate async callMultipart<T>(method: string, form: FormData): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: form,\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n}\n\nexport async function runTelegramBridgeMode(options: TelegramBridgeModeOptions): Promise<never> {\n\tconst mode = new TelegramBridgeRuntime(options);\n\tawait mode.run();\n\t// run() loops forever unless it throws; keep Promise<never> contract explicit.\n\treturn new Promise(() => {});\n}\n\nclass TelegramBridgeRuntime {\n\tprivate readonly settingsManager: SettingsManager;\n\tprivate readonly bot: TelegramBotApi;\n\tprivate readonly allowedUserIds: Set<number>;\n\tprivate readonly statusEditThrottleMs: number;\n\tprivate readonly maxSummaryChars: number;\n\tprivate readonly rpcClient: RpcClient;\n\tprivate readonly queue: Array<{ chatId: TelegramChatId; text: string }> = [];\n\tprivate readonly pendingConfirmations = new Map<string, PendingConfirmation>();\n\tprivate readonly pendingConfirmationGroupIdsByKey = new Map<string, Set<string>>();\n\tprivate readonly commandCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: CommandCatalogEntry[] }>();\n\tprivate readonly modelCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: ModelCatalogEntry[] }>();\n\tprivate readonly hubMessageIdByChat = new Map<TelegramChatId, number>();\n\tprivate readonly hubViewByChat = new Map<TelegramChatId, HubView>();\n\tprivate readonly inputMenuEnabledByChat = new Set<TelegramChatId>();\n\tprivate nextUpdateOffset = 0;\n\tprivate nextTurnId = 1;\n\tprivate activeTurn: ActiveTurnState | undefined;\n\tprivate activeSessionState: RpcSessionState | undefined;\n\tprivate lastAuthorizedChatId: TelegramChatId | undefined;\n\tprivate rpcConnected = false;\n\tprivate bridgeStopped = false;\n\n\tconstructor(private readonly options: TelegramBridgeModeOptions) {\n\t\tthis.settingsManager = options.settingsManager;\n\t\tconst telegramSettings = this.settingsManager.getTelegramSettings();\n\t\tif (!telegramSettings.enabled) {\n\t\t\tthrow new Error(\"Telegram bridge is disabled in settings (telegram.enabled=false).\");\n\t\t}\n\t\tif (!telegramSettings.botToken) {\n\t\t\tthrow new Error(\"Telegram bridge requires settings.telegram.botToken.\");\n\t\t}\n\t\tif (telegramSettings.allowedUserIds.length === 0) {\n\t\t\tthrow new Error(\"Telegram bridge requires at least one allowed user ID in settings.telegram.allowedUserIds.\");\n\t\t}\n\t\tif (telegramSettings.transport !== \"long-polling\") {\n\t\t\tthrow new Error(`Unsupported telegram transport: ${telegramSettings.transport}`);\n\t\t}\n\n\t\tthis.bot = new TelegramBotApi(telegramSettings.botToken);\n\t\tthis.allowedUserIds = new Set(telegramSettings.allowedUserIds);\n\t\tthis.statusEditThrottleMs = telegramSettings.chatDefaults.statusEditThrottleMs;\n\t\tthis.maxSummaryChars = telegramSettings.chatDefaults.maxSummaryChars;\n\t\tthis.rpcClient = new RpcClient({\n\t\t\tcliPath: options.cliPath,\n\t\t\tcwd: options.cwd,\n\t\t\targs: this.buildRpcForwardedArgs(options.rawArgs),\n\t\t});\n\t}\n\n\tasync run(): Promise<void> {\n\t\tconst me = await this.bot.getMe();\n\t\tawait this.startRpc();\n\t\tconsole.log(`[telegram] bridge online as @${me.username ?? \"unknown\"} (${me.id})`);\n\n\t\tconst shutdown = async (signal: string) => {\n\t\t\tconsole.log(`[telegram] received ${signal}, stopping bridge...`);\n\t\t\ttry {\n\t\t\t\tawait this.rpcClient.stop();\n\t\t\t} finally {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t};\n\t\tprocess.once(\"SIGINT\", () => {\n\t\t\tvoid shutdown(\"SIGINT\");\n\t\t});\n\t\tprocess.once(\"SIGTERM\", () => {\n\t\t\tvoid shutdown(\"SIGTERM\");\n\t\t});\n\n\t\tthis.rpcClient.onEvent((event) => {\n\t\t\tvoid this.onRpcEvent(event);\n\t\t});\n\t\tthis.rpcClient.onExtensionUIRequest((request) => {\n\t\t\tvoid this.onRpcExtensionUiRequest(request);\n\t\t});\n\t\tthis.rpcClient.onRequiresConfirmation((event) => {\n\t\t\tvoid this.onRpcConfirmationRequest(event);\n\t\t});\n\n\t\t// Keep polling forever.\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst updates = await this.bot.getUpdates(this.nextUpdateOffset, 25);\n\t\t\t\tfor (const update of updates) {\n\t\t\t\t\tthis.nextUpdateOffset = Math.max(this.nextUpdateOffset, update.update_id + 1);\n\t\t\t\t\tawait this.handleUpdate(update);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[telegram] polling error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\tawait sleepTimeout(2_000);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate buildRpcForwardedArgs(rawArgs: string[]): string[] {\n\t\tconst forwarded: string[] = [];\n\t\tfor (let i = 0; i < rawArgs.length; i++) {\n\t\t\tconst arg = rawArgs[i];\n\t\t\tif (i === 0 && arg === \"telegram\") continue;\n\t\t\tif (arg === \"--mode\") {\n\t\t\t\t// RPC mode is enforced by RpcClient; ignore any caller-provided mode.\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforwarded.push(arg);\n\t\t}\n\t\treturn forwarded;\n\t}\n\n\tprivate async startRpc(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rpcClient.start();\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tthrow new Error(`Failed to start RPC child: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async restartRpc(): Promise<void> {\n\t\tawait this.rpcClient.stop();\n\t\tawait this.startRpc();\n\t}\n\n\tprivate async ensureRpcConnected(): Promise<void> {\n\t\tif (this.rpcConnected) return;\n\t\tawait this.restartRpc();\n\t}\n\n\tprivate isAuthorizedUser(userId: number | undefined): userId is number {\n\t\treturn typeof userId === \"number\" && this.allowedUserIds.has(userId);\n\t}\n\n\tprivate buildInputMenuKeyboard(stopped = this.bridgeStopped): TelegramReplyKeyboardMarkup {\n\t\tif (stopped) {\n\t\t\treturn {\n\t\t\t\tkeyboard: [[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_START }], [{ text: INPUT_BUTTON_HELP }]],\n\t\t\t\tresize_keyboard: true,\n\t\t\t\tis_persistent: true,\n\t\t\t\tinput_field_placeholder: \"Bridge stopped. Tap Start to resume\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkeyboard: [\n\t\t\t\t[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_NEW }, { text: INPUT_BUTTON_COMMANDS }],\n\t\t\t\t[{ text: INPUT_BUTTON_HELP }, { text: INPUT_BUTTON_ABORT }, { text: INPUT_BUTTON_STOP }],\n\t\t\t],\n\t\t\tresize_keyboard: true,\n\t\t\tis_persistent: true,\n\t\t\tinput_field_placeholder: \"Write a task or pick an action\",\n\t\t};\n\t}\n\n\tprivate async ensureInputMenu(chatId: TelegramChatId, force = false): Promise<void> {\n\t\tif (!force && this.inputMenuEnabledByChat.has(chatId)) return;\n\t\tconst notice = force ? \"Quick actions updated ↓\" : \"Quick actions ready ↓\";\n\t\tawait this.bot.sendMessage(chatId, notice, {\n\t\t\treplyMarkup: this.buildInputMenuKeyboard(),\n\t\t\tdisableNotification: true,\n\t\t});\n\t\tthis.inputMenuEnabledByChat.add(chatId);\n\t}\n\n\tprivate normalizeInputActionText(text: string): string {\n\t\treturn text\n\t\t\t.normalize(\"NFKC\")\n\t\t\t.replace(/\\uFE0F/g, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^\\p{Letter}\\p{Number} ]+/gu, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t}\n\n\tprivate mapInputMenuAction(text: string): string | undefined {\n\t\tconst normalized = this.normalizeInputActionText(text);\n\t\tswitch (normalized) {\n\t\t\tcase \"start\":\n\t\t\tcase \"resume\":\n\t\t\tcase \"старт\":\n\t\t\tcase \"запуск\":\n\t\t\t\treturn \"/start\";\n\t\t\tcase \"hub\":\n\t\t\tcase \"status\":\n\t\t\tcase \"хаб\":\n\t\t\tcase \"статус\":\n\t\t\t\treturn \"/status\";\n\t\t\tcase \"new\":\n\t\t\tcase \"new session\":\n\t\t\tcase \"новая\":\n\t\t\tcase \"новая сессия\":\n\t\t\tcase \"новый\":\n\t\t\t\treturn \"/new\";\n\t\t\tcase \"cmd\":\n\t\t\tcase \"command\":\n\t\t\tcase \"commands\":\n\t\t\tcase \"команда\":\n\t\t\tcase \"команды\":\n\t\t\t\treturn \"/commands\";\n\t\t\tcase \"help\":\n\t\t\tcase \"помощь\":\n\t\t\tcase \"хелп\":\n\t\t\t\treturn \"/help\";\n\t\t\tcase \"abort\":\n\t\t\tcase \"cancel\":\n\t\t\tcase \"прервать\":\n\t\t\tcase \"отмена\":\n\t\t\t\treturn \"/abort\";\n\t\t\tcase \"stop\":\n\t\t\tcase \"стоп\":\n\t\t\t\treturn \"/stop\";\n\t\t}\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_START)) return \"/start\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HUB)) return \"/status\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_NEW)) return \"/new\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_COMMANDS)) return \"/commands\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HELP)) return \"/help\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_ABORT)) return \"/abort\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_STOP)) return \"/stop\";\n\t\treturn undefined;\n\t}\n\n\tprivate async handleUpdate(update: TelegramUpdate): Promise<void> {\n\t\tif (update.callback_query) {\n\t\t\tawait this.handleCallbackQuery(update.callback_query);\n\t\t\treturn;\n\t\t}\n\t\tif (!update.message?.text) return;\n\n\t\tconst message = update.message;\n\t\tconst userId = message.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tconsole.warn(\n\t\t\t\t`[telegram] unauthorized message ignored (user=${userId ?? \"unknown\"}, chat=${message.chat.id})`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastAuthorizedChatId = message.chat.id;\n\t\tconst text = (message.text ?? \"\").trim();\n\t\tif (text.length === 0) return;\n\t\tif (!this.inputMenuEnabledByChat.has(message.chat.id)) {\n\t\t\tawait this.ensureInputMenu(message.chat.id);\n\t\t}\n\n\t\tconst quickActionCommand = this.mapInputMenuAction(text);\n\t\tif (quickActionCommand) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, quickActionCommand);\n\t\t\treturn;\n\t\t}\n\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, text);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(message.chat.id, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.enqueuePrompt(message.chat.id, text);\n\t}\n\n\tprivate async handleCallbackQuery(callback: TelegramCallbackQuery): Promise<void> {\n\t\tconst userId = callback.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Unauthorized\");\n\t\t\tconsole.warn(`[telegram] unauthorized callback ignored (user=${userId ?? \"unknown\"})`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = callback.data?.trim();\n\t\tif (!data) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"confirm:\")) {\n\t\t\tconst [, requestId, decision] = data.split(\":\");\n\t\t\tif (!requestId || (decision !== \"yes\" && decision !== \"no\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Invalid confirmation payload\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst confirmed = decision === \"yes\";\n\t\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\t\tawait this.respondConfirmation(requestId, confirmed);\n\t\t\tconst confirmChatId = callback.message?.chat.id;\n\t\t\tconst confirmMessageId = callback.message?.message_id;\n\t\t\tif (confirmChatId && typeof confirmMessageId === \"number\") {\n\t\t\t\tawait this.updateConfirmationDecisionMessage(confirmChatId, confirmMessageId, confirmed, pending?.label);\n\t\t\t\tawait this.moveLiveStatusToBottom(confirmChatId);\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, confirmed ? \"Approved\" : \"Denied\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"hub:\")) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.handleHubAction(callback.message?.chat.id, data.slice(4));\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"live:\")) {\n\t\t\tawait this.handleLiveAction(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"cmd:\")) {\n\t\t\tawait this.handleCommandMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"model:\")) {\n\t\t\tawait this.handleModelMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleHubAction(chatId: TelegramChatId | undefined, action: string): Promise<void> {\n\t\tif (!chatId) return;\n\t\tconst stoppedSafeActions = new Set([\"status\", \"refresh\", \"details\", \"compact\", \"start\", \"help\"]);\n\t\tif (this.bridgeStopped && !stoppedSafeActions.has(action)) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tswitch (action) {\n\t\t\tcase \"start\":\n\t\t\t\tawait this.handleCommandMessage(chatId, \"/start\");\n\t\t\t\treturn;\n\t\t\tcase \"help\":\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"prompt\":\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Send any text to start a task.\");\n\t\t\t\treturn;\n\t\t\tcase \"commands\":\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\tcase \"new\": {\n\t\t\t\tawait this.runNewSession(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"permissions\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"toggle_mode\":\n\t\t\t\tawait this.togglePermissionMode(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"model\":\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\tcase \"status\":\n\t\t\tcase \"refresh\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\tcase \"details\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"compact\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"compact\" });\n\t\t\t\treturn;\n\t\t\tcase \"abort\":\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Action is not implemented yet in Telegram bridge.\");\n\t\t}\n\t}\n\n\tprivate async runNewSession(chatId: TelegramChatId): Promise<void> {\n\t\tconst handled = await this.runBuiltinCommand(chatId, \"/new\");\n\t\tif (!handled) {\n\t\t\tawait this.enqueuePrompt(chatId, \"/new\");\n\t\t}\n\t}\n\n\tprivate async switchMenuMessageToHub(chatId: TelegramChatId, messageId?: number): Promise<void> {\n\t\tif (messageId) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, messageId);\n\t\t}\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t}\n\n\tprivate async clearInlineKeyboard(chatId: TelegramChatId, messageId: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bot.editMessageReplyMarkup(chatId, messageId, { inline_keyboard: [] });\n\t\t} catch {\n\t\t\t// Best-effort cleanup of stale buttons.\n\t\t}\n\t}\n\n\tprivate buildConfirmationResolvedText(confirmed: boolean, label?: string): string {\n\t\tconst status = confirmed ? \"✅ Allowed\" : \"❌ Denied\";\n\t\tif (!label) return status;\n\t\tconst lines = label\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t\tconst detail = lines.find((line) => !/^permission required$/i.test(line)) ?? lines[0];\n\t\tif (!detail) return status;\n\t\tconst clipped = detail.length > 120 ? `${detail.slice(0, 119)}…` : detail;\n\t\treturn `${status}\\n${clipped}`;\n\t}\n\n\tprivate async updateConfirmationDecisionMessage(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\tconfirmed: boolean,\n\t\tlabel?: string,\n\t): Promise<void> {\n\t\tconst text = this.buildConfirmationResolvedText(confirmed, label);\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(chatId, messageId, text, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\tawait this.clearInlineKeyboard(chatId, messageId);\n\t\t}\n\t}\n\n\tprivate async moveLiveStatusToBottom(chatId: TelegramChatId): Promise<void> {\n\t\tconst turn = this.activeTurn;\n\t\tif (!turn || turn.chatId !== chatId) return;\n\t\tconst previousStatusId = turn.statusMessageId;\n\t\ttry {\n\t\t\tconst fresh = await this.bot.sendMessage(chatId, this.formatLiveStatus());\n\t\t\tturn.statusMessageId = fresh.message_id;\n\t\t\tturn.lastStatusEditAt = Date.now();\n\t\t\tif (previousStatusId !== fresh.message_id) {\n\t\t\t\tawait this.bot.deleteMessage(chatId, previousStatusId).catch(() => {});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Best-effort relocation; keep existing status message on failure.\n\t\t}\n\t}\n\n\tprivate async handleLiveAction(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tconst [, action] = data.split(\":\");\n\t\tif (!action) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped && action !== \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"commands\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"model\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"new\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"New session\");\n\t\t\tawait this.runNewSession(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"abort\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Aborting...\");\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"stop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping...\");\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleCommandMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst [commandRaw, ...rest] = text.split(/\\s+/);\n\t\tconst command = (commandRaw.toLowerCase().split(\"@\")[0] ?? commandRaw.toLowerCase()).trim();\n\n\t\tif (command === \"/start\") {\n\t\t\tthis.bridgeStopped = false;\n\t\t\tawait this.sendStart(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/help\") {\n\t\t\tawait this.sendHelp(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/menu\") {\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/status\") {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/stop\") {\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/commands\") {\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/abort\") {\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/yolo\") {\n\t\t\tawait this.handleYoloCommand(chatId, rest);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/model\" && rest.join(\" \").trim().length === 0) {\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst handled = await this.runBuiltinCommand(chatId, text);\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to raw slash prompt to support extension/prompt-template/skill slash commands.\n\t\tawait this.enqueuePrompt(chatId, text);\n\t}\n\n\tprivate async runBuiltinCommand(chatId: TelegramChatId, commandText: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst result = await this.rpcClient.runBuiltinCommand(commandText);\n\t\t\tthis.rpcConnected = true;\n\t\t\tif (!result.handled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tawait this.sendBuiltinCommandResult(chatId, result);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async sendBuiltinCommandResult(chatId: TelegramChatId, result: BuiltinCommandResult): Promise<void> {\n\t\tif (result.message) {\n\t\t\tconst prefix = result.level === \"error\" ? \"Error: \" : result.level === \"warning\" ? \"Warning: \" : \"\";\n\t\t\tawait this.bot.sendMessage(chatId, `${prefix}${result.message}`);\n\t\t}\n\t\tif (result.text) {\n\t\t\tawait this.sendFinalOutput(chatId, result.text);\n\t\t}\n\t\tif (result.filePath) {\n\t\t\tawait this.bot.sendMessage(chatId, `File: ${result.filePath}`);\n\t\t}\n\t}\n\n\tprivate async sendStart(chatId: TelegramChatId): Promise<void> {\n\t\tawait this.sendStatusCard(chatId, {\n\t\t\theader: `Control Hub · ${APP_NAME} v${VERSION}`,\n\t\t\tincludeKeyboard: true,\n\t\t\tpreferEditHub: false,\n\t\t});\n\t\tawait this.ensureInputMenu(chatId, true);\n\t}\n\n\tprivate async sendHelp(chatId: TelegramChatId): Promise<void> {\n\t\tconst help = [\n\t\t\t\"IOSM Telegram · Quick Guide\",\n\t\t\t\"\",\n\t\t\t\"What the agent can do\",\n\t\t\t\"- Analyze your codebase and explain behavior\",\n\t\t\t\"- Create/edit files and refactor code\",\n\t\t\t\"- Run shell commands, investigate failures, fix tests\",\n\t\t\t\"- Work with git changes and repository context\",\n\t\t\t\"- Prepare concise result summaries\",\n\t\t\t\"\",\n\t\t\t\"Tools the agent uses\",\n\t\t\t\"- Shell tools: bash/zsh commands for diagnostics and automation\",\n\t\t\t\"- Code tools: search (rg), read/edit files, refactor project code\",\n\t\t\t\"- Validation tools: run tests, linters, build checks\",\n\t\t\t\"- Git tools: inspect diffs/status, create safe code changes\",\n\t\t\t\"- In ASK mode, dangerous tool actions require Allow/Deny\",\n\t\t\t\"\",\n\t\t\t\"How to ask\",\n\t\t\t\"- Write a plain task: what to do + where + expected output\",\n\t\t\t\"- Example: \\\"Find why tests fail and fix them\\\"\",\n\t\t\t\"- Example: \\\"Find large files and propose safe cleanup\\\"\",\n\t\t\t\"\",\n\t\t\t\"Quick buttons\",\n\t\t\t\"- 🧭 Hub: current status/model/mode\",\n\t\t\t\"- ⚡ Cmd: command/action center\",\n\t\t\t\"- 🆕 New: start a new session\",\n\t\t\t\"- ⛔ Abort: stop current task\",\n\t\t\t\"- 🛑 Stop: stop bridge\",\n\t\t\t\"\",\n\t\t\t\"Models and permissions\",\n\t\t\t\"- /model: choose model\",\n\t\t\t\"- ASK mode: dangerous actions require Allow/Deny\",\n\t\t\t\"- /yolo on|off|status: confirmation mode control\",\n\t\t\t\"\",\n\t\t\t\"Useful commands\",\n\t\t\t\"/status /commands /model /menu /help\",\n\t\t\t\"\",\n\t\t\t\"Tip: phrase tasks like \\\"do X, verify Y, report result\\\".\",\n\t\t].join(\"\\n\");\n\t\tawait this.bot.sendMessage(chatId, help);\n\t}\n\n\tprivate buildDefaultCommandText(name: string): string {\n\t\tconst lower = name.toLowerCase();\n\t\tswitch (lower) {\n\t\t\tcase \"permissions\":\n\t\t\t\treturn \"/permissions status\";\n\t\t\tcase \"yolo\":\n\t\t\t\treturn \"/yolo status\";\n\t\t\tcase \"checkpoint\":\n\t\t\t\treturn \"/checkpoint list\";\n\t\t\tcase \"rollback\":\n\t\t\t\treturn \"/rollback list\";\n\t\t\tcase \"tree\":\n\t\t\t\treturn \"/tree list\";\n\t\t\tdefault:\n\t\t\t\treturn `/${name}`;\n\t\t}\n\t}\n\n\tprivate mapBuiltinCommands(commands: RpcBuiltinSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: \"builtin\" as const,\n\t\t\tcommandText: this.buildDefaultCommandText(command.name),\n\t\t}));\n\t}\n\n\tprivate mapExternalCommands(commands: RpcSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: command.source,\n\t\t\tcommandText: `/${command.name}`,\n\t\t}));\n\t}\n\n\tprivate getLocalBridgeCommands(): CommandCatalogEntry[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"commands\",\n\t\t\t\tdescription: \"Open paged command buttons\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/commands\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"model\",\n\t\t\t\tdescription: \"Open model picker\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/model\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"status\",\n\t\t\t\tdescription: \"Show runtime status\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/status\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abort\",\n\t\t\t\tdescription: \"Abort active task\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/abort\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"stop\",\n\t\t\t\tdescription: \"Stop bridge and cancel active work\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/stop\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate commandButtonLabel(entry: CommandCatalogEntry, view: CommandMenuView): string {\n\t\tif (view === \"all\") {\n\t\t\tconst raw = entry.commandText.startsWith(\"/\") ? entry.commandText : `/${entry.name}`;\n\t\t\treturn raw.length > 24 ? `${raw.slice(0, 23)}…` : raw;\n\t\t}\n\t\tconst key = entry.commandText.toLowerCase();\n\t\tswitch (key) {\n\t\t\tcase \"/model\":\n\t\t\t\treturn \"🤖 Model\";\n\t\t\tcase \"/status\":\n\t\t\t\treturn \"🔄 Status\";\n\t\t\tcase \"/new\":\n\t\t\t\treturn \"🆕 New\";\n\t\t\tcase \"/abort\":\n\t\t\t\treturn \"⛔ Abort\";\n\t\t\tcase \"/permissions status\":\n\t\t\t\treturn \"🛡 Mode\";\n\t\t\tcase \"/yolo status\":\n\t\t\t\treturn \"⚠️ YOLO\";\n\t\t\tcase \"/help\":\n\t\t\t\treturn \"❓ Help\";\n\t\t\tcase \"/stop\":\n\t\t\t\treturn \"🛑 Stop\";\n\t\t\tdefault:\n\t\t\t\treturn entry.commandText;\n\t\t}\n\t}\n\n\tprivate async getCommandCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<CommandCatalogEntry[]> {\n\t\tconst cached = this.commandCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < COMMAND_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst [builtin, dynamic] = await Promise.all([\n\t\t\tthis.rpcClient.getBuiltinCommands(),\n\t\t\tthis.rpcClient.getCommands(),\n\t\t]);\n\t\tthis.rpcConnected = true;\n\n\t\tconst entries: CommandCatalogEntry[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const entry of this.getLocalBridgeCommands()) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\t\tfor (const entry of this.mapBuiltinCommands(builtin)) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tconst dynamicEntries = this.mapExternalCommands(dynamic).sort((a, b) => a.name.localeCompare(b.name));\n\t\tfor (const entry of dynamicEntries) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tthis.commandCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildCommandMenuKeyboard(\n\t\tentries: CommandCatalogEntry[],\n\t\tpage: number,\n\t\tview: CommandMenuView,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * COMMANDS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + COMMANDS_PAGE_SIZE);\n\n\t\tconst commandRows: Array<Array<{ text: string; callback_data: string }>> = [];\n\t\tfor (let index = 0; index < pageEntries.length; index += 2) {\n\t\t\tconst left = pageEntries[index];\n\t\t\tconst right = pageEntries[index + 1];\n\t\t\tconst row: Array<{ text: string; callback_data: string }> = [];\n\t\t\tif (left) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(left, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (right) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(right, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index + 1}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (row.length > 0) {\n\t\t\t\tcommandRows.push(row);\n\t\t\t}\n\t\t}\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `cmd:page:${view}:${normalizedPage - 1}` : \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `cmd:page:${view}:${normalizedPage + 1}` : \"cmd:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...commandRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: view === \"main\" ? \"All Commands\" : \"Main Commands\",\n\t\t\t\t\t\tcallback_data: `cmd:view:${view === \"main\" ? \"all\" : \"main\"}:0`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: \"Refresh\",\n\t\t\t\t\t\tcallback_data: view === \"all\" ? `cmd:refresh:${view}:${normalizedPage}` : `cmd:view:${view}:0`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"cmd:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"cmd:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendCommandMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean; view?: CommandMenuView },\n\t): Promise<void> {\n\t\tlet entries: CommandCatalogEntry[] = [];\n\t\tconst view = options?.view ?? \"main\";\n\t\ttry {\n\t\t\tentries = view === \"main\" ? MAIN_COMMAND_MENU : await this.getCommandCatalog(chatId, options?.refreshCatalog === true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load commands: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t`Command Center · ${APP_NAME}`,\n\t\t\t`${view === \"main\" ? \"Main Actions\" : \"All Commands\"} · ${normalizedPage + 1}/${pageCount}`,\n\t\t\t`${entries.length} items`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildCommandMenuKeyboard(entries, normalizedPage, view);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback below: send a new message if editing failed.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleCommandMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst parts = data.split(\":\");\n\t\tconst action = parts[1] ?? \"\";\n\t\tconst rawView = parts[2];\n\t\tlet view: CommandMenuView = rawView === \"all\" ? \"all\" : \"main\";\n\t\tlet value = parts[3];\n\t\t// Backward compatibility with older callback payloads: cmd:<action>:<value>.\n\t\tif ((action === \"page\" || action === \"refresh\" || action === \"run\") && parts.length === 3) {\n\t\t\tview = \"main\";\n\t\t\tvalue = parts[2];\n\t\t}\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"view\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: view === \"all\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"run\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: CommandCatalogEntry[] = [];\n\t\t\tif (view === \"main\") {\n\t\t\t\tentries = MAIN_COMMAND_MENU;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tentries = await this.getCommandCatalog(chatId, false);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.rpcConnected = false;\n\t\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to load command catalog\");\n\t\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\t\tchatId,\n\t\t\t\t\t\t`Failed to load commands: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Command list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/model\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Open model picker\");\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/status\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/help\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/abort\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Abort signal sent\");\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText.startsWith(\"/yolo\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tconst parts = entry.commandText.split(/\\s+/).slice(1);\n\t\t\t\tawait this.handleYoloCommand(chatId, parts);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/stop\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping bridge\");\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/commands\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Run ${entry.commandText}`);\n\t\t\tconst handled = await this.runBuiltinCommand(chatId, entry.commandText);\n\t\t\tif (!handled) {\n\t\t\t\tawait this.enqueuePrompt(chatId, entry.commandText);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate modelKey(model: { provider: string; id: string } | undefined): string | undefined {\n\t\tif (!model) return undefined;\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate async getModelCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<ModelCatalogEntry[]> {\n\t\tconst cached = this.modelCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < MODEL_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst entries = (await this.rpcClient.getAvailableModels())\n\t\t\t.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tid: model.id,\n\t\t\t\tcontextWindow: model.contextWindow,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t}))\n\t\t\t.sort((a, b) => this.modelKey(a)!.localeCompare(this.modelKey(b)!));\n\t\tthis.rpcConnected = true;\n\t\tthis.modelCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildModelMenuKeyboard(\n\t\tentries: ModelCatalogEntry[],\n\t\tpage: number,\n\t\tcurrentModelKey: string | undefined,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * MODELS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + MODELS_PAGE_SIZE);\n\n\t\tconst modelRows = pageEntries.map((entry, index) => {\n\t\t\tconst key = this.modelKey(entry);\n\t\t\tconst selectedPrefix = key === currentModelKey ? \"✅ \" : \"\";\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\ttext: `${selectedPrefix}${entry.provider}/${entry.id}`,\n\t\t\t\t\tcallback_data: `model:set:${start + index}`,\n\t\t\t\t},\n\t\t\t];\n\t\t});\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `model:page:${normalizedPage - 1}` : \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `model:page:${normalizedPage + 1}` : \"model:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...modelRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Cycle\", callback_data: \"model:cycle\" },\n\t\t\t\t\t{ text: \"Refresh\", callback_data: `model:refresh:${normalizedPage}` },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"model:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"model:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendModelMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean },\n\t): Promise<void> {\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tlet entries: ModelCatalogEntry[] = [];\n\t\ttry {\n\t\t\tentries = await this.getModelCatalog(chatId, options?.refreshCatalog === true);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (entries.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No models available. Configure models in settings and retry.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentModelKey = this.modelKey(this.activeSessionState?.model);\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t\"Model Picker\",\n\t\t\t`Current: ${currentModelKey ?? \"not selected\"}`,\n\t\t\t`Available: ${entries.length}`,\n\t\t\t`Page: ${normalizedPage + 1}/${pageCount}`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildModelMenuKeyboard(entries, normalizedPage, currentModelKey);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback to sending a fresh message.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleModelMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst [, action, value] = data.split(\":\");\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"cycle\") {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tconst cycled = await this.rpcClient.cycleModel();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(\n\t\t\t\t\tcallback.id,\n\t\t\t\t\tcycled ? `Model: ${cycled.model.provider}/${cycled.model.id}` : \"No model candidates\",\n\t\t\t\t);\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { messageId, refreshCatalog: false });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to cycle model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to cycle model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"set\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: ModelCatalogEntry[] = [];\n\t\t\ttry {\n\t\t\t\tentries = await this.getModelCatalog(chatId, false);\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tawait this.rpcClient.setModel(entry.provider, entry.id);\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Selected ${entry.provider}/${entry.id}`);\n\t\t\t\tawait this.sendModelMenu(chatId, Math.floor(index / MODELS_PAGE_SIZE), { messageId, refreshCatalog: false });\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to set model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to set model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async stopBridge(chatId: TelegramChatId): Promise<void> {\n\t\tif (this.bridgeStopped && !this.activeTurn && this.queue.length === 0 && !this.rpcConnected) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst droppedQueue = this.queue.length;\n\t\tthis.queue.length = 0;\n\t\tthis.bridgeStopped = true;\n\t\tthis.commandCatalogByChat.clear();\n\t\tthis.modelCatalogByChat.clear();\n\n\t\tif (this.rpcConnected) {\n\t\t\tfor (const requestId of this.pendingConfirmations.keys()) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: requestId, confirmed: false });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore; bridge is stopping.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmations.clear();\n\t\tthis.pendingConfirmationGroupIdsByKey.clear();\n\n\t\tconst active = this.activeTurn;\n\t\tif (active?.statusEditTimer) {\n\t\t\tclearTimeout(active.statusEditTimer);\n\t\t}\n\t\tthis.activeTurn = undefined;\n\t\tif (active) {\n\t\t\tif (active.statusEditInFlight) {\n\t\t\t\ttry {\n\t\t\t\t\tawait active.statusEditInFlight;\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort; proceed with stop status.\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(active.chatId, active.statusMessageId, \"⛔ done (stopped)\");\n\t\t\t} catch {\n\t\t\t\t// Best-effort status close.\n\t\t\t}\n\t\t\tif (active.chatId !== chatId) {\n\t\t\t\tawait this.bot.sendMessage(active.chatId, \"Bridge stopped. Active task cancelled.\");\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.rpcClient.stop();\n\t\t} catch (error) {\n\t\t\tconsole.warn(`[telegram] rpc stop failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t} finally {\n\t\t\tthis.rpcConnected = false;\n\t\t}\n\n\t\tconst parts = [\"Bridge stopped.\"];\n\t\tif (active) {\n\t\t\tparts.push(\"Active task cancelled.\");\n\t\t}\n\t\tif (droppedQueue > 0) {\n\t\t\tparts.push(`Dropped queued tasks: ${droppedQueue}.`);\n\t\t}\n\t\tparts.push(\"Use /start to resume.\");\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\tawait this.ensureInputMenu(chatId, true);\n\t\tawait this.bot.sendMessage(chatId, parts.join(\" \"));\n\t}\n\n\tprivate formatConnectionStatus(): string {\n\t\tif (this.bridgeStopped) return \"⛔ stopped\";\n\t\tif (!this.rpcConnected) return \"🟥 disconnected\";\n\t\tif (this.activeTurn) return \"🟩 connected\";\n\t\treturn \"🟦 idle\";\n\t}\n\n\tprivate formatPermissionShort(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"YOLO\";\n\t\tif (mode === \"auto\") return \"AUTO\";\n\t\treturn \"ASK\";\n\t}\n\n\tprivate formatPermissionButton(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"⚠️ YOLO\";\n\t\tif (mode === \"auto\") return \"🤖 AUTO\";\n\t\treturn \"🛡 ASK\";\n\t}\n\n\tprivate formatModelShort(model: string, maxLen = 42): string {\n\t\tif (model.length <= maxLen) return model;\n\t\treturn `${model.slice(0, maxLen - 1)}…`;\n\t}\n\n\tprivate formatSessionShort(sessionName: string | undefined, sessionId: string | undefined): string {\n\t\tif (sessionName && sessionName.trim().length > 0) return this.formatModelShort(sessionName.trim(), 24);\n\t\tif (!sessionId || sessionId.trim().length === 0) return \"unknown\";\n\t\tconst value = sessionId.trim();\n\t\tif (value.length <= 14) return value;\n\t\treturn `${value.slice(0, 8)}…${value.slice(-4)}`;\n\t}\n\n\tprivate formatCompactTurn(): string {\n\t\tif (!this.activeTurn) return \"idle\";\n\t\tconst elapsed = Math.max(0, Math.floor((Date.now() - this.activeTurn.startedAt) / 1000));\n\t\tconst phase = this.formatStatusPhase(this.activeTurn.phase);\n\t\treturn `${phase} ${elapsed}s`;\n\t}\n\n\tprivate buildHubKeyboard(mode: \"ask\" | \"auto\" | \"yolo\" | undefined, view: HubView): TelegramInlineKeyboardMarkup {\n\t\tif (this.bridgeStopped) {\n\t\t\treturn {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"▶️ Start\", callback_data: \"hub:start\" },\n\t\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\t],\n\t\t\t\t\t[{ text: \"❓ Help\", callback_data: \"hub:help\" }],\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tconst detailsToggle =\n\t\t\tview === \"details\"\n\t\t\t\t? { text: \"◀ Compact\", callback_data: \"hub:compact\" }\n\t\t\t\t: { text: \"ℹ️ Details\", callback_data: \"hub:details\" };\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t[\n\t\t\t\t\t{ text: \"🆕 New\", callback_data: \"hub:new\" },\n\t\t\t\t\t{ text: \"⚡ Cmd\", callback_data: \"hub:commands\" },\n\t\t\t\t\t{ text: \"🤖 Model\", callback_data: \"hub:model\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: this.formatPermissionButton(mode), callback_data: \"hub:toggle_mode\" },\n\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\tdetailsToggle,\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"⛔ Abort\", callback_data: \"hub:abort\" },\n\t\t\t\t\t{ text: \"🛑 Stop\", callback_data: \"hub:stop\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendStatusCard(\n\t\tchatId: TelegramChatId,\n\t\toptions?: { header?: string; includeKeyboard?: boolean; preferEditHub?: boolean; view?: HubView },\n\t): Promise<void> {\n\t\tif (!this.bridgeStopped) {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\tchatId,\n\t\t\t\t\t`Status unavailable: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst state = this.activeSessionState;\n\t\tconst model = state?.model ? `${state.model.provider}/${state.model.id}` : \"not selected\";\n\t\tconst queueSize = this.queue.length;\n\t\tconst mcpState = \"RPC child\";\n\t\tconst permissionMode = state?.permissionMode ?? \"ask\";\n\t\tconst resolvedView = options?.view ?? this.hubViewByChat.get(chatId) ?? \"compact\";\n\t\tthis.hubViewByChat.set(chatId, resolvedView);\n\n\t\tconst header = options?.header ?? \"Control Hub\";\n\t\tconst compactText = [\n\t\t\theader,\n\t\t\t`${this.formatConnectionStatus()} · ${this.formatPermissionShort(permissionMode)} · q${queueSize} · ${this.formatCompactTurn()}`,\n\t\t\t`🤖 ${this.formatModelShort(model)}`,\n\t\t\t`💬 ${this.formatSessionShort(state?.sessionName, state?.sessionId)}`,\n\t\t].join(\"\\n\");\n\t\tconst detailsText = [\n\t\t\t`${header} · Details`,\n\t\t\t`Connection: ${this.formatConnectionStatus()}`,\n\t\t\t`Mode: ${permissionMode}`,\n\t\t\t`Model: ${model}`,\n\t\t\t`Session: ${state?.sessionName ?? state?.sessionId ?? \"unknown\"}`,\n\t\t\t`Turn: ${this.activeTurn ? `${this.activeTurn.phase} (${Math.floor((Date.now() - this.activeTurn.startedAt) / 1000)}s)` : \"idle\"}`,\n\t\t\t`Queue: ${queueSize}`,\n\t\t\t`MCP: ${mcpState}`,\n\t\t\t\"Telegram: active\",\n\t\t].join(\"\\n\");\n\t\tconst text = resolvedView === \"details\" ? detailsText : compactText;\n\t\tconst keyboard = options?.includeKeyboard ? this.buildHubKeyboard(permissionMode, resolvedView) : undefined;\n\n\t\tif (options?.includeKeyboard && options.preferEditHub) {\n\t\t\tconst hubMessageId = this.hubMessageIdByChat.get(chatId);\n\t\t\tif (hubMessageId) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.bot.editMessageText(chatId, hubMessageId, text, { replyMarkup: keyboard });\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback below: send a fresh hub card if original message is gone.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst message = await this.bot.sendMessage(chatId, text, { replyMarkup: keyboard });\n\t\tif (options?.includeKeyboard) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, message.message_id);\n\t\t}\n\t}\n\n\tprivate async togglePermissionMode(chatId: TelegramChatId): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst current = await this.rpcClient.getPermissionMode();\n\t\t\tconst next = current === \"yolo\" ? \"ask\" : \"yolo\";\n\t\t\tawait this.rpcClient.setPermissionMode(next);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to switch mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async handleYoloCommand(chatId: TelegramChatId, args: string[]): Promise<void> {\n\t\tconst desired = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tif (!desired || desired === \"status\") {\n\t\t\t\tconst mode = await this.rpcClient.getPermissionMode();\n\t\t\t\tawait this.bot.sendMessage(chatId, `YOLO mode: ${mode === \"yolo\" ? \"ON\" : \"OFF\"} (${mode})`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"on\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"yolo\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: ON (tool confirmations disabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"off\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"ask\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: OFF (tool confirmations enabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.sendMessage(chatId, \"Usage: /yolo [on|off|status]\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to update mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async abortActiveTurn(chatId: TelegramChatId): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No active task.\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tthis.activeTurn.aborted = true;\n\t\t\tawait this.rpcClient.abort();\n\t\t\tawait this.bot.sendMessage(chatId, \"Abort signal sent.\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Abort failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async enqueuePrompt(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.startTurn(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push({ chatId, text });\n\t\tawait this.bot.sendMessage(chatId, `⏸ queued · ${this.queue.length}`);\n\t\tvoid this.editLiveStatus();\n\t}\n\n\tprivate async startTurn(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst statusMessage = await this.bot.sendMessage(chatId, this.formatStartingStatus(text));\n\t\tthis.activeTurn = {\n\t\t\tturnId: this.nextTurnId++,\n\t\t\tchatId,\n\t\t\tprompt: text,\n\t\t\tstartedAt: Date.now(),\n\t\t\tstatusMessageId: statusMessage.message_id,\n\t\t\tphase: \"starting\",\n\t\t\taborted: false,\n\t\t\tstatusEditPending: false,\n\t\t\tlastStatusEditAt: 0,\n\t\t};\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tawait this.rpcClient.prompt(text);\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.editLiveStatus(true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.finishTurn({\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async onRpcEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\n\t\tswitch (event.type) {\n\t\t\tcase \"turn_start\":\n\t\t\t\tthis.activeTurn.phase = \"running\";\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName ?? this.activeTurn.lastTool;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"turn_end\": {\n\t\t\t\tconst turnEnd = event as AgentEvent;\n\t\t\t\tconst directText = this.extractAssistantTextFromTurnEnd(turnEnd);\n\t\t\t\tif (directText) {\n\t\t\t\t\t// Keep as fallback in case getLastAssistantText fails.\n\t\t\t\t\tthis.activeTurn.phase = \"finalizing\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent_end\":\n\t\t\t\tawait this.finishTurn();\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tawait this.editLiveStatus();\n\t}\n\n\tprivate async onRpcExtensionUiRequest(request: RpcExtensionUIRequest): Promise<void> {\n\t\tif (request.method === \"confirm_permission\" || request.method === \"confirm\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (!chatId) {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, confirmed: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = `${request.title}\\n${request.message}`;\n\t\t\tconst groupKey =\n\t\t\t\trequest.method === \"confirm_permission\"\n\t\t\t\t\t? this.buildPermissionGroupKey(chatId, request.request)\n\t\t\t\t\t: this.buildGenericConfirmationGroupKey(chatId, label);\n\t\t\tawait this.queueConfirmationPrompt(chatId, request.id, label, groupKey);\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.method === \"notify\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (chatId) {\n\t\t\t\tawait this.bot.sendMessage(chatId, request.message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unsupported interactive extension methods in telegram v1: cancel by default.\n\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, cancelled: true });\n\t}\n\n\tprivate async onRpcConfirmationRequest(event: RpcRequiresConfirmationEvent): Promise<void> {\n\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\tif (!chatId) {\n\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: event.id, confirmed: false });\n\t\t\treturn;\n\t\t}\n\t\tconst groupKey = this.buildPermissionGroupKey(chatId, event.request);\n\t\tawait this.queueConfirmationPrompt(chatId, event.id, event.message, groupKey);\n\t}\n\n\tprivate buildPermissionGroupKey(chatId: TelegramChatId, request: RpcRequiresConfirmationEvent[\"request\"]): string {\n\t\tconst requiredPermission = request.requiredPermission ?? \"unknown\";\n\t\tconst toolSource = request.toolSource ?? \"unknown\";\n\t\tconst inputJson = JSON.stringify(request.input ?? {});\n\t\treturn `${chatId}|perm|${request.toolName}|${requiredPermission}|${toolSource}|${request.summary}|${request.cwd}|${inputJson}`;\n\t}\n\n\tprivate buildGenericConfirmationGroupKey(chatId: TelegramChatId, label: string): string {\n\t\tconst normalized = label.replace(/\\s+/g, \" \").trim();\n\t\treturn `${chatId}|confirm|${normalized}`;\n\t}\n\n\tprivate async queueConfirmationPrompt(\n\t\tchatId: TelegramChatId,\n\t\trequestId: string,\n\t\tlabel: string,\n\t\tgroupKey: string,\n\t): Promise<void> {\n\t\tif (this.pendingConfirmations.has(requestId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.pendingConfirmationGroupIdsByKey.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.add(requestId);\n\t\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\t\tif (this.activeTurn) {\n\t\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\t\tawait this.editLiveStatus(true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = new Set<string>([requestId]);\n\t\tthis.pendingConfirmationGroupIdsByKey.set(groupKey, ids);\n\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\tawait this.bot.sendMessage(chatId, label, {\n\t\t\treplyMarkup: {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"Allow\", callback_data: `confirm:${requestId}:yes` },\n\t\t\t\t\t\t{ text: \"Deny\", callback_data: `confirm:${requestId}:no` },\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate async respondConfirmation(requestId: string, confirmed: boolean): Promise<void> {\n\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\tif (!pending) return;\n\n\t\tconst groupedIds = this.pendingConfirmationGroupIdsByKey.get(pending.groupKey);\n\t\tconst ids = groupedIds && groupedIds.size > 0 ? Array.from(groupedIds) : [requestId];\n\t\tfor (const id of ids) {\n\t\t\tthis.pendingConfirmations.delete(id);\n\t\t\ttry {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id, confirmed });\n\t\t\t} catch {\n\t\t\t\t// Best-effort for duplicated request IDs from different streams.\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmationGroupIdsByKey.delete(pending.groupKey);\n\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = confirmed ? \"running\" : \"permission denied\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate extractAssistantTextFromTurnEnd(event: AgentEvent): string | undefined {\n\t\tconst messageEvent = event as { message?: { role?: string; content?: Array<{ type: string; text?: string }> } };\n\t\tconst message = messageEvent.message;\n\t\tif (!message || message.role !== \"assistant\") return undefined;\n\t\tconst content = Array.isArray(message.content) ? message.content : [];\n\t\tconst textParts = content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text.trim())\n\t\t\t.filter((part) => part.length > 0);\n\t\tif (textParts.length === 0) return undefined;\n\t\treturn textParts.join(\"\\n\\n\");\n\t}\n\n\tprivate escapeTelegramHtml(text: string): string {\n\t\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \""\");\n\t}\n\n\tprivate stripHtmlTags(text: string): string {\n\t\treturn text.replace(/<[^>]*>/g, \"\");\n\t}\n\n\tprivate normalizeTelegramText(text: string): string {\n\t\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\t}\n\n\tprivate renderMarkdownInlineTokens(tokens: Token[] | undefined): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"strong\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"em\":\n\t\t\t\t\toutput += `<i>${this.renderMarkdownInlineTokens(token.tokens)}</i>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"del\":\n\t\t\t\t\toutput += `<s>${this.renderMarkdownInlineTokens(token.tokens)}</s>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codespan\":\n\t\t\t\t\toutput += `<code>${this.escapeTelegramHtml(token.text)}</code>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"br\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"link\": {\n\t\t\t\t\tconst labelRaw = this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\tconst label = labelRaw.length > 0 ? labelRaw : this.escapeTelegramHtml(token.text ?? token.href);\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^(https?:\\/\\/|mailto:|tg:\\/\\/)/i.test(href)) {\n\t\t\t\t\t\toutput += `<a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${label}</a>`;\n\t\t\t\t\t} else if (href) {\n\t\t\t\t\t\toutput += `${label} (${this.escapeTelegramHtml(href)})`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += label;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"image\": {\n\t\t\t\t\tconst captionRaw = token.text?.trim();\n\t\t\t\t\tconst caption = captionRaw && captionRaw.length > 0 ? captionRaw : \"image\";\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^https?:\\/\\//i.test(href)) {\n\t\t\t\t\t\toutput += `🖼 <a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${this.escapeTelegramHtml(caption)}</a>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `🖼 ${this.escapeTelegramHtml(caption)}`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"escape\":\n\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\");\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(htmlText);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.raw);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate renderMarkdownTableCell(cell: Tokens.TableCell): string {\n\t\tconst rendered = this.renderMarkdownInlineTokens(cell.tokens);\n\t\treturn rendered.replace(/\\s+/g, \" \").trim();\n\t}\n\n\tprivate renderMarkdownBlockTokens(tokens: Token[] | undefined, listDepth = 0): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"space\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"heading\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"paragraph\":\n\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"code\":\n\t\t\t\t\toutput += `<pre>${this.escapeTelegramHtml(token.text.replace(/\\r\\n/g, \"\\n\"))}</pre>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"blockquote\": {\n\t\t\t\t\tconst rawQuote = this.normalizeTelegramText(this.renderMarkdownBlockTokens(token.tokens, listDepth));\n\t\t\t\t\tif (rawQuote.length > 0) {\n\t\t\t\t\t\tconst quoted = rawQuote\n\t\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t\t.map((line) => (line.trim().length > 0 ? `> ${line}` : \">\"))\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\t\toutput += `${quoted}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst baseIndent = \" \".repeat(listDepth);\n\t\t\t\t\tconst start = token.ordered && typeof token.start === \"number\" ? token.start : 1;\n\t\t\t\t\ttoken.items.forEach((item: Tokens.ListItem, index: number) => {\n\t\t\t\t\t\tconst marker = token.ordered ? `${start + index}.` : \"•\";\n\t\t\t\t\t\tconst renderedItem = this.normalizeTelegramText(this.renderMarkdownBlockTokens(item.tokens, listDepth + 1));\n\t\t\t\t\t\tconst fallback = this.escapeTelegramHtml(item.text ?? \"\");\n\t\t\t\t\t\tconst body = renderedItem.length > 0 ? renderedItem : fallback;\n\t\t\t\t\t\tconst lines = body.split(\"\\n\");\n\t\t\t\t\t\tconst firstLine = lines.shift() ?? \"\";\n\t\t\t\t\t\toutput += `${baseIndent}${marker} ${firstLine}\\n`;\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (line.trim().length === 0) {\n\t\t\t\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput += `${baseIndent} ${line}\\n`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"hr\":\n\t\t\t\t\toutput += \"────────\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"table\": {\n\t\t\t\t\tconst headerLine = token.header\n\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t.trim();\n\t\t\t\t\tif (headerLine.length > 0) {\n\t\t\t\t\t\toutput += `${headerLine}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const row of token.rows) {\n\t\t\t\t\t\tconst rowLine = row\n\t\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tif (rowLine.length > 0) {\n\t\t\t\t\t\t\toutput += `${rowLine}\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\").trim();\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(htmlText)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownBlockTokens(token.tokens, listDepth)}\\n`;\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.raw)}\\n`;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate markdownToTelegramHtml(markdown: string): string {\n\t\tif (!markdown || markdown.trim().length === 0) return \"\";\n\t\tconst tokens = marked.lexer(markdown, { gfm: true, breaks: true }) as Token[];\n\t\tconst rendered = this.renderMarkdownBlockTokens(tokens);\n\t\treturn this.normalizeTelegramText(rendered);\n\t}\n\n\tprivate markdownToTelegramPlainText(markdown: string): string {\n\t\tconst html = this.markdownToTelegramHtml(markdown);\n\t\treturn this.normalizeTelegramText(\n\t\t\thtml\n\t\t\t\t.replace(/<a [^>]*>([\\s\\S]*?)<\\/a>/gi, \"$1\")\n\t\t\t\t.replace(/<\\/?(b|i|s|u|code|pre)>/gi, \"\")\n\t\t\t\t.replace(/"/g, \"\\\"\")\n\t\t\t\t.replace(/</g, \"<\")\n\t\t\t\t.replace(/>/g, \">\")\n\t\t\t\t.replace(/&/g, \"&\"),\n\t\t);\n\t}\n\n\tprivate async sendRichMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst html = this.markdownToTelegramHtml(text);\n\t\tif (!html || html.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.bot.sendMessage(chatId, html, { parseMode: \"HTML\" });\n\t\t} catch {\n\t\t\tconst plain = this.markdownToTelegramPlainText(text);\n\t\t\tawait this.bot.sendMessage(chatId, plain.length > 0 ? plain : text);\n\t\t}\n\t}\n\n\tprivate formatStatusPhase(phase: string): string {\n\t\tconst lower = phase.toLowerCase();\n\t\tif (lower.includes(\"awaiting\")) return \"confirm\";\n\t\tif (lower.includes(\"tool\")) return \"tool\";\n\t\tif (lower.includes(\"final\")) return \"final\";\n\t\tif (lower.includes(\"start\")) return \"start\";\n\t\tif (lower.includes(\"permission denied\")) return \"denied\";\n\t\tif (lower.includes(\"running\")) return \"run\";\n\t\treturn lower.replace(/\\s+/g, \"-\");\n\t}\n\n\tprivate formatPromptPreview(prompt: string, limit = 100): string {\n\t\tconst cleaned = prompt.replace(/\\s+/g, \" \").trim();\n\t\tif (cleaned.length <= limit) return cleaned;\n\t\treturn `${cleaned.slice(0, limit - 1)}…`;\n\t}\n\n\tprivate statusSpinnerFrame(elapsedMs: number): string {\n\t\tconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\t\treturn frames[Math.floor(elapsedMs / 250) % frames.length] ?? \"⠋\";\n\t}\n\n\tprivate statusPulseFrame(elapsedMs: number): string {\n\t\tconst frames = [\"◼···\", \"◼•··\", \"◼••·\", \"◼•••\", \"◼••·\", \"◼•··\"];\n\t\treturn frames[Math.floor(elapsedMs / 280) % frames.length] ?? \"◼···\";\n\t}\n\n\tprivate statusDotsFrame(elapsedMs: number): string {\n\t\tconst frames = [\".\", \"..\", \"...\"];\n\t\treturn frames[Math.floor(elapsedMs / 420) % frames.length] ?? \".\";\n\t}\n\n\tprivate statusActivityLabel(turn: ActiveTurnState | undefined): string {\n\t\tif (!turn) return \"idle\";\n\t\tconst phase = turn.phase.toLowerCase();\n\t\tif (phase.includes(\"awaiting\")) return \"awaiting confirm\";\n\t\tif (phase.includes(\"tool\")) {\n\t\t\tconst tool = turn.lastTool?.trim();\n\t\t\tif (tool && tool.length > 0) {\n\t\t\t\tconst shortTool = tool.length > 18 ? `${tool.slice(0, 17)}…` : tool;\n\t\t\t\treturn `tool:${shortTool}`;\n\t\t\t}\n\t\t\treturn \"tool:running\";\n\t\t}\n\t\tif (phase.includes(\"final\")) return \"finalizing\";\n\t\tif (phase.includes(\"start\")) return \"starting\";\n\t\tif (phase.includes(\"denied\")) return \"permission denied\";\n\t\treturn \"working\";\n\t}\n\n\tprivate formatToolBadge(toolName: string | undefined): string {\n\t\tif (!toolName) return \"\";\n\t\tconst compact = toolName.trim().replace(/\\s+/g, \" \");\n\t\tconst clipped = compact.length > 18 ? `${compact.slice(0, 17)}…` : compact;\n\t\treturn ` · ${clipped}`;\n\t}\n\n\tprivate formatStartingStatus(prompt: string): string {\n\t\treturn [`⏳ ${APP_NAME} · start · 0s · q${this.queue.length}`, `“${this.formatPromptPreview(prompt, 56)}”`].join(\"\\n\");\n\t}\n\n\tprivate formatLiveStatus(turn: ActiveTurnState | undefined = this.activeTurn): string {\n\t\tif (!turn) return \"No active task.\";\n\t\tconst elapsedMs = Date.now() - turn.startedAt;\n\t\tconst elapsed = `${Math.floor(elapsedMs / 1000)}s`;\n\t\tconst spinner = this.statusSpinnerFrame(elapsedMs);\n\t\tconst pulse = this.statusPulseFrame(elapsedMs);\n\t\tconst phaseLabel = this.formatStatusPhase(turn.phase);\n\t\tconst toolSegment = this.formatToolBadge(turn.lastTool);\n\t\tconst activity = this.statusActivityLabel(turn);\n\t\treturn [\n\t\t\t`${spinner} ${APP_NAME} · ${phaseLabel}${toolSegment} · ${elapsed} · q${this.queue.length}`,\n\t\t\t`${pulse} ${activity}`,\n\t\t\t`“${this.formatPromptPreview(turn.prompt, 56)}”`,\n\t\t].join(\"\\n\");\n\t}\n\n\tprivate async editLiveStatus(force = false): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\t\tif (this.activeTurn.statusEditPending) return;\n\t\tconst turnId = this.activeTurn.turnId;\n\t\tconst now = Date.now();\n\t\tconst effectiveThrottleMs = Math.min(this.statusEditThrottleMs, LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS);\n\t\tconst waitMs = this.activeTurn.lastStatusEditAt + effectiveThrottleMs - now;\n\t\tif (!force && waitMs > 0) {\n\t\t\tthis.activeTurn.statusEditPending = true;\n\t\t\tthis.activeTurn.statusEditTimer = setTimeout(() => {\n\t\t\t\tif (this.activeTurn && this.activeTurn.turnId === turnId) {\n\t\t\t\t\tthis.activeTurn.statusEditPending = false;\n\t\t\t\t\tvoid this.editLiveStatus(true);\n\t\t\t\t}\n\t\t\t}, waitMs);\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = this.activeTurn;\n\t\tconst statusText = this.formatLiveStatus(target);\n\t\tconst editPromise = this.bot\n\t\t\t.editMessageText(target.chatId, target.statusMessageId, statusText, {\n\t\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\ttarget.lastStatusEditAt = Date.now();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t// Ignore no-op edit errors and transient \"message is not modified\".\n\t\t\t\tif (!message.toLowerCase().includes(\"message is not modified\")) {\n\t\t\t\t\tconsole.warn(`[telegram] status edit failed: ${message}`);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (target.statusEditInFlight === editPromise) {\n\t\t\t\t\ttarget.statusEditInFlight = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\ttarget.statusEditInFlight = editPromise;\n\t\tawait editPromise;\n\t}\n\n\tprivate async finishTurn(options?: { error?: string }): Promise<void> {\n\t\tconst finishedTurn = this.activeTurn;\n\t\tif (!finishedTurn) return;\n\t\tthis.activeTurn = undefined;\n\t\tif (finishedTurn.statusEditTimer) {\n\t\t\tclearTimeout(finishedTurn.statusEditTimer);\n\t\t}\n\t\tfinishedTurn.statusEditPending = false;\n\t\tif (finishedTurn.statusEditInFlight) {\n\t\t\ttry {\n\t\t\t\tawait finishedTurn.statusEditInFlight;\n\t\t\t} catch {\n\t\t\t\t// Best-effort; still continue to final status update.\n\t\t\t}\n\t\t}\n\n\t\tlet finalText: string | null = null;\n\t\tif (!options?.error) {\n\t\t\ttry {\n\t\t\t\tfinalText = await this.rpcClient.getLastAssistantText();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\toptions = {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst statusLabel = options?.error\n\t\t\t? `❌ error · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s\\n${this.formatPromptPreview(options.error, 96)}`\n\t\t\t: finishedTurn.aborted\n\t\t\t\t? `⛔ aborted · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`\n\t\t\t\t: `✅ done · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`;\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(finishedTurn.chatId, finishedTurn.statusMessageId, statusLabel, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\t// Best-effort.\n\t\t}\n\n\t\tif (options?.error) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, `Task failed: ${options.error}`);\n\t\t} else if (finalText && finalText.trim().length > 0) {\n\t\t\tawait this.sendFinalOutput(finishedTurn.chatId, finalText);\n\t\t} else if (!finishedTurn.aborted) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, \"Task completed with no assistant text output.\");\n\t\t}\n\n\t\tawait this.drainQueue();\n\t}\n\n\tprivate async sendFinalOutput(chatId: TelegramChatId, finalText: string): Promise<void> {\n\t\tif (finalText.length <= this.maxSummaryChars) {\n\t\t\tawait this.sendRichMessage(chatId, finalText);\n\t\t\treturn;\n\t\t}\n\t\tconst summary = `${finalText.slice(0, this.maxSummaryChars).trimEnd()}\\n\\n[output truncated in chat]`;\n\t\tawait this.sendRichMessage(chatId, summary);\n\t\tawait this.bot.sendTextDocument(chatId, \"iosm-output.txt\", finalText, \"Full output\");\n\t}\n\n\tprivate async drainQueue(): Promise<void> {\n\t\tif (this.activeTurn) return;\n\t\tconst next = this.queue.shift();\n\t\tif (!next) return;\n\t\tawait this.startTurn(next.chatId, next.text);\n\t}\n}\n"]}
|