export function elide(text?: string, limit = 400) { if (!text) return text; if (text.length <= limit) return text; return `${text.slice(0, limit)}… (truncated ${text.length - limit} chars)`; } export function isLikelyWhatsAppCryptoError(reason: unknown) { const formatReason = (value: unknown): string => { if (value == null) return ""; if (typeof value === "string") return value; if (value instanceof Error) { return `${value.message}\n${value.stack ?? ""}`; } if (typeof value === "object") { try { return JSON.stringify(value); } catch { return Object.prototype.toString.call(value); } } if (typeof value === "number") return String(value); if (typeof value === "boolean") return String(value); if (typeof value === "bigint") return String(value); if (typeof value === "symbol") return value.description ?? value.toString(); if (typeof value === "function") return value.name ? `[function ${value.name}]` : "[function]"; return Object.prototype.toString.call(value); }; const raw = reason instanceof Error ? `${reason.message}\n${reason.stack ?? ""}` : formatReason(reason); const haystack = raw.toLowerCase(); const hasAuthError = haystack.includes("unsupported state or unable to authenticate data") || haystack.includes("bad mac"); if (!hasAuthError) return false; return ( haystack.includes("@whiskeysockets/baileys") || haystack.includes("baileys") || haystack.includes("noise-handler") || haystack.includes("aesdecryptgcm") ); }