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
@@ -1,6 +1,6 @@
1
1
  <div align="center">
2
2
 
3
- <h1>IOSM CLI 0.2.14</h1>
3
+ <h1>IOSM CLI 0.2.15</h1>
4
4
 
5
5
  <p><strong>Terminal-native AI runtime for controlled, measurable engineering work on real codebases.</strong></p>
6
6
 
@@ -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 statusOnlyActions = new Set(["status", "refresh", "details", "compact", "permissions"]);
457
- if (this.bridgeStopped && !statusOnlyActions.has(action)) {
458
- await this.bot.sendMessage(chatId, "Bridge is stopped. Use /start to resume.");
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: false });
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.bot.sendMessage(chatId, "Bridge is stopped. Use /start to resume.");
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: true,
707
+ preferEditHub: false,
695
708
  });
696
- await this.ensureInputMenu(chatId, false);
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.bot.sendMessage(chatId, "Bridge is stopped. Use /start to resume.");
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.bot.sendMessage(chatId, "Bridge already stopped. Use /start to resume.");
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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \"&quot;\");\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(/&quot;/g, \"\\\"\")\n\t\t\t\t.replace(/&lt;/g, \"<\")\n\t\t\t\t.replace(/&gt;/g, \">\")\n\t\t\t\t.replace(/&amp;/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, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \"&quot;\");\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(/&quot;/g, \"\\\"\")\n\t\t\t\t.replace(/&lt;/g, \"<\")\n\t\t\t\t.replace(/&gt;/g, \">\")\n\t\t\t\t.replace(/&amp;/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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "iosm-cli",
3
- "version": "0.2.14",
3
+ "version": "0.2.15",
4
4
  "description": "Standalone IOSM CLI with agent tooling, session management, and IOSM artifact orchestration",
5
5
  "type": "module",
6
6
  "iosmConfig": {