



























@@ -144,7 +144,7 @@ const WHATSAPP_QA_CAPTURE_CONTENT_ENV = "OPENCLAW_QA_WHATSAPP_CAPTURE_CONTENT";
144144const QA_REDACT_PUBLIC_METADATA_ENV = "OPENCLAW_QA_REDACT_PUBLIC_METADATA";
145145const WHATSAPP_QA_TRANSIENT_DRIVER_ATTEMPTS = 5;
146146const WHATSAPP_QA_READY_TIMEOUT_MS = 150_000;
147-const WHATSAPP_QA_READY_STABILITY_MS = 8_000;
147+const WHATSAPP_QA_READY_STABILITY_MS = 20_000;
148148const WHATSAPP_QA_DRIVER_RECONNECT_DELAY_MS = 10_000;
149149const WHATSAPP_QA_ENV_KEYS = [
150150"OPENCLAW_QA_WHATSAPP_DRIVER_PHONE_E164",
@@ -418,7 +418,7 @@ async function waitForWhatsAppChannelRunning(
418418}
419419 : undefined;
420420if (match?.running && match.connected === true && match.restartPending !== true) {
421-return;
421+return lastStatus;
422422}
423423} catch {
424424// retry
@@ -435,9 +435,24 @@ async function waitForWhatsAppChannelStable(
435435gateway: Awaited<ReturnType<typeof startQaGatewayChild>>,
436436accountId: string,
437437) {
438-await waitForWhatsAppChannelRunning(gateway, accountId);
439-await new Promise((resolve) => setTimeout(resolve, WHATSAPP_QA_READY_STABILITY_MS));
440-await waitForWhatsAppChannelRunning(gateway, accountId);
438+const startedAt = Date.now();
439+while (Date.now() - startedAt < WHATSAPP_QA_READY_TIMEOUT_MS) {
440+const status = await waitForWhatsAppChannelRunning(gateway, accountId);
441+const connectedAt =
442+typeof status.lastConnectedAt === "number" && status.lastConnectedAt > 0
443+ ? status.lastConnectedAt
444+ : Date.now();
445+const connectedForMs = Date.now() - connectedAt;
446+if (connectedForMs >= WHATSAPP_QA_READY_STABILITY_MS) {
447+return;
448+}
449+await new Promise((resolve) =>
450+setTimeout(resolve, Math.max(750, WHATSAPP_QA_READY_STABILITY_MS - connectedForMs)),
451+);
452+}
453+throw new Error(
454+`whatsapp account "${accountId}" did not remain ready for ${WHATSAPP_QA_READY_STABILITY_MS}ms`,
455+);
441456}
442457443458async function listTarEntries(archivePath: string): Promise<string[]> {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。