iosm-cli 0.3.4 → 0.3.5
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,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.3.5] - 2026-04-06
|
|
11
|
+
|
|
12
|
+
### Fixed
|
|
13
|
+
|
|
14
|
+
- **Telegram API 429 resilience** — added automatic `retry after N` backoff/retry handling for all Telegram API operations (including `sendMessage`, `editMessageText`, `sendDocument`, and control actions)
|
|
15
|
+
- **Telegram status message recovery** — when live status edit target becomes invalid (`MESSAGE_ID_INVALID`, deleted or non-editable message), bridge now recreates status message and continues updates on a fresh `message_id`
|
|
16
|
+
- **Bridge runtime stability under delivery failures** — wrapped RPC event callbacks and final output delivery with fail-safe guards to prevent bridge process crashes from transient Telegram delivery errors
|
|
17
|
+
|
|
10
18
|
## [0.3.4] - 2026-04-06
|
|
11
19
|
|
|
12
20
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
<h1>IOSM CLI 0.3.
|
|
3
|
+
<h1>IOSM CLI 0.3.5</h1>
|
|
4
4
|
|
|
5
5
|
<p><strong>Terminal-native AI runtime for controlled, measurable engineering work on real codebases.</strong></p>
|
|
6
6
|
|
|
@@ -32,12 +32,11 @@ It is not a chat interface. It is a runtime.
|
|
|
32
32
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
|
-
## ✦ What's New in 0.3.
|
|
35
|
+
## ✦ What's New in 0.3.5
|
|
36
36
|
|
|
37
|
-
- Added
|
|
38
|
-
- Fixed
|
|
39
|
-
-
|
|
40
|
-
- Added regression tests for Windows command adaptation behavior
|
|
37
|
+
- Added Telegram API rate-limit resilience: bridge now respects `retry after N` and auto-retries on HTTP `429` across all Telegram methods
|
|
38
|
+
- Fixed live status update reliability: invalid or deleted status messages are now recreated automatically and status streaming continues
|
|
39
|
+
- Hardened Telegram bridge runtime: event callbacks and final output delivery are now fail-safe so transient Telegram send/edit errors do not crash the process
|
|
41
40
|
|
|
42
41
|
## ✦ Major Additions in 0.2.16
|
|
43
42
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telegram-bridge-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/telegram/telegram-bridge-mode.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAYtE,MAAM,WAAW,yBAAyB;IACzC;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,eAAe,EAAE,eAAe,CAAC;IACjC,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;
|
|
1
|
+
{"version":3,"file":"telegram-bridge-mode.d.ts","sourceRoot":"","sources":["../../../src/modes/telegram/telegram-bridge-mode.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAYtE,MAAM,WAAW,yBAAyB;IACzC;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,yEAAyE;IACzE,eAAe,EAAE,eAAe,CAAC;IACjC,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;CACb;AAoUD,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,KAAK,CAAC,CAK9F"}
|
|
@@ -7,6 +7,7 @@ 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
9
|
const LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS = 850;
|
|
10
|
+
const TELEGRAM_API_MAX_429_RETRIES = 4;
|
|
10
11
|
const INPUT_BUTTON_HUB = "🧭 Hub";
|
|
11
12
|
const INPUT_BUTTON_START = "▶️ Start";
|
|
12
13
|
const INPUT_BUTTON_NEW = "🆕 New";
|
|
@@ -128,29 +129,77 @@ class TelegramBotApi {
|
|
|
128
129
|
return this.callMultipart("sendDocument", form);
|
|
129
130
|
}
|
|
130
131
|
async call(method, payload) {
|
|
131
|
-
|
|
132
|
-
method
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
132
|
+
for (let attempt = 0;; attempt++) {
|
|
133
|
+
const response = await fetch(`${this.endpoint}/${method}`, {
|
|
134
|
+
method: "POST",
|
|
135
|
+
headers: {
|
|
136
|
+
"content-type": "application/json",
|
|
137
|
+
},
|
|
138
|
+
body: JSON.stringify(payload),
|
|
139
|
+
});
|
|
140
|
+
const envelope = await this.readEnvelope(response);
|
|
141
|
+
if (response.ok && envelope.ok && envelope.result !== undefined) {
|
|
142
|
+
return envelope.result;
|
|
143
|
+
}
|
|
144
|
+
const errorCode = envelope.error_code ?? response.status;
|
|
145
|
+
const retryAfterMs = this.extractRetryAfterMs(response, envelope.description);
|
|
146
|
+
if (errorCode === 429 && retryAfterMs !== undefined && attempt < TELEGRAM_API_MAX_429_RETRIES) {
|
|
147
|
+
console.warn(`[telegram] ${method} rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s (${attempt + 1}/${TELEGRAM_API_MAX_429_RETRIES})`);
|
|
148
|
+
await sleepTimeout(retryAfterMs);
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
throw new Error(`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${errorCode})`);
|
|
141
152
|
}
|
|
142
|
-
return envelope.result;
|
|
143
153
|
}
|
|
144
154
|
async callMultipart(method, form) {
|
|
145
|
-
|
|
146
|
-
method
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
for (let attempt = 0;; attempt++) {
|
|
156
|
+
const response = await fetch(`${this.endpoint}/${method}`, {
|
|
157
|
+
method: "POST",
|
|
158
|
+
body: form,
|
|
159
|
+
});
|
|
160
|
+
const envelope = await this.readEnvelope(response);
|
|
161
|
+
if (response.ok && envelope.ok && envelope.result !== undefined) {
|
|
162
|
+
return envelope.result;
|
|
163
|
+
}
|
|
164
|
+
const errorCode = envelope.error_code ?? response.status;
|
|
165
|
+
const retryAfterMs = this.extractRetryAfterMs(response, envelope.description);
|
|
166
|
+
if (errorCode === 429 && retryAfterMs !== undefined && attempt < TELEGRAM_API_MAX_429_RETRIES) {
|
|
167
|
+
console.warn(`[telegram] ${method} rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s (${attempt + 1}/${TELEGRAM_API_MAX_429_RETRIES})`);
|
|
168
|
+
await sleepTimeout(retryAfterMs);
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
throw new Error(`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${errorCode})`);
|
|
152
172
|
}
|
|
153
|
-
|
|
173
|
+
}
|
|
174
|
+
async readEnvelope(response) {
|
|
175
|
+
try {
|
|
176
|
+
return (await response.json());
|
|
177
|
+
}
|
|
178
|
+
catch {
|
|
179
|
+
return {
|
|
180
|
+
ok: false,
|
|
181
|
+
description: response.statusText,
|
|
182
|
+
error_code: response.status,
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
extractRetryAfterMs(response, description) {
|
|
187
|
+
const headerValue = response.headers.get("retry-after");
|
|
188
|
+
if (headerValue) {
|
|
189
|
+
const headerSeconds = Number.parseInt(headerValue, 10);
|
|
190
|
+
if (Number.isFinite(headerSeconds) && headerSeconds > 0) {
|
|
191
|
+
return headerSeconds * 1000;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (!description)
|
|
195
|
+
return undefined;
|
|
196
|
+
const match = /retry after\s+(\d+)/i.exec(description);
|
|
197
|
+
if (!match)
|
|
198
|
+
return undefined;
|
|
199
|
+
const seconds = Number.parseInt(match[1] ?? "", 10);
|
|
200
|
+
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
201
|
+
return undefined;
|
|
202
|
+
return seconds * 1000;
|
|
154
203
|
}
|
|
155
204
|
}
|
|
156
205
|
export async function runTelegramBridgeMode(options) {
|
|
@@ -218,13 +267,19 @@ class TelegramBridgeRuntime {
|
|
|
218
267
|
void shutdown("SIGTERM");
|
|
219
268
|
});
|
|
220
269
|
this.rpcClient.onEvent((event) => {
|
|
221
|
-
void this.onRpcEvent(event)
|
|
270
|
+
void this.onRpcEvent(event).catch((error) => {
|
|
271
|
+
console.error(`[telegram] rpc event handler error: ${error instanceof Error ? error.message : String(error)}`);
|
|
272
|
+
});
|
|
222
273
|
});
|
|
223
274
|
this.rpcClient.onExtensionUIRequest((request) => {
|
|
224
|
-
void this.onRpcExtensionUiRequest(request)
|
|
275
|
+
void this.onRpcExtensionUiRequest(request).catch((error) => {
|
|
276
|
+
console.error(`[telegram] rpc extension ui handler error: ${error instanceof Error ? error.message : String(error)}`);
|
|
277
|
+
});
|
|
225
278
|
});
|
|
226
279
|
this.rpcClient.onRequiresConfirmation((event) => {
|
|
227
|
-
void this.onRpcConfirmationRequest(event)
|
|
280
|
+
void this.onRpcConfirmationRequest(event).catch((error) => {
|
|
281
|
+
console.error(`[telegram] rpc confirmation handler error: ${error instanceof Error ? error.message : String(error)}`);
|
|
282
|
+
});
|
|
228
283
|
});
|
|
229
284
|
// Keep polling forever.
|
|
230
285
|
for (;;) {
|
|
@@ -2030,6 +2085,53 @@ class TelegramBridgeRuntime {
|
|
|
2030
2085
|
formatStartingStatus(prompt) {
|
|
2031
2086
|
return [`⏳ ${APP_NAME} · start · 0s · q${this.queue.length}`, `“${this.formatPromptPreview(prompt, 56)}”`].join("\n");
|
|
2032
2087
|
}
|
|
2088
|
+
isStatusMessageInvalidError(error) {
|
|
2089
|
+
const message = (error instanceof Error ? error.message : String(error)).toLowerCase();
|
|
2090
|
+
return (message.includes("message_id_invalid") ||
|
|
2091
|
+
message.includes("message to edit not found") ||
|
|
2092
|
+
message.includes("message can't be edited"));
|
|
2093
|
+
}
|
|
2094
|
+
extractTelegramRetryAfterMs(error) {
|
|
2095
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
2096
|
+
const match = /retry after\s+(\d+)/i.exec(message);
|
|
2097
|
+
if (!match)
|
|
2098
|
+
return undefined;
|
|
2099
|
+
const seconds = Number.parseInt(match[1] ?? "", 10);
|
|
2100
|
+
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
2101
|
+
return undefined;
|
|
2102
|
+
return seconds * 1000;
|
|
2103
|
+
}
|
|
2104
|
+
scheduleStatusEditRetry(turnId, retryAfterMs) {
|
|
2105
|
+
if (!this.activeTurn || this.activeTurn.turnId !== turnId)
|
|
2106
|
+
return;
|
|
2107
|
+
if (this.activeTurn.statusEditPending)
|
|
2108
|
+
return;
|
|
2109
|
+
this.activeTurn.statusEditPending = true;
|
|
2110
|
+
this.activeTurn.statusEditTimer = setTimeout(() => {
|
|
2111
|
+
if (this.activeTurn && this.activeTurn.turnId === turnId) {
|
|
2112
|
+
this.activeTurn.statusEditPending = false;
|
|
2113
|
+
void this.editLiveStatus(true);
|
|
2114
|
+
}
|
|
2115
|
+
}, retryAfterMs);
|
|
2116
|
+
}
|
|
2117
|
+
async recreateLiveStatusMessage(target, statusText) {
|
|
2118
|
+
// Status message may be removed by user or become invalid in Telegram storage.
|
|
2119
|
+
// Recreate it and continue editing against the new message_id.
|
|
2120
|
+
if (!this.activeTurn || this.activeTurn.turnId !== target.turnId)
|
|
2121
|
+
return false;
|
|
2122
|
+
try {
|
|
2123
|
+
const fresh = await this.bot.sendMessage(target.chatId, statusText, {
|
|
2124
|
+
replyMarkup: { inline_keyboard: [] },
|
|
2125
|
+
});
|
|
2126
|
+
target.statusMessageId = fresh.message_id;
|
|
2127
|
+
target.lastStatusEditAt = Date.now();
|
|
2128
|
+
return true;
|
|
2129
|
+
}
|
|
2130
|
+
catch (error) {
|
|
2131
|
+
console.warn(`[telegram] status recreation failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
2132
|
+
return false;
|
|
2133
|
+
}
|
|
2134
|
+
}
|
|
2033
2135
|
formatLiveStatus(turn = this.activeTurn) {
|
|
2034
2136
|
if (!turn)
|
|
2035
2137
|
return "No active task.";
|
|
@@ -2074,10 +2176,21 @@ class TelegramBridgeRuntime {
|
|
|
2074
2176
|
.then(() => {
|
|
2075
2177
|
target.lastStatusEditAt = Date.now();
|
|
2076
2178
|
})
|
|
2077
|
-
.catch((error) => {
|
|
2179
|
+
.catch(async (error) => {
|
|
2078
2180
|
const message = error instanceof Error ? error.message : String(error);
|
|
2079
2181
|
// Ignore no-op edit errors and transient "message is not modified".
|
|
2080
2182
|
if (!message.toLowerCase().includes("message is not modified")) {
|
|
2183
|
+
const retryAfterMs = this.extractTelegramRetryAfterMs(error);
|
|
2184
|
+
if (retryAfterMs) {
|
|
2185
|
+
console.warn(`[telegram] status edit rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s`);
|
|
2186
|
+
this.scheduleStatusEditRetry(turnId, retryAfterMs);
|
|
2187
|
+
return;
|
|
2188
|
+
}
|
|
2189
|
+
if (this.isStatusMessageInvalidError(error)) {
|
|
2190
|
+
const recovered = await this.recreateLiveStatusMessage(target, statusText);
|
|
2191
|
+
if (recovered)
|
|
2192
|
+
return;
|
|
2193
|
+
}
|
|
2081
2194
|
console.warn(`[telegram] status edit failed: ${message}`);
|
|
2082
2195
|
}
|
|
2083
2196
|
})
|
|
@@ -2129,17 +2242,25 @@ class TelegramBridgeRuntime {
|
|
|
2129
2242
|
replyMarkup: { inline_keyboard: [] },
|
|
2130
2243
|
});
|
|
2131
2244
|
}
|
|
2132
|
-
catch {
|
|
2133
|
-
// Best-effort.
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
2245
|
+
catch (error) {
|
|
2246
|
+
// Best-effort, but recover from invalid status message ids to avoid losing final state.
|
|
2247
|
+
if (this.isStatusMessageInvalidError(error)) {
|
|
2248
|
+
await this.bot.sendMessage(finishedTurn.chatId, statusLabel).catch(() => { });
|
|
2249
|
+
}
|
|
2137
2250
|
}
|
|
2138
|
-
|
|
2139
|
-
|
|
2251
|
+
try {
|
|
2252
|
+
if (options?.error) {
|
|
2253
|
+
await this.bot.sendMessage(finishedTurn.chatId, `Task failed: ${options.error}`);
|
|
2254
|
+
}
|
|
2255
|
+
else if (finalText && finalText.trim().length > 0) {
|
|
2256
|
+
await this.sendFinalOutput(finishedTurn.chatId, finalText);
|
|
2257
|
+
}
|
|
2258
|
+
else if (!finishedTurn.aborted) {
|
|
2259
|
+
await this.bot.sendMessage(finishedTurn.chatId, "Task completed with no assistant text output.");
|
|
2260
|
+
}
|
|
2140
2261
|
}
|
|
2141
|
-
|
|
2142
|
-
|
|
2262
|
+
catch (error) {
|
|
2263
|
+
console.warn(`[telegram] final output delivery failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
2143
2264
|
}
|
|
2144
2265
|
await this.drainQueue();
|
|
2145
2266
|
}
|
|
@@ -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 LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS = 850;\nconst INPUT_BUTTON_HUB = \"🧭 Hub\";\nconst INPUT_BUTTON_START = \"▶️ Start\";\nconst INPUT_BUTTON_NEW = \"🆕 New\";\nconst INPUT_BUTTON_COMMANDS = \"⚡ Cmd\";\nconst INPUT_BUTTON_HELP = \"❓ Help\";\nconst INPUT_BUTTON_ABORT = \"⛔ Abort\";\nconst INPUT_BUTTON_STOP = \"🛑 Stop\";\nconst MAIN_COMMAND_MENU: CommandCatalogEntry[] = [\n\t{\n\t\tname: \"model\",\n\t\tdescription: \"Choose active model\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/model\",\n\t},\n\t{\n\t\tname: \"status\",\n\t\tdescription: \"Show control hub status\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/status\",\n\t},\n\t{\n\t\tname: \"new\",\n\t\tdescription: \"Start a new session\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/new\",\n\t},\n\t{\n\t\tname: \"abort\",\n\t\tdescription: \"Abort active task\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/abort\",\n\t},\n\t{\n\t\tname: \"permissions\",\n\t\tdescription: \"Show permission mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/permissions status\",\n\t},\n\t{\n\t\tname: \"yolo\",\n\t\tdescription: \"Show YOLO mode\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/yolo status\",\n\t},\n\t{\n\t\tname: \"help\",\n\t\tdescription: \"Show command help\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/help\",\n\t},\n\t{\n\t\tname: \"stop\",\n\t\tdescription: \"Stop bridge and cancel active work\",\n\t\tsource: \"builtin\",\n\t\tcommandText: \"/stop\",\n\t},\n];\n\nclass TelegramBotApi {\n\tconstructor(private readonly token: string) {}\n\n\tprivate get endpoint(): string {\n\t\treturn `https://api.telegram.org/bot${this.token}`;\n\t}\n\n\tasync getMe(): Promise<{ id: number; username?: string }> {\n\t\treturn this.call(\"getMe\", {});\n\t}\n\n\tasync getUpdates(offset: number, timeoutSeconds: number): Promise<TelegramUpdate[]> {\n\t\treturn this.call(\"getUpdates\", {\n\t\t\toffset,\n\t\t\ttimeout: timeoutSeconds,\n\t\t\tallowed_updates: [\"message\", \"callback_query\"],\n\t\t});\n\t}\n\n\tasync sendMessage(\n\t\tchatId: TelegramChatId,\n\t\ttext: string,\n\t\toptions?: {\n\t\t\treplyMarkup?: TelegramReplyMarkup;\n\t\t\tdisableNotification?: boolean;\n\t\t\tparseMode?: \"HTML\";\n\t\t},\n\t): Promise<TelegramMessage> {\n\t\treturn this.call(\"sendMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t\tdisable_notification: options?.disableNotification ?? false,\n\t\t\tparse_mode: options?.parseMode,\n\t\t});\n\t}\n\n\tasync editMessageText(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\ttext: string,\n\t\toptions?: { replyMarkup?: TelegramInlineKeyboardMarkup },\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageText\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\ttext,\n\t\t\treply_markup: options?.replyMarkup,\n\t\t});\n\t}\n\n\tasync editMessageReplyMarkup(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\treplyMarkup?: TelegramInlineKeyboardMarkup,\n\t): Promise<TelegramMessage | boolean> {\n\t\treturn this.call(\"editMessageReplyMarkup\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t\treply_markup: replyMarkup,\n\t\t});\n\t}\n\n\tasync deleteMessage(chatId: TelegramChatId, messageId: number): Promise<boolean> {\n\t\treturn this.call(\"deleteMessage\", {\n\t\t\tchat_id: chatId,\n\t\t\tmessage_id: messageId,\n\t\t});\n\t}\n\n\tasync answerCallbackQuery(callbackQueryId: string, text?: string): Promise<boolean> {\n\t\treturn this.call(\"answerCallbackQuery\", {\n\t\t\tcallback_query_id: callbackQueryId,\n\t\t\ttext,\n\t\t\tshow_alert: false,\n\t\t});\n\t}\n\n\tasync sendTextDocument(chatId: TelegramChatId, filename: string, content: string, caption?: string): Promise<TelegramMessage> {\n\t\tconst form = new FormData();\n\t\tform.set(\"chat_id\", String(chatId));\n\t\tif (caption) {\n\t\t\tform.set(\"caption\", caption);\n\t\t}\n\t\tform.set(\"document\", new Blob([content], { type: \"text/plain\" }), filename);\n\t\treturn this.callMultipart(\"sendDocument\", form);\n\t}\n\n\tprivate async call<T>(method: string, payload: Record<string, unknown>): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\theaders: {\n\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n\n\tprivate async callMultipart<T>(method: string, form: FormData): Promise<T> {\n\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: form,\n\t\t});\n\t\tconst envelope = (await response.json()) as TelegramApiEnvelope<T>;\n\t\tif (!response.ok || !envelope.ok || envelope.result === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${envelope.error_code ?? response.status})`,\n\t\t\t);\n\t\t}\n\t\treturn envelope.result;\n\t}\n}\n\nexport async function runTelegramBridgeMode(options: TelegramBridgeModeOptions): Promise<never> {\n\tconst mode = new TelegramBridgeRuntime(options);\n\tawait mode.run();\n\t// run() loops forever unless it throws; keep Promise<never> contract explicit.\n\treturn new Promise(() => {});\n}\n\nclass TelegramBridgeRuntime {\n\tprivate readonly settingsManager: SettingsManager;\n\tprivate readonly bot: TelegramBotApi;\n\tprivate readonly allowedUserIds: Set<number>;\n\tprivate readonly statusEditThrottleMs: number;\n\tprivate readonly maxSummaryChars: number;\n\tprivate readonly rpcClient: RpcClient;\n\tprivate readonly queue: Array<{ chatId: TelegramChatId; text: string }> = [];\n\tprivate readonly pendingConfirmations = new Map<string, PendingConfirmation>();\n\tprivate readonly pendingConfirmationGroupIdsByKey = new Map<string, Set<string>>();\n\tprivate readonly commandCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: CommandCatalogEntry[] }>();\n\tprivate readonly modelCatalogByChat = new Map<TelegramChatId, { updatedAt: number; entries: ModelCatalogEntry[] }>();\n\tprivate readonly hubMessageIdByChat = new Map<TelegramChatId, number>();\n\tprivate readonly hubViewByChat = new Map<TelegramChatId, HubView>();\n\tprivate readonly inputMenuEnabledByChat = new Set<TelegramChatId>();\n\tprivate nextUpdateOffset = 0;\n\tprivate nextTurnId = 1;\n\tprivate activeTurn: ActiveTurnState | undefined;\n\tprivate activeSessionState: RpcSessionState | undefined;\n\tprivate lastAuthorizedChatId: TelegramChatId | undefined;\n\tprivate rpcConnected = false;\n\tprivate bridgeStopped = false;\n\n\tconstructor(private readonly options: TelegramBridgeModeOptions) {\n\t\tthis.settingsManager = options.settingsManager;\n\t\tconst telegramSettings = this.settingsManager.getTelegramSettings();\n\t\tif (!telegramSettings.enabled) {\n\t\t\tthrow new Error(\"Telegram bridge is disabled in settings (telegram.enabled=false).\");\n\t\t}\n\t\tif (!telegramSettings.botToken) {\n\t\t\tthrow new Error(\"Telegram bridge requires settings.telegram.botToken.\");\n\t\t}\n\t\tif (telegramSettings.allowedUserIds.length === 0) {\n\t\t\tthrow new Error(\"Telegram bridge requires at least one allowed user ID in settings.telegram.allowedUserIds.\");\n\t\t}\n\t\tif (telegramSettings.transport !== \"long-polling\") {\n\t\t\tthrow new Error(`Unsupported telegram transport: ${telegramSettings.transport}`);\n\t\t}\n\n\t\tthis.bot = new TelegramBotApi(telegramSettings.botToken);\n\t\tthis.allowedUserIds = new Set(telegramSettings.allowedUserIds);\n\t\tthis.statusEditThrottleMs = telegramSettings.chatDefaults.statusEditThrottleMs;\n\t\tthis.maxSummaryChars = telegramSettings.chatDefaults.maxSummaryChars;\n\t\tthis.rpcClient = new RpcClient({\n\t\t\tcliPath: options.cliPath,\n\t\t\tcwd: options.cwd,\n\t\t\targs: this.buildRpcForwardedArgs(options.rawArgs),\n\t\t});\n\t}\n\n\tasync run(): Promise<void> {\n\t\tconst me = await this.bot.getMe();\n\t\tawait this.startRpc();\n\t\tconsole.log(`[telegram] bridge online as @${me.username ?? \"unknown\"} (${me.id})`);\n\n\t\tconst shutdown = async (signal: string) => {\n\t\t\tconsole.log(`[telegram] received ${signal}, stopping bridge...`);\n\t\t\ttry {\n\t\t\t\tawait this.rpcClient.stop();\n\t\t\t} finally {\n\t\t\t\tprocess.exit(0);\n\t\t\t}\n\t\t};\n\t\tprocess.once(\"SIGINT\", () => {\n\t\t\tvoid shutdown(\"SIGINT\");\n\t\t});\n\t\tprocess.once(\"SIGTERM\", () => {\n\t\t\tvoid shutdown(\"SIGTERM\");\n\t\t});\n\n\t\tthis.rpcClient.onEvent((event) => {\n\t\t\tvoid this.onRpcEvent(event);\n\t\t});\n\t\tthis.rpcClient.onExtensionUIRequest((request) => {\n\t\t\tvoid this.onRpcExtensionUiRequest(request);\n\t\t});\n\t\tthis.rpcClient.onRequiresConfirmation((event) => {\n\t\t\tvoid this.onRpcConfirmationRequest(event);\n\t\t});\n\n\t\t// Keep polling forever.\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst updates = await this.bot.getUpdates(this.nextUpdateOffset, 25);\n\t\t\t\tfor (const update of updates) {\n\t\t\t\t\tthis.nextUpdateOffset = Math.max(this.nextUpdateOffset, update.update_id + 1);\n\t\t\t\t\tawait this.handleUpdate(update);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[telegram] polling error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\tawait sleepTimeout(2_000);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate buildRpcForwardedArgs(rawArgs: string[]): string[] {\n\t\tconst forwarded: string[] = [];\n\t\tfor (let i = 0; i < rawArgs.length; i++) {\n\t\t\tconst arg = rawArgs[i];\n\t\t\tif (i === 0 && arg === \"telegram\") continue;\n\t\t\tif (arg === \"--mode\") {\n\t\t\t\t// RPC mode is enforced by RpcClient; ignore any caller-provided mode.\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforwarded.push(arg);\n\t\t}\n\t\treturn forwarded;\n\t}\n\n\tprivate async startRpc(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rpcClient.start();\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tthrow new Error(`Failed to start RPC child: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async restartRpc(): Promise<void> {\n\t\tawait this.rpcClient.stop();\n\t\tawait this.startRpc();\n\t}\n\n\tprivate async ensureRpcConnected(): Promise<void> {\n\t\tif (this.rpcConnected) return;\n\t\tawait this.restartRpc();\n\t}\n\n\tprivate isAuthorizedUser(userId: number | undefined): userId is number {\n\t\treturn typeof userId === \"number\" && this.allowedUserIds.has(userId);\n\t}\n\n\tprivate buildInputMenuKeyboard(stopped = this.bridgeStopped): TelegramReplyKeyboardMarkup {\n\t\tif (stopped) {\n\t\t\treturn {\n\t\t\t\tkeyboard: [[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_START }], [{ text: INPUT_BUTTON_HELP }]],\n\t\t\t\tresize_keyboard: true,\n\t\t\t\tis_persistent: true,\n\t\t\t\tinput_field_placeholder: \"Bridge stopped. Tap Start to resume\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkeyboard: [\n\t\t\t\t[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_NEW }, { text: INPUT_BUTTON_COMMANDS }],\n\t\t\t\t[{ text: INPUT_BUTTON_HELP }, { text: INPUT_BUTTON_ABORT }, { text: INPUT_BUTTON_STOP }],\n\t\t\t],\n\t\t\tresize_keyboard: true,\n\t\t\tis_persistent: true,\n\t\t\tinput_field_placeholder: \"Write a task or pick an action\",\n\t\t};\n\t}\n\n\tprivate async ensureInputMenu(chatId: TelegramChatId, force = false): Promise<void> {\n\t\tif (!force && this.inputMenuEnabledByChat.has(chatId)) return;\n\t\tconst notice = force ? \"Quick actions updated ↓\" : \"Quick actions ready ↓\";\n\t\tawait this.bot.sendMessage(chatId, notice, {\n\t\t\treplyMarkup: this.buildInputMenuKeyboard(),\n\t\t\tdisableNotification: true,\n\t\t});\n\t\tthis.inputMenuEnabledByChat.add(chatId);\n\t}\n\n\tprivate normalizeInputActionText(text: string): string {\n\t\treturn text\n\t\t\t.normalize(\"NFKC\")\n\t\t\t.replace(/\\uFE0F/g, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^\\p{Letter}\\p{Number} ]+/gu, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t}\n\n\tprivate mapInputMenuAction(text: string): string | undefined {\n\t\tconst normalized = this.normalizeInputActionText(text);\n\t\tswitch (normalized) {\n\t\t\tcase \"start\":\n\t\t\tcase \"resume\":\n\t\t\tcase \"старт\":\n\t\t\tcase \"запуск\":\n\t\t\t\treturn \"/start\";\n\t\t\tcase \"hub\":\n\t\t\tcase \"status\":\n\t\t\tcase \"хаб\":\n\t\t\tcase \"статус\":\n\t\t\t\treturn \"/status\";\n\t\t\tcase \"new\":\n\t\t\tcase \"new session\":\n\t\t\tcase \"новая\":\n\t\t\tcase \"новая сессия\":\n\t\t\tcase \"новый\":\n\t\t\t\treturn \"/new\";\n\t\t\tcase \"cmd\":\n\t\t\tcase \"command\":\n\t\t\tcase \"commands\":\n\t\t\tcase \"команда\":\n\t\t\tcase \"команды\":\n\t\t\t\treturn \"/commands\";\n\t\t\tcase \"help\":\n\t\t\tcase \"помощь\":\n\t\t\tcase \"хелп\":\n\t\t\t\treturn \"/help\";\n\t\t\tcase \"abort\":\n\t\t\tcase \"cancel\":\n\t\t\tcase \"прервать\":\n\t\t\tcase \"отмена\":\n\t\t\t\treturn \"/abort\";\n\t\t\tcase \"stop\":\n\t\t\tcase \"стоп\":\n\t\t\t\treturn \"/stop\";\n\t\t}\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_START)) return \"/start\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HUB)) return \"/status\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_NEW)) return \"/new\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_COMMANDS)) return \"/commands\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HELP)) return \"/help\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_ABORT)) return \"/abort\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_STOP)) return \"/stop\";\n\t\treturn undefined;\n\t}\n\n\tprivate async handleUpdate(update: TelegramUpdate): Promise<void> {\n\t\tif (update.callback_query) {\n\t\t\tawait this.handleCallbackQuery(update.callback_query);\n\t\t\treturn;\n\t\t}\n\t\tif (!update.message?.text) return;\n\n\t\tconst message = update.message;\n\t\tconst userId = message.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tconsole.warn(\n\t\t\t\t`[telegram] unauthorized message ignored (user=${userId ?? \"unknown\"}, chat=${message.chat.id})`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastAuthorizedChatId = message.chat.id;\n\t\tconst text = (message.text ?? \"\").trim();\n\t\tif (text.length === 0) return;\n\t\tif (!this.inputMenuEnabledByChat.has(message.chat.id)) {\n\t\t\tawait this.ensureInputMenu(message.chat.id);\n\t\t}\n\n\t\tconst quickActionCommand = this.mapInputMenuAction(text);\n\t\tif (quickActionCommand) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, quickActionCommand);\n\t\t\treturn;\n\t\t}\n\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, text);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(message.chat.id, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.enqueuePrompt(message.chat.id, text);\n\t}\n\n\tprivate async handleCallbackQuery(callback: TelegramCallbackQuery): Promise<void> {\n\t\tconst userId = callback.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Unauthorized\");\n\t\t\tconsole.warn(`[telegram] unauthorized callback ignored (user=${userId ?? \"unknown\"})`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = callback.data?.trim();\n\t\tif (!data) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"confirm:\")) {\n\t\t\tconst [, requestId, decision] = data.split(\":\");\n\t\t\tif (!requestId || (decision !== \"yes\" && decision !== \"no\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Invalid confirmation payload\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst confirmed = decision === \"yes\";\n\t\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\t\tawait this.respondConfirmation(requestId, confirmed);\n\t\t\tconst confirmChatId = callback.message?.chat.id;\n\t\t\tconst confirmMessageId = callback.message?.message_id;\n\t\t\tif (confirmChatId && typeof confirmMessageId === \"number\") {\n\t\t\t\tawait this.updateConfirmationDecisionMessage(confirmChatId, confirmMessageId, confirmed, pending?.label);\n\t\t\t\tawait this.moveLiveStatusToBottom(confirmChatId);\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, confirmed ? \"Approved\" : \"Denied\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"hub:\")) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.handleHubAction(callback.message?.chat.id, data.slice(4));\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"live:\")) {\n\t\t\tawait this.handleLiveAction(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"cmd:\")) {\n\t\t\tawait this.handleCommandMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"model:\")) {\n\t\t\tawait this.handleModelMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleHubAction(chatId: TelegramChatId | undefined, action: string): Promise<void> {\n\t\tif (!chatId) return;\n\t\tconst stoppedSafeActions = new Set([\"status\", \"refresh\", \"details\", \"compact\", \"start\", \"help\"]);\n\t\tif (this.bridgeStopped && !stoppedSafeActions.has(action)) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tswitch (action) {\n\t\t\tcase \"start\":\n\t\t\t\tawait this.handleCommandMessage(chatId, \"/start\");\n\t\t\t\treturn;\n\t\t\tcase \"help\":\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"prompt\":\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Send any text to start a task.\");\n\t\t\t\treturn;\n\t\t\tcase \"commands\":\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\tcase \"new\": {\n\t\t\t\tawait this.runNewSession(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"permissions\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"toggle_mode\":\n\t\t\t\tawait this.togglePermissionMode(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"model\":\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\tcase \"status\":\n\t\t\tcase \"refresh\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\tcase \"details\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"compact\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"compact\" });\n\t\t\t\treturn;\n\t\t\tcase \"abort\":\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Action is not implemented yet in Telegram bridge.\");\n\t\t}\n\t}\n\n\tprivate async runNewSession(chatId: TelegramChatId): Promise<void> {\n\t\tconst handled = await this.runBuiltinCommand(chatId, \"/new\");\n\t\tif (!handled) {\n\t\t\tawait this.enqueuePrompt(chatId, \"/new\");\n\t\t}\n\t}\n\n\tprivate async switchMenuMessageToHub(chatId: TelegramChatId, messageId?: number): Promise<void> {\n\t\tif (messageId) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, messageId);\n\t\t}\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t}\n\n\tprivate async clearInlineKeyboard(chatId: TelegramChatId, messageId: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bot.editMessageReplyMarkup(chatId, messageId, { inline_keyboard: [] });\n\t\t} catch {\n\t\t\t// Best-effort cleanup of stale buttons.\n\t\t}\n\t}\n\n\tprivate buildConfirmationResolvedText(confirmed: boolean, label?: string): string {\n\t\tconst status = confirmed ? \"✅ Allowed\" : \"❌ Denied\";\n\t\tif (!label) return status;\n\t\tconst lines = label\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t\tconst detail = lines.find((line) => !/^permission required$/i.test(line)) ?? lines[0];\n\t\tif (!detail) return status;\n\t\tconst clipped = detail.length > 120 ? `${detail.slice(0, 119)}…` : detail;\n\t\treturn `${status}\\n${clipped}`;\n\t}\n\n\tprivate async updateConfirmationDecisionMessage(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\tconfirmed: boolean,\n\t\tlabel?: string,\n\t): Promise<void> {\n\t\tconst text = this.buildConfirmationResolvedText(confirmed, label);\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(chatId, messageId, text, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\tawait this.clearInlineKeyboard(chatId, messageId);\n\t\t}\n\t}\n\n\tprivate async moveLiveStatusToBottom(chatId: TelegramChatId): Promise<void> {\n\t\tconst turn = this.activeTurn;\n\t\tif (!turn || turn.chatId !== chatId) return;\n\t\tconst previousStatusId = turn.statusMessageId;\n\t\ttry {\n\t\t\tconst fresh = await this.bot.sendMessage(chatId, this.formatLiveStatus());\n\t\t\tturn.statusMessageId = fresh.message_id;\n\t\t\tturn.lastStatusEditAt = Date.now();\n\t\t\tif (previousStatusId !== fresh.message_id) {\n\t\t\t\tawait this.bot.deleteMessage(chatId, previousStatusId).catch(() => {});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Best-effort relocation; keep existing status message on failure.\n\t\t}\n\t}\n\n\tprivate async handleLiveAction(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tconst [, action] = data.split(\":\");\n\t\tif (!action) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped && action !== \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"commands\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"model\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"new\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"New session\");\n\t\t\tawait this.runNewSession(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"abort\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Aborting...\");\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"stop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping...\");\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleCommandMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst [commandRaw, ...rest] = text.split(/\\s+/);\n\t\tconst command = (commandRaw.toLowerCase().split(\"@\")[0] ?? commandRaw.toLowerCase()).trim();\n\n\t\tif (command === \"/start\") {\n\t\t\tthis.bridgeStopped = false;\n\t\t\tawait this.sendStart(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/help\") {\n\t\t\tawait this.sendHelp(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/menu\") {\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/status\") {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/stop\") {\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/commands\") {\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/abort\") {\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/yolo\") {\n\t\t\tawait this.handleYoloCommand(chatId, rest);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/model\" && rest.join(\" \").trim().length === 0) {\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst handled = await this.runBuiltinCommand(chatId, text);\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to raw slash prompt to support extension/prompt-template/skill slash commands.\n\t\tawait this.enqueuePrompt(chatId, text);\n\t}\n\n\tprivate async runBuiltinCommand(chatId: TelegramChatId, commandText: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst result = await this.rpcClient.runBuiltinCommand(commandText);\n\t\t\tthis.rpcConnected = true;\n\t\t\tif (!result.handled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tawait this.sendBuiltinCommandResult(chatId, result);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async sendBuiltinCommandResult(chatId: TelegramChatId, result: BuiltinCommandResult): Promise<void> {\n\t\tif (result.message) {\n\t\t\tconst prefix = result.level === \"error\" ? \"Error: \" : result.level === \"warning\" ? \"Warning: \" : \"\";\n\t\t\tawait this.bot.sendMessage(chatId, `${prefix}${result.message}`);\n\t\t}\n\t\tif (result.text) {\n\t\t\tawait this.sendFinalOutput(chatId, result.text);\n\t\t}\n\t\tif (result.filePath) {\n\t\t\tawait this.bot.sendMessage(chatId, `File: ${result.filePath}`);\n\t\t}\n\t}\n\n\tprivate async sendStart(chatId: TelegramChatId): Promise<void> {\n\t\tawait this.sendStatusCard(chatId, {\n\t\t\theader: `Control Hub · ${APP_NAME} v${VERSION}`,\n\t\t\tincludeKeyboard: true,\n\t\t\tpreferEditHub: false,\n\t\t});\n\t\tawait this.ensureInputMenu(chatId, true);\n\t}\n\n\tprivate async sendHelp(chatId: TelegramChatId): Promise<void> {\n\t\tconst help = [\n\t\t\t\"IOSM Telegram · Quick Guide\",\n\t\t\t\"\",\n\t\t\t\"What the agent can do\",\n\t\t\t\"- Analyze your codebase and explain behavior\",\n\t\t\t\"- Create/edit files and refactor code\",\n\t\t\t\"- Run shell commands, investigate failures, fix tests\",\n\t\t\t\"- Work with git changes and repository context\",\n\t\t\t\"- Prepare concise result summaries\",\n\t\t\t\"\",\n\t\t\t\"Tools the agent uses\",\n\t\t\t\"- Shell tools: bash/zsh commands for diagnostics and automation\",\n\t\t\t\"- Code tools: search (rg), read/edit files, refactor project code\",\n\t\t\t\"- Validation tools: run tests, linters, build checks\",\n\t\t\t\"- Git tools: inspect diffs/status, create safe code changes\",\n\t\t\t\"- In ASK mode, dangerous tool actions require Allow/Deny\",\n\t\t\t\"\",\n\t\t\t\"How to ask\",\n\t\t\t\"- Write a plain task: what to do + where + expected output\",\n\t\t\t\"- Example: \\\"Find why tests fail and fix them\\\"\",\n\t\t\t\"- Example: \\\"Find large files and propose safe cleanup\\\"\",\n\t\t\t\"\",\n\t\t\t\"Quick buttons\",\n\t\t\t\"- 🧭 Hub: current status/model/mode\",\n\t\t\t\"- ⚡ Cmd: command/action center\",\n\t\t\t\"- 🆕 New: start a new session\",\n\t\t\t\"- ⛔ Abort: stop current task\",\n\t\t\t\"- 🛑 Stop: stop bridge\",\n\t\t\t\"\",\n\t\t\t\"Models and permissions\",\n\t\t\t\"- /model: choose model\",\n\t\t\t\"- ASK mode: dangerous actions require Allow/Deny\",\n\t\t\t\"- /yolo on|off|status: confirmation mode control\",\n\t\t\t\"\",\n\t\t\t\"Useful commands\",\n\t\t\t\"/status /commands /model /menu /help\",\n\t\t\t\"\",\n\t\t\t\"Tip: phrase tasks like \\\"do X, verify Y, report result\\\".\",\n\t\t].join(\"\\n\");\n\t\tawait this.bot.sendMessage(chatId, help);\n\t}\n\n\tprivate buildDefaultCommandText(name: string): string {\n\t\tconst lower = name.toLowerCase();\n\t\tswitch (lower) {\n\t\t\tcase \"permissions\":\n\t\t\t\treturn \"/permissions status\";\n\t\t\tcase \"yolo\":\n\t\t\t\treturn \"/yolo status\";\n\t\t\tcase \"checkpoint\":\n\t\t\t\treturn \"/checkpoint list\";\n\t\t\tcase \"rollback\":\n\t\t\t\treturn \"/rollback list\";\n\t\t\tcase \"tree\":\n\t\t\t\treturn \"/tree list\";\n\t\t\tdefault:\n\t\t\t\treturn `/${name}`;\n\t\t}\n\t}\n\n\tprivate mapBuiltinCommands(commands: RpcBuiltinSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: \"builtin\" as const,\n\t\t\tcommandText: this.buildDefaultCommandText(command.name),\n\t\t}));\n\t}\n\n\tprivate mapExternalCommands(commands: RpcSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: command.source,\n\t\t\tcommandText: `/${command.name}`,\n\t\t}));\n\t}\n\n\tprivate getLocalBridgeCommands(): CommandCatalogEntry[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"commands\",\n\t\t\t\tdescription: \"Open paged command buttons\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/commands\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"model\",\n\t\t\t\tdescription: \"Open model picker\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/model\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"status\",\n\t\t\t\tdescription: \"Show runtime status\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/status\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abort\",\n\t\t\t\tdescription: \"Abort active task\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/abort\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"stop\",\n\t\t\t\tdescription: \"Stop bridge and cancel active work\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/stop\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate commandButtonLabel(entry: CommandCatalogEntry, view: CommandMenuView): string {\n\t\tif (view === \"all\") {\n\t\t\tconst raw = entry.commandText.startsWith(\"/\") ? entry.commandText : `/${entry.name}`;\n\t\t\treturn raw.length > 24 ? `${raw.slice(0, 23)}…` : raw;\n\t\t}\n\t\tconst key = entry.commandText.toLowerCase();\n\t\tswitch (key) {\n\t\t\tcase \"/model\":\n\t\t\t\treturn \"🤖 Model\";\n\t\t\tcase \"/status\":\n\t\t\t\treturn \"🔄 Status\";\n\t\t\tcase \"/new\":\n\t\t\t\treturn \"🆕 New\";\n\t\t\tcase \"/abort\":\n\t\t\t\treturn \"⛔ Abort\";\n\t\t\tcase \"/permissions status\":\n\t\t\t\treturn \"🛡 Mode\";\n\t\t\tcase \"/yolo status\":\n\t\t\t\treturn \"⚠️ YOLO\";\n\t\t\tcase \"/help\":\n\t\t\t\treturn \"❓ Help\";\n\t\t\tcase \"/stop\":\n\t\t\t\treturn \"🛑 Stop\";\n\t\t\tdefault:\n\t\t\t\treturn entry.commandText;\n\t\t}\n\t}\n\n\tprivate async getCommandCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<CommandCatalogEntry[]> {\n\t\tconst cached = this.commandCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < COMMAND_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst [builtin, dynamic] = await Promise.all([\n\t\t\tthis.rpcClient.getBuiltinCommands(),\n\t\t\tthis.rpcClient.getCommands(),\n\t\t]);\n\t\tthis.rpcConnected = true;\n\n\t\tconst entries: CommandCatalogEntry[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const entry of this.getLocalBridgeCommands()) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\t\tfor (const entry of this.mapBuiltinCommands(builtin)) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tconst dynamicEntries = this.mapExternalCommands(dynamic).sort((a, b) => a.name.localeCompare(b.name));\n\t\tfor (const entry of dynamicEntries) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tthis.commandCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildCommandMenuKeyboard(\n\t\tentries: CommandCatalogEntry[],\n\t\tpage: number,\n\t\tview: CommandMenuView,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * COMMANDS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + COMMANDS_PAGE_SIZE);\n\n\t\tconst commandRows: Array<Array<{ text: string; callback_data: string }>> = [];\n\t\tfor (let index = 0; index < pageEntries.length; index += 2) {\n\t\t\tconst left = pageEntries[index];\n\t\t\tconst right = pageEntries[index + 1];\n\t\t\tconst row: Array<{ text: string; callback_data: string }> = [];\n\t\t\tif (left) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(left, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (right) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(right, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index + 1}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (row.length > 0) {\n\t\t\t\tcommandRows.push(row);\n\t\t\t}\n\t\t}\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `cmd:page:${view}:${normalizedPage - 1}` : \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `cmd:page:${view}:${normalizedPage + 1}` : \"cmd:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...commandRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: view === \"main\" ? \"All Commands\" : \"Main Commands\",\n\t\t\t\t\t\tcallback_data: `cmd:view:${view === \"main\" ? \"all\" : \"main\"}:0`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: \"Refresh\",\n\t\t\t\t\t\tcallback_data: view === \"all\" ? `cmd:refresh:${view}:${normalizedPage}` : `cmd:view:${view}:0`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"cmd:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"cmd:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendCommandMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean; view?: CommandMenuView },\n\t): Promise<void> {\n\t\tlet entries: CommandCatalogEntry[] = [];\n\t\tconst view = options?.view ?? \"main\";\n\t\ttry {\n\t\t\tentries = view === \"main\" ? MAIN_COMMAND_MENU : await this.getCommandCatalog(chatId, options?.refreshCatalog === true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load commands: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t`Command Center · ${APP_NAME}`,\n\t\t\t`${view === \"main\" ? \"Main Actions\" : \"All Commands\"} · ${normalizedPage + 1}/${pageCount}`,\n\t\t\t`${entries.length} items`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildCommandMenuKeyboard(entries, normalizedPage, view);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback below: send a new message if editing failed.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleCommandMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst parts = data.split(\":\");\n\t\tconst action = parts[1] ?? \"\";\n\t\tconst rawView = parts[2];\n\t\tlet view: CommandMenuView = rawView === \"all\" ? \"all\" : \"main\";\n\t\tlet value = parts[3];\n\t\t// Backward compatibility with older callback payloads: cmd:<action>:<value>.\n\t\tif ((action === \"page\" || action === \"refresh\" || action === \"run\") && parts.length === 3) {\n\t\t\tview = \"main\";\n\t\t\tvalue = parts[2];\n\t\t}\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"view\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: view === \"all\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"run\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: CommandCatalogEntry[] = [];\n\t\t\tif (view === \"main\") {\n\t\t\t\tentries = MAIN_COMMAND_MENU;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tentries = await this.getCommandCatalog(chatId, false);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.rpcConnected = false;\n\t\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to load command catalog\");\n\t\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\t\tchatId,\n\t\t\t\t\t\t`Failed to load commands: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Command list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/model\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Open model picker\");\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/status\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/help\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/abort\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Abort signal sent\");\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText.startsWith(\"/yolo\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tconst parts = entry.commandText.split(/\\s+/).slice(1);\n\t\t\t\tawait this.handleYoloCommand(chatId, parts);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/stop\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping bridge\");\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/commands\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Run ${entry.commandText}`);\n\t\t\tconst handled = await this.runBuiltinCommand(chatId, entry.commandText);\n\t\t\tif (!handled) {\n\t\t\t\tawait this.enqueuePrompt(chatId, entry.commandText);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate modelKey(model: { provider: string; id: string } | undefined): string | undefined {\n\t\tif (!model) return undefined;\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate async getModelCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<ModelCatalogEntry[]> {\n\t\tconst cached = this.modelCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < MODEL_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst entries = (await this.rpcClient.getAvailableModels())\n\t\t\t.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tid: model.id,\n\t\t\t\tcontextWindow: model.contextWindow,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t}))\n\t\t\t.sort((a, b) => this.modelKey(a)!.localeCompare(this.modelKey(b)!));\n\t\tthis.rpcConnected = true;\n\t\tthis.modelCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildModelMenuKeyboard(\n\t\tentries: ModelCatalogEntry[],\n\t\tpage: number,\n\t\tcurrentModelKey: string | undefined,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * MODELS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + MODELS_PAGE_SIZE);\n\n\t\tconst modelRows = pageEntries.map((entry, index) => {\n\t\t\tconst key = this.modelKey(entry);\n\t\t\tconst selectedPrefix = key === currentModelKey ? \"✅ \" : \"\";\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\ttext: `${selectedPrefix}${entry.provider}/${entry.id}`,\n\t\t\t\t\tcallback_data: `model:set:${start + index}`,\n\t\t\t\t},\n\t\t\t];\n\t\t});\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `model:page:${normalizedPage - 1}` : \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `model:page:${normalizedPage + 1}` : \"model:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...modelRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Cycle\", callback_data: \"model:cycle\" },\n\t\t\t\t\t{ text: \"Refresh\", callback_data: `model:refresh:${normalizedPage}` },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"model:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"model:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendModelMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean },\n\t): Promise<void> {\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tlet entries: ModelCatalogEntry[] = [];\n\t\ttry {\n\t\t\tentries = await this.getModelCatalog(chatId, options?.refreshCatalog === true);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (entries.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No models available. Configure models in settings and retry.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentModelKey = this.modelKey(this.activeSessionState?.model);\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t\"Model Picker\",\n\t\t\t`Current: ${currentModelKey ?? \"not selected\"}`,\n\t\t\t`Available: ${entries.length}`,\n\t\t\t`Page: ${normalizedPage + 1}/${pageCount}`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildModelMenuKeyboard(entries, normalizedPage, currentModelKey);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback to sending a fresh message.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleModelMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst [, action, value] = data.split(\":\");\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"cycle\") {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tconst cycled = await this.rpcClient.cycleModel();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(\n\t\t\t\t\tcallback.id,\n\t\t\t\t\tcycled ? `Model: ${cycled.model.provider}/${cycled.model.id}` : \"No model candidates\",\n\t\t\t\t);\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { messageId, refreshCatalog: false });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to cycle model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to cycle model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"set\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: ModelCatalogEntry[] = [];\n\t\t\ttry {\n\t\t\t\tentries = await this.getModelCatalog(chatId, false);\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tawait this.rpcClient.setModel(entry.provider, entry.id);\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Selected ${entry.provider}/${entry.id}`);\n\t\t\t\tawait this.sendModelMenu(chatId, Math.floor(index / MODELS_PAGE_SIZE), { messageId, refreshCatalog: false });\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to set model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to set model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async stopBridge(chatId: TelegramChatId): Promise<void> {\n\t\tif (this.bridgeStopped && !this.activeTurn && this.queue.length === 0 && !this.rpcConnected) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst droppedQueue = this.queue.length;\n\t\tthis.queue.length = 0;\n\t\tthis.bridgeStopped = true;\n\t\tthis.commandCatalogByChat.clear();\n\t\tthis.modelCatalogByChat.clear();\n\n\t\tif (this.rpcConnected) {\n\t\t\tfor (const requestId of this.pendingConfirmations.keys()) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: requestId, confirmed: false });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore; bridge is stopping.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmations.clear();\n\t\tthis.pendingConfirmationGroupIdsByKey.clear();\n\n\t\tconst active = this.activeTurn;\n\t\tif (active?.statusEditTimer) {\n\t\t\tclearTimeout(active.statusEditTimer);\n\t\t}\n\t\tthis.activeTurn = undefined;\n\t\tif (active) {\n\t\t\tif (active.statusEditInFlight) {\n\t\t\t\ttry {\n\t\t\t\t\tawait active.statusEditInFlight;\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort; proceed with stop status.\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(active.chatId, active.statusMessageId, \"⛔ done (stopped)\");\n\t\t\t} catch {\n\t\t\t\t// Best-effort status close.\n\t\t\t}\n\t\t\tif (active.chatId !== chatId) {\n\t\t\t\tawait this.bot.sendMessage(active.chatId, \"Bridge stopped. Active task cancelled.\");\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.rpcClient.stop();\n\t\t} catch (error) {\n\t\t\tconsole.warn(`[telegram] rpc stop failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t} finally {\n\t\t\tthis.rpcConnected = false;\n\t\t}\n\n\t\tconst parts = [\"Bridge stopped.\"];\n\t\tif (active) {\n\t\t\tparts.push(\"Active task cancelled.\");\n\t\t}\n\t\tif (droppedQueue > 0) {\n\t\t\tparts.push(`Dropped queued tasks: ${droppedQueue}.`);\n\t\t}\n\t\tparts.push(\"Use /start to resume.\");\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\tawait this.ensureInputMenu(chatId, true);\n\t\tawait this.bot.sendMessage(chatId, parts.join(\" \"));\n\t}\n\n\tprivate formatConnectionStatus(): string {\n\t\tif (this.bridgeStopped) return \"⛔ stopped\";\n\t\tif (!this.rpcConnected) return \"🟥 disconnected\";\n\t\tif (this.activeTurn) return \"🟩 connected\";\n\t\treturn \"🟦 idle\";\n\t}\n\n\tprivate formatPermissionShort(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"YOLO\";\n\t\tif (mode === \"auto\") return \"AUTO\";\n\t\treturn \"ASK\";\n\t}\n\n\tprivate formatPermissionButton(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"⚠️ YOLO\";\n\t\tif (mode === \"auto\") return \"🤖 AUTO\";\n\t\treturn \"🛡 ASK\";\n\t}\n\n\tprivate formatModelShort(model: string, maxLen = 42): string {\n\t\tif (model.length <= maxLen) return model;\n\t\treturn `${model.slice(0, maxLen - 1)}…`;\n\t}\n\n\tprivate formatSessionShort(sessionName: string | undefined, sessionId: string | undefined): string {\n\t\tif (sessionName && sessionName.trim().length > 0) return this.formatModelShort(sessionName.trim(), 24);\n\t\tif (!sessionId || sessionId.trim().length === 0) return \"unknown\";\n\t\tconst value = sessionId.trim();\n\t\tif (value.length <= 14) return value;\n\t\treturn `${value.slice(0, 8)}…${value.slice(-4)}`;\n\t}\n\n\tprivate formatCompactTurn(): string {\n\t\tif (!this.activeTurn) return \"idle\";\n\t\tconst elapsed = Math.max(0, Math.floor((Date.now() - this.activeTurn.startedAt) / 1000));\n\t\tconst phase = this.formatStatusPhase(this.activeTurn.phase);\n\t\treturn `${phase} ${elapsed}s`;\n\t}\n\n\tprivate buildHubKeyboard(mode: \"ask\" | \"auto\" | \"yolo\" | undefined, view: HubView): TelegramInlineKeyboardMarkup {\n\t\tif (this.bridgeStopped) {\n\t\t\treturn {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"▶️ Start\", callback_data: \"hub:start\" },\n\t\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\t],\n\t\t\t\t\t[{ text: \"❓ Help\", callback_data: \"hub:help\" }],\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tconst detailsToggle =\n\t\t\tview === \"details\"\n\t\t\t\t? { text: \"◀ Compact\", callback_data: \"hub:compact\" }\n\t\t\t\t: { text: \"ℹ️ Details\", callback_data: \"hub:details\" };\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t[\n\t\t\t\t\t{ text: \"🆕 New\", callback_data: \"hub:new\" },\n\t\t\t\t\t{ text: \"⚡ Cmd\", callback_data: \"hub:commands\" },\n\t\t\t\t\t{ text: \"🤖 Model\", callback_data: \"hub:model\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: this.formatPermissionButton(mode), callback_data: \"hub:toggle_mode\" },\n\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\tdetailsToggle,\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"⛔ Abort\", callback_data: \"hub:abort\" },\n\t\t\t\t\t{ text: \"🛑 Stop\", callback_data: \"hub:stop\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendStatusCard(\n\t\tchatId: TelegramChatId,\n\t\toptions?: { header?: string; includeKeyboard?: boolean; preferEditHub?: boolean; view?: HubView },\n\t): Promise<void> {\n\t\tif (!this.bridgeStopped) {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\tchatId,\n\t\t\t\t\t`Status unavailable: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst state = this.activeSessionState;\n\t\tconst model = state?.model ? `${state.model.provider}/${state.model.id}` : \"not selected\";\n\t\tconst queueSize = this.queue.length;\n\t\tconst mcpState = \"RPC child\";\n\t\tconst permissionMode = state?.permissionMode ?? \"ask\";\n\t\tconst resolvedView = options?.view ?? this.hubViewByChat.get(chatId) ?? \"compact\";\n\t\tthis.hubViewByChat.set(chatId, resolvedView);\n\n\t\tconst header = options?.header ?? \"Control Hub\";\n\t\tconst compactText = [\n\t\t\theader,\n\t\t\t`${this.formatConnectionStatus()} · ${this.formatPermissionShort(permissionMode)} · q${queueSize} · ${this.formatCompactTurn()}`,\n\t\t\t`🤖 ${this.formatModelShort(model)}`,\n\t\t\t`💬 ${this.formatSessionShort(state?.sessionName, state?.sessionId)}`,\n\t\t].join(\"\\n\");\n\t\tconst detailsText = [\n\t\t\t`${header} · Details`,\n\t\t\t`Connection: ${this.formatConnectionStatus()}`,\n\t\t\t`Mode: ${permissionMode}`,\n\t\t\t`Model: ${model}`,\n\t\t\t`Session: ${state?.sessionName ?? state?.sessionId ?? \"unknown\"}`,\n\t\t\t`Turn: ${this.activeTurn ? `${this.activeTurn.phase} (${Math.floor((Date.now() - this.activeTurn.startedAt) / 1000)}s)` : \"idle\"}`,\n\t\t\t`Queue: ${queueSize}`,\n\t\t\t`MCP: ${mcpState}`,\n\t\t\t\"Telegram: active\",\n\t\t].join(\"\\n\");\n\t\tconst text = resolvedView === \"details\" ? detailsText : compactText;\n\t\tconst keyboard = options?.includeKeyboard ? this.buildHubKeyboard(permissionMode, resolvedView) : undefined;\n\n\t\tif (options?.includeKeyboard && options.preferEditHub) {\n\t\t\tconst hubMessageId = this.hubMessageIdByChat.get(chatId);\n\t\t\tif (hubMessageId) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.bot.editMessageText(chatId, hubMessageId, text, { replyMarkup: keyboard });\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback below: send a fresh hub card if original message is gone.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst message = await this.bot.sendMessage(chatId, text, { replyMarkup: keyboard });\n\t\tif (options?.includeKeyboard) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, message.message_id);\n\t\t}\n\t}\n\n\tprivate async togglePermissionMode(chatId: TelegramChatId): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst current = await this.rpcClient.getPermissionMode();\n\t\t\tconst next = current === \"yolo\" ? \"ask\" : \"yolo\";\n\t\t\tawait this.rpcClient.setPermissionMode(next);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to switch mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async handleYoloCommand(chatId: TelegramChatId, args: string[]): Promise<void> {\n\t\tconst desired = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tif (!desired || desired === \"status\") {\n\t\t\t\tconst mode = await this.rpcClient.getPermissionMode();\n\t\t\t\tawait this.bot.sendMessage(chatId, `YOLO mode: ${mode === \"yolo\" ? \"ON\" : \"OFF\"} (${mode})`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"on\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"yolo\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: ON (tool confirmations disabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"off\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"ask\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: OFF (tool confirmations enabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.sendMessage(chatId, \"Usage: /yolo [on|off|status]\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to update mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async abortActiveTurn(chatId: TelegramChatId): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No active task.\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tthis.activeTurn.aborted = true;\n\t\t\tawait this.rpcClient.abort();\n\t\t\tawait this.bot.sendMessage(chatId, \"Abort signal sent.\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Abort failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async enqueuePrompt(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.startTurn(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push({ chatId, text });\n\t\tawait this.bot.sendMessage(chatId, `⏸ queued · ${this.queue.length}`);\n\t\tvoid this.editLiveStatus();\n\t}\n\n\tprivate async startTurn(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst statusMessage = await this.bot.sendMessage(chatId, this.formatStartingStatus(text));\n\t\tthis.activeTurn = {\n\t\t\tturnId: this.nextTurnId++,\n\t\t\tchatId,\n\t\t\tprompt: text,\n\t\t\tstartedAt: Date.now(),\n\t\t\tstatusMessageId: statusMessage.message_id,\n\t\t\tphase: \"starting\",\n\t\t\taborted: false,\n\t\t\tstatusEditPending: false,\n\t\t\tlastStatusEditAt: 0,\n\t\t};\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tawait this.rpcClient.prompt(text);\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.editLiveStatus(true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.finishTurn({\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async onRpcEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\n\t\tswitch (event.type) {\n\t\t\tcase \"turn_start\":\n\t\t\t\tthis.activeTurn.phase = \"running\";\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName ?? this.activeTurn.lastTool;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"turn_end\": {\n\t\t\t\tconst turnEnd = event as AgentEvent;\n\t\t\t\tconst directText = this.extractAssistantTextFromTurnEnd(turnEnd);\n\t\t\t\tif (directText) {\n\t\t\t\t\t// Keep as fallback in case getLastAssistantText fails.\n\t\t\t\t\tthis.activeTurn.phase = \"finalizing\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent_end\":\n\t\t\t\tawait this.finishTurn();\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tawait this.editLiveStatus();\n\t}\n\n\tprivate async onRpcExtensionUiRequest(request: RpcExtensionUIRequest): Promise<void> {\n\t\tif (request.method === \"confirm_permission\" || request.method === \"confirm\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (!chatId) {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, confirmed: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = `${request.title}\\n${request.message}`;\n\t\t\tconst groupKey =\n\t\t\t\trequest.method === \"confirm_permission\"\n\t\t\t\t\t? this.buildPermissionGroupKey(chatId, request.request)\n\t\t\t\t\t: this.buildGenericConfirmationGroupKey(chatId, label);\n\t\t\tawait this.queueConfirmationPrompt(chatId, request.id, label, groupKey);\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.method === \"notify\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (chatId) {\n\t\t\t\tawait this.bot.sendMessage(chatId, request.message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unsupported interactive extension methods in telegram v1: cancel by default.\n\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, cancelled: true });\n\t}\n\n\tprivate async onRpcConfirmationRequest(event: RpcRequiresConfirmationEvent): Promise<void> {\n\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\tif (!chatId) {\n\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: event.id, confirmed: false });\n\t\t\treturn;\n\t\t}\n\t\tconst groupKey = this.buildPermissionGroupKey(chatId, event.request);\n\t\tawait this.queueConfirmationPrompt(chatId, event.id, event.message, groupKey);\n\t}\n\n\tprivate buildPermissionGroupKey(chatId: TelegramChatId, request: RpcRequiresConfirmationEvent[\"request\"]): string {\n\t\tconst requiredPermission = request.requiredPermission ?? \"unknown\";\n\t\tconst toolSource = request.toolSource ?? \"unknown\";\n\t\tconst inputJson = JSON.stringify(request.input ?? {});\n\t\treturn `${chatId}|perm|${request.toolName}|${requiredPermission}|${toolSource}|${request.summary}|${request.cwd}|${inputJson}`;\n\t}\n\n\tprivate buildGenericConfirmationGroupKey(chatId: TelegramChatId, label: string): string {\n\t\tconst normalized = label.replace(/\\s+/g, \" \").trim();\n\t\treturn `${chatId}|confirm|${normalized}`;\n\t}\n\n\tprivate async queueConfirmationPrompt(\n\t\tchatId: TelegramChatId,\n\t\trequestId: string,\n\t\tlabel: string,\n\t\tgroupKey: string,\n\t): Promise<void> {\n\t\tif (this.pendingConfirmations.has(requestId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.pendingConfirmationGroupIdsByKey.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.add(requestId);\n\t\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\t\tif (this.activeTurn) {\n\t\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\t\tawait this.editLiveStatus(true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = new Set<string>([requestId]);\n\t\tthis.pendingConfirmationGroupIdsByKey.set(groupKey, ids);\n\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\tawait this.bot.sendMessage(chatId, label, {\n\t\t\treplyMarkup: {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"Allow\", callback_data: `confirm:${requestId}:yes` },\n\t\t\t\t\t\t{ text: \"Deny\", callback_data: `confirm:${requestId}:no` },\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate async respondConfirmation(requestId: string, confirmed: boolean): Promise<void> {\n\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\tif (!pending) return;\n\n\t\tconst groupedIds = this.pendingConfirmationGroupIdsByKey.get(pending.groupKey);\n\t\tconst ids = groupedIds && groupedIds.size > 0 ? Array.from(groupedIds) : [requestId];\n\t\tfor (const id of ids) {\n\t\t\tthis.pendingConfirmations.delete(id);\n\t\t\ttry {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id, confirmed });\n\t\t\t} catch {\n\t\t\t\t// Best-effort for duplicated request IDs from different streams.\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmationGroupIdsByKey.delete(pending.groupKey);\n\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = confirmed ? \"running\" : \"permission denied\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate extractAssistantTextFromTurnEnd(event: AgentEvent): string | undefined {\n\t\tconst messageEvent = event as { message?: { role?: string; content?: Array<{ type: string; text?: string }> } };\n\t\tconst message = messageEvent.message;\n\t\tif (!message || message.role !== \"assistant\") return undefined;\n\t\tconst content = Array.isArray(message.content) ? message.content : [];\n\t\tconst textParts = content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text.trim())\n\t\t\t.filter((part) => part.length > 0);\n\t\tif (textParts.length === 0) return undefined;\n\t\treturn textParts.join(\"\\n\\n\");\n\t}\n\n\tprivate escapeTelegramHtml(text: string): string {\n\t\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \""\");\n\t}\n\n\tprivate stripHtmlTags(text: string): string {\n\t\treturn text.replace(/<[^>]*>/g, \"\");\n\t}\n\n\tprivate normalizeTelegramText(text: string): string {\n\t\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\t}\n\n\tprivate renderMarkdownInlineTokens(tokens: Token[] | undefined): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"strong\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"em\":\n\t\t\t\t\toutput += `<i>${this.renderMarkdownInlineTokens(token.tokens)}</i>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"del\":\n\t\t\t\t\toutput += `<s>${this.renderMarkdownInlineTokens(token.tokens)}</s>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codespan\":\n\t\t\t\t\toutput += `<code>${this.escapeTelegramHtml(token.text)}</code>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"br\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"link\": {\n\t\t\t\t\tconst labelRaw = this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\tconst label = labelRaw.length > 0 ? labelRaw : this.escapeTelegramHtml(token.text ?? token.href);\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^(https?:\\/\\/|mailto:|tg:\\/\\/)/i.test(href)) {\n\t\t\t\t\t\toutput += `<a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${label}</a>`;\n\t\t\t\t\t} else if (href) {\n\t\t\t\t\t\toutput += `${label} (${this.escapeTelegramHtml(href)})`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += label;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"image\": {\n\t\t\t\t\tconst captionRaw = token.text?.trim();\n\t\t\t\t\tconst caption = captionRaw && captionRaw.length > 0 ? captionRaw : \"image\";\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^https?:\\/\\//i.test(href)) {\n\t\t\t\t\t\toutput += `🖼 <a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${this.escapeTelegramHtml(caption)}</a>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `🖼 ${this.escapeTelegramHtml(caption)}`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"escape\":\n\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\");\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(htmlText);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.raw);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate renderMarkdownTableCell(cell: Tokens.TableCell): string {\n\t\tconst rendered = this.renderMarkdownInlineTokens(cell.tokens);\n\t\treturn rendered.replace(/\\s+/g, \" \").trim();\n\t}\n\n\tprivate renderMarkdownBlockTokens(tokens: Token[] | undefined, listDepth = 0): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"space\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"heading\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"paragraph\":\n\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"code\":\n\t\t\t\t\toutput += `<pre>${this.escapeTelegramHtml(token.text.replace(/\\r\\n/g, \"\\n\"))}</pre>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"blockquote\": {\n\t\t\t\t\tconst rawQuote = this.normalizeTelegramText(this.renderMarkdownBlockTokens(token.tokens, listDepth));\n\t\t\t\t\tif (rawQuote.length > 0) {\n\t\t\t\t\t\tconst quoted = rawQuote\n\t\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t\t.map((line) => (line.trim().length > 0 ? `> ${line}` : \">\"))\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\t\toutput += `${quoted}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst baseIndent = \" \".repeat(listDepth);\n\t\t\t\t\tconst start = token.ordered && typeof token.start === \"number\" ? token.start : 1;\n\t\t\t\t\ttoken.items.forEach((item: Tokens.ListItem, index: number) => {\n\t\t\t\t\t\tconst marker = token.ordered ? `${start + index}.` : \"•\";\n\t\t\t\t\t\tconst renderedItem = this.normalizeTelegramText(this.renderMarkdownBlockTokens(item.tokens, listDepth + 1));\n\t\t\t\t\t\tconst fallback = this.escapeTelegramHtml(item.text ?? \"\");\n\t\t\t\t\t\tconst body = renderedItem.length > 0 ? renderedItem : fallback;\n\t\t\t\t\t\tconst lines = body.split(\"\\n\");\n\t\t\t\t\t\tconst firstLine = lines.shift() ?? \"\";\n\t\t\t\t\t\toutput += `${baseIndent}${marker} ${firstLine}\\n`;\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (line.trim().length === 0) {\n\t\t\t\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput += `${baseIndent} ${line}\\n`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"hr\":\n\t\t\t\t\toutput += \"────────\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"table\": {\n\t\t\t\t\tconst headerLine = token.header\n\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t.trim();\n\t\t\t\t\tif (headerLine.length > 0) {\n\t\t\t\t\t\toutput += `${headerLine}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const row of token.rows) {\n\t\t\t\t\t\tconst rowLine = row\n\t\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tif (rowLine.length > 0) {\n\t\t\t\t\t\t\toutput += `${rowLine}\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\").trim();\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(htmlText)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownBlockTokens(token.tokens, listDepth)}\\n`;\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.raw)}\\n`;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate markdownToTelegramHtml(markdown: string): string {\n\t\tif (!markdown || markdown.trim().length === 0) return \"\";\n\t\tconst tokens = marked.lexer(markdown, { gfm: true, breaks: true }) as Token[];\n\t\tconst rendered = this.renderMarkdownBlockTokens(tokens);\n\t\treturn this.normalizeTelegramText(rendered);\n\t}\n\n\tprivate markdownToTelegramPlainText(markdown: string): string {\n\t\tconst html = this.markdownToTelegramHtml(markdown);\n\t\treturn this.normalizeTelegramText(\n\t\t\thtml\n\t\t\t\t.replace(/<a [^>]*>([\\s\\S]*?)<\\/a>/gi, \"$1\")\n\t\t\t\t.replace(/<\\/?(b|i|s|u|code|pre)>/gi, \"\")\n\t\t\t\t.replace(/"/g, \"\\\"\")\n\t\t\t\t.replace(/</g, \"<\")\n\t\t\t\t.replace(/>/g, \">\")\n\t\t\t\t.replace(/&/g, \"&\"),\n\t\t);\n\t}\n\n\tprivate async sendRichMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst html = this.markdownToTelegramHtml(text);\n\t\tif (!html || html.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.bot.sendMessage(chatId, html, { parseMode: \"HTML\" });\n\t\t} catch {\n\t\t\tconst plain = this.markdownToTelegramPlainText(text);\n\t\t\tawait this.bot.sendMessage(chatId, plain.length > 0 ? plain : text);\n\t\t}\n\t}\n\n\tprivate formatStatusPhase(phase: string): string {\n\t\tconst lower = phase.toLowerCase();\n\t\tif (lower.includes(\"awaiting\")) return \"confirm\";\n\t\tif (lower.includes(\"tool\")) return \"tool\";\n\t\tif (lower.includes(\"final\")) return \"final\";\n\t\tif (lower.includes(\"start\")) return \"start\";\n\t\tif (lower.includes(\"permission denied\")) return \"denied\";\n\t\tif (lower.includes(\"running\")) return \"run\";\n\t\treturn lower.replace(/\\s+/g, \"-\");\n\t}\n\n\tprivate formatPromptPreview(prompt: string, limit = 100): string {\n\t\tconst cleaned = prompt.replace(/\\s+/g, \" \").trim();\n\t\tif (cleaned.length <= limit) return cleaned;\n\t\treturn `${cleaned.slice(0, limit - 1)}…`;\n\t}\n\n\tprivate statusSpinnerFrame(elapsedMs: number): string {\n\t\tconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\t\treturn frames[Math.floor(elapsedMs / 250) % frames.length] ?? \"⠋\";\n\t}\n\n\tprivate statusPulseFrame(elapsedMs: number): string {\n\t\tconst frames = [\"◼···\", \"◼•··\", \"◼••·\", \"◼•••\", \"◼••·\", \"◼•··\"];\n\t\treturn frames[Math.floor(elapsedMs / 280) % frames.length] ?? \"◼···\";\n\t}\n\n\tprivate statusDotsFrame(elapsedMs: number): string {\n\t\tconst frames = [\".\", \"..\", \"...\"];\n\t\treturn frames[Math.floor(elapsedMs / 420) % frames.length] ?? \".\";\n\t}\n\n\tprivate statusActivityLabel(turn: ActiveTurnState | undefined): string {\n\t\tif (!turn) return \"idle\";\n\t\tconst phase = turn.phase.toLowerCase();\n\t\tif (phase.includes(\"awaiting\")) return \"awaiting confirm\";\n\t\tif (phase.includes(\"tool\")) {\n\t\t\tconst tool = turn.lastTool?.trim();\n\t\t\tif (tool && tool.length > 0) {\n\t\t\t\tconst shortTool = tool.length > 18 ? `${tool.slice(0, 17)}…` : tool;\n\t\t\t\treturn `tool:${shortTool}`;\n\t\t\t}\n\t\t\treturn \"tool:running\";\n\t\t}\n\t\tif (phase.includes(\"final\")) return \"finalizing\";\n\t\tif (phase.includes(\"start\")) return \"starting\";\n\t\tif (phase.includes(\"denied\")) return \"permission denied\";\n\t\treturn \"working\";\n\t}\n\n\tprivate formatToolBadge(toolName: string | undefined): string {\n\t\tif (!toolName) return \"\";\n\t\tconst compact = toolName.trim().replace(/\\s+/g, \" \");\n\t\tconst clipped = compact.length > 18 ? `${compact.slice(0, 17)}…` : compact;\n\t\treturn ` · ${clipped}`;\n\t}\n\n\tprivate formatStartingStatus(prompt: string): string {\n\t\treturn [`⏳ ${APP_NAME} · start · 0s · q${this.queue.length}`, `“${this.formatPromptPreview(prompt, 56)}”`].join(\"\\n\");\n\t}\n\n\tprivate formatLiveStatus(turn: ActiveTurnState | undefined = this.activeTurn): string {\n\t\tif (!turn) return \"No active task.\";\n\t\tconst elapsedMs = Date.now() - turn.startedAt;\n\t\tconst elapsed = `${Math.floor(elapsedMs / 1000)}s`;\n\t\tconst spinner = this.statusSpinnerFrame(elapsedMs);\n\t\tconst pulse = this.statusPulseFrame(elapsedMs);\n\t\tconst phaseLabel = this.formatStatusPhase(turn.phase);\n\t\tconst toolSegment = this.formatToolBadge(turn.lastTool);\n\t\tconst activity = this.statusActivityLabel(turn);\n\t\treturn [\n\t\t\t`${spinner} ${APP_NAME} · ${phaseLabel}${toolSegment} · ${elapsed} · q${this.queue.length}`,\n\t\t\t`${pulse} ${activity}`,\n\t\t\t`“${this.formatPromptPreview(turn.prompt, 56)}”`,\n\t\t].join(\"\\n\");\n\t}\n\n\tprivate async editLiveStatus(force = false): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\t\tif (this.activeTurn.statusEditPending) return;\n\t\tconst turnId = this.activeTurn.turnId;\n\t\tconst now = Date.now();\n\t\tconst effectiveThrottleMs = Math.min(this.statusEditThrottleMs, LIVE_STATUS_ANIMATION_MAX_THROTTLE_MS);\n\t\tconst waitMs = this.activeTurn.lastStatusEditAt + effectiveThrottleMs - now;\n\t\tif (!force && waitMs > 0) {\n\t\t\tthis.activeTurn.statusEditPending = true;\n\t\t\tthis.activeTurn.statusEditTimer = setTimeout(() => {\n\t\t\t\tif (this.activeTurn && this.activeTurn.turnId === turnId) {\n\t\t\t\t\tthis.activeTurn.statusEditPending = false;\n\t\t\t\t\tvoid this.editLiveStatus(true);\n\t\t\t\t}\n\t\t\t}, waitMs);\n\t\t\treturn;\n\t\t}\n\n\t\tconst target = this.activeTurn;\n\t\tconst statusText = this.formatLiveStatus(target);\n\t\tconst editPromise = this.bot\n\t\t\t.editMessageText(target.chatId, target.statusMessageId, statusText, {\n\t\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t\t})\n\t\t\t.then(() => {\n\t\t\t\ttarget.lastStatusEditAt = Date.now();\n\t\t\t})\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\t\t// Ignore no-op edit errors and transient \"message is not modified\".\n\t\t\t\tif (!message.toLowerCase().includes(\"message is not modified\")) {\n\t\t\t\t\tconsole.warn(`[telegram] status edit failed: ${message}`);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.finally(() => {\n\t\t\t\tif (target.statusEditInFlight === editPromise) {\n\t\t\t\t\ttarget.statusEditInFlight = undefined;\n\t\t\t\t}\n\t\t\t});\n\t\ttarget.statusEditInFlight = editPromise;\n\t\tawait editPromise;\n\t}\n\n\tprivate async finishTurn(options?: { error?: string }): Promise<void> {\n\t\tconst finishedTurn = this.activeTurn;\n\t\tif (!finishedTurn) return;\n\t\tthis.activeTurn = undefined;\n\t\tif (finishedTurn.statusEditTimer) {\n\t\t\tclearTimeout(finishedTurn.statusEditTimer);\n\t\t}\n\t\tfinishedTurn.statusEditPending = false;\n\t\tif (finishedTurn.statusEditInFlight) {\n\t\t\ttry {\n\t\t\t\tawait finishedTurn.statusEditInFlight;\n\t\t\t} catch {\n\t\t\t\t// Best-effort; still continue to final status update.\n\t\t\t}\n\t\t}\n\n\t\tlet finalText: string | null = null;\n\t\tif (!options?.error) {\n\t\t\ttry {\n\t\t\t\tfinalText = await this.rpcClient.getLastAssistantText();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\toptions = {\n\t\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tconst statusLabel = options?.error\n\t\t\t? `❌ error · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s\\n${this.formatPromptPreview(options.error, 96)}`\n\t\t\t: finishedTurn.aborted\n\t\t\t\t? `⛔ aborted · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`\n\t\t\t\t: `✅ done · ${Math.floor((Date.now() - finishedTurn.startedAt) / 1000)}s`;\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(finishedTurn.chatId, finishedTurn.statusMessageId, statusLabel, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\t// Best-effort.\n\t\t}\n\n\t\tif (options?.error) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, `Task failed: ${options.error}`);\n\t\t} else if (finalText && finalText.trim().length > 0) {\n\t\t\tawait this.sendFinalOutput(finishedTurn.chatId, finalText);\n\t\t} else if (!finishedTurn.aborted) {\n\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, \"Task completed with no assistant text output.\");\n\t\t}\n\n\t\tawait this.drainQueue();\n\t}\n\n\tprivate async sendFinalOutput(chatId: TelegramChatId, finalText: string): Promise<void> {\n\t\tif (finalText.length <= this.maxSummaryChars) {\n\t\t\tawait this.sendRichMessage(chatId, finalText);\n\t\t\treturn;\n\t\t}\n\t\tconst summary = `${finalText.slice(0, this.maxSummaryChars).trimEnd()}\\n\\n[output truncated in chat]`;\n\t\tawait this.sendRichMessage(chatId, summary);\n\t\tawait this.bot.sendTextDocument(chatId, \"iosm-output.txt\", finalText, \"Full output\");\n\t}\n\n\tprivate async drainQueue(): Promise<void> {\n\t\tif (this.activeTurn) return;\n\t\tconst next = this.queue.shift();\n\t\tif (!next) return;\n\t\tawait this.startTurn(next.chatId, next.text);\n\t}\n}\n"]}
|
|
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 TELEGRAM_API_MAX_429_RETRIES = 4;\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\tfor (let attempt = 0; ; attempt++) {\n\t\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: {\n\t\t\t\t\t\"content-type\": \"application/json\",\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\t\t\tconst envelope = await this.readEnvelope<T>(response);\n\t\t\tif (response.ok && envelope.ok && envelope.result !== undefined) {\n\t\t\t\treturn envelope.result;\n\t\t\t}\n\t\t\tconst errorCode = envelope.error_code ?? response.status;\n\t\t\tconst retryAfterMs = this.extractRetryAfterMs(response, envelope.description);\n\t\t\tif (errorCode === 429 && retryAfterMs !== undefined && attempt < TELEGRAM_API_MAX_429_RETRIES) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[telegram] ${method} rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s (${attempt + 1}/${TELEGRAM_API_MAX_429_RETRIES})`,\n\t\t\t\t);\n\t\t\t\tawait sleepTimeout(retryAfterMs);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow new Error(`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${errorCode})`);\n\t\t}\n\t}\n\n\tprivate async callMultipart<T>(method: string, form: FormData): Promise<T> {\n\t\tfor (let attempt = 0; ; attempt++) {\n\t\t\tconst response = await fetch(`${this.endpoint}/${method}`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\tbody: form,\n\t\t\t});\n\t\t\tconst envelope = await this.readEnvelope<T>(response);\n\t\t\tif (response.ok && envelope.ok && envelope.result !== undefined) {\n\t\t\t\treturn envelope.result;\n\t\t\t}\n\t\t\tconst errorCode = envelope.error_code ?? response.status;\n\t\t\tconst retryAfterMs = this.extractRetryAfterMs(response, envelope.description);\n\t\t\tif (errorCode === 429 && retryAfterMs !== undefined && attempt < TELEGRAM_API_MAX_429_RETRIES) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[telegram] ${method} rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s (${attempt + 1}/${TELEGRAM_API_MAX_429_RETRIES})`,\n\t\t\t\t);\n\t\t\t\tawait sleepTimeout(retryAfterMs);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthrow new Error(`Telegram API ${method} failed: ${envelope.description ?? response.statusText} (${errorCode})`);\n\t\t}\n\t}\n\n\tprivate async readEnvelope<T>(response: Response): Promise<TelegramApiEnvelope<T>> {\n\t\ttry {\n\t\t\treturn (await response.json()) as TelegramApiEnvelope<T>;\n\t\t} catch {\n\t\t\treturn {\n\t\t\t\tok: false,\n\t\t\t\tdescription: response.statusText,\n\t\t\t\terror_code: response.status,\n\t\t\t};\n\t\t}\n\t}\n\n\tprivate extractRetryAfterMs(response: Response, description: string | undefined): number | undefined {\n\t\tconst headerValue = response.headers.get(\"retry-after\");\n\t\tif (headerValue) {\n\t\t\tconst headerSeconds = Number.parseInt(headerValue, 10);\n\t\t\tif (Number.isFinite(headerSeconds) && headerSeconds > 0) {\n\t\t\t\treturn headerSeconds * 1000;\n\t\t\t}\n\t\t}\n\t\tif (!description) return undefined;\n\t\tconst match = /retry after\\s+(\\d+)/i.exec(description);\n\t\tif (!match) return undefined;\n\t\tconst seconds = Number.parseInt(match[1] ?? \"\", 10);\n\t\tif (!Number.isFinite(seconds) || seconds <= 0) return undefined;\n\t\treturn seconds * 1000;\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).catch((error) => {\n\t\t\t\tconsole.error(`[telegram] rpc event handler error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t});\n\t\t});\n\t\tthis.rpcClient.onExtensionUIRequest((request) => {\n\t\t\tvoid this.onRpcExtensionUiRequest(request).catch((error) => {\n\t\t\t\tconsole.error(`[telegram] rpc extension ui handler error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t});\n\t\t});\n\t\tthis.rpcClient.onRequiresConfirmation((event) => {\n\t\t\tvoid this.onRpcConfirmationRequest(event).catch((error) => {\n\t\t\t\tconsole.error(\n\t\t\t\t\t`[telegram] rpc confirmation handler error: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t});\n\t\t});\n\n\t\t// Keep polling forever.\n\t\tfor (;;) {\n\t\t\ttry {\n\t\t\t\tconst updates = await this.bot.getUpdates(this.nextUpdateOffset, 25);\n\t\t\t\tfor (const update of updates) {\n\t\t\t\t\tthis.nextUpdateOffset = Math.max(this.nextUpdateOffset, update.update_id + 1);\n\t\t\t\t\tawait this.handleUpdate(update);\n\t\t\t\t}\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error(`[telegram] polling error: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\tawait sleepTimeout(2_000);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate buildRpcForwardedArgs(rawArgs: string[]): string[] {\n\t\tconst forwarded: string[] = [];\n\t\tfor (let i = 0; i < rawArgs.length; i++) {\n\t\t\tconst arg = rawArgs[i];\n\t\t\tif (i === 0 && arg === \"telegram\") continue;\n\t\t\tif (arg === \"--mode\") {\n\t\t\t\t// RPC mode is enforced by RpcClient; ignore any caller-provided mode.\n\t\t\t\ti += 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tforwarded.push(arg);\n\t\t}\n\t\treturn forwarded;\n\t}\n\n\tprivate async startRpc(): Promise<void> {\n\t\ttry {\n\t\t\tawait this.rpcClient.start();\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tthrow new Error(`Failed to start RPC child: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async restartRpc(): Promise<void> {\n\t\tawait this.rpcClient.stop();\n\t\tawait this.startRpc();\n\t}\n\n\tprivate async ensureRpcConnected(): Promise<void> {\n\t\tif (this.rpcConnected) return;\n\t\tawait this.restartRpc();\n\t}\n\n\tprivate isAuthorizedUser(userId: number | undefined): userId is number {\n\t\treturn typeof userId === \"number\" && this.allowedUserIds.has(userId);\n\t}\n\n\tprivate buildInputMenuKeyboard(stopped = this.bridgeStopped): TelegramReplyKeyboardMarkup {\n\t\tif (stopped) {\n\t\t\treturn {\n\t\t\t\tkeyboard: [[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_START }], [{ text: INPUT_BUTTON_HELP }]],\n\t\t\t\tresize_keyboard: true,\n\t\t\t\tis_persistent: true,\n\t\t\t\tinput_field_placeholder: \"Bridge stopped. Tap Start to resume\",\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\tkeyboard: [\n\t\t\t\t[{ text: INPUT_BUTTON_HUB }, { text: INPUT_BUTTON_NEW }, { text: INPUT_BUTTON_COMMANDS }],\n\t\t\t\t[{ text: INPUT_BUTTON_HELP }, { text: INPUT_BUTTON_ABORT }, { text: INPUT_BUTTON_STOP }],\n\t\t\t],\n\t\t\tresize_keyboard: true,\n\t\t\tis_persistent: true,\n\t\t\tinput_field_placeholder: \"Write a task or pick an action\",\n\t\t};\n\t}\n\n\tprivate async ensureInputMenu(chatId: TelegramChatId, force = false): Promise<void> {\n\t\tif (!force && this.inputMenuEnabledByChat.has(chatId)) return;\n\t\tconst notice = force ? \"Quick actions updated ↓\" : \"Quick actions ready ↓\";\n\t\tawait this.bot.sendMessage(chatId, notice, {\n\t\t\treplyMarkup: this.buildInputMenuKeyboard(),\n\t\t\tdisableNotification: true,\n\t\t});\n\t\tthis.inputMenuEnabledByChat.add(chatId);\n\t}\n\n\tprivate normalizeInputActionText(text: string): string {\n\t\treturn text\n\t\t\t.normalize(\"NFKC\")\n\t\t\t.replace(/\\uFE0F/g, \"\")\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^\\p{Letter}\\p{Number} ]+/gu, \" \")\n\t\t\t.replace(/\\s+/g, \" \")\n\t\t\t.trim();\n\t}\n\n\tprivate mapInputMenuAction(text: string): string | undefined {\n\t\tconst normalized = this.normalizeInputActionText(text);\n\t\tswitch (normalized) {\n\t\t\tcase \"start\":\n\t\t\tcase \"resume\":\n\t\t\tcase \"старт\":\n\t\t\tcase \"запуск\":\n\t\t\t\treturn \"/start\";\n\t\t\tcase \"hub\":\n\t\t\tcase \"status\":\n\t\t\tcase \"хаб\":\n\t\t\tcase \"статус\":\n\t\t\t\treturn \"/status\";\n\t\t\tcase \"new\":\n\t\t\tcase \"new session\":\n\t\t\tcase \"новая\":\n\t\t\tcase \"новая сессия\":\n\t\t\tcase \"новый\":\n\t\t\t\treturn \"/new\";\n\t\t\tcase \"cmd\":\n\t\t\tcase \"command\":\n\t\t\tcase \"commands\":\n\t\t\tcase \"команда\":\n\t\t\tcase \"команды\":\n\t\t\t\treturn \"/commands\";\n\t\t\tcase \"help\":\n\t\t\tcase \"помощь\":\n\t\t\tcase \"хелп\":\n\t\t\t\treturn \"/help\";\n\t\t\tcase \"abort\":\n\t\t\tcase \"cancel\":\n\t\t\tcase \"прервать\":\n\t\t\tcase \"отмена\":\n\t\t\t\treturn \"/abort\";\n\t\t\tcase \"stop\":\n\t\t\tcase \"стоп\":\n\t\t\t\treturn \"/stop\";\n\t\t}\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_START)) return \"/start\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HUB)) return \"/status\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_NEW)) return \"/new\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_COMMANDS)) return \"/commands\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_HELP)) return \"/help\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_ABORT)) return \"/abort\";\n\t\tif (normalized === this.normalizeInputActionText(INPUT_BUTTON_STOP)) return \"/stop\";\n\t\treturn undefined;\n\t}\n\n\tprivate async handleUpdate(update: TelegramUpdate): Promise<void> {\n\t\tif (update.callback_query) {\n\t\t\tawait this.handleCallbackQuery(update.callback_query);\n\t\t\treturn;\n\t\t}\n\t\tif (!update.message?.text) return;\n\n\t\tconst message = update.message;\n\t\tconst userId = message.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tconsole.warn(\n\t\t\t\t`[telegram] unauthorized message ignored (user=${userId ?? \"unknown\"}, chat=${message.chat.id})`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.lastAuthorizedChatId = message.chat.id;\n\t\tconst text = (message.text ?? \"\").trim();\n\t\tif (text.length === 0) return;\n\t\tif (!this.inputMenuEnabledByChat.has(message.chat.id)) {\n\t\t\tawait this.ensureInputMenu(message.chat.id);\n\t\t}\n\n\t\tconst quickActionCommand = this.mapInputMenuAction(text);\n\t\tif (quickActionCommand) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, quickActionCommand);\n\t\t\treturn;\n\t\t}\n\n\t\tif (text.startsWith(\"/\")) {\n\t\t\tawait this.handleCommandMessage(message.chat.id, text);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.sendMessage(message.chat.id, \"Bridge is stopped. Use /start to resume.\");\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.enqueuePrompt(message.chat.id, text);\n\t}\n\n\tprivate async handleCallbackQuery(callback: TelegramCallbackQuery): Promise<void> {\n\t\tconst userId = callback.from?.id;\n\t\tif (!this.isAuthorizedUser(userId)) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Unauthorized\");\n\t\t\tconsole.warn(`[telegram] unauthorized callback ignored (user=${userId ?? \"unknown\"})`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst data = callback.data?.trim();\n\t\tif (!data) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"confirm:\")) {\n\t\t\tconst [, requestId, decision] = data.split(\":\");\n\t\t\tif (!requestId || (decision !== \"yes\" && decision !== \"no\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Invalid confirmation payload\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst confirmed = decision === \"yes\";\n\t\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\t\tawait this.respondConfirmation(requestId, confirmed);\n\t\t\tconst confirmChatId = callback.message?.chat.id;\n\t\t\tconst confirmMessageId = callback.message?.message_id;\n\t\t\tif (confirmChatId && typeof confirmMessageId === \"number\") {\n\t\t\t\tawait this.updateConfirmationDecisionMessage(confirmChatId, confirmMessageId, confirmed, pending?.label);\n\t\t\t\tawait this.moveLiveStatusToBottom(confirmChatId);\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, confirmed ? \"Approved\" : \"Denied\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"hub:\")) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.handleHubAction(callback.message?.chat.id, data.slice(4));\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"live:\")) {\n\t\t\tawait this.handleLiveAction(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"cmd:\")) {\n\t\t\tawait this.handleCommandMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (data.startsWith(\"model:\")) {\n\t\t\tawait this.handleModelMenuCallback(callback, data);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleHubAction(chatId: TelegramChatId | undefined, action: string): Promise<void> {\n\t\tif (!chatId) return;\n\t\tconst stoppedSafeActions = new Set([\"status\", \"refresh\", \"details\", \"compact\", \"start\", \"help\"]);\n\t\tif (this.bridgeStopped && !stoppedSafeActions.has(action)) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tswitch (action) {\n\t\t\tcase \"start\":\n\t\t\t\tawait this.handleCommandMessage(chatId, \"/start\");\n\t\t\t\treturn;\n\t\t\tcase \"help\":\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"prompt\":\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Send any text to start a task.\");\n\t\t\t\treturn;\n\t\t\tcase \"commands\":\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\tcase \"new\": {\n\t\t\t\tawait this.runNewSession(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcase \"permissions\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"toggle_mode\":\n\t\t\t\tawait this.togglePermissionMode(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"model\":\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\tcase \"status\":\n\t\t\tcase \"refresh\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\tcase \"details\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"details\" });\n\t\t\t\treturn;\n\t\t\tcase \"compact\":\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true, view: \"compact\" });\n\t\t\t\treturn;\n\t\t\tcase \"abort\":\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\tcase \"stop\":\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tawait this.bot.sendMessage(chatId, \"Action is not implemented yet in Telegram bridge.\");\n\t\t}\n\t}\n\n\tprivate async runNewSession(chatId: TelegramChatId): Promise<void> {\n\t\tconst handled = await this.runBuiltinCommand(chatId, \"/new\");\n\t\tif (!handled) {\n\t\t\tawait this.enqueuePrompt(chatId, \"/new\");\n\t\t}\n\t}\n\n\tprivate async switchMenuMessageToHub(chatId: TelegramChatId, messageId?: number): Promise<void> {\n\t\tif (messageId) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, messageId);\n\t\t}\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t}\n\n\tprivate async clearInlineKeyboard(chatId: TelegramChatId, messageId: number): Promise<void> {\n\t\ttry {\n\t\t\tawait this.bot.editMessageReplyMarkup(chatId, messageId, { inline_keyboard: [] });\n\t\t} catch {\n\t\t\t// Best-effort cleanup of stale buttons.\n\t\t}\n\t}\n\n\tprivate buildConfirmationResolvedText(confirmed: boolean, label?: string): string {\n\t\tconst status = confirmed ? \"✅ Allowed\" : \"❌ Denied\";\n\t\tif (!label) return status;\n\t\tconst lines = label\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => line.trim())\n\t\t\t.filter((line) => line.length > 0);\n\t\tconst detail = lines.find((line) => !/^permission required$/i.test(line)) ?? lines[0];\n\t\tif (!detail) return status;\n\t\tconst clipped = detail.length > 120 ? `${detail.slice(0, 119)}…` : detail;\n\t\treturn `${status}\\n${clipped}`;\n\t}\n\n\tprivate async updateConfirmationDecisionMessage(\n\t\tchatId: TelegramChatId,\n\t\tmessageId: number,\n\t\tconfirmed: boolean,\n\t\tlabel?: string,\n\t): Promise<void> {\n\t\tconst text = this.buildConfirmationResolvedText(confirmed, label);\n\t\ttry {\n\t\t\tawait this.bot.editMessageText(chatId, messageId, text, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t} catch {\n\t\t\tawait this.clearInlineKeyboard(chatId, messageId);\n\t\t}\n\t}\n\n\tprivate async moveLiveStatusToBottom(chatId: TelegramChatId): Promise<void> {\n\t\tconst turn = this.activeTurn;\n\t\tif (!turn || turn.chatId !== chatId) return;\n\t\tconst previousStatusId = turn.statusMessageId;\n\t\ttry {\n\t\t\tconst fresh = await this.bot.sendMessage(chatId, this.formatLiveStatus());\n\t\t\tturn.statusMessageId = fresh.message_id;\n\t\t\tturn.lastStatusEditAt = Date.now();\n\t\t\tif (previousStatusId !== fresh.message_id) {\n\t\t\t\tawait this.bot.deleteMessage(chatId, previousStatusId).catch(() => {});\n\t\t\t}\n\t\t} catch {\n\t\t\t// Best-effort relocation; keep existing status message on failure.\n\t\t}\n\t}\n\n\tprivate async handleLiveAction(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tconst [, action] = data.split(\":\");\n\t\tif (!action) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped && action !== \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"commands\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"model\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"new\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"New session\");\n\t\t\tawait this.runNewSession(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"abort\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Aborting...\");\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"stop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping...\");\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async handleCommandMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst [commandRaw, ...rest] = text.split(/\\s+/);\n\t\tconst command = (commandRaw.toLowerCase().split(\"@\")[0] ?? commandRaw.toLowerCase()).trim();\n\n\t\tif (command === \"/start\") {\n\t\t\tthis.bridgeStopped = false;\n\t\t\tawait this.sendStart(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/help\") {\n\t\t\tawait this.sendHelp(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/menu\") {\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/status\") {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/stop\") {\n\t\t\tawait this.stopBridge(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/commands\") {\n\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/abort\") {\n\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/yolo\") {\n\t\t\tawait this.handleYoloCommand(chatId, rest);\n\t\t\treturn;\n\t\t}\n\t\tif (command === \"/model\" && rest.join(\" \").trim().length === 0) {\n\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\treturn;\n\t\t}\n\n\t\tconst handled = await this.runBuiltinCommand(chatId, text);\n\t\tif (handled) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to raw slash prompt to support extension/prompt-template/skill slash commands.\n\t\tawait this.enqueuePrompt(chatId, text);\n\t}\n\n\tprivate async runBuiltinCommand(chatId: TelegramChatId, commandText: string): Promise<boolean> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst result = await this.rpcClient.runBuiltinCommand(commandText);\n\t\t\tthis.rpcConnected = true;\n\t\t\tif (!result.handled) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tawait this.sendBuiltinCommandResult(chatId, result);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Command failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tprivate async sendBuiltinCommandResult(chatId: TelegramChatId, result: BuiltinCommandResult): Promise<void> {\n\t\tif (result.message) {\n\t\t\tconst prefix = result.level === \"error\" ? \"Error: \" : result.level === \"warning\" ? \"Warning: \" : \"\";\n\t\t\tawait this.bot.sendMessage(chatId, `${prefix}${result.message}`);\n\t\t}\n\t\tif (result.text) {\n\t\t\tawait this.sendFinalOutput(chatId, result.text);\n\t\t}\n\t\tif (result.filePath) {\n\t\t\tawait this.bot.sendMessage(chatId, `File: ${result.filePath}`);\n\t\t}\n\t}\n\n\tprivate async sendStart(chatId: TelegramChatId): Promise<void> {\n\t\tawait this.sendStatusCard(chatId, {\n\t\t\theader: `Control Hub · ${APP_NAME} v${VERSION}`,\n\t\t\tincludeKeyboard: true,\n\t\t\tpreferEditHub: false,\n\t\t});\n\t\tawait this.ensureInputMenu(chatId, true);\n\t}\n\n\tprivate async sendHelp(chatId: TelegramChatId): Promise<void> {\n\t\tconst help = [\n\t\t\t\"IOSM Telegram · Quick Guide\",\n\t\t\t\"\",\n\t\t\t\"What the agent can do\",\n\t\t\t\"- Analyze your codebase and explain behavior\",\n\t\t\t\"- Create/edit files and refactor code\",\n\t\t\t\"- Run shell commands, investigate failures, fix tests\",\n\t\t\t\"- Work with git changes and repository context\",\n\t\t\t\"- Prepare concise result summaries\",\n\t\t\t\"\",\n\t\t\t\"Tools the agent uses\",\n\t\t\t\"- Shell tools: bash/zsh commands for diagnostics and automation\",\n\t\t\t\"- Code tools: search (rg), read/edit files, refactor project code\",\n\t\t\t\"- Validation tools: run tests, linters, build checks\",\n\t\t\t\"- Git tools: inspect diffs/status, create safe code changes\",\n\t\t\t\"- In ASK mode, dangerous tool actions require Allow/Deny\",\n\t\t\t\"\",\n\t\t\t\"How to ask\",\n\t\t\t\"- Write a plain task: what to do + where + expected output\",\n\t\t\t\"- Example: \\\"Find why tests fail and fix them\\\"\",\n\t\t\t\"- Example: \\\"Find large files and propose safe cleanup\\\"\",\n\t\t\t\"\",\n\t\t\t\"Quick buttons\",\n\t\t\t\"- 🧭 Hub: current status/model/mode\",\n\t\t\t\"- ⚡ Cmd: command/action center\",\n\t\t\t\"- 🆕 New: start a new session\",\n\t\t\t\"- ⛔ Abort: stop current task\",\n\t\t\t\"- 🛑 Stop: stop bridge\",\n\t\t\t\"\",\n\t\t\t\"Models and permissions\",\n\t\t\t\"- /model: choose model\",\n\t\t\t\"- ASK mode: dangerous actions require Allow/Deny\",\n\t\t\t\"- /yolo on|off|status: confirmation mode control\",\n\t\t\t\"\",\n\t\t\t\"Useful commands\",\n\t\t\t\"/status /commands /model /menu /help\",\n\t\t\t\"\",\n\t\t\t\"Tip: phrase tasks like \\\"do X, verify Y, report result\\\".\",\n\t\t].join(\"\\n\");\n\t\tawait this.bot.sendMessage(chatId, help);\n\t}\n\n\tprivate buildDefaultCommandText(name: string): string {\n\t\tconst lower = name.toLowerCase();\n\t\tswitch (lower) {\n\t\t\tcase \"permissions\":\n\t\t\t\treturn \"/permissions status\";\n\t\t\tcase \"yolo\":\n\t\t\t\treturn \"/yolo status\";\n\t\t\tcase \"checkpoint\":\n\t\t\t\treturn \"/checkpoint list\";\n\t\t\tcase \"rollback\":\n\t\t\t\treturn \"/rollback list\";\n\t\t\tcase \"tree\":\n\t\t\t\treturn \"/tree list\";\n\t\t\tdefault:\n\t\t\t\treturn `/${name}`;\n\t\t}\n\t}\n\n\tprivate mapBuiltinCommands(commands: RpcBuiltinSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: \"builtin\" as const,\n\t\t\tcommandText: this.buildDefaultCommandText(command.name),\n\t\t}));\n\t}\n\n\tprivate mapExternalCommands(commands: RpcSlashCommand[]): CommandCatalogEntry[] {\n\t\treturn commands.map((command) => ({\n\t\t\tname: command.name,\n\t\t\tdescription: command.description,\n\t\t\tsource: command.source,\n\t\t\tcommandText: `/${command.name}`,\n\t\t}));\n\t}\n\n\tprivate getLocalBridgeCommands(): CommandCatalogEntry[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tname: \"commands\",\n\t\t\t\tdescription: \"Open paged command buttons\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/commands\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"model\",\n\t\t\t\tdescription: \"Open model picker\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/model\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"status\",\n\t\t\t\tdescription: \"Show runtime status\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/status\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"abort\",\n\t\t\t\tdescription: \"Abort active task\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/abort\",\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: \"stop\",\n\t\t\t\tdescription: \"Stop bridge and cancel active work\",\n\t\t\t\tsource: \"builtin\",\n\t\t\t\tcommandText: \"/stop\",\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate commandButtonLabel(entry: CommandCatalogEntry, view: CommandMenuView): string {\n\t\tif (view === \"all\") {\n\t\t\tconst raw = entry.commandText.startsWith(\"/\") ? entry.commandText : `/${entry.name}`;\n\t\t\treturn raw.length > 24 ? `${raw.slice(0, 23)}…` : raw;\n\t\t}\n\t\tconst key = entry.commandText.toLowerCase();\n\t\tswitch (key) {\n\t\t\tcase \"/model\":\n\t\t\t\treturn \"🤖 Model\";\n\t\t\tcase \"/status\":\n\t\t\t\treturn \"🔄 Status\";\n\t\t\tcase \"/new\":\n\t\t\t\treturn \"🆕 New\";\n\t\t\tcase \"/abort\":\n\t\t\t\treturn \"⛔ Abort\";\n\t\t\tcase \"/permissions status\":\n\t\t\t\treturn \"🛡 Mode\";\n\t\t\tcase \"/yolo status\":\n\t\t\t\treturn \"⚠️ YOLO\";\n\t\t\tcase \"/help\":\n\t\t\t\treturn \"❓ Help\";\n\t\t\tcase \"/stop\":\n\t\t\t\treturn \"🛑 Stop\";\n\t\t\tdefault:\n\t\t\t\treturn entry.commandText;\n\t\t}\n\t}\n\n\tprivate async getCommandCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<CommandCatalogEntry[]> {\n\t\tconst cached = this.commandCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < COMMAND_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst [builtin, dynamic] = await Promise.all([\n\t\t\tthis.rpcClient.getBuiltinCommands(),\n\t\t\tthis.rpcClient.getCommands(),\n\t\t]);\n\t\tthis.rpcConnected = true;\n\n\t\tconst entries: CommandCatalogEntry[] = [];\n\t\tconst seen = new Set<string>();\n\t\tfor (const entry of this.getLocalBridgeCommands()) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\t\tfor (const entry of this.mapBuiltinCommands(builtin)) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tconst dynamicEntries = this.mapExternalCommands(dynamic).sort((a, b) => a.name.localeCompare(b.name));\n\t\tfor (const entry of dynamicEntries) {\n\t\t\tconst key = entry.commandText;\n\t\t\tif (seen.has(key)) continue;\n\t\t\tseen.add(key);\n\t\t\tentries.push(entry);\n\t\t}\n\n\t\tthis.commandCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildCommandMenuKeyboard(\n\t\tentries: CommandCatalogEntry[],\n\t\tpage: number,\n\t\tview: CommandMenuView,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * COMMANDS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + COMMANDS_PAGE_SIZE);\n\n\t\tconst commandRows: Array<Array<{ text: string; callback_data: string }>> = [];\n\t\tfor (let index = 0; index < pageEntries.length; index += 2) {\n\t\t\tconst left = pageEntries[index];\n\t\t\tconst right = pageEntries[index + 1];\n\t\t\tconst row: Array<{ text: string; callback_data: string }> = [];\n\t\t\tif (left) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(left, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (right) {\n\t\t\t\trow.push({\n\t\t\t\t\ttext: this.commandButtonLabel(right, view),\n\t\t\t\t\tcallback_data: `cmd:run:${view}:${start + index + 1}`,\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (row.length > 0) {\n\t\t\t\tcommandRows.push(row);\n\t\t\t}\n\t\t}\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `cmd:page:${view}:${normalizedPage - 1}` : \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"cmd:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `cmd:page:${view}:${normalizedPage + 1}` : \"cmd:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...commandRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: view === \"main\" ? \"All Commands\" : \"Main Commands\",\n\t\t\t\t\t\tcallback_data: `cmd:view:${view === \"main\" ? \"all\" : \"main\"}:0`,\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\ttext: \"Refresh\",\n\t\t\t\t\t\tcallback_data: view === \"all\" ? `cmd:refresh:${view}:${normalizedPage}` : `cmd:view:${view}:0`,\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"cmd:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"cmd:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendCommandMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean; view?: CommandMenuView },\n\t): Promise<void> {\n\t\tlet entries: CommandCatalogEntry[] = [];\n\t\tconst view = options?.view ?? \"main\";\n\t\ttry {\n\t\t\tentries = view === \"main\" ? MAIN_COMMAND_MENU : await this.getCommandCatalog(chatId, options?.refreshCatalog === true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load commands: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / COMMANDS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t`Command Center · ${APP_NAME}`,\n\t\t\t`${view === \"main\" ? \"Main Actions\" : \"All Commands\"} · ${normalizedPage + 1}/${pageCount}`,\n\t\t\t`${entries.length} items`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildCommandMenuKeyboard(entries, normalizedPage, view);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback below: send a new message if editing failed.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleCommandMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst parts = data.split(\":\");\n\t\tconst action = parts[1] ?? \"\";\n\t\tconst rawView = parts[2];\n\t\tlet view: CommandMenuView = rawView === \"all\" ? \"all\" : \"main\";\n\t\tlet value = parts[3];\n\t\t// Backward compatibility with older callback payloads: cmd:<action>:<value>.\n\t\tif ((action === \"page\" || action === \"refresh\" || action === \"run\") && parts.length === 3) {\n\t\t\tview = \"main\";\n\t\t\tvalue = parts[2];\n\t\t}\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"view\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: view === \"all\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendCommandMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\tview,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"run\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: CommandCatalogEntry[] = [];\n\t\t\tif (view === \"main\") {\n\t\t\t\tentries = MAIN_COMMAND_MENU;\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tentries = await this.getCommandCatalog(chatId, false);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthis.rpcConnected = false;\n\t\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to load command catalog\");\n\t\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\t\tchatId,\n\t\t\t\t\t\t`Failed to load commands: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Command list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/model\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Open model picker\");\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { refreshCatalog: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/status\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/help\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendHelp(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/abort\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Abort signal sent\");\n\t\t\t\tawait this.abortActiveTurn(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText.startsWith(\"/yolo\")) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tconst parts = entry.commandText.split(/\\s+/).slice(1);\n\t\t\t\tawait this.handleYoloCommand(chatId, parts);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/stop\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Stopping bridge\");\n\t\t\t\tawait this.stopBridge(chatId);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (entry.commandText === \"/commands\") {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\t\tawait this.sendCommandMenu(chatId, 0, { view: \"main\", refreshCatalog: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Run ${entry.commandText}`);\n\t\t\tconst handled = await this.runBuiltinCommand(chatId, entry.commandText);\n\t\t\tif (!handled) {\n\t\t\t\tawait this.enqueuePrompt(chatId, entry.commandText);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate modelKey(model: { provider: string; id: string } | undefined): string | undefined {\n\t\tif (!model) return undefined;\n\t\treturn `${model.provider}/${model.id}`;\n\t}\n\n\tprivate async getModelCatalog(chatId: TelegramChatId, refreshCatalog: boolean): Promise<ModelCatalogEntry[]> {\n\t\tconst cached = this.modelCatalogByChat.get(chatId);\n\t\tconst now = Date.now();\n\t\tif (!refreshCatalog && cached && now - cached.updatedAt < MODEL_MENU_TTL_MS) {\n\t\t\treturn cached.entries;\n\t\t}\n\n\t\tawait this.ensureRpcConnected();\n\t\tconst entries = (await this.rpcClient.getAvailableModels())\n\t\t\t.map((model) => ({\n\t\t\t\tprovider: model.provider,\n\t\t\t\tid: model.id,\n\t\t\t\tcontextWindow: model.contextWindow,\n\t\t\t\treasoning: model.reasoning,\n\t\t\t}))\n\t\t\t.sort((a, b) => this.modelKey(a)!.localeCompare(this.modelKey(b)!));\n\t\tthis.rpcConnected = true;\n\t\tthis.modelCatalogByChat.set(chatId, { updatedAt: now, entries });\n\t\treturn entries;\n\t}\n\n\tprivate buildModelMenuKeyboard(\n\t\tentries: ModelCatalogEntry[],\n\t\tpage: number,\n\t\tcurrentModelKey: string | undefined,\n\t): TelegramInlineKeyboardMarkup {\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst start = normalizedPage * MODELS_PAGE_SIZE;\n\t\tconst pageEntries = entries.slice(start, start + MODELS_PAGE_SIZE);\n\n\t\tconst modelRows = pageEntries.map((entry, index) => {\n\t\t\tconst key = this.modelKey(entry);\n\t\t\tconst selectedPrefix = key === currentModelKey ? \"✅ \" : \"\";\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\ttext: `${selectedPrefix}${entry.provider}/${entry.id}`,\n\t\t\t\t\tcallback_data: `model:set:${start + index}`,\n\t\t\t\t},\n\t\t\t];\n\t\t});\n\n\t\tconst navRow: Array<{ text: string; callback_data: string }> = [];\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage > 0 ? \"◀ Prev\" : \"·\",\n\t\t\tcallback_data: normalizedPage > 0 ? `model:page:${normalizedPage - 1}` : \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: `${normalizedPage + 1}/${pageCount}`,\n\t\t\tcallback_data: \"model:noop\",\n\t\t});\n\t\tnavRow.push({\n\t\t\ttext: normalizedPage < pageCount - 1 ? \"Next ▶\" : \"·\",\n\t\t\tcallback_data: normalizedPage < pageCount - 1 ? `model:page:${normalizedPage + 1}` : \"model:noop\",\n\t\t});\n\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t...modelRows,\n\t\t\t\tnavRow,\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Cycle\", callback_data: \"model:cycle\" },\n\t\t\t\t\t{ text: \"Refresh\", callback_data: `model:refresh:${normalizedPage}` },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"Hub\", callback_data: \"model:hub\" },\n\t\t\t\t\t{ text: \"Close\", callback_data: \"model:close\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendModelMenu(\n\t\tchatId: TelegramChatId,\n\t\tpage: number,\n\t\toptions?: { messageId?: number; refreshCatalog?: boolean },\n\t): Promise<void> {\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\treturn;\n\t\t}\n\n\t\tlet entries: ModelCatalogEntry[] = [];\n\t\ttry {\n\t\t\tentries = await this.getModelCatalog(chatId, options?.refreshCatalog === true);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (entries.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No models available. Configure models in settings and retry.\");\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentModelKey = this.modelKey(this.activeSessionState?.model);\n\t\tconst pageCount = Math.max(1, Math.ceil(entries.length / MODELS_PAGE_SIZE));\n\t\tconst normalizedPage = Math.max(0, Math.min(page, pageCount - 1));\n\t\tconst header = [\n\t\t\t\"Model Picker\",\n\t\t\t`Current: ${currentModelKey ?? \"not selected\"}`,\n\t\t\t`Available: ${entries.length}`,\n\t\t\t`Page: ${normalizedPage + 1}/${pageCount}`,\n\t\t].join(\"\\n\");\n\t\tconst keyboard = this.buildModelMenuKeyboard(entries, normalizedPage, currentModelKey);\n\n\t\tif (options?.messageId) {\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(chatId, options.messageId, header, { replyMarkup: keyboard });\n\t\t\t\treturn;\n\t\t\t} catch {\n\t\t\t\t// Fallback to sending a fresh message.\n\t\t\t}\n\t\t}\n\t\tawait this.bot.sendMessage(chatId, header, { replyMarkup: keyboard });\n\t}\n\n\tprivate async handleModelMenuCallback(callback: TelegramCallbackQuery, data: string): Promise<void> {\n\t\tconst chatId = callback.message?.chat.id;\n\t\tconst messageId = callback.message?.message_id;\n\t\tif (!chatId) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\n\t\tconst [, action, value] = data.split(\":\");\n\t\tif (action === \"noop\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"close\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\t\tif (action === \"hub\") {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Hub\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.bridgeStopped) {\n\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Bridge is stopped\");\n\t\t\tawait this.switchMenuMessageToHub(chatId, messageId);\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"page\" || action === \"refresh\") {\n\t\t\tconst page = Number.parseInt(value ?? \"0\", 10);\n\t\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t\t\tawait this.sendModelMenu(chatId, Number.isFinite(page) ? page : 0, {\n\t\t\t\tmessageId,\n\t\t\t\trefreshCatalog: action === \"refresh\",\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"cycle\") {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tconst cycled = await this.rpcClient.cycleModel();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(\n\t\t\t\t\tcallback.id,\n\t\t\t\t\tcycled ? `Model: ${cycled.model.provider}/${cycled.model.id}` : \"No model candidates\",\n\t\t\t\t);\n\t\t\t\tawait this.sendModelMenu(chatId, 0, { messageId, refreshCatalog: false });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to cycle model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to cycle model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (action === \"set\") {\n\t\t\tconst index = Number.parseInt(value ?? \"-1\", 10);\n\t\t\tlet entries: ModelCatalogEntry[] = [];\n\t\t\ttry {\n\t\t\t\tentries = await this.getModelCatalog(chatId, false);\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to load models: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst entry = Number.isFinite(index) ? entries[index] : undefined;\n\t\t\tif (!entry) {\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Model list expired. Refresh.\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tawait this.rpcClient.setModel(entry.provider, entry.id);\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, `Selected ${entry.provider}/${entry.id}`);\n\t\t\t\tawait this.sendModelMenu(chatId, Math.floor(index / MODELS_PAGE_SIZE), { messageId, refreshCatalog: false });\n\t\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.answerCallbackQuery(callback.id, \"Failed to set model\");\n\t\t\t\tawait this.bot.sendMessage(chatId, `Failed to set model: ${error instanceof Error ? error.message : String(error)}`);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.bot.answerCallbackQuery(callback.id);\n\t}\n\n\tprivate async stopBridge(chatId: TelegramChatId): Promise<void> {\n\t\tif (this.bridgeStopped && !this.activeTurn && this.queue.length === 0 && !this.rpcConnected) {\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t\tawait this.ensureInputMenu(chatId, true);\n\t\t\treturn;\n\t\t}\n\n\t\tconst droppedQueue = this.queue.length;\n\t\tthis.queue.length = 0;\n\t\tthis.bridgeStopped = true;\n\t\tthis.commandCatalogByChat.clear();\n\t\tthis.modelCatalogByChat.clear();\n\n\t\tif (this.rpcConnected) {\n\t\t\tfor (const requestId of this.pendingConfirmations.keys()) {\n\t\t\t\ttry {\n\t\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: requestId, confirmed: false });\n\t\t\t\t} catch {\n\t\t\t\t\t// Ignore; bridge is stopping.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmations.clear();\n\t\tthis.pendingConfirmationGroupIdsByKey.clear();\n\n\t\tconst active = this.activeTurn;\n\t\tif (active?.statusEditTimer) {\n\t\t\tclearTimeout(active.statusEditTimer);\n\t\t}\n\t\tthis.activeTurn = undefined;\n\t\tif (active) {\n\t\t\tif (active.statusEditInFlight) {\n\t\t\t\ttry {\n\t\t\t\t\tawait active.statusEditInFlight;\n\t\t\t\t} catch {\n\t\t\t\t\t// Best-effort; proceed with stop status.\n\t\t\t\t}\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait this.bot.editMessageText(active.chatId, active.statusMessageId, \"⛔ done (stopped)\");\n\t\t\t} catch {\n\t\t\t\t// Best-effort status close.\n\t\t\t}\n\t\t\tif (active.chatId !== chatId) {\n\t\t\t\tawait this.bot.sendMessage(active.chatId, \"Bridge stopped. Active task cancelled.\");\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait this.rpcClient.stop();\n\t\t} catch (error) {\n\t\t\tconsole.warn(`[telegram] rpc stop failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t} finally {\n\t\t\tthis.rpcConnected = false;\n\t\t}\n\n\t\tconst parts = [\"Bridge stopped.\"];\n\t\tif (active) {\n\t\t\tparts.push(\"Active task cancelled.\");\n\t\t}\n\t\tif (droppedQueue > 0) {\n\t\t\tparts.push(`Dropped queued tasks: ${droppedQueue}.`);\n\t\t}\n\t\tparts.push(\"Use /start to resume.\");\n\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\tawait this.ensureInputMenu(chatId, true);\n\t\tawait this.bot.sendMessage(chatId, parts.join(\" \"));\n\t}\n\n\tprivate formatConnectionStatus(): string {\n\t\tif (this.bridgeStopped) return \"⛔ stopped\";\n\t\tif (!this.rpcConnected) return \"🟥 disconnected\";\n\t\tif (this.activeTurn) return \"🟩 connected\";\n\t\treturn \"🟦 idle\";\n\t}\n\n\tprivate formatPermissionShort(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"YOLO\";\n\t\tif (mode === \"auto\") return \"AUTO\";\n\t\treturn \"ASK\";\n\t}\n\n\tprivate formatPermissionButton(mode: \"ask\" | \"auto\" | \"yolo\" | undefined): string {\n\t\tif (mode === \"yolo\") return \"⚠️ YOLO\";\n\t\tif (mode === \"auto\") return \"🤖 AUTO\";\n\t\treturn \"🛡 ASK\";\n\t}\n\n\tprivate formatModelShort(model: string, maxLen = 42): string {\n\t\tif (model.length <= maxLen) return model;\n\t\treturn `${model.slice(0, maxLen - 1)}…`;\n\t}\n\n\tprivate formatSessionShort(sessionName: string | undefined, sessionId: string | undefined): string {\n\t\tif (sessionName && sessionName.trim().length > 0) return this.formatModelShort(sessionName.trim(), 24);\n\t\tif (!sessionId || sessionId.trim().length === 0) return \"unknown\";\n\t\tconst value = sessionId.trim();\n\t\tif (value.length <= 14) return value;\n\t\treturn `${value.slice(0, 8)}…${value.slice(-4)}`;\n\t}\n\n\tprivate formatCompactTurn(): string {\n\t\tif (!this.activeTurn) return \"idle\";\n\t\tconst elapsed = Math.max(0, Math.floor((Date.now() - this.activeTurn.startedAt) / 1000));\n\t\tconst phase = this.formatStatusPhase(this.activeTurn.phase);\n\t\treturn `${phase} ${elapsed}s`;\n\t}\n\n\tprivate buildHubKeyboard(mode: \"ask\" | \"auto\" | \"yolo\" | undefined, view: HubView): TelegramInlineKeyboardMarkup {\n\t\tif (this.bridgeStopped) {\n\t\t\treturn {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"▶️ Start\", callback_data: \"hub:start\" },\n\t\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\t],\n\t\t\t\t\t[{ text: \"❓ Help\", callback_data: \"hub:help\" }],\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\t\tconst detailsToggle =\n\t\t\tview === \"details\"\n\t\t\t\t? { text: \"◀ Compact\", callback_data: \"hub:compact\" }\n\t\t\t\t: { text: \"ℹ️ Details\", callback_data: \"hub:details\" };\n\t\treturn {\n\t\t\tinline_keyboard: [\n\t\t\t\t[\n\t\t\t\t\t{ text: \"🆕 New\", callback_data: \"hub:new\" },\n\t\t\t\t\t{ text: \"⚡ Cmd\", callback_data: \"hub:commands\" },\n\t\t\t\t\t{ text: \"🤖 Model\", callback_data: \"hub:model\" },\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: this.formatPermissionButton(mode), callback_data: \"hub:toggle_mode\" },\n\t\t\t\t\t{ text: \"🔄 Refresh\", callback_data: \"hub:refresh\" },\n\t\t\t\t\tdetailsToggle,\n\t\t\t\t],\n\t\t\t\t[\n\t\t\t\t\t{ text: \"⛔ Abort\", callback_data: \"hub:abort\" },\n\t\t\t\t\t{ text: \"🛑 Stop\", callback_data: \"hub:stop\" },\n\t\t\t\t],\n\t\t\t],\n\t\t};\n\t}\n\n\tprivate async sendStatusCard(\n\t\tchatId: TelegramChatId,\n\t\toptions?: { header?: string; includeKeyboard?: boolean; preferEditHub?: boolean; view?: HubView },\n\t): Promise<void> {\n\t\tif (!this.bridgeStopped) {\n\t\t\ttry {\n\t\t\t\tawait this.ensureRpcConnected();\n\t\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\t\tthis.rpcConnected = true;\n\t\t\t} catch (error) {\n\t\t\t\tthis.rpcConnected = false;\n\t\t\t\tawait this.bot.sendMessage(\n\t\t\t\t\tchatId,\n\t\t\t\t\t`Status unavailable: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tconst state = this.activeSessionState;\n\t\tconst model = state?.model ? `${state.model.provider}/${state.model.id}` : \"not selected\";\n\t\tconst queueSize = this.queue.length;\n\t\tconst mcpState = \"RPC child\";\n\t\tconst permissionMode = state?.permissionMode ?? \"ask\";\n\t\tconst resolvedView = options?.view ?? this.hubViewByChat.get(chatId) ?? \"compact\";\n\t\tthis.hubViewByChat.set(chatId, resolvedView);\n\n\t\tconst header = options?.header ?? \"Control Hub\";\n\t\tconst compactText = [\n\t\t\theader,\n\t\t\t`${this.formatConnectionStatus()} · ${this.formatPermissionShort(permissionMode)} · q${queueSize} · ${this.formatCompactTurn()}`,\n\t\t\t`🤖 ${this.formatModelShort(model)}`,\n\t\t\t`💬 ${this.formatSessionShort(state?.sessionName, state?.sessionId)}`,\n\t\t].join(\"\\n\");\n\t\tconst detailsText = [\n\t\t\t`${header} · Details`,\n\t\t\t`Connection: ${this.formatConnectionStatus()}`,\n\t\t\t`Mode: ${permissionMode}`,\n\t\t\t`Model: ${model}`,\n\t\t\t`Session: ${state?.sessionName ?? state?.sessionId ?? \"unknown\"}`,\n\t\t\t`Turn: ${this.activeTurn ? `${this.activeTurn.phase} (${Math.floor((Date.now() - this.activeTurn.startedAt) / 1000)}s)` : \"idle\"}`,\n\t\t\t`Queue: ${queueSize}`,\n\t\t\t`MCP: ${mcpState}`,\n\t\t\t\"Telegram: active\",\n\t\t].join(\"\\n\");\n\t\tconst text = resolvedView === \"details\" ? detailsText : compactText;\n\t\tconst keyboard = options?.includeKeyboard ? this.buildHubKeyboard(permissionMode, resolvedView) : undefined;\n\n\t\tif (options?.includeKeyboard && options.preferEditHub) {\n\t\t\tconst hubMessageId = this.hubMessageIdByChat.get(chatId);\n\t\t\tif (hubMessageId) {\n\t\t\t\ttry {\n\t\t\t\t\tawait this.bot.editMessageText(chatId, hubMessageId, text, { replyMarkup: keyboard });\n\t\t\t\t\treturn;\n\t\t\t\t} catch {\n\t\t\t\t\t// Fallback below: send a fresh hub card if original message is gone.\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst message = await this.bot.sendMessage(chatId, text, { replyMarkup: keyboard });\n\t\tif (options?.includeKeyboard) {\n\t\t\tthis.hubMessageIdByChat.set(chatId, message.message_id);\n\t\t}\n\t}\n\n\tprivate async togglePermissionMode(chatId: TelegramChatId): Promise<void> {\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tconst current = await this.rpcClient.getPermissionMode();\n\t\t\tconst next = current === \"yolo\" ? \"ask\" : \"yolo\";\n\t\t\tawait this.rpcClient.setPermissionMode(next);\n\t\t\tthis.activeSessionState = await this.rpcClient.getState();\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.sendStatusCard(chatId, { includeKeyboard: true, preferEditHub: true });\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to switch mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async handleYoloCommand(chatId: TelegramChatId, args: string[]): Promise<void> {\n\t\tconst desired = args[0]?.toLowerCase();\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tif (!desired || desired === \"status\") {\n\t\t\t\tconst mode = await this.rpcClient.getPermissionMode();\n\t\t\t\tawait this.bot.sendMessage(chatId, `YOLO mode: ${mode === \"yolo\" ? \"ON\" : \"OFF\"} (${mode})`);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"on\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"yolo\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: ON (tool confirmations disabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (desired === \"off\") {\n\t\t\t\tawait this.rpcClient.setPermissionMode(\"ask\");\n\t\t\t\tawait this.bot.sendMessage(chatId, \"YOLO mode: OFF (tool confirmations enabled).\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this.bot.sendMessage(chatId, \"Usage: /yolo [on|off|status]\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Failed to update mode: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async abortActiveTurn(chatId: TelegramChatId): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.bot.sendMessage(chatId, \"No active task.\");\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tthis.activeTurn.aborted = true;\n\t\t\tawait this.rpcClient.abort();\n\t\t\tawait this.bot.sendMessage(chatId, \"Abort signal sent.\");\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.bot.sendMessage(chatId, `Abort failed: ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\n\tprivate async enqueuePrompt(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tif (!this.activeTurn) {\n\t\t\tawait this.startTurn(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\tthis.queue.push({ chatId, text });\n\t\tawait this.bot.sendMessage(chatId, `⏸ queued · ${this.queue.length}`);\n\t\tvoid this.editLiveStatus();\n\t}\n\n\tprivate async startTurn(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst statusMessage = await this.bot.sendMessage(chatId, this.formatStartingStatus(text));\n\t\tthis.activeTurn = {\n\t\t\tturnId: this.nextTurnId++,\n\t\t\tchatId,\n\t\t\tprompt: text,\n\t\t\tstartedAt: Date.now(),\n\t\t\tstatusMessageId: statusMessage.message_id,\n\t\t\tphase: \"starting\",\n\t\t\taborted: false,\n\t\t\tstatusEditPending: false,\n\t\t\tlastStatusEditAt: 0,\n\t\t};\n\t\ttry {\n\t\t\tawait this.ensureRpcConnected();\n\t\t\tawait this.rpcClient.prompt(text);\n\t\t\tthis.rpcConnected = true;\n\t\t\tawait this.editLiveStatus(true);\n\t\t} catch (error) {\n\t\t\tthis.rpcConnected = false;\n\t\t\tawait this.finishTurn({\n\t\t\t\terror: error instanceof Error ? error.message : String(error),\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async onRpcEvent(event: AgentEvent): Promise<void> {\n\t\tif (!this.activeTurn) return;\n\n\t\tswitch (event.type) {\n\t\t\tcase \"turn_start\":\n\t\t\t\tthis.activeTurn.phase = \"running\";\n\t\t\t\tbreak;\n\t\t\tcase \"tool_execution_start\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolEvent = event as { toolName?: string };\n\t\t\t\tthis.activeTurn.phase = \"tool\";\n\t\t\t\tthis.activeTurn.lastTool = toolEvent.toolName ?? this.activeTurn.lastTool;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"turn_end\": {\n\t\t\t\tconst turnEnd = event as AgentEvent;\n\t\t\t\tconst directText = this.extractAssistantTextFromTurnEnd(turnEnd);\n\t\t\t\tif (directText) {\n\t\t\t\t\t// Keep as fallback in case getLastAssistantText fails.\n\t\t\t\t\tthis.activeTurn.phase = \"finalizing\";\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"agent_end\":\n\t\t\t\tawait this.finishTurn();\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\tbreak;\n\t\t}\n\n\t\tawait this.editLiveStatus();\n\t}\n\n\tprivate async onRpcExtensionUiRequest(request: RpcExtensionUIRequest): Promise<void> {\n\t\tif (request.method === \"confirm_permission\" || request.method === \"confirm\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (!chatId) {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, confirmed: false });\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst label = `${request.title}\\n${request.message}`;\n\t\t\tconst groupKey =\n\t\t\t\trequest.method === \"confirm_permission\"\n\t\t\t\t\t? this.buildPermissionGroupKey(chatId, request.request)\n\t\t\t\t\t: this.buildGenericConfirmationGroupKey(chatId, label);\n\t\t\tawait this.queueConfirmationPrompt(chatId, request.id, label, groupKey);\n\t\t\treturn;\n\t\t}\n\n\t\tif (request.method === \"notify\") {\n\t\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\t\tif (chatId) {\n\t\t\t\tawait this.bot.sendMessage(chatId, request.message);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Unsupported interactive extension methods in telegram v1: cancel by default.\n\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: request.id, cancelled: true });\n\t}\n\n\tprivate async onRpcConfirmationRequest(event: RpcRequiresConfirmationEvent): Promise<void> {\n\t\tconst chatId = this.activeTurn?.chatId ?? this.lastAuthorizedChatId;\n\t\tif (!chatId) {\n\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id: event.id, confirmed: false });\n\t\t\treturn;\n\t\t}\n\t\tconst groupKey = this.buildPermissionGroupKey(chatId, event.request);\n\t\tawait this.queueConfirmationPrompt(chatId, event.id, event.message, groupKey);\n\t}\n\n\tprivate buildPermissionGroupKey(chatId: TelegramChatId, request: RpcRequiresConfirmationEvent[\"request\"]): string {\n\t\tconst requiredPermission = request.requiredPermission ?? \"unknown\";\n\t\tconst toolSource = request.toolSource ?? \"unknown\";\n\t\tconst inputJson = JSON.stringify(request.input ?? {});\n\t\treturn `${chatId}|perm|${request.toolName}|${requiredPermission}|${toolSource}|${request.summary}|${request.cwd}|${inputJson}`;\n\t}\n\n\tprivate buildGenericConfirmationGroupKey(chatId: TelegramChatId, label: string): string {\n\t\tconst normalized = label.replace(/\\s+/g, \" \").trim();\n\t\treturn `${chatId}|confirm|${normalized}`;\n\t}\n\n\tprivate async queueConfirmationPrompt(\n\t\tchatId: TelegramChatId,\n\t\trequestId: string,\n\t\tlabel: string,\n\t\tgroupKey: string,\n\t): Promise<void> {\n\t\tif (this.pendingConfirmations.has(requestId)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst existing = this.pendingConfirmationGroupIdsByKey.get(groupKey);\n\t\tif (existing) {\n\t\t\texisting.add(requestId);\n\t\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\t\tif (this.activeTurn) {\n\t\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\t\tawait this.editLiveStatus(true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst ids = new Set<string>([requestId]);\n\t\tthis.pendingConfirmationGroupIdsByKey.set(groupKey, ids);\n\t\tthis.pendingConfirmations.set(requestId, { chatId, requestId, label, groupKey });\n\t\tawait this.bot.sendMessage(chatId, label, {\n\t\t\treplyMarkup: {\n\t\t\t\tinline_keyboard: [\n\t\t\t\t\t[\n\t\t\t\t\t\t{ text: \"Allow\", callback_data: `confirm:${requestId}:yes` },\n\t\t\t\t\t\t{ text: \"Deny\", callback_data: `confirm:${requestId}:no` },\n\t\t\t\t\t],\n\t\t\t\t],\n\t\t\t},\n\t\t});\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = \"awaiting confirmation\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate async respondConfirmation(requestId: string, confirmed: boolean): Promise<void> {\n\t\tconst pending = this.pendingConfirmations.get(requestId);\n\t\tif (!pending) return;\n\n\t\tconst groupedIds = this.pendingConfirmationGroupIdsByKey.get(pending.groupKey);\n\t\tconst ids = groupedIds && groupedIds.size > 0 ? Array.from(groupedIds) : [requestId];\n\t\tfor (const id of ids) {\n\t\t\tthis.pendingConfirmations.delete(id);\n\t\t\ttry {\n\t\t\t\tthis.rpcClient.respondExtensionUi({ type: \"extension_ui_response\", id, confirmed });\n\t\t\t} catch {\n\t\t\t\t// Best-effort for duplicated request IDs from different streams.\n\t\t\t}\n\t\t}\n\t\tthis.pendingConfirmationGroupIdsByKey.delete(pending.groupKey);\n\n\t\tif (this.activeTurn) {\n\t\t\tthis.activeTurn.phase = confirmed ? \"running\" : \"permission denied\";\n\t\t\tawait this.editLiveStatus(true);\n\t\t}\n\t}\n\n\tprivate extractAssistantTextFromTurnEnd(event: AgentEvent): string | undefined {\n\t\tconst messageEvent = event as { message?: { role?: string; content?: Array<{ type: string; text?: string }> } };\n\t\tconst message = messageEvent.message;\n\t\tif (!message || message.role !== \"assistant\") return undefined;\n\t\tconst content = Array.isArray(message.content) ? message.content : [];\n\t\tconst textParts = content\n\t\t\t.filter((part): part is { type: \"text\"; text: string } => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text.trim())\n\t\t\t.filter((part) => part.length > 0);\n\t\tif (textParts.length === 0) return undefined;\n\t\treturn textParts.join(\"\\n\\n\");\n\t}\n\n\tprivate escapeTelegramHtml(text: string): string {\n\t\treturn text.replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n\t}\n\n\tprivate escapeTelegramHtmlAttribute(text: string): string {\n\t\treturn this.escapeTelegramHtml(text).replace(/\"/g, \""\");\n\t}\n\n\tprivate stripHtmlTags(text: string): string {\n\t\treturn text.replace(/<[^>]*>/g, \"\");\n\t}\n\n\tprivate normalizeTelegramText(text: string): string {\n\t\treturn text.replace(/\\r\\n/g, \"\\n\").replace(/\\n{3,}/g, \"\\n\\n\").trim();\n\t}\n\n\tprivate renderMarkdownInlineTokens(tokens: Token[] | undefined): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"strong\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"em\":\n\t\t\t\t\toutput += `<i>${this.renderMarkdownInlineTokens(token.tokens)}</i>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"del\":\n\t\t\t\t\toutput += `<s>${this.renderMarkdownInlineTokens(token.tokens)}</s>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"codespan\":\n\t\t\t\t\toutput += `<code>${this.escapeTelegramHtml(token.text)}</code>`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"br\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"link\": {\n\t\t\t\t\tconst labelRaw = this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\tconst label = labelRaw.length > 0 ? labelRaw : this.escapeTelegramHtml(token.text ?? token.href);\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^(https?:\\/\\/|mailto:|tg:\\/\\/)/i.test(href)) {\n\t\t\t\t\t\toutput += `<a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${label}</a>`;\n\t\t\t\t\t} else if (href) {\n\t\t\t\t\t\toutput += `${label} (${this.escapeTelegramHtml(href)})`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += label;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"image\": {\n\t\t\t\t\tconst captionRaw = token.text?.trim();\n\t\t\t\t\tconst caption = captionRaw && captionRaw.length > 0 ? captionRaw : \"image\";\n\t\t\t\t\tconst href = token.href?.trim();\n\t\t\t\t\tif (href && /^https?:\\/\\//i.test(href)) {\n\t\t\t\t\t\toutput += `🖼 <a href=\"${this.escapeTelegramHtmlAttribute(href)}\">${this.escapeTelegramHtml(caption)}</a>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `🖼 ${this.escapeTelegramHtml(caption)}`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"escape\":\n\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\");\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(htmlText);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += this.renderMarkdownInlineTokens(token.tokens);\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.text);\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += this.escapeTelegramHtml(token.raw);\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate renderMarkdownTableCell(cell: Tokens.TableCell): string {\n\t\tconst rendered = this.renderMarkdownInlineTokens(cell.tokens);\n\t\treturn rendered.replace(/\\s+/g, \" \").trim();\n\t}\n\n\tprivate renderMarkdownBlockTokens(tokens: Token[] | undefined, listDepth = 0): string {\n\t\tif (!tokens || tokens.length === 0) return \"\";\n\t\tlet output = \"\";\n\t\tfor (const token of tokens) {\n\t\t\tswitch (token.type) {\n\t\t\t\tcase \"space\":\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"heading\":\n\t\t\t\t\toutput += `<b>${this.renderMarkdownInlineTokens(token.tokens)}</b>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"paragraph\":\n\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tif (Array.isArray(token.tokens) && token.tokens.length > 0) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownInlineTokens(token.tokens)}\\n`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"code\":\n\t\t\t\t\toutput += `<pre>${this.escapeTelegramHtml(token.text.replace(/\\r\\n/g, \"\\n\"))}</pre>\\n`;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"blockquote\": {\n\t\t\t\t\tconst rawQuote = this.normalizeTelegramText(this.renderMarkdownBlockTokens(token.tokens, listDepth));\n\t\t\t\t\tif (rawQuote.length > 0) {\n\t\t\t\t\t\tconst quoted = rawQuote\n\t\t\t\t\t\t\t.split(\"\\n\")\n\t\t\t\t\t\t\t.map((line) => (line.trim().length > 0 ? `> ${line}` : \">\"))\n\t\t\t\t\t\t\t.join(\"\\n\");\n\t\t\t\t\t\toutput += `${quoted}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"list\": {\n\t\t\t\t\tconst baseIndent = \" \".repeat(listDepth);\n\t\t\t\t\tconst start = token.ordered && typeof token.start === \"number\" ? token.start : 1;\n\t\t\t\t\ttoken.items.forEach((item: Tokens.ListItem, index: number) => {\n\t\t\t\t\t\tconst marker = token.ordered ? `${start + index}.` : \"•\";\n\t\t\t\t\t\tconst renderedItem = this.normalizeTelegramText(this.renderMarkdownBlockTokens(item.tokens, listDepth + 1));\n\t\t\t\t\t\tconst fallback = this.escapeTelegramHtml(item.text ?? \"\");\n\t\t\t\t\t\tconst body = renderedItem.length > 0 ? renderedItem : fallback;\n\t\t\t\t\t\tconst lines = body.split(\"\\n\");\n\t\t\t\t\t\tconst firstLine = lines.shift() ?? \"\";\n\t\t\t\t\t\toutput += `${baseIndent}${marker} ${firstLine}\\n`;\n\t\t\t\t\t\tfor (const line of lines) {\n\t\t\t\t\t\t\tif (line.trim().length === 0) {\n\t\t\t\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput += `${baseIndent} ${line}\\n`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"hr\":\n\t\t\t\t\toutput += \"────────\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"table\": {\n\t\t\t\t\tconst headerLine = token.header\n\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t.trim();\n\t\t\t\t\tif (headerLine.length > 0) {\n\t\t\t\t\t\toutput += `${headerLine}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tfor (const row of token.rows) {\n\t\t\t\t\t\tconst rowLine = row\n\t\t\t\t\t\t\t.map((cell: Tokens.TableCell) => this.renderMarkdownTableCell(cell))\n\t\t\t\t\t\t\t.join(\" | \")\n\t\t\t\t\t\t\t.trim();\n\t\t\t\t\t\tif (rowLine.length > 0) {\n\t\t\t\t\t\t\toutput += `${rowLine}\\n`;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\toutput += \"\\n\";\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"html\": {\n\t\t\t\t\tconst htmlText = this.stripHtmlTags(token.text ?? token.raw ?? \"\").trim();\n\t\t\t\t\tif (htmlText.length > 0) {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(htmlText)}\\n`;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\tif (\"tokens\" in token && Array.isArray(token.tokens)) {\n\t\t\t\t\t\toutput += `${this.renderMarkdownBlockTokens(token.tokens, listDepth)}\\n`;\n\t\t\t\t\t} else if (\"text\" in token && typeof token.text === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.text)}\\n`;\n\t\t\t\t\t} else if (\"raw\" in token && typeof token.raw === \"string\") {\n\t\t\t\t\t\toutput += `${this.escapeTelegramHtml(token.raw)}\\n`;\n\t\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\tprivate markdownToTelegramHtml(markdown: string): string {\n\t\tif (!markdown || markdown.trim().length === 0) return \"\";\n\t\tconst tokens = marked.lexer(markdown, { gfm: true, breaks: true }) as Token[];\n\t\tconst rendered = this.renderMarkdownBlockTokens(tokens);\n\t\treturn this.normalizeTelegramText(rendered);\n\t}\n\n\tprivate markdownToTelegramPlainText(markdown: string): string {\n\t\tconst html = this.markdownToTelegramHtml(markdown);\n\t\treturn this.normalizeTelegramText(\n\t\t\thtml\n\t\t\t\t.replace(/<a [^>]*>([\\s\\S]*?)<\\/a>/gi, \"$1\")\n\t\t\t\t.replace(/<\\/?(b|i|s|u|code|pre)>/gi, \"\")\n\t\t\t\t.replace(/"/g, \"\\\"\")\n\t\t\t\t.replace(/</g, \"<\")\n\t\t\t\t.replace(/>/g, \">\")\n\t\t\t\t.replace(/&/g, \"&\"),\n\t\t);\n\t}\n\n\tprivate async sendRichMessage(chatId: TelegramChatId, text: string): Promise<void> {\n\t\tconst html = this.markdownToTelegramHtml(text);\n\t\tif (!html || html.length === 0) {\n\t\t\tawait this.bot.sendMessage(chatId, text);\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tawait this.bot.sendMessage(chatId, html, { parseMode: \"HTML\" });\n\t\t} catch {\n\t\t\tconst plain = this.markdownToTelegramPlainText(text);\n\t\t\tawait this.bot.sendMessage(chatId, plain.length > 0 ? plain : text);\n\t\t}\n\t}\n\n\tprivate formatStatusPhase(phase: string): string {\n\t\tconst lower = phase.toLowerCase();\n\t\tif (lower.includes(\"awaiting\")) return \"confirm\";\n\t\tif (lower.includes(\"tool\")) return \"tool\";\n\t\tif (lower.includes(\"final\")) return \"final\";\n\t\tif (lower.includes(\"start\")) return \"start\";\n\t\tif (lower.includes(\"permission denied\")) return \"denied\";\n\t\tif (lower.includes(\"running\")) return \"run\";\n\t\treturn lower.replace(/\\s+/g, \"-\");\n\t}\n\n\tprivate formatPromptPreview(prompt: string, limit = 100): string {\n\t\tconst cleaned = prompt.replace(/\\s+/g, \" \").trim();\n\t\tif (cleaned.length <= limit) return cleaned;\n\t\treturn `${cleaned.slice(0, limit - 1)}…`;\n\t}\n\n\tprivate statusSpinnerFrame(elapsedMs: number): string {\n\t\tconst frames = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\n\t\treturn frames[Math.floor(elapsedMs / 250) % frames.length] ?? \"⠋\";\n\t}\n\n\tprivate statusPulseFrame(elapsedMs: number): string {\n\t\tconst frames = [\"◼···\", \"◼•··\", \"◼••·\", \"◼•••\", \"◼••·\", \"◼•··\"];\n\t\treturn frames[Math.floor(elapsedMs / 280) % frames.length] ?? \"◼···\";\n\t}\n\n\tprivate statusDotsFrame(elapsedMs: number): string {\n\t\tconst frames = [\".\", \"..\", \"...\"];\n\t\treturn frames[Math.floor(elapsedMs / 420) % frames.length] ?? \".\";\n\t}\n\n\tprivate statusActivityLabel(turn: ActiveTurnState | undefined): string {\n\t\tif (!turn) return \"idle\";\n\t\tconst phase = turn.phase.toLowerCase();\n\t\tif (phase.includes(\"awaiting\")) return \"awaiting confirm\";\n\t\tif (phase.includes(\"tool\")) {\n\t\t\tconst tool = turn.lastTool?.trim();\n\t\t\tif (tool && tool.length > 0) {\n\t\t\t\tconst shortTool = tool.length > 18 ? `${tool.slice(0, 17)}…` : tool;\n\t\t\t\treturn `tool:${shortTool}`;\n\t\t\t}\n\t\t\treturn \"tool:running\";\n\t\t}\n\t\tif (phase.includes(\"final\")) return \"finalizing\";\n\t\tif (phase.includes(\"start\")) return \"starting\";\n\t\tif (phase.includes(\"denied\")) return \"permission denied\";\n\t\treturn \"working\";\n\t}\n\n\tprivate formatToolBadge(toolName: string | undefined): string {\n\t\tif (!toolName) return \"\";\n\t\tconst compact = toolName.trim().replace(/\\s+/g, \" \");\n\t\tconst clipped = compact.length > 18 ? `${compact.slice(0, 17)}…` : compact;\n\t\treturn ` · ${clipped}`;\n\t}\n\n\tprivate formatStartingStatus(prompt: string): string {\n\t\treturn [`⏳ ${APP_NAME} · start · 0s · q${this.queue.length}`, `“${this.formatPromptPreview(prompt, 56)}”`].join(\"\\n\");\n\t}\n\n\tprivate isStatusMessageInvalidError(error: unknown): boolean {\n\t\tconst message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n\t\treturn (\n\t\t\tmessage.includes(\"message_id_invalid\") ||\n\t\t\tmessage.includes(\"message to edit not found\") ||\n\t\t\tmessage.includes(\"message can't be edited\")\n\t\t);\n\t}\n\n\tprivate extractTelegramRetryAfterMs(error: unknown): number | undefined {\n\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\tconst match = /retry after\\s+(\\d+)/i.exec(message);\n\t\tif (!match) return undefined;\n\t\tconst seconds = Number.parseInt(match[1] ?? \"\", 10);\n\t\tif (!Number.isFinite(seconds) || seconds <= 0) return undefined;\n\t\treturn seconds * 1000;\n\t}\n\n\tprivate scheduleStatusEditRetry(turnId: number, retryAfterMs: number): void {\n\t\tif (!this.activeTurn || this.activeTurn.turnId !== turnId) return;\n\t\tif (this.activeTurn.statusEditPending) return;\n\t\tthis.activeTurn.statusEditPending = true;\n\t\tthis.activeTurn.statusEditTimer = setTimeout(() => {\n\t\t\tif (this.activeTurn && this.activeTurn.turnId === turnId) {\n\t\t\t\tthis.activeTurn.statusEditPending = false;\n\t\t\t\tvoid this.editLiveStatus(true);\n\t\t\t}\n\t\t}, retryAfterMs);\n\t}\n\n\tprivate async recreateLiveStatusMessage(target: ActiveTurnState, statusText: string): Promise<boolean> {\n\t\t// Status message may be removed by user or become invalid in Telegram storage.\n\t\t// Recreate it and continue editing against the new message_id.\n\t\tif (!this.activeTurn || this.activeTurn.turnId !== target.turnId) return false;\n\t\ttry {\n\t\t\tconst fresh = await this.bot.sendMessage(target.chatId, statusText, {\n\t\t\t\treplyMarkup: { inline_keyboard: [] },\n\t\t\t});\n\t\t\ttarget.statusMessageId = fresh.message_id;\n\t\t\ttarget.lastStatusEditAt = Date.now();\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\tconsole.warn(\n\t\t\t\t`[telegram] status recreation failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t\t);\n\t\t\treturn false;\n\t\t}\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(async (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\tconst retryAfterMs = this.extractTelegramRetryAfterMs(error);\n\t\t\t\t\tif (retryAfterMs) {\n\t\t\t\t\t\tconsole.warn(`[telegram] status edit rate-limited, retrying in ${Math.ceil(retryAfterMs / 1000)}s`);\n\t\t\t\t\t\tthis.scheduleStatusEditRetry(turnId, retryAfterMs);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.isStatusMessageInvalidError(error)) {\n\t\t\t\t\t\tconst recovered = await this.recreateLiveStatusMessage(target, statusText);\n\t\t\t\t\t\tif (recovered) return;\n\t\t\t\t\t}\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 (error) {\n\t\t\t// Best-effort, but recover from invalid status message ids to avoid losing final state.\n\t\t\tif (this.isStatusMessageInvalidError(error)) {\n\t\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, statusLabel).catch(() => {});\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tif (options?.error) {\n\t\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, `Task failed: ${options.error}`);\n\t\t\t} else if (finalText && finalText.trim().length > 0) {\n\t\t\t\tawait this.sendFinalOutput(finishedTurn.chatId, finalText);\n\t\t\t} else if (!finishedTurn.aborted) {\n\t\t\t\tawait this.bot.sendMessage(finishedTurn.chatId, \"Task completed with no assistant text output.\");\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.warn(`[telegram] final output delivery failed: ${error instanceof Error ? error.message : String(error)}`);\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"]}
|