

























@@ -126,6 +126,7 @@ type TelegramObservedMessage = {
126126};
127127128128const DEFAULT_TELEGRAM_QA_CANARY_TIMEOUT_MS = 30_000;
129+const TELEGRAM_QA_DEFAULT_READY_TIMEOUT_MS = 45_000;
129130130131type TelegramQaScenarioResult = LiveTransportCheckResult;
131132@@ -157,6 +158,15 @@ type TelegramQaRunResult = {
157158scenarios: TelegramQaScenarioResult[];
158159};
159160161+type TelegramChannelStatus = {
162+connected?: boolean;
163+lastConnectedAt?: number;
164+lastDisconnect?: unknown;
165+lastError?: string | null;
166+restartPending?: boolean;
167+running?: boolean;
168+};
169+160170class TelegramQaCanaryError extends Error {
161171phase: TelegramQaCanaryPhase;
162172context: Record<string, string | number | undefined>;
@@ -617,6 +627,14 @@ function resolveTelegramQaScenarioTimeoutMs(
617627return parsePositiveTelegramQaEnvMs(env, "OPENCLAW_QA_TELEGRAM_SCENARIO_TIMEOUT_MS", fallbackMs);
618628}
619629630+function resolveTelegramQaReadyTimeoutMs(env: NodeJS.ProcessEnv = process.env) {
631+const raw = env.OPENCLAW_QA_TRANSPORT_READY_TIMEOUT_MS;
632+if (!raw) {
633+return TELEGRAM_QA_DEFAULT_READY_TIMEOUT_MS;
634+}
635+return parseStrictPositiveInteger(raw) ?? TELEGRAM_QA_DEFAULT_READY_TIMEOUT_MS;
636+}
637+620638function normalizeTelegramQaRttOptions(params: {
621639count?: number;
622640checkIds?: readonly string[];
@@ -1230,13 +1248,16 @@ async function waitForTelegramChannelRunning(
12301248gateway: Awaited<ReturnType<typeof startQaGatewayChild>>,
12311249accountId: string,
12321250options?: {
1251+env?: NodeJS.ProcessEnv;
12331252pollMs?: number;
12341253timeoutMs?: number;
12351254},
12361255) {
12371256const startedAt = Date.now();
1238-const timeoutMs = options?.timeoutMs ?? 45_000;
1257+const timeoutMs = options?.timeoutMs ?? resolveTelegramQaReadyTimeoutMs(options?.env);
12391258const pollMs = options?.pollMs ?? 500;
1259+let lastProbeError: string | undefined;
1260+let lastStatus: TelegramChannelStatus | undefined;
12401261while (Date.now() - startedAt < timeoutMs) {
12411262try {
12421263const payload = (await gateway.call(
@@ -1249,28 +1270,49 @@ async function waitForTelegramChannelRunning(
12491270Array<{
12501271accountId?: string;
12511272connected?: boolean;
1273+lastConnectedAt?: number;
1274+lastDisconnect?: unknown;
1275+lastError?: string | null;
12521276running?: boolean;
12531277restartPending?: boolean;
12541278}>
12551279>;
12561280};
12571281const accounts = payload.channelAccounts?.telegram ?? [];
12581282const match = accounts.find((entry) => entry.accountId === accountId);
1283+lastProbeError = undefined;
1284+lastStatus = match
1285+ ? {
1286+connected: match.connected,
1287+lastConnectedAt: match.lastConnectedAt,
1288+lastDisconnect: match.lastDisconnect,
1289+lastError: match.lastError,
1290+restartPending: match.restartPending,
1291+running: match.running,
1292+}
1293+ : undefined;
12591294if (match?.running && match.connected === true && match.restartPending !== true) {
12601295return;
12611296}
1262-} catch {
1297+} catch (error) {
1298+lastProbeError = formatErrorMessage(error);
12631299// retry
12641300}
12651301await new Promise((resolve) => {
12661302setTimeout(resolve, pollMs);
12671303});
12681304}
1269-throw new Error(`telegram account "${accountId}" did not become ready`);
1305+const details = lastStatus
1306+ ? `; last status: ${JSON.stringify(lastStatus)}`
1307+ : lastProbeError
1308+ ? `; last probe error: ${lastProbeError}`
1309+ : "";
1310+throw new Error(`telegram account "${accountId}" did not become ready${details}`);
12701311}
1271131212721313async function setTelegramQaDriverGroupAuthorization(params: {
12731314driverBotId: number;
1315+env: NodeJS.ProcessEnv;
12741316gateway: Awaited<ReturnType<typeof startQaGatewayChild>>;
12751317groupId: string;
12761318sutAccountId: string;
@@ -1293,7 +1335,7 @@ async function setTelegramQaDriverGroupAuthorization(params: {
12931335mode: 0o600,
12941336});
12951337});
1296-await waitForTelegramChannelRunning(params.gateway, params.sutAccountId);
1338+await waitForTelegramChannelRunning(params.gateway, params.sutAccountId, { env: params.env });
12971339}
1298134012991341function renderTelegramQaMarkdown(params: {
@@ -1903,7 +1945,7 @@ export async function runTelegramQaLive(params: {
19031945}),
19041946});
19051947try {
1906-await waitForTelegramChannelRunning(gatewayHarness.gateway, sutAccountId);
1948+await waitForTelegramChannelRunning(gatewayHarness.gateway, sutAccountId, { env });
19071949assertLeaseHealthy();
19081950let latestSutMessageId: number | undefined;
19091951try {
@@ -1982,6 +2024,7 @@ export async function runTelegramQaLive(params: {
19822024if (step.driverGroupAuthorization) {
19832025await setTelegramQaDriverGroupAuthorization({
19842026driverBotId: driverIdentity.id,
2027+ env,
19852028gateway: gatewayHarness.gateway,
19862029groupId: runtimeEnv.groupId,
19872030 sutAccountId,
@@ -2259,6 +2302,7 @@ export const testing = {
22592302 parseTelegramQaCredentialPayload,
22602303 normalizeTelegramQaRttOptions,
22612304 resolveTelegramQaCanaryTimeoutMs,
2305+ resolveTelegramQaReadyTimeoutMs,
22622306 resolveTelegramQaScenarioTimeoutMs,
22632307 resolveTelegramQaRuntimeEnv,
22642308 sanitizeTelegramQaProgressValue,
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。