"use strict";Object.defineProperty(exports, "__esModule", { value: true });exports._ = resolveWebCredsPath;exports.a = resolveWhatsAppAuthDir;exports.b = createAccountListHelpers;exports.c = getWebAuthAgeMs;exports.d = maybeRestoreCredsFromBackup;exports.f = pickWebChannel;exports.g = resolveWebCredsBackupPath;exports.h = resolveDefaultWebAuthDir;exports.i = resolveWhatsAppAccount;exports.l = logWebSelfId;exports.m = readWebSelfId;exports.n = void 0;exports.o = resolveWhatsAppMediaMaxBytes;exports.p = readCredsJsonRaw;exports.s = exports.r = void 0;exports.t = hasAnyWhatsAppAuth;exports.u = logoutWeb;exports.v = webAuthExists;exports.y = resolveAccountEntry;var _runWithConcurrency2ga3CMk = require("./run-with-concurrency-2ga3-CMk.js"); var _pathsEFexkPEh = require("./paths-eFexkPEh.js"); var _configDiiPndBn = require("./config-DiiPndBn.js"); var _loggerU3s76KST = require("./logger-U3s76KST.js"); var _nodeFs = _interopRequireDefault(require("node:fs")); var _nodePath = _interopRequireDefault(require("node:path")); var _promises = _interopRequireDefault(require("node:fs/promises"));function _interopRequireDefault(e) {return e && e.__esModule ? e : { default: e };} //#region src/channels/plugins/account-helpers.ts function createAccountListHelpers(channelKey, options) { function resolveConfiguredDefaultAccountId(cfg) { const channel = cfg.channels?.[channelKey]; const preferred = (0, _runWithConcurrency2ga3CMk.dt)(typeof channel?.defaultAccount === "string" ? channel.defaultAccount : void 0); if (!preferred) return; if (listAccountIds(cfg).some((id) => (0, _runWithConcurrency2ga3CMk.ut)(id) === preferred)) return preferred; } function listConfiguredAccountIds(cfg) { const accounts = cfg.channels?.[channelKey]?.accounts; if (!accounts || typeof accounts !== "object") return []; const ids = Object.keys(accounts).filter(Boolean); const normalizeConfiguredAccountId = options?.normalizeAccountId; if (!normalizeConfiguredAccountId) return ids; return [...new Set(ids.map((id) => normalizeConfiguredAccountId(id)).filter(Boolean))]; } function listAccountIds(cfg) { const ids = listConfiguredAccountIds(cfg); if (ids.length === 0) return [_runWithConcurrency2ga3CMk.lt]; return ids.toSorted((a, b) => a.localeCompare(b)); } function resolveDefaultAccountId(cfg) { const preferred = resolveConfiguredDefaultAccountId(cfg); if (preferred) return preferred; const ids = listAccountIds(cfg); if (ids.includes("default")) return _runWithConcurrency2ga3CMk.lt; return ids[0] ?? "default"; } return { listConfiguredAccountIds, listAccountIds, resolveDefaultAccountId }; } //#endregion //#region src/routing/account-lookup.ts function resolveAccountEntry(accounts, accountId) { if (!accounts || typeof accounts !== "object") return; if (Object.hasOwn(accounts, accountId)) return accounts[accountId]; const normalized = accountId.toLowerCase(); const matchKey = Object.keys(accounts).find((key) => key.toLowerCase() === normalized); return matchKey ? accounts[matchKey] : void 0; } //#endregion //#region src/web/auth-store.ts function resolveDefaultWebAuthDir() { return _nodePath.default.join((0, _pathsEFexkPEh.o)(), "whatsapp", _runWithConcurrency2ga3CMk.lt); } const WA_WEB_AUTH_DIR = exports.s = resolveDefaultWebAuthDir(); function resolveWebCredsPath(authDir) { return _nodePath.default.join(authDir, "creds.json"); } function resolveWebCredsBackupPath(authDir) { return _nodePath.default.join(authDir, "creds.json.bak"); } function hasWebCredsSync(authDir) { try { const stats = _nodeFs.default.statSync(resolveWebCredsPath(authDir)); return stats.isFile() && stats.size > 1; } catch { return false; } } function readCredsJsonRaw(filePath) { try { if (!_nodeFs.default.existsSync(filePath)) return null; const stats = _nodeFs.default.statSync(filePath); if (!stats.isFile() || stats.size <= 1) return null; return _nodeFs.default.readFileSync(filePath, "utf-8"); } catch { return null; } } function maybeRestoreCredsFromBackup(authDir) { const logger = (0, _loggerU3s76KST.K)({ module: "web-session" }); try { const credsPath = resolveWebCredsPath(authDir); const backupPath = resolveWebCredsBackupPath(authDir); const raw = readCredsJsonRaw(credsPath); if (raw) { JSON.parse(raw); return; } const backupRaw = readCredsJsonRaw(backupPath); if (!backupRaw) return; JSON.parse(backupRaw); _nodeFs.default.copyFileSync(backupPath, credsPath); try { _nodeFs.default.chmodSync(credsPath, 384); } catch {} logger.warn({ credsPath }, "restored corrupted WhatsApp creds.json from backup"); } catch {} } async function webAuthExists(authDir = resolveDefaultWebAuthDir()) { const resolvedAuthDir = (0, _loggerU3s76KST.D)(authDir); maybeRestoreCredsFromBackup(resolvedAuthDir); const credsPath = resolveWebCredsPath(resolvedAuthDir); try { await _promises.default.access(resolvedAuthDir); } catch { return false; } try { const stats = await _promises.default.stat(credsPath); if (!stats.isFile() || stats.size <= 1) return false; const raw = await _promises.default.readFile(credsPath, "utf-8"); JSON.parse(raw); return true; } catch { return false; } } async function clearLegacyBaileysAuthState(authDir) { const entries = await _promises.default.readdir(authDir, { withFileTypes: true }); const shouldDelete = (name) => { if (name === "oauth.json") return false; if (name === "creds.json" || name === "creds.json.bak") return true; if (!name.endsWith(".json")) return false; return /^(app-state-sync|session|sender-key|pre-key)-/.test(name); }; await Promise.all(entries.map(async (entry) => { if (!entry.isFile()) return; if (!shouldDelete(entry.name)) return; await _promises.default.rm(_nodePath.default.join(authDir, entry.name), { force: true }); })); } async function logoutWeb(params) { const runtime = params.runtime ?? _loggerU3s76KST.l; const resolvedAuthDir = (0, _loggerU3s76KST.D)(params.authDir ?? resolveDefaultWebAuthDir()); if (!(await webAuthExists(resolvedAuthDir))) { runtime.log((0, _loggerU3s76KST.L)("No WhatsApp Web session found; nothing to delete.")); return false; } if (params.isLegacyAuthDir) await clearLegacyBaileysAuthState(resolvedAuthDir);else await _promises.default.rm(resolvedAuthDir, { recursive: true, force: true }); runtime.log((0, _loggerU3s76KST.V)("Cleared WhatsApp Web credentials.")); return true; } function readWebSelfId(authDir = resolveDefaultWebAuthDir()) { try { const credsPath = resolveWebCredsPath((0, _loggerU3s76KST.D)(authDir)); if (!_nodeFs.default.existsSync(credsPath)) return { e164: null, jid: null }; const raw = _nodeFs.default.readFileSync(credsPath, "utf-8"); const jid = JSON.parse(raw)?.me?.id ?? null; return { e164: jid ? (0, _loggerU3s76KST.S)(jid, { authDir }) : null, jid }; } catch { return { e164: null, jid: null }; } } /** * Return the age (in milliseconds) of the cached WhatsApp web auth state, or null when missing. * Helpful for heartbeats/observability to spot stale credentials. */ function getWebAuthAgeMs(authDir = resolveDefaultWebAuthDir()) { try { const stats = _nodeFs.default.statSync(resolveWebCredsPath((0, _loggerU3s76KST.D)(authDir))); return Date.now() - stats.mtimeMs; } catch { return null; } } function logWebSelfId(authDir = resolveDefaultWebAuthDir(), runtime = _loggerU3s76KST.l, includeChannelPrefix = false) { const { e164, jid } = readWebSelfId(authDir); const details = e164 || jid ? `${e164 ?? "unknown"}${jid ? ` (jid ${jid})` : ""}` : "unknown"; const prefix = includeChannelPrefix ? "Web Channel: " : ""; runtime.log((0, _loggerU3s76KST.L)(`${prefix}${details}`)); } async function pickWebChannel(pref, authDir = resolveDefaultWebAuthDir()) { const choice = pref === "auto" ? "web" : pref; if (!(await webAuthExists(authDir))) throw new Error(`No WhatsApp Web session found. Run \`${(0, _configDiiPndBn.Br)("openclaw channels login --channel whatsapp --verbose")}\` to link.`); return choice; } const { listConfiguredAccountIds, listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("whatsapp"); const listWhatsAppAccountIds = exports.n = listAccountIds; const resolveDefaultWhatsAppAccountId = exports.r = resolveDefaultAccountId; function listWhatsAppAuthDirs(cfg) { const oauthDir = (0, _pathsEFexkPEh.o)(); const whatsappDir = _nodePath.default.join(oauthDir, "whatsapp"); const authDirs = new Set([oauthDir, _nodePath.default.join(whatsappDir, _runWithConcurrency2ga3CMk.lt)]); const accountIds = listConfiguredAccountIds(cfg); for (const accountId of accountIds) authDirs.add(resolveWhatsAppAuthDir({ cfg, accountId }).authDir); try { const entries = _nodeFs.default.readdirSync(whatsappDir, { withFileTypes: true }); for (const entry of entries) { if (!entry.isDirectory()) continue; authDirs.add(_nodePath.default.join(whatsappDir, entry.name)); } } catch {} return Array.from(authDirs); } function hasAnyWhatsAppAuth(cfg) { return listWhatsAppAuthDirs(cfg).some((authDir) => hasWebCredsSync(authDir)); } function resolveAccountConfig(cfg, accountId) { return resolveAccountEntry(cfg.channels?.whatsapp?.accounts, accountId); } function resolveDefaultAuthDir(accountId) { return _nodePath.default.join((0, _pathsEFexkPEh.o)(), "whatsapp", (0, _runWithConcurrency2ga3CMk.ut)(accountId)); } function resolveLegacyAuthDir() { return (0, _pathsEFexkPEh.o)(); } function legacyAuthExists(authDir) { try { return _nodeFs.default.existsSync(_nodePath.default.join(authDir, "creds.json")); } catch { return false; } } function resolveWhatsAppAuthDir(params) { const accountId = params.accountId.trim() || "default"; const configured = resolveAccountConfig(params.cfg, accountId)?.authDir?.trim(); if (configured) return { authDir: (0, _loggerU3s76KST.D)(configured), isLegacy: false }; const defaultDir = resolveDefaultAuthDir(accountId); if (accountId === "default") { const legacyDir = resolveLegacyAuthDir(); if (legacyAuthExists(legacyDir) && !legacyAuthExists(defaultDir)) return { authDir: legacyDir, isLegacy: true }; } return { authDir: defaultDir, isLegacy: false }; } function resolveWhatsAppAccount(params) { const rootCfg = params.cfg.channels?.whatsapp; const accountId = params.accountId?.trim() || resolveDefaultWhatsAppAccountId(params.cfg); const accountCfg = resolveAccountConfig(params.cfg, accountId); const enabled = accountCfg?.enabled !== false; const { authDir, isLegacy } = resolveWhatsAppAuthDir({ cfg: params.cfg, accountId }); return { accountId, name: accountCfg?.name?.trim() || void 0, enabled, sendReadReceipts: accountCfg?.sendReadReceipts ?? rootCfg?.sendReadReceipts ?? true, messagePrefix: accountCfg?.messagePrefix ?? rootCfg?.messagePrefix ?? params.cfg.messages?.messagePrefix, authDir, isLegacyAuthDir: isLegacy, selfChatMode: accountCfg?.selfChatMode ?? rootCfg?.selfChatMode, dmPolicy: accountCfg?.dmPolicy ?? rootCfg?.dmPolicy, allowFrom: accountCfg?.allowFrom ?? rootCfg?.allowFrom, groupAllowFrom: accountCfg?.groupAllowFrom ?? rootCfg?.groupAllowFrom, groupPolicy: accountCfg?.groupPolicy ?? rootCfg?.groupPolicy, textChunkLimit: accountCfg?.textChunkLimit ?? rootCfg?.textChunkLimit, chunkMode: accountCfg?.chunkMode ?? rootCfg?.chunkMode, mediaMaxMb: accountCfg?.mediaMaxMb ?? rootCfg?.mediaMaxMb, blockStreaming: accountCfg?.blockStreaming ?? rootCfg?.blockStreaming, ackReaction: accountCfg?.ackReaction ?? rootCfg?.ackReaction, groups: accountCfg?.groups ?? rootCfg?.groups, debounceMs: accountCfg?.debounceMs ?? rootCfg?.debounceMs }; } function resolveWhatsAppMediaMaxBytes(account) { return (typeof account.mediaMaxMb === "number" && account.mediaMaxMb > 0 ? account.mediaMaxMb : 50) * 1024 * 1024; } //#endregion /* v9-87d970b28975f024 */