§
    øžyjïS ã                   ó  — d Z ddlZddlZddlZddlZddlZddlZddlZ ej        ¦   «         dk    Z	ddl
mZ ddlmZmZmZ ddlmZ ddlmZmZmZ d7d	ed
edefd„Z ej        e¦  «        ZdZdedefd„Zdeddfd„Zdedede fd„Z!deddfd„Z"dededdfd„Z#ddœde ddfd„Z$ddl%Z%e%j&         '                    d e ee(¦  «         )                    ¦   «         j*        d         ¦  «        ¦  «         ddl+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9 ddl:m;Z; d ede fd!„Z<d"edefd#„Z=de fd$„Z> G d%„ d&e/e3¦  «        Z?h d'£Z@h d(£ZAh d)£ZBd*ed+e d,e defd-„ZCddddd.œd/„ZDd8d0„ZEd1eFd2eFdeFdz  fd3„ZGde fd4„ZHd5„ ZId8d6„ZJdS )9aG  
WhatsApp platform adapter.

WhatsApp integration is more complex than Telegram/Discord because:
- No official bot API for personal accounts
- Business API requires Meta Business verification
- Most solutions use web-based automation

This adapter supports multiple backends:
1. WhatsApp Business API (requires Meta verification)
2. whatsapp-web.js (via Node.js subprocess) - for personal accounts
3. Baileys (via Node.js subprocess) - alternative for personal accounts

For simplicity, we'll implement a generic interface that can work
with different backends via a bridge pattern.
é    NÚWindows)ÚPath)ÚDictÚOptionalÚAny)Úwindows_detach_popen_kwargs)Úfind_node_executableÚget_hermes_dirÚwith_hermes_node_pathÚ ÚnameÚdefaultÚreturnc                 óv   — ddl m}m} 	  || ¦  «        }n# |$ r t          j        | ¦  «        }Y nw xY w|�|n|S )a�  Read a WHATSAPP_* env var through the profile secret scope.

    Under multiplexing, ``os.getenv`` bypasses the per-profile ``.env`` and
    returns the process-global value (often unset), causing the bridge to
    silently fall back to ``"self-chat"`` and reject all messages.
    ``get_secret`` honors the active ``_profile_runtime_scope`` so secondary
    profiles see their own credentials.
    r   )ÚUnscopedSecretErrorÚ
get_secret)Úagent.secret_scoper   r   ÚosÚgetenv)r   r   r   r   Úvals        úH/home/ragecks/.hermes/hermes-agent/plugins/platforms/whatsapp/adapter.pyÚ_wenvr   %   sq   € ð CÐBÐBÐBÐBÐBÐBÐBðØˆj˜ÑÔˆˆøØð ð ð õ Œi˜‰oŒoˆˆˆðøøøð �/ˆ3ˆ3 wÐ.s   Š –2±2z[owner reply] Úportc                 óB  — g }	 t          j        ddd| › �dgddddd¬	¦  «        }|j                             ¦   «                              ¦   «         D ]5}	 |                     t          |¦  «        ¦  «         Œ&# t          $ r Y Œ2w xY w|r|S n# t          $ r Y nw xY w	 t          j        d
dd| › �gddddd¬	¦  «        }t          j
        d|j        ¦  «        D ]7}|                     t          |                     d¦  «        ¦  «        ¦  «         Œ8n# t          $ r Y nw xY w|S )uö  PIDs of processes *listening* on ``port`` (POSIX) â€” never clients.

    This must match only LISTEN sockets. A bare ``lsof -i :PORT`` (or
    ``fuser PORT/tcp``) also returns *clients* whose connection merely involves
    that port number â€” e.g. a browser with a tab open on a local dev server
    sharing the port. SIGTERMing those closed the user's browser at irregular
    intervals. Restricting to LISTEN state frees the port for a new bridge
    without ever touching an unrelated client.
    Úlsofz-tiztcp:z-sTCP:LISTENTúutf-8Úreplaceé   ©Úcapture_outputÚtextÚencodingÚerrorsÚtimeoutÚssz-ltnHpz	sport = :z	pid=(\d+)é   )Ú
subprocessÚrunÚstdoutÚstripÚ
splitlinesÚappendÚintÚ
ValueErrorÚFileNotFoundErrorÚreÚfinditerÚgroup)r   ÚpidsÚresultÚlineÚms        r   Ú_listener_pids_on_portr7   A   s‡  € ð €DðÝ”Ø�U˜M 4˜M˜M¨>Ð:Ø d°WÀYÐXYð
ñ 
ô 
ˆð ”M×'Ò'Ñ)Ô)×4Ò4Ñ6Ô6ð 	ð 	ˆDðØ—’�C ™IœIÑ&Ô&Ð&Ð&øÝð ð ð Ø�ðøøøàð 	ØˆKð	øåð ð ð ØˆðøøøðÝ”Ø�8Ð/¨Ð/Ð/Ð0Ø d°WÀYÐXYð
ñ 
ô 
ˆõ ”˜\¨6¬=Ñ9Ô9ð 	)ð 	)ˆAØ�KŠK�˜AŸGšG A™JœJ™œÑ(Ô(Ð(Ð(ð	)øåð ð ð Øˆðøøøà€KsI   „AB Á"A6Á5B Á6
BÂ B ÂBÂB Â
BÂBÂA2D Ä
DÄDc           
      ó�  — 	 t           rÝddlm} t          j        g d¢ddddd |¦   «         ¬¦  «        }|j                             ¦   «         D ]–}|                     ¦   «         }t          |¦  «        dk    rm|d	         d
k    ra|d         }| 	                    d| › �¦  «        rA	 t          j        dd|d         dgdd |¦   «         ¬¦  «         Œ�# t          j
        $ r Y Œ’w xY wŒ—dS t          | ¦  «        D ]?}	 t          j        |t          j        ¦  «         Œ## t           t"          t$          f$ r Y Œ<w xY wdS # t&          $ r Y dS w xY w)zDKill any process *listening* on the given TCP port (a stale bridge).r   )Úwindows_hide_flags)Únetstatz-anoz-pÚTCPTr   r   r   )r    r!   r"   r#   r$   Úcreationflagsé   Ú	LISTENINGr&   ú:Útaskkillú/PIDé   ú/F)r    r$   r<   N)Ú_IS_WINDOWSÚhermes_cli._subprocess_compatr9   r'   r(   r)   r+   ÚsplitÚlenÚendswithÚSubprocessErrorr7   r   ÚkillÚsignalÚSIGTERMÚProcessLookupErrorÚPermissionErrorÚOSErrorÚ	Exception)r   r9   r4   r5   ÚpartsÚ
local_addrÚpids          r   Ú_kill_port_processrT   g   sÆ  € ð!Ýð 	ØHÐHÐHÐHÐHÐHõ  ”^Ø0Ð0Ð0Ø#¨$¸ÈÐ\]Ø0Ð0Ñ2Ô2ðñ ô ˆFð
 œ×0Ò0Ñ2Ô2ð !ð !�ØŸ
š
™œ�Ý�u‘:”: ’?�? u¨Q¤x°;Ò'>Ð'>Ø!& q¤�JØ!×*Ò*¨:¨t¨:¨:Ñ6Ô6ð !ð!Ý&œNØ!+¨V°U¸1´X¸tÐ DØ/3¸QØ.@Ð.@Ñ.BÔ.Bðñ ô ð ð øõ
  *Ô9ð !ð !ð !Ø ˜Dð!øøøøð!ð !õ" .¨dÑ3Ô3ð ð �ðÝ”G˜C¥¤Ñ0Ô0Ð0Ð0øÝ*­O½WÐEð ð ð Ø�Dðøøøðð øõ
 ð ð ð Øˆˆðøøøs`   ‚B D7 Â#*CÃD7 ÃC ÃD7 ÃC Ã D7 Ã&D7 Ã8DÄD7 ÄD2Ä/D7 Ä1D2Ä2D7 Ä7
EÅErS   Úsession_pathc                 óª   — ddl m}  || ¦  «        sdS |�ddl m}  || ¦  «        |k    S ddl m}  || ¦  «        }|sdS d|v ot	          |¦  «        |v S )u  True only if ``pid`` is alive AND still our node bridge for this session.

    The PID is read from a file written by a previous run.  Once that process
    exits and is reaped the kernel can recycle the number onto an unrelated
    process â€” observed in the wild landing on a desktop browser's main process,
    which a bare-liveness ``os.kill`` then SIGTERMed, closing the whole browser
    at irregular intervals (every time the flapping bridge restarted).

    Identity is confirmed two ways: the kernel start time captured when we wrote
    the pidfile (definitive), and â€” for legacy pidfiles with no baseline â€” the
    command line, which must contain ``node`` and this session's unique path.
    A recycled PID (different start time / different cmdline) is never ours.
    r   ©Ú_pid_existsFN©Úget_process_start_time)Ú_read_process_cmdlineÚnode)Úgateway.statusrX   rZ   r[   Ústr)rS   rU   Úexpected_startrX   rZ   r[   Úcmdlines          r   Ú_bridge_pid_is_oursra   �   s©   € ð +Ð*Ð*Ð*Ð*Ð*Øˆ;�sÑÔð ØˆuØÐ!Ø9Ð9Ð9Ð9Ð9Ð9à%Ð% cÑ*Ô*¨nÒ<Ð<ð 5Ð4Ð4Ð4Ð4Ð4Ø#Ð# CÑ(Ô(€GØð ØˆuØ�gÐÐA¥C¨Ñ$5Ô$5¸Ð$@ÐAó    c                 óœ  — | dz  }|                      ¦   «         sdS d}d}	 |                     d¬¦  «                             d¦  «        }t          |d                              ¦   «         ¦  «        }t          |¦  «        dk    rA|d                              ¦   «         r't          |d                              ¦   «         ¦  «        }nJ# t          t          t          t          f$ r* 	 | 
                    ¦   «          n# t          $ r Y nw xY wY dS w xY wt          || |¦  «        rY	 t          j        |t          j        ¦  «         t                                d|¦  «         nI# t$          t&          t          f$ r Y n0w xY wdd	lm}  ||¦  «        rt                                d
|¦  «         	 | 
                    ¦   «          dS # t          $ r Y dS w xY w)u  Kill a bridge process recorded in a PID file from a previous run.

    The bridge writes ``bridge.pid`` into the session directory when it
    starts.  If the gateway crashed without a clean shutdown the old bridge
    process becomes orphaned â€” this helper finds and kills it.

    Critically, the recorded PID is re-validated against the live process
    (:func:`_bridge_pid_is_ours`) before any signal, so a recycled PID that now
    names an unrelated process (e.g. the user's browser) is never killed.
    ú
bridge.pidNr   ©r"   Ú
r   r&   z2[whatsapp] Killed stale bridge PID %d from pidfilerW   z�[whatsapp] Not killing pidfile PID %d: it is no longer the bridge (recycled onto an unrelated process); skipping to avoid killing a stranger.)ÚexistsÚ	read_textrF   r-   r*   rG   r.   rO   Ú	TypeErrorÚ
IndexErrorÚunlinkra   r   rJ   rK   rL   ÚloggerÚinforM   rN   r]   rX   Úwarning)rU   Úpid_filerS   Úrecorded_startÚlinesrX   s         r   Ú_kill_stale_bridge_by_pidfilerr   ¬   s  € ð ˜lÑ*€HØ�?Š?ÑÔð ØˆØ
€CØ€Nðð ×"Ò"¨GÐ"Ñ4Ô4×:Ò:¸4Ñ@Ô@ˆÝ�%˜”(—.’.Ñ"Ô"Ñ#Ô#ˆÝˆu‰:Œ:˜Š>ˆ>˜e AœhŸnšnÑ.Ô.ˆ>Ý   q¤§¢Ñ!1Ô!1Ñ2Ô2ˆNøøÝ�¥­JÐ7ð ð ð ð	Ø�OŠOÑÔÐÐøÝð 	ð 	ð 	ØˆDð	øøøàˆˆðøøøõ ˜3 ¨nÑ=Ô=ð ð	ÝŒG�C�œÑ(Ô(Ð(Ý�KŠKÐLÈcÑRÔRÐRÐRøÝ"¥OµWÐ=ð 	ð 	ð 	ØˆDð	øøøð 	/Ð.Ð.Ð.Ð.Ð.Øˆ;�sÑÔð 	Ý�NŠNð&à'*ñô ð ð
Ø�ŠÑÔÐÐÐøÝð ð ð ØˆˆðøøøsZ   ¡B$C ÃDÃ$C9Ã8DÃ9
DÄDÄDÄDÄDÄ":E ÅE7Å6E7Æ'F= Æ=
GÇ
Gc                 óÎ   — 	 ddl m}  ||¦  «        }|€t          |¦  «        nd                     ||¦  «        }| dz                       |d¬¦  «         dS # t
          $ r Y dS w xY w)a'  Write the bridge PID (and its kernel start time) for later cleanup.

    The start time on line 2 lets a future run prove the PID still names this
    exact process before signalling it, so a recycled PID can never be killed
    as a "stale bridge". Older single-line files remain readable.
    r   rY   Nz{}
{}rd   r   re   )r]   rZ   r^   ÚformatÚ
write_textrO   )rU   rS   rZ   Ústartr!   s        r   Ú_write_bridge_pidfilerw   Ý   s�   € ðØ9Ð9Ð9Ð9Ð9Ð9Ø&Ð& sÑ+Ô+ˆØ ˜=�s�3‰xŒxˆx¨h¯oªo¸cÀ5Ñ.IÔ.IˆØ	˜Ñ	$×0Ò0°ÀÐ0ÑHÔHÐHÐHÐHøÝð ð ð Øˆˆðøøøs   ‚AA Á
A$Á#A$F©Úforcery   c                ó>  — t           rÏddt          | j        ¦  «        dg}|r|                     d¦  «         	 t	          j        |ddddd¬	¦  «        }n<# t          $ r/ |r|                      ¦   «          n|                      ¦   «          Y d
S w xY w|j	        dk    r;|j
        p|j        pd                     ¦   «         }t          |p	d| j        › �¦  «        ‚d
S dd
l}	 |                     | j        ¦  «        }|                     d¬¦  «        }|r@|D ]'}	 |                     ¦   «          Œ# |j        $ r Y Œ$w xY w|                     ¦   «          d
S |D ]'}	 |                     ¦   «          Œ# |j        $ r Y Œ$w xY w|                     ¦   «          d
S # |j        $ r Y d
S w xY w)zITerminate the bridge process using process-tree semantics where possible.r@   rA   z/TrC   Tr   r   é
   r   Nr   r   ztaskkill failed for PID )Ú	recursive)rD   r^   rS   r,   r'   r(   r/   rJ   Ú	terminateÚ
returncodeÚstderrr)   r*   rO   ÚpsutilÚProcessÚchildrenÚNoSuchProcess)	Úprocry   Úcmdr4   Údetailsr€   Úparentr‚   Úchilds	            r   Ú_terminate_bridge_processr‰   í   s  € åð Ø˜6¥3 t¤x¡=¤=°$Ð7ˆØð 	Ø�JŠJ�tÑÔÐð	Ý”^ØØ#Ø G°IØð	ñ ô ˆFˆFøõ !ð 	ð 	ð 	Øð !Ø—	’	‘”��à—’Ñ Ô Ð ØˆFˆFð	øøøð Ô Ò!Ð!Ø”}Ð;¨¬Ð;¸×BÒBÑDÔDˆGÝ˜'ÐJÐ%JÀÄÐ%JÐ%JÑKÔKÐKØˆà€M€M€MðØ—’ ¤Ñ)Ô)ˆØ—?’?¨T�?Ñ2Ô2ˆØð 	Ø!ð ð �ðØ—J’J‘L”L�L�LøØÔ+ð ð ð Ø�Dðøøøà�KŠK‰MŒMˆMˆMˆMà!ð ð �ðØ—O’OÑ%Ô%Ð%Ð%øØÔ+ð ð ð Ø�Dðøøøà×ÒÑÔÐÐÐøØÔð ð ð Øˆˆðøøøsq   ¸A Á5BÂBÃ6F ÄD(Ä'F Ä(
D5Ä2F Ä4D5Ä5F ÅF ÅE(Å'F Å(
E5Å2F Å4E5Å5F Æ
FÆFr=   )ÚPlatformÚPlatformConfig)ÚWhatsAppBehaviorMixin)Úto_whatsapp_jid)ÚBasePlatformAdapterÚMessageEventÚMessageTypeÚ
SendResultÚSUPPORTED_DOCUMENT_TYPESÚcache_image_from_urlÚcache_audio_from_url)Úenv_intÚurlc                 ó„  — 	 t          | ¦  «                             ¦   «         }n# t          t          f$ r Y dS w xY wddlm}m}m}m}  |¦   «          |¦   «          |¦   «          |¦   «         fD ]Q}	 | 	                    t          |¦  «                             ¦   «         ¦  «        r dS Œ;# t          t          f$ r Y ŒNw xY wdS )u~  Return True only when an absolute path from the bridge resolves inside a
    known Hermes media cache directory.

    The Baileys bridge is a local subprocess that downloads inbound media and
    hands back absolute file paths. A compromised or buggy bridge could hand
    back an arbitrary path (e.g. ``/etc/passwd``) which would otherwise be
    attached verbatim and sent to the model. Resolve the path (following any
    symlinks) and require it to live under one of the real cache roots â€” this
    covers both the canonical ``cache/<kind>`` layout and the legacy
    ``<kind>_cache`` layout that ``get_hermes_dir`` may return.
    Fr   )Úget_audio_cache_dirÚget_document_cache_dirÚget_image_cache_dirÚget_video_cache_dirT)
r   ÚresolverO   r.   Úgateway.platforms.baser˜   r™   rš   r›   Úis_relative_to)r–   Úresolvedr˜   r™   rš   r›   Úroots          r   Ú_is_allowed_bridge_pathr¡   -  s)  € ðÝ˜‘9”9×$Ò$Ñ&Ô&ˆˆøÝ•ZÐ ð ð ð Øˆuˆuðøøøðð ð ð ð ð ð ð ð ð ð ð ð 	ÐÑÔØÐÑÔØÐÑÔØÐÑ Ô ð	ð 
ð 
ˆð	Ø×&Ò&¥t¨D¡z¤z×'9Ò'9Ñ';Ô';Ñ<Ô<ð Ø�t�tðøå�Ð$ð 	ð 	ð 	ØˆHð	øøøàˆ5s   ‚!$ ¤9¸9Á14B)Â)B=Â<B=Úpathc                 ó°   — ddl }	 |                     |                      ¦   «         ¦  «                             ¦   «         dd…         S # t          $ r Y dS w xY w)aš  Return the first 16 hex chars of the SHA-256 of *path*'s contents.

    Used for the bridge staleness handshake: bridge.js reports its own
    source hash in ``/health`` (``scriptHash``), and the adapter compares
    it against the hash of bridge.js currently on disk.  A mismatch means
    a long-lived bridge process is serving code from before an update.
    Returns ``""`` when the file can't be read.
    r   Né   r   )ÚhashlibÚsha256Ú
read_bytesÚ	hexdigestrO   )r¢   r¥   s     r   Ú_file_content_hashr©   V  se   € ð €N€N€NðØ�~Š~˜dŸošoÑ/Ô/Ñ0Ô0×:Ò:Ñ<Ô<¸S¸b¸SÔAÐAøÝð ð ð Øˆrˆrðøøøs   †A A Á
AÁAc                  óš   — t          d¦  «        } | sdS 	 t          j        | dgddddd¬¦  «        }|j        d	k    S # t          $ r Y dS w xY w)
z}
    Check if WhatsApp dependencies are available.
    
    WhatsApp requires a Node.js bridge for most implementations.
    r\   Fz	--versionTr   r   r   r   r   )r	   r'   r(   r~   rP   )Ú_noder4   s     r   Úcheck_whatsapp_requirementsr¬   f  s€   € õ ! Ñ(Ô(€EØð Øˆuð	Ý”Ø�KÐ ØØ °	Øð	
ñ 
ô 
ˆð Ô  AÒ%Ð%øÝð ð ð Øˆuˆuðøøøs   •&< ¼
A
Á	A
c                   ó6  ‡ — e Zd ZdZdZdZdefˆ fd„Zdede	de	fd	„Z
d
dœdedefd„ZdCd„Zdee         fd„ZdCd„Z	 	 dDdededee         deeeef                  def
d„Zd
dœdededededef
d„Z	 	 dDdedededee         dee         defd„Zdd œded!ed"ee         d#edef
d$„Z	 dEded!ed%ee         d&ed'edeeeef                  defˆ fd(„Zddddd)œded*e	d+e	d,ee         d-ee         dee         deeeef                  defd.„Z	 	 	 dFded/edee         dee         deeeef                  defˆ fd0„Z	 	 dDded1edee         dee         def
d2„Z	 	 dDded3edee         dee         def
d4„Z	 	 dDded5edee         dee         def
d6„Z	 	 	 dFdededee         dee         dee         defd7„Z dEdeddfd8„Z!dedeeef         fd9„Z"dCd:„Z#d;eeef         ddfd<„Z$d=Z%d>e&defd?„Z'd>e&ddfd@„Z(deddfdA„Z)d;eeef         dee&         fdB„Z*ˆ xZ+S )GÚWhatsAppAdapteruî  
    WhatsApp adapter.
    
    This implementation uses a simple HTTP bridge pattern where:
    1. A Node.js process runs the WhatsApp Web client
    2. Messages are forwarded via HTTP/IPC to this Python adapter
    3. Responses are sent back through the bridge
    
    The actual Node.js bridge implementation can vary:
    - whatsapp-web.js based
    - Baileys based
    - Business API based
    
    Configuration:
    - bridge_script: Path to the Node.js bridge script
    - bridge_port: Port for HTTP communication (default: 3000)
    - session_path: Path to store WhatsApp session data
    - dm_policy: "open" | "allowlist" | "disabled" | "pairing" â€” how DMs are handled (default: "pairing")
    - allow_from: List of sender IDs allowed in DMs (when dm_policy="allowlist")
    - group_policy: "open" | "allowlist" | "disabled" | "pairing" â€” which groups are processed (default: "pairing")
    - group_allow_from: List of group JIDs allowed (when group_policy="allowlist")
    - send_read_receipts: Mark accepted inbound WhatsApp messages as read

    Behavior (gating, mention parsing, markdown conversion, chunking) is
    provided by ``WhatsAppBehaviorMixin`` so the Cloud API adapter can
    share it. Only transport-specific code lives here.
    NTÚconfigc           	      óz  •— t          ¦   «                              |t          j        ¦  «         t          j        €ddlm}  |¦   «         t          _        d | _        |j	         
                    dd¦  «        | _        |j	         
                    dt          | j        dz  ¦  «        ¦  «        | _        t          |j	         
                    dt          dd	¦  «        ¦  «        ¦  «        | _        |j	         
                    d
¦  «        | _        t          |j	         
                    d¦  «        pt%          dd¦  «        ¦  «                             ¦   «                              ¦   «         | _        d|j	        v r"d| _        |j	         
                    d¦  «        }nZd|j	        v r"d| _        |j	         
                    d¦  «        }n/t%          d¦  «        rd| _        t%          d¦  «        }n	d | _        d }|                      |¦  «        | _        t          |j	         
                    d¦  «        pt%          dd¦  «        ¦  «                             ¦   «                              ¦   «         | _        |                      |j	         
                    d¦  «        p|j	         
                    d¦  «        ¦  «        | _        |j	         
                    dd¦  «        }t7          |t8          ¦  «        r|n6t          |pd¦  «                             ¦   «                              ¦   «         dv | _        |                      ¦   «         | _        tA          j!        ¦   «         | _"        d | _#        d | _$        d | _%        d | _&        d| _'        |  (                    dd¦  «        | _)        |  (                    dd¦  «        | _*        i | _+        i | _,        d S )Nr   )Úresolve_whatsapp_bridge_dirÚbridge_porté¸  Úbridge_scriptz	bridge.jsrU   zplatforms/whatsapp/sessionzwhatsapp/sessionÚreply_prefixÚ	dm_policyÚWHATSAPP_DM_POLICYÚpairingÚ
allow_fromr¯   Ú	allowFromÚWHATSAPP_ALLOWED_USERSÚgroup_policyÚWHATSAPP_GROUP_POLICYÚgroup_allow_fromÚgroupAllowFromÚsend_read_receiptsFr   >   Ú1ÚonÚyesÚtrueÚtext_batch_delay_secondsg      @Útext_batch_split_delay_secondsg      $@)-ÚsuperÚ__init__rŠ   ÚWHATSAPPr®   Ú_DEFAULT_BRIDGE_DIRÚ!gateway.platforms.whatsapp_commonr±   Ú_bridge_processÚextraÚgetÚ_bridge_portr^   Ú_bridge_scriptr   r
   Ú_session_pathÚ_reply_prefixr   r*   ÚlowerÚ
_dm_policyÚ_dm_allowlist_sourceÚ_coerce_allow_listÚ_allow_fromÚ_group_policyÚ_group_allow_fromÚ
isinstanceÚboolÚ_send_read_receiptsÚ_compile_mention_patternsÚ_mention_patternsÚasyncioÚQueueÚ_message_queueÚ_bridge_log_fhÚ_bridge_logÚ
_poll_taskÚ_http_sessionÚ_shutting_downÚ_coerce_float_extraÚ_text_batch_delay_secondsÚ_text_batch_split_delay_secondsÚ_pending_text_batchesÚ_pending_text_batch_tasks)Úselfr¯   r±   Ú	allow_rawÚread_receiptsÚ	__class__s        €r   rÈ   zWhatsAppAdapter.__init__ž  s†  ø€ Ý‰Œ×Ò˜¥Ô!2Ñ3Ô3Ð3åÔ.Ð6ØUÐUÐUÐUÐUÐUØ2MÐ2MÑ2OÔ2O�OÔ/Ø;?ˆÔØ!'¤×!1Ò!1°-ÀÑ!FÔ!FˆÔØ-3¬\×-=Ò-=ØÝ�Ô(¨;Ñ6Ñ7Ô7ñ.
ô .
ˆÔõ $(¨¬×(8Ò(8ØÝÐ7Ð9KÑLÔLñ)
ô )
ñ $ô $ˆÔð -3¬L×,<Ò,<¸^Ñ,LÔ,LˆÔÝ˜fœl×.Ò.¨{Ñ;Ô;Ðe½uÐEYÐ[dÑ?eÔ?eÑfÔf×lÒlÑnÔn×tÒtÑvÔvˆŒð ˜6œ<Ð'Ð'Ø(0ˆDÔ%Øœ×(Ò(¨Ñ6Ô6ˆIˆIØ˜FœLÐ(Ð(Ø(0ˆDÔ%Øœ×(Ò(¨Ñ5Ô5ˆIˆIÝÐ+Ñ,Ô,ð 	Ø(@ˆDÔ%ÝÐ6Ñ7Ô7ˆIˆIà(,ˆDÔ%ØˆIØ×2Ò2°9Ñ=Ô=ˆÔÝ  ¤×!1Ò!1°.Ñ!AÔ!AÐ!nÅUÐKbÐdmÑEnÔEnÑoÔo×uÒuÑwÔw×}Ò}ÑÔˆÔØ!%×!8Ò!8¸¼×9IÒ9IÐJ\Ñ9]Ô9]ð  :DÐagÔam×aqÒaqð  sCñ  bDô  bDñ  "Eô  "EˆÔØœ×(Ò(Ð)=¸uÑEÔEˆå'¨µtÑ<Ô<ð XˆMˆMÝ�]Ð( bÑ)Ô)×/Ò/Ñ1Ô1×7Ò7Ñ9Ô9Ð=WÐWð 	Ô ð "&×!?Ò!?Ñ!AÔ!AˆÔÝ-4¬]©_¬_ˆÔØ"ˆÔØ+/ˆÔØ26ˆŒØ@DˆÔð %*ˆÔð *.×)AÒ)AØ&¨ñ*
ô *
ˆÔ&ð 04×/GÒ/GØ,¨dñ0
ô 0
ˆÔ,ð ?AˆÔ"ØBDˆÔ&Ð&Ð&rb   Úkeyr   r   c                 ó`  — ddl }t          | j        dd¦  «        r| j        j                             |¦  «        nd}|€t          |¦  «        S 	 t          |¦  «        }n&# t          t          f$ r t          |¦  «        cY S w xY w|                     |¦  «        r|dk     rt          |¦  «        S |S )zÔRead a float from ``config.extra``, guarding against bad/non-finite values.

        The result is fed directly to ``asyncio.sleep()``, so NaN/Inf and
        unparseable values fall back to ``default``.
        r   NrÍ   )	ÚmathÚgetattrr¯   rÍ   rÎ   Úfloatri   r.   Úisfinite)rì   rð   r   rò   ÚvalueÚparseds         r   rç   z#WhatsAppAdapter._coerce_float_extraê  sÀ   € ð 	ˆˆˆå.5°d´kÀ7ÈDÑ.QÔ.QÐ[�”Ô!×%Ò% cÑ*Ô*Ð*ÐW[ˆØˆ=Ý˜‘>”>Ð!ð	"Ý˜5‘\”\ˆFˆFøÝ�:Ð&ð 	"ð 	"ð 	"Ý˜‘>”>Ð!Ð!Ð!ð	"øøøà�}Š}˜VÑ$Ô$ð 	"¨°ª
¨
Ý˜‘>”>Ð!Øˆs   ÁA Á BÂ BF)Úis_reconnectrø   c             ƒ   óŠ  K  — t          ¦   «         s:t                               d| j        ¦  «         |                      ddd¬¦  «         dS t          | j        ¦  «        }|                     ¦   «         s?t                               d| j        |¦  «         |                      dd|› d	�d¬¦  «         dS | j        d
z  }|                     ¦   «         s;t                               d| j        |¦  «         |                      ddd¬¦  «         dS t           	                    d| j        |¦  «         d}	 |  
                    dt          | j        ¦  «        d¦  «        sdS d}n8# t          $ r+}t                               d| j        |¦  «         Y d}~nd}~ww xY w	 |j        }|dz  }|dz  dz  }t          |¦  «        }	d}
|dz                       ¦   «         rO	 |                     d¬¦  «                             ¦   «         |	k    ot#          |	¦  «        }
n# t$          $ r d}
Y nw xY w|
�s{t'          d| j        › d�¦  «         t)          d¦  «        pd}	 t+          dd¦  «        }t-          j        |ddgt          |¦  «        dddd |t1          ¦   «         ¬!¦  «        }|j        d"k    rUt'          d| j        › d#|j        › �¦  «         	 | j        s,|r|                      ¦   «          |                      ¦   «          dS dS t'          d| j        › d$�¦  «         |	r)	 |                     |	d¬¦  «         n# t$          $ r Y nw xY wne# t          $ rX}t'          d| j        › d%|› �¦  «         Y d}~| j        s,|r|                      ¦   «          |                      ¦   «          dS dS d}~ww xY w| j                             dd¬&¦  «         d"dl }	 | !                    ¦   «         4 ƒd{V —†}| "                    d'| j#        › d(�| $                    d)¬*¦  «        ¬+¦  «        4 ƒd{V —†	 }|j%        d,k    �r±| &                    ¦   «         ƒ d{V —†}| "                    d-d.¦  «        }|d/k    �r_| "                    d0d1¦  «        }t          |¦  «        }t#          | "                    d2d¦  «        ¦  «        }|| j'        k    }|rÜ|rÚ||k    rÔ|rÒt'          d| j        › d3|› d4�¦  «         |  (                    ¦   «          d| _)        | !                    ¦   «         | _*        tW          j,        |  -                    ¦   «         ¦  «        | _.        	 ddd¦  «        ƒd{V —† ddd¦  «        ƒd{V —† | j        s,|r|                      ¦   «          |                      ¦   «          dS dS ||k    r
d5|pd6› d7|› �nd8}t'          d| j        › d9|› d:�¦  «         nt'          d| j        › d;|› d:�¦  «         ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n# t          $ r Y nw xY wt_          | j        ¦  «         ta          | j#        ¦  «         tW          j1        d<¦  «        ƒ d{V —† te          d=d>¦  «        }| j        j        d?z  | _3        ti          | j3        d@d¬¦  «        }|| _5        t1          ¦   «         }| j6        �
| j6        |dA<   | j'        rdBndC|dD<   te          d=d>¦  «        }|r||d=<   dED ]}te          |¦  «        }|r|||<   Œd"dFl7m8}m9}m:}  t           | ¦   «         ¦  «        |dG<   t           |¦   «         ¦  «        |dH<   t           |¦   «         ¦  «        |dI<   t-          j;        t)          dJ¦  «        pdJt          |¦  «        dKt          | j#        ¦  «        dLt          | j        ¦  «        dM|gf|||dNœty          ¦   «         ¤Ž| _)        t{          | j        | j)        j>        ¦  «         d"dl }d}!i }t          dO¦  «        D �]ð}"tW          j1        d<¦  «        ƒ d{V —† | j)         @                    ¦   «         �Žt'          d| j        › dP| j)        j        › d4�¦  «         t'          d| j        › dQ| j3        › �¦  «         |                      ¦   «           | j        s,|r|                      ¦   «          |                      ¦   «          dS dS 	 | !                    ¦   «         4 ƒd{V —†}| "                    d'| j#        › d(�| $                    d)¬*¦  «        ¬+¦  «        4 ƒd{V —†	 }|j%        d,k    rrd}!| &                    ¦   «         ƒ d{V —†}| "                    d-¦  «        d/k    r=t'          d| j        › dR�¦  «         	 ddd¦  «        ƒd{V —† ddd¦  «        ƒd{V —†  nYddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   �Œá# t          $ r Y �Œîw xY w|!s�t'          d| j        › dS�¦  «         t'          d| j        › dQ| j3        › �¦  «         |                      ¦   «          	 | j        s,|r|                      ¦   «          |                      ¦   «          dS dS | "                    d-¦  «        d/k    �rYt'          d| j        › dT�¦  «         t          dO¦  «        D �]á}"tW          j1        d<¦  «        ƒ d{V —† | j)         @                    ¦   «         ��t'          d| j        › dU�¦  «         t'          d| j        › dQ| j3        › �¦  «         |                      ¦   «           | j        s,|r|                      ¦   «          |                      ¦   «          dS dS 	 | !                    ¦   «         4 ƒd{V —†}| "                    d'| j#        › d(�| $                    d)¬*¦  «        ¬+¦  «        4 ƒd{V —†	 }|j%        d,k    rp| &                    ¦   «         ƒ d{V —†}| "                    d-¦  «        d/k    r=t'          d| j        › dR�¦  «         	 ddd¦  «        ƒd{V —† ddd¦  «        ƒd{V —†  n¨ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   �ŒÒ# t          $ r Y �Œßw xY wt'          d| j        › dV�¦  «         t'          d| j        › dW| j3        › �¦  «         t'          d| j        › dX�¦  «         | !                    ¦   «         | _*        tW          j,        |  -                    ¦   «         ¦  «        | _.        |  (                    ¦   «          t'          d| j        › dY| j#        › �¦  «         	 | j        s,|r|                      ¦   «          |                      ¦   «          dS dS # t          $ ra}t           A                    dZ| j        |d¬[¦  «         Y d}~| j        s,|r|                      ¦   «          |                      ¦   «          dS dS d}~ww xY w# | j        s+|r|                      ¦   «          |                      ¦   «          w w xY w)\z„
        Start the WhatsApp bridge.
        
        This launches the Node.js bridge process and waits for it to be ready.
        z2[%s] Node.js not found. WhatsApp requires Node.js.Úwhatsapp_node_missinguI   Node.js is not installed â€” install Node.js and re-run `hermes gateway`.F©Ú	retryablez [%s] Bridge script not found: %sÚwhatsapp_bridge_missingz"WhatsApp bridge script missing at ú.z
creds.jsonz£[%s] WhatsApp is enabled but not paired (no creds.json at %s). Pair from the dashboard or run `hermes whatsapp`; remove WHATSAPP_ENABLED from your .env to disable.Úwhatsapp_not_paireduU   WhatsApp enabled but not paired â€” pair from the dashboard or run `hermes whatsapp`.z[%s] Bridge found at %szwhatsapp-sessionzWhatsApp sessionTz3[%s] Could not acquire session lock (non-fatal): %sNzpackage.jsonÚnode_modulesz.hermes-pkg-hashr   re   Ú[z,] Installing WhatsApp bridge dependencies...ÚnpmÚWHATSAPP_NPM_INSTALL_TIMEOUTi,  Úinstallz--silentr   )Úcwdr    r!   r"   r#   r$   Úenvr   z] npm install failed: z] Dependencies installedz"] Failed to install dependencies: )ÚparentsÚexist_okúhttp://127.0.0.1:z/healthé   ©Útotal©r$   éÈ   ÚstatusÚunknownÚ	connectedÚ
scriptHashr   ÚsendReadReceiptsz!] Using existing bridge (status: ú)zrunning=Úunversionedz, disk=z!send_read_receipts config changedz] Running bridge is stale (z), restartingz*] Bridge found but not connected (status: r&   ÚWHATSAPP_MODEz	self-chatz
bridge.logÚaÚWHATSAPP_REPLY_PREFIXrÄ   ÚfalseÚWHATSAPP_SEND_READ_RECEIPTS)r»   ÚWHATSAPP_ALLOW_FROMr·   r½   ÚWHATSAPP_GROUP_ALLOWED_USERSÚWHATSAPP_GROUP_ALLOW_FROMÚWHATSAPP_REQUIRE_MENTIONÚWHATSAPP_MENTION_PATTERNSÚWHATSAPP_FREE_RESPONSE_CHATSÚWHATSAPP_DEBUGÚWHATSAPP_FORWARD_OWNER_MESSAGESr  ÚWHATSAPP_MAX_MESSAGE_LENGTHÚWHATSAPP_CHUNK_DELAY_MSÚWHATSAPP_SEND_TIMEOUT_MS)r˜   r™   rš   ÚHERMES_IMAGE_CACHE_DIRÚHERMES_AUDIO_CACHE_DIRÚHERMES_DOCUMENT_CACHE_DIRr\   z--portz	--sessionz--mode)r)   r   r  é   z!] Bridge process died (exit code z] Check log: z"] Bridge ready (status: connected)z)] Bridge HTTP server did not start in 15sz7] Bridge HTTP ready, waiting for WhatsApp connection...z'] Bridge process died during connectionu&   ] âš  WhatsApp not connected after 30sz]   Bridge log: z0]   If session expired, re-pair: hermes whatsappz] Bridge started on port z[%s] Failed to start bridge: %s)Úexc_info)Br¬   rl   rn   r   Ú_set_fatal_errorr   rÐ   rg   rÑ   rm   Ú_acquire_platform_lockr^   rP   r‡   r©   rh   r*   rÛ   rO   Úprintr	   r•   r'   r(   r   r~   r   Ú_runningÚ_release_platform_lockÚ_close_bridge_logru   ÚmkdirÚaiohttpÚClientSessionrÎ   rÏ   ÚClientTimeoutr  ÚjsonrÜ   Ú_mark_connectedrÌ   rå   rß   Úcreate_taskÚ_poll_messagesrä   rr   rT   Úsleepr   rã   Úopenrâ   rÒ   r�   r˜   r™   rš   ÚPopenr   rw   rS   ÚrangeÚpollÚerror)#rì   rø   Úbridge_pathÚ
creds_pathÚlock_acquiredÚeÚ
bridge_dirÚ	_pkg_jsonÚ
_dep_stampÚ	_pkg_hashÚ_deps_freshÚ_npm_binÚnpm_install_timeoutÚinstall_resultr2  ÚsessionÚrespÚdataÚbridge_statusÚrunning_hashÚ	disk_hashÚrunning_read_receiptsÚconfig_matchesÚstale_reasonÚwhatsapp_modeÚbridge_log_fhÚ
bridge_envÚ_profile_wa_modeÚ_keyÚ_vÚ_get_audio_dirÚ_get_doc_dirÚ_get_img_dirÚ
http_readyÚattempts#                                      r   ÚconnectzWhatsAppAdapter.connectý  s  è è € õ +Ñ,Ô,ð 	Ý�NŠNÐOÐQUÔQZÑ[Ô[Ð[Ø×!Ò!Ø'Ø[Øð "ñ ô ð ð
 �5å˜4Ô.Ñ/Ô/ˆØ×!Ò!Ñ#Ô#ð 	Ý�NŠNÐ=¸t¼yÈ+ÑVÔVÐVØ×!Ò!Ø)ØC°[ÐCÐCÐCØð "ñ ô ð ð
 �5ð Ô'¨,Ñ6ˆ
Ø× Ò Ñ"Ô"ð 	Ý�NŠNð>ð ”	˜:ñ	ô ð ð ×!Ò!Ø%ØgØð "ñ ô ð ð
 �5å�ŠÐ-¨t¬y¸+ÑFÔFÐFð ˆð	`Ø×.Ò.Ð/AÅ3ÀtÔGYÑCZÔCZÐ\nÑoÔoð Ø�uØ ˆMˆMøÝð 	`ð 	`ð 	`Ý�NŠNÐPÐRVÔR[Ð]^Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_øøøøð	`øøøð	)ð
 %Ô+ˆJØ" ^Ñ3ˆIØ# nÑ4Ð7IÑIˆJÝ*¨9Ñ5Ô5ˆIØˆKØ˜^Ñ+×3Ò3Ñ5Ô5ð (ð(à"×,Ò,°gÐ,Ñ>Ô>×DÒDÑFÔFÈ)ÒSð#*å˜y™/œ/ð  �Køõ ð (ð (ð (Ø"'�K�K�Kð(øøøàñ !ÝÐQ˜$œ)ÐQÐQÐQÑRÔRÐRõ 0°Ñ6Ô6Ð?¸%�ð!õ +2Ð2PÐRUÑ*VÔ*VÐ'Ý%/¤^Ø! 9¨jÐ9Ý 
™OœOØ'+Ø!¨G¸IØ 3Ý1Ñ3Ô3ð&ñ &ô &�Nð &Ô0°AÒ5Ð5ÝÐZ $¤)ÐZÐZÀ>ÔCXÐZÐZÑ[Ô[Ð[Ø$ðp ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )õo ÐA˜dœiÐAÐAÐAÑBÔBÐBØ ð !ð!Ø&×1Ò1°)ÀgÐ1ÑNÔNÐNÐNøÝ&ð !ð !ð !Ø ˜Dð!øøøøøå ð !ð !ð !ÝÐN˜dœiÐNÐNÈ1ÐNÐNÑOÔOÐOØ ˜5˜5˜5ð^ ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )øøøøðc!øøøð
 Ô×$Ò$¨T¸DÐ$ÑAÔAÐAð ˆNˆNˆNð,Ø"×0Ò0Ñ2Ô2ð )}ð )}ð )}ð )}ð )}ð )}ð )}°gØ&Ÿ{š{ØF¨DÔ,=ÐFÐFÐFØ '× 5Ò 5¸AÐ 5Ñ >Ô >ð  +ñ  ô  ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð Øœ;¨#Ò-Ñ-Ø)-¯ª©¬Ð#4Ð#4Ð#4Ð#4Ð#4Ð#4˜DØ,0¯HªH°X¸yÑ,IÔ,I˜MØ,°Ò;Ñ;ð 04¯xªx¸ÀbÑ/IÔ/I Ý,>¸{Ñ,KÔ,K 	Ý8<¸T¿XºXÐFXÐZ_Ñ=`Ô=`Ñ8aÔ8aÐ 5Ø1FÈ$ÔJbÒ1b à$0ð!0à(1ð!0ð )5¸	Ò(AÐ(AØ(6ð )Bõ %*Ð*j¨d¬iÐ*jÐ*jÐZgÐ*jÐ*jÐ*jÑ$kÔ$kÐ$kØ$(×$8Ò$8Ñ$:Ô$:Ð$:Ø;? DÔ$8Ø9@×9NÒ9NÑ9PÔ9P DÔ$6Ý6=Ô6IÈ$×J]ÒJ]ÑJ_ÔJ_Ñ6`Ô6` D¤OØ+/ðA(}ð (}ð (}ñ (}ô (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð)}ð )}ð )}ñ )}ô )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ðN ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )ðG (4°yÒ'@Ð'@ð %a¨|Ð/L¸}Ð$`Ð$`ÐU^Ð$`Ð$`Ð$`à)Lð !-õ
 !&Ð&k¨$¬)Ð&kÐ&kÐP\Ð&kÐ&kÐ&kÑ lÔ lÐ lÐ lå %Ð&{¨$¬)Ð&{Ð&{Ð_lÐ&{Ð&{Ð&{Ñ |Ô |Ð |ðQ(}ð (}ð (}ñ (}ô (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}ð (}øøøð (}ð (}ð (}ð (}ð)}ð )}ð )}ñ )}ô )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}ð )}øøøð )}ð )}ð )}ð )}øøõT ð ð ð Ø�ðøøøõ *¨$Ô*<Ñ=Ô=Ð=Ý˜tÔ0Ñ1Ô1Ð1Ý”- Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"õ
 " /°;Ñ?Ô?ˆMØ#Ô1Ô8¸<ÑGˆDÔÝ  Ô!1°3ÀÐIÑIÔIˆMØ"/ˆDÔõ /Ñ0Ô0ˆJØÔ!Ð-Ø6:Ô6H�
Ð2Ñ3àÔ2Ð?��¸ð Ð4Ñ5õ  % _°kÑBÔBÐØð ?Ø.>�
˜?Ñ+ðð *ð *�õ ˜4‘[”[�Øð *Ø')�J˜tÑ$øð
ð ð ð ð ð ð ð ð ð õ
 47°|°|±~´~Ñ3FÔ3FˆJÐ/Ñ0Ý36°~°~Ñ7GÔ7GÑ3HÔ3HˆJÐ/Ñ0Ý69¸,¸,¹.¼.Ñ6IÔ6IˆJÐ2Ñ3å#-Ô#3å(¨Ñ0Ô0Ð:°FÝ˜Ñ$Ô$Ø�c $Ô"3Ñ4Ô4Ø¥ TÔ%7Ñ!8Ô!8Ø˜mðð$ð %Ø$Øð$ð $õ .Ñ/Ô/ð$ð $ˆDÔ õ " $Ô"4°dÔ6JÔ6NÑOÔOÐOð
 ˆNˆNˆNØˆJØˆDÝ  ™9œ9ð ñ �Ý”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ'×,Ò,Ñ.Ô.Ð:ÝÐl˜dœiÐlÐlÈ$ÔJ^ÔJiÐlÐlÐlÑmÔmÐmÝÐH˜dœiÐHÐH°dÔ6FÐHÐHÑIÔIÐIØ×*Ò*Ñ,Ô,Ð,Ø ðF ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )ðEØ&×4Ò4Ñ6Ô6ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*¸'Ø#*§;¢;ØJ°Ô0AÐJÐJÐJØ$+×$9Ò$9ÀÐ$9Ñ$BÔ$Bð $/ñ $ô $ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð "Ø#œ{¨cÒ1Ð1Ø-1 
Ø-1¯YªY©[¬[Ð'8Ð'8Ð'8Ð'8Ð'8Ð'8 Ø#'§8¢8¨HÑ#5Ô#5¸Ò#DÐ#DÝ$)Ð*[¨d¬iÐ*[Ð*[Ð*[Ñ$\Ô$\Ð$\Ø$)ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð
*ð 
*ð 
*ñ 
*ô 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð	*ð 	*ð 	*ñ 	*ô 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*ð 	*øøøð 	*ð 	*ð 	*ð 	*ð
*ð 
*ð 
*ñ 
*ô 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*øøøð 
*ð 
*ð 
*ð 
*ùøõ !ð ð ð Ø‘Hðøøøð ð ÝÐN˜$œ)ÐNÐNÐNÑOÔOÐOÝÐD˜$œ)ÐDÐD°$Ô2BÐDÐDÑEÔEÐEØ×&Ò&Ñ(Ô(Ð(Øð^ ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )ðW �xŠx˜Ñ!Ô! [Ò0Ñ0ÝÐ\˜$œ)Ð\Ð\Ð\Ñ]Ô]Ð]Ý$ R™yœyð [ñ [�GÝ!œ-¨Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÔ+×0Ò0Ñ2Ô2Ð>ÝÐT $¤)ÐTÐTÐTÑUÔUÐUÝÐL $¤)ÐLÐL¸$Ô:JÐLÐLÑMÔMÐMØ×.Ò.Ñ0Ô0Ð0Ø$ðF ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )ðE!Ø#*×#8Ò#8Ñ#:Ô#:ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.¸gØ'.§{¢{Ø N°DÔ4EÐ NÐ NÐ NØ(/×(=Ò(=ÀAÐ(=Ñ(FÔ(Fð (3ñ (ô (ð .ð .ð .ð .ð .ð .ð .ð .ð "&Ø#'¤;°#Ò#5Ð#5Ø15·²±´Ð+<Ð+<Ð+<Ð+<Ð+<Ð+< DØ'+§x¢x°Ñ'9Ô'9¸[Ò'HÐ'HÝ(-Ð._°$´)Ð._Ð._Ð._Ñ(`Ô(`Ð(`Ø(-ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .ð .ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð	.ð 	.ð 	.ñ 	.ô 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.ð 	.øøøð 	.ð 	.ð 	.ð 	.ùøõ %ð !ð !ð !Ø ™ð!øøøõ
 ÐO˜dœiÐOÐOÐOÑPÔPÐPÝÐK˜dœiÐKÐK¸Ô9IÐKÐKÑLÔLÐLÝÐY˜dœiÐYÐYÐYÑZÔZÐZð ")×!6Ò!6Ñ!8Ô!8ˆDÔõ &Ô1°$×2EÒ2EÑ2GÔ2GÑHÔHˆDŒOà× Ò Ñ"Ô"Ð"ÝÐM�d”iÐMÐM¸$Ô:KÐMÐMÑNÔNÐNØð ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )øõ	 ð 	ð 	ð 	Ý�LŠLÐ:¸D¼IÀqÐSWˆLÑXÔXÐXØ�5�5�5à”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(Ð(ð)ð )øøøøð		øøøøð ”=ð )Ø ð 2Ø×/Ò/Ñ1Ô1Ð1Ø×&Ò&Ñ(Ô(Ð(Ð(ð)øøøsI  Ä/)E ÅE Å
FÅ'!FÆFÆ<v  Ç;H Èv  ÈHÈv  ÈHÈ/v  ÉA2L: Ë6L: ÌL) Ì(L: Ì)
L6Ì3L: Ì5L6Ì6L: Ì9v  Ì:
NÍNÍv  ÎNÎ#v  Ï X Ï;X	ÐDW&Ô4X	ÕX ÖA	W&×X	×&
W0	×0X	×3W0	×4X	×7X Ø	
XØX ØXØX Øv  Ø
X(Ø%v  Ø'X(Ø(I2v  ãg,ã*;gä&Af6æ gæg,æ"v  æ$gæ6
g ç gçg çgçg,ç
g#	ç#g,ç&g#	ç'g,ç*v  ç,
g:ç6v  ç9g:ç:Av  ê Cv  í9rî;r ïAqð'r ð8rñ	v  ñr ñ
q'ñ'r ñ*q'ñ+r ñ.rò 
r
	ò
ròr
	òròv  ò
r!òv  ò r!ò!C	v  ö 
xö*#x÷x øxøx ø4yc                 ó|   — | j         r4	 | j                              ¦   «          n# t          $ r Y nw xY wd| _         dS dS )z)Close the bridge log file handle if open.N)râ   ÚcloserP   )rì   s    r   r0  z!WhatsAppAdapter._close_bridge_log8  sb   € àÔð 	'ðØÔ#×)Ò)Ñ+Ô+Ð+Ð+øÝð ð ð Ø�ðøøøà"&ˆDÔÐÐð	'ð 	's   ‰# £
0¯0c              ƒ   ó¼  K  — | j         €dS | j                              ¦   «         }|€dS t          | dd¦  «        r'|dv r#t                               d| j        |¦  «         dS d|› d�}| j        sgt                               d| j        |¦  «         |                      d	|d
¬¦  «         |  	                    ¦   «          |  
                    ¦   «         ƒ d{V —† | j        p|S )z@Return a fatal error message if the managed bridge child exited.Nræ   F>   éñÿÿÿr   éþÿÿÿz-[%s] Bridge exited during shutdown (code %d).z2WhatsApp bridge process exited unexpectedly (code z).z[%s] %sÚwhatsapp_bridge_exitedTrû   )rÌ   r=  ró   rl   rm   r   Úhas_fatal_errorr>  r+  r0  Ú_notify_fatal_errorÚfatal_error_message)rì   r~   Úmessages      r   Ú_check_managed_bridge_exitz*WhatsAppAdapter._check_managed_bridge_exitA  s  è è € àÔÐ'Ø�4àÔ)×.Ò.Ñ0Ô0ˆ
ØÐØ�4õ �4Ð)¨5Ñ1Ô1ð 	°jÀLÐ6PÐ6PÝ�KŠKØ?Ø”	Øñô ð ð
 �4àUÀzÐUÐUÐUˆØÔ#ð 	-Ý�LŠL˜ D¤I¨wÑ7Ô7Ð7Ø×!Ò!Ð":¸GÈtÐ!ÑTÔTÐTØ×"Ò"Ñ$Ô$Ð$Ø×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÔ'Ð2¨7Ð2rb   c              ƒ   ó   K  — d| _         | j        rö	 	 t          | j        d¬¦  «         n0# t          t          f$ r | j                             ¦   «          Y nw xY wt          j        d¦  «        ƒ d{V —† | j                             ¦   «         €H	 t          | j        d¬¦  «         n0# t          t          f$ r | j         	                    ¦   «          Y nw xY wnI# t          $ r$}t          d| j        › d|› �¦  «         Y d}~n d}~ww xY wt          d| j        › d�¦  «         	 | j        d	z                       d¬
¦  «         n# t          $ r Y nw xY w| j        r]| j                             ¦   «         sD| j                             ¦   «          	 | j        ƒ d{V —† n# t          j        t          f$ r Y nw xY wd| _        | j        r+| j        j        s| j                             ¦   «         ƒ d{V —† d| _        |                      ¦   «          |                      ¦   «          d| _        |                      ¦   «          t          d| j        › d�¦  «         dS )z=Stop the WhatsApp bridge and clean up any orphaned processes.TFrx   r&   Nr  z] Error stopping bridge: z.] Disconnecting (external bridge left running)rd   )Ú
missing_okz] Disconnected)ræ   rÌ   r‰   rM   rN   r}   rß   r9  r=  rJ   rP   r-  r   rÑ   rk   rO   rä   ÚdoneÚcancelÚCancelledErrorrå   Úclosedra  r/  Ú_mark_disconnectedr0  )rì   rB  s     r   Ú
disconnectzWhatsAppAdapter.disconnecta  só  è è € ð
 #ˆÔØÔð 	QðCð5Ý-¨dÔ.BÈ%ÐPÑPÔPÐPÐPøÝ*­OÐ<ð 5ð 5ð 5ØÔ(×2Ò2Ñ4Ô4Ð4Ð4Ð4ð5øøøå”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ'×,Ò,Ñ.Ô.Ð6ð4Ý1°$Ô2FÈdÐSÑSÔSÐSÐSøÝ.µÐ@ð 4ð 4ð 4ØÔ,×1Ò1Ñ3Ô3Ð3Ð3Ð3ð4øøøøøåð Cð Cð CÝÐA˜$œ)ÐAÐA¸aÐAÐAÑBÔBÐBÐBÐBÐBÐBÐBøøøøðCøøøõ ÐO�d”iÐOÐOÐOÑPÔPÐPð	ØÔ ,Ñ.×6Ò6À$Ð6ÑGÔGÐGÐGøÝð 	ð 	ð 	ØˆDð	øøøð Œ?ð 	 4¤?×#7Ò#7Ñ#9Ô#9ð 	ØŒO×"Ò"Ñ$Ô$Ð$ðØ”oÐ%Ð%Ð%Ð%Ð%Ð%Ð%Ð%øÝÔ*­IÐ6ð ð ð Ø�ðøøøàˆŒð Ôð 	- dÔ&8Ô&?ð 	-ØÔ$×*Ò*Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø!ˆÔà×#Ò#Ñ%Ô%Ð%à×ÒÑ!Ô!Ð!Ø#ˆÔØ×ÒÑ Ô Ð ÝÐ+�$”)Ð+Ð+Ð+Ñ,Ô,Ð,Ð,Ð,sz   “* ©C ª*AÁC ÁAÁ6C ÂB% Â$C Â%*CÃC ÃCÃC Ã
DÃ C?Ã?DÄ D? Ä?
EÅEÆ	F ÆF0Æ/F0Úchat_idÚcontentÚreply_toÚmetadatac           	   ƒ   ó  K  — | j         r| j        st          dd¬¦  «        S |                      ¦   «         ƒ d{V —†}|rt          d|¬¦  «        S |r|                     ¦   «         st          dd¬¦  «        S t          |¦  «        }	 ddl}|                      |¦  «        }|                      ||  	                    ¦   «         ¦  «        }g }	d}
t          |¦  «        D �]H\  }}||dœ}|r|dk    r||d	<   | j                             d
| j        › d�||                     d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j        dk    rT|                     ¦   «         ƒ d{V —†}|                     d¦  «        }
|
r"|	                     t%          |
¦  «        ¦  «         n?|                     ¦   «         ƒ d{V —†}t          d|¬¦  «        cddd¦  «        ƒd{V —† c S ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   t)          |¦  «        dk    rt+          j        d¦  «        ƒ d{V —† �ŒJt          d|
t/          |	dd…         ¦  «        d|	i¬¦  «        S # t0          $ r(}t          dt%          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)zÉSend a message via the WhatsApp bridge.

        Formats markdown for WhatsApp, splits long messages into chunks
        that preserve code block boundaries, and sends each chunk sequentially.
        FúNot connected©Úsuccessr>  NT©rz  Ú
message_idr   ©ÚchatIdri  ÚreplyTor	  ú/sendé   r  ©r5  r$   r  Ú	messageIdr&   g333333Ó?éÿÿÿÿÚmessage_ids)rz  r|  Úcontinuation_message_idsÚraw_response)r.  rå   r‘   rj  r*   r�   r2  Úformat_messageÚtruncate_messageÚ_outgoing_chunk_limitÚ	enumerateÚpostrÏ   r4  r  r5  rÎ   r,   r^   r!   rG   rß   r9  ÚtuplerP   )rì   rs  rt  ru  rv  Úbridge_exitr2  Ú	formattedÚchunksÚsent_message_idsÚlast_message_idÚidxÚchunkÚpayloadrL  rM  r>  rB  s                     r   ÚsendzWhatsAppAdapter.send”  s  è è € ð Œ}ð 	D DÔ$6ð 	DÝ e°?ÐCÑCÔCÐCØ ×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØð 	@Ý e°;Ð?Ñ?Ô?Ð?àð 	=˜gŸmšm™oœoð 	=Ý d°tÐ<Ñ<Ô<Ð<å! 'Ñ*Ô*ˆð,	;ØˆNˆNˆNð ×+Ò+¨GÑ4Ô4ˆIØ×*Ò*¨9°d×6PÒ6PÑ6RÔ6RÑSÔSˆFà*,ÐØ"ˆOÝ'¨Ñ/Ô/ð -ñ -‘
��Uà%Ø$ð+ð +�ð ð 2  q¢ ð *2�G˜IÑ&àÔ-×2Ò2Ø@¨Ô(9Ð@Ð@Ð@Ø Ø#×1Ò1¸Ð1Ñ;Ô;ð 3ñ ô ð Fð Fð Fð Fð Fð Fð Fð Fð Ø”{ cÒ)Ð)Ø%)§Y¢Y¡[¤[Ð0Ð0Ð0Ð0Ð0Ð0˜Ø*.¯(ª(°;Ñ*?Ô*?˜Ø*ð JØ,×3Ò3µC¸Ñ4HÔ4HÑIÔIÐIøà&*§i¢i¡k¤kÐ 1Ð 1Ð 1Ð 1Ð 1Ð 1˜Ý)°%¸uÐEÑEÔEðFð Fð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fñ Fô Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Fð Føøøð Fð Fð Fð Fõ �v‘;”; ’?�?Ý!œ-¨Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ùåØØ*Ý).Ð/?ÀÀÀÔ/DÑ)EÔ)EØ+Ð-=Ð>ð	ñ ô ð øõ ð 	;ð 	;ð 	;Ý eµ3°q±6´6Ð:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøsK   ÂB,I Ä3B
G$Æ=I ÇI Ç$
G.	Ç.I Ç1G.	Ç2AI É
J ÉI;É5J É;J )Úfinalizer|  r—  c             ƒ   ó´  K  — | j         r| j        st          dd¬¦  «        S |                      ¦   «         ƒ d{V —†}|rt          d|¬¦  «        S 	 ddl}| j                             d| j        › d�t          |¦  «        ||dœ|                     d	¬
¦  «        ¬¦  «        4 ƒd{V —†	 }|j	        dk    r#t          d|¬¦  «        cddd¦  «        ƒd{V —† S | 
                    ¦   «         ƒ d{V —†}t          d|¬¦  «        cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r(}	t          dt          |	¦  «        ¬¦  «        cY d}	~	S d}	~	ww xY w)z7Edit a previously sent message via the WhatsApp bridge.Frx  ry  Nr   r	  z/edit)r~  rƒ  ri  r)  r  r‚  r  Tr{  )r.  rå   r‘   rj  r2  rŒ  rÏ   r�   r4  r  r!   rP   r^   )
rì   rs  r|  rt  r—  rŽ  r2  rL  r>  rB  s
             r   Úedit_messagezWhatsAppAdapter.edit_messageÙ  s²  è è € ð Œ}ð 	D DÔ$6ð 	DÝ e°?ÐCÑCÔCÐCØ ×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØð 	@Ý e°;Ð?Ñ?Ô?Ð?ð	;ØˆNˆNˆNØÔ)×.Ò.Ø< DÔ$5Ð<Ð<Ð<å-¨gÑ6Ô6Ø!+Ø&ðð ð
  ×-Ò-°BÐ-Ñ7Ô7ð /ñ ô ð Bð Bð Bð Bð Bð Bð Bð Bð Ø”; #Ò%Ð%Ý%¨d¸zÐJÑJÔJðBð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bð Bð #'§)¢)¡+¤+Ð-Ð-Ð-Ð-Ð-Ð-�EÝ%¨e¸5ÐAÑAÔAðBð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð Bð Bøõ ð 	;ð 	;ð 	;Ý eµ3°q±6´6Ð:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøsO   ÁAD% Â&DÃD% Ã*DÃ?D% Ä
DÄD% ÄDÄ D% Ä%
EÄ/EÅEÅEÚ	file_pathÚ
media_typeÚcaptionÚ	file_namec              ƒ   ó–  K  — | j         r| j        st          dd¬¦  «        S |                      ¦   «         ƒ d{V —†}|rt          d|¬¦  «        S 	 ddl}t
          j                             |¦  «        st          dd|› �¬¦  «        S t          |¦  «        ||dœ}|r||d<   |r||d	<   | j         	                    d
| j
        › d�||                     d¬¦  «        ¬¦  «        4 ƒd{V —†	 }	|	j        dk    rQ|	                     ¦   «         ƒ d{V —†}
t          d|
                     d¦  «        |
¬¦  «        cddd¦  «        ƒd{V —† S |	                     ¦   «         ƒ d{V —†}t          d|¬¦  «        cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t           $ r(}t          dt#          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)z4Send any media file via bridge /send-media endpoint.Frx  ry  Nr   zFile not found: ©r~  ÚfilePathÚ	mediaTyperœ  ÚfileNamer	  ú/send-mediaéx   r  r‚  r  Trƒ  ©rz  r|  r‡  )r.  rå   r‘   rj  r2  r   r¢   rg   r�   rŒ  rÏ   r4  r  r5  rÎ   r!   rP   r^   )rì   rs  rš  r›  rœ  r�  rŽ  r2  r•  rL  rM  r>  rB  s                r   Ú_send_media_to_bridgez%WhatsAppAdapter._send_media_to_bridgeú  sF  è è € ð Œ}ð 	D DÔ$6ð 	DÝ e°?ÐCÑCÔCÐCØ ×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØð 	@Ý e°;Ð?Ñ?Ô?Ð?ð!	;ØˆNˆNˆNå”7—>’> )Ñ,Ô,ð WÝ!¨%Ð7UÈ)Ð7UÐ7UÐVÑVÔVÐVõ *¨'Ñ2Ô2Ø%Ø'ð'ð 'ˆGð
 ð -Ø%,�˜	Ñ"Øð 0Ø&/�˜
Ñ#àÔ)×.Ò.ØB DÔ$5ÐBÐBÐBØØ×-Ò-°CÐ-Ñ8Ô8ð /ñ ô ð Bð Bð Bð Bð Bð Bð Bð Bð Ø”; #Ò%Ð%Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ%Ø $Ø#'§8¢8¨KÑ#8Ô#8Ø%)ðñ ô ðBð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bð Bð #'§)¢)¡+¤+Ð-Ð-Ð-Ð-Ð-Ð-�EÝ%¨e¸5ÐAÑAÔAðBð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð Bð Bøõ  ð 	;ð 	;ð 	;Ý eµ3°q±6´6Ð:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøsV   Á6F ÂA!F Ã)A
FÄ3F Å*FÅ0F Æ
FÆF ÆFÆF Æ
GÆ GÆ=GÇGr&   ©Úselectable_countÚquestionÚoptionsr¨  c             ƒ   ó4  K  — | j         r| j        st          dd¬¦  «        S |                      ¦   «         ƒ d{V —†}|rt          d|¬¦  «        S 	 ddl}t          |¦  «        |t          |pg ¦  «        |dœ}| j                             d| j        › d�|| 	                    d	¬
¦  «        ¬¦  «        4 ƒd{V —†	 }|j
        dk    rQ|                     ¦   «         ƒ d{V —†}	t          d|	                     d¦  «        |	¬¦  «        cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}
t          d|
¬¦  «        cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r(}t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)a   Send a native WhatsApp poll via the Baileys bridge.

        This is a low-level transport primitive only. Gateway approval UX must
        remain gateway-owned and add text fallback plus explicit confirmation
        semantics before approval prompts are ever mapped onto polls.
        Frx  ry  Nr   )r~  r©  rª  ÚselectableCountr	  z
/send-pollr�  r  r‚  r  Trƒ  r¥  )r.  rå   r‘   rj  r2  r�   ÚlistrŒ  rÏ   r4  r  r5  rÎ   r!   rP   r^   )rì   rs  r©  rª  r¨  rŽ  r2  r•  rL  rM  r>  rB  s               r   Ú	send_pollzWhatsAppAdapter.send_poll+  sÊ  è è € ð Œ}ð 	D DÔ$6ð 	DÝ e°?ÐCÑCÔCÐCØ ×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØð 	@Ý e°;Ð?Ñ?Ô?Ð?ð	;ØˆNˆNˆNõ *¨'Ñ2Ô2Ø$Ý  ¨2Ñ.Ô.Ø#3ð	'ð 'ˆGð Ô)×.Ò.ØA DÔ$5ÐAÐAÐAØØ×-Ò-°BÐ-Ñ7Ô7ð /ñ ô ð >ð >ð >ð >ð >ð >ð >ð >ð Ø”; #Ò%Ð%Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ%Ø $Ø#'§8¢8¨KÑ#8Ô#8Ø%)ðñ ô ð>ð >ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >ð >ð >ð #Ÿiši™kœkÐ)Ð)Ð)Ð)Ð)Ð)�Ý!¨%°uÐ=Ñ=Ô=ð>ð >ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð >ð >øõ ð 	;ð 	;ð 	;Ý eµ3°q±6´6Ð:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøsP   ÁA'E% Â8A
EÄE% Ä*EÄ?E% Å
EÅE% ÅEÅ E% Å%
FÅ/FÆFÆFÚchoicesÚ
clarify_idÚsession_keyc              ƒ   ó–  •K  — d„ |pg D ¦   «         }dt          |¦  «        cxk    rdk    rrn no|                      |t          |pd¦  «                             ¦   «         |d¬¦  «        ƒ d{V —†}|j        r|S t
                               d| j        |j        ¦  «         t          ¦   «          
                    ||||||¬	¦  «        ƒ d{V —†S )
a¼  Render multiple-choice clarify as a native WhatsApp poll.

        The gateway registers the pending clarify before calling this method.
        When Baileys later emits a poll_update with the selected option as
        message text, the normal clarify text-intercept resolves the pending
        question and the blocked agent continues. Open-ended clarifies use the
        text fallback so the user's next typed message is captured.
        c                 ó’   — g | ]D}t          |¦  «                             ¦   «         ¯#t          |¦  «                             ¦   «         ‘ŒES © )r^   r*   )Ú.0Úchoices     r   ú
<listcomp>z0WhatsAppAdapter.send_clarify.<locals>.<listcomp>i  sB   € ÐbÐbÐb°ÍcÐRXÉkÌk×N_ÒN_ÑNaÔNaÐb�˜V™œ×*Ò*Ñ,Ô,ÐbÐbÐbrb   r
  é   r   r&   r§  NzB[%s] Native WhatsApp clarify poll failed; falling back to text: %s)rs  r©  r¯  r°  r±  rv  )rG   r®  r^   r*   rz  rl   rn   r   r>  rÇ   Úsend_clarify)
rì   rs  r©  r¯  r°  r±  rv  Úclean_choicesr4   rï   s
            €r   r¹  zWhatsAppAdapter.send_clarifyX  s,  øè è € ð" cÐb¸G¸MÀrÐbÑbÔbˆØ•�MÑ"Ô"Ð(Ð(Ò(Ð( bÒ(Ð(Ð(Ð(Ð(ØŸ>š>ØÝ�H�N Ñ#Ô#×)Ò)Ñ+Ô+ØØ!"ð	 *ñ ô ð ð ð ð ð ð ˆFð Œ~ð Ø�Ý�NŠNØTØ”	Ø”ñô ð õ
 ‘W”W×)Ò)ØØØØ!Ø#Øð *ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
rb   )r   Úaddressru  rv  ÚlatitudeÚ	longituder   r»  c             ƒ   ód  K  — | j         r| j        st          dd¬¦  «        S |                      ¦   «         ƒ d{V —†}|rt          d|¬¦  «        S 	 ddl}	t          |¦  «        t          |¦  «        t          |¦  «        dœ}
|r||
d<   |r||
d<   | j                             d	| j        › d
�|
|	 	                    d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j
        dk    rQ|                     ¦   «         ƒ d{V —†}t          d|                     d¦  «        |¬¦  «        cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}t          d|¬¦  «        cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r(}t          dt          |¦  «        ¬¦  «        cY d}~S d}~ww xY w)z;Send a native WhatsApp location pin via the Baileys bridge.Frx  ry  Nr   )r~  r¼  r½  r   r»  r	  z/send-locationr�  r  r‚  r  Trƒ  r¥  )r.  rå   r‘   rj  r2  r�   rô   rŒ  rÏ   r4  r  r5  rÎ   r!   rP   r^   )rì   rs  r¼  r½  r   r»  ru  rv  rŽ  r2  r•  rL  rM  r>  rB  s                  r   Úsend_locationzWhatsAppAdapter.send_location�  sì  è è € ð Œ}ð 	D DÔ$6ð 	DÝ e°?ÐCÑCÔCÐCØ ×;Ò;Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØð 	@Ý e°;Ð?Ñ?Ô?Ð?ð	;ØˆNˆNˆNõ *¨'Ñ2Ô2Ý! (™OœOÝ" 9Ñ-Ô-ð'ð 'ˆGð
 ð 'Ø"&�˜‘Øð -Ø%,�˜	Ñ"ØÔ)×.Ò.ØE DÔ$5ÐEÐEÐEØØ×-Ò-°BÐ-Ñ7Ô7ð /ñ ô ð >ð >ð >ð >ð >ð >ð >ð >ð Ø”; #Ò%Ð%Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ%Ø $Ø#'§8¢8¨KÑ#8Ô#8Ø%)ðñ ô ð>ð >ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >ð >ð >ð #Ÿiši™kœkÐ)Ð)Ð)Ð)Ð)Ð)�Ý!¨%°uÐ=Ñ=Ô=ð>ð >ð >ð >ñ >ô >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >ð >øøøð >ð >ð >ð >ð >ð >øõ ð 	;ð 	;ð 	;Ý eµ3°q±6´6Ð:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:øøøøð	;øøøsP   ÁA?E= ÃA
E*ÄE= Ä-*E*ÅE= Å*
E4Å4E= Å7E4Å8E= Å=
F/ÆF*Æ$F/Æ*F/Ú	image_urlc              ƒ   óæ   •K  — 	 t          |¦  «        ƒ d{V —†}|                      ||d|¦  «        ƒ d{V —†S # t          $ r. t          ¦   «                              |||||¦  «        ƒ d{V —†cY S w xY w)u^  Download image URL to cache, send natively via bridge.

        ``metadata`` is accepted to honor the base-class contract â€” the
        batch sender ``send_multiple_images`` passes it through to every
        send path. The bridge media call doesn't use it, matching the
        sibling overrides (send_video / send_voice / send_document).
        NÚimage)r“   r¦  rP   rÇ   Ú
send_image)rì   rs  rÀ  rœ  ru  rv  Ú
local_pathrï   s          €r   rÃ  zWhatsAppAdapter.send_image¯  s±   øè è € ð	]Ý3°IÑ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>ˆJØ×3Ò3°G¸ZÈÐRYÑZÔZÐZÐZÐZÐZÐZÐZÐZøÝð 	]ð 	]ð 	]Ý™œ×+Ò+¨G°YÀÈÐS[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\Ð\ð	]øøøs   …28 ¸5A0Á/A0Ú
image_pathc              ‹   óB   K  — |                       ||d|¦  «        ƒ d{V —†S )z,Send a local image file natively via bridge.rÂ  N©r¦  )rì   rs  rÅ  rœ  ru  Úkwargss         r   Úsend_image_filezWhatsAppAdapter.send_image_fileÄ  ó4   è è € ð ×/Ò/°¸ÀWÈgÑVÔVÐVÐVÐVÐVÐVÐVÐVrb   Ú
video_pathc              ‹   óB   K  — |                       ||d|¦  «        ƒ d{V —†S )u>   Send a video natively via bridge â€” plays inline in WhatsApp.ÚvideoNrÇ  )rì   rs  rË  rœ  ru  rÈ  s         r   Ú
send_videozWhatsAppAdapter.send_videoÏ  rÊ  rb   Ú
audio_pathc              ‹   óB   K  — |                       ||d|¦  «        ƒ d{V —†S )z:Send an audio file as a WhatsApp voice message via bridge.ÚaudioNrÇ  )rì   rs  rÏ  rœ  ru  rÈ  s         r   Ú
send_voicezWhatsAppAdapter.send_voiceÚ  rÊ  rb   c           	   ‹   ó‚   K  — |                       ||d||pt          j                             |¦  «        ¦  «        ƒ d{V —†S )z=Send a document/file as a downloadable attachment via bridge.ÚdocumentN)r¦  r   r¢   Úbasename)rì   rs  rš  rœ  r�  ru  rÈ  s          r   Úsend_documentzWhatsAppAdapter.send_documentå  s_   è è € ð ×/Ò/Ø�Y 
¨GØÐ4�œ×)Ò)¨)Ñ4Ô4ñ
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
rb   c              ƒ   óx  K  — | j         r| j        sdS |                      ¦   «         ƒ d{V —†rdS 	 ddl}| j                             d| j        › d�dt          |¦  «        i|                     d¬¦  «        ¬¦  «        4 ƒd{V —† 	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t          $ r Y dS w xY w)	z!Send typing indicator via bridge.Nr   r	  z/typingr~  r   r  r‚  )	r.  rå   rj  r2  rŒ  rÏ   r�   r4  rP   )rì   rs  rv  r2  s       r   Úsend_typingzWhatsAppAdapter.send_typingô  s”  è è € àŒ}ð 	 DÔ$6ð 	ØˆFØ×0Ò0Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2ð 	ØˆFð	ØˆNˆNˆNð
 Ô)×.Ò.Ø> DÔ$5Ð>Ð>Ð>Ø¥°Ñ 8Ô 8Ð9Ø×-Ò-°AÐ-Ñ6Ô6ð /ñ ô ð ð ð ð ð ð ð ð ð
 ðð ð ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð øøøð ð ð ð ð ð øõ ð 	ð 	ð 	ØˆDˆDð	øøøs6   °AB+ ÂBÂB+ Â
B"Â"B+ Â%B"Â&B+ Â+
B9Â8B9c              ƒ   óÆ  K  — | j         r| j        sdddœS |                      ¦   «         ƒ d{V —†r|ddœS 	 ddl}| j                             d| j        › dt          |¦  «        › �|                     d¬	¦  «        ¬
¦  «        4 ƒd{V —†	 }|j        dk    rq| 	                    ¦   «         ƒ d{V —†}|                     d|¦  «        |                     d¦  «        rdnd|                     dg ¦  «        dœcddd¦  «        ƒd{V —† S 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n3# t          $ r&}t                               d||¦  «         Y d}~nd}~ww xY w|ddœS )z&Get information about a WhatsApp chat.ÚUnknownÚdm)r   ÚtypeNr   r	  z/chat/r{   r  r  r  r   ÚisGroupr2   Úparticipants)r   rÜ  rÞ  z+Could not get WhatsApp chat info for %s: %s)r.  rå   rj  r2  rÎ   rÏ   r�   r4  r  r5  rP   rl   Údebug)rì   rs  r2  rL  rM  rB  s         r   Úget_chat_infozWhatsAppAdapter.get_chat_info
  s‡  è è € àŒ}ð 	5 DÔ$6ð 	5Ø%¨tÐ4Ð4Ð4Ø×0Ò0Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2ð 	3Ø#¨TÐ2Ð2Ð2ð	TØˆNˆNˆNàÔ)×-Ò-ØW DÔ$5ÐWÐW½_ÈWÑ=UÔ=UÐWÐWØ×-Ò-°BÐ-Ñ7Ô7ð .ñ ô ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð Ø”; #Ò%Ð%Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�Dà $§¢¨°Ñ 9Ô 9Ø+/¯8ª8°IÑ+>Ô+>Ð H  ÀDØ(,¯ª°ÀÑ(DÔ(Dðð ð
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð &ð	
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
øøõ ð 	Tð 	Tð 	TÝ�LŠLÐFÈÐQRÑSÔSÐSÐSÐSÐSÐSÐSøøøøð	Tøøøð  ¨Ð.Ð.Ð.sC   ¶AD+ Â	A*DÃ3D+ ÄD+ Ä
D#Ä#D+ Ä&D#Ä'D+ Ä+
EÄ5EÅEc              ƒ   óP  K  — ddl }| j        �r| j        sdS |                      ¦   «         ƒ d{V —†}|rt	          d| j        › d|› �¦  «         dS 	 | j                             d| j        › d�|                     d¬¦  «        ¬	¦  «        4 ƒd{V —†	 }|j	        d
k    r©| 
                    ¦   «         ƒ d{V —†}|D ]Œ}|                      |¦  «        ƒ d{V —†}|rmt          j        |                      |¦  «        ¦  «         |j        t           j        k    r|                      |¦  «         Œq|                      |¦  «        ƒ d{V —† Œ�ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n˜# t          j        $ r Y dS t*          $ rz}|                      ¦   «         ƒ d{V —†}|r t	          d| j        › d|› �¦  «         Y d}~dS t	          d| j        › d|› �¦  «         t          j        d¦  «        ƒ d{V —† Y d}~nd}~ww xY wt          j        d¦  «        ƒ d{V —† | j        �°dS dS )z&Poll the bridge for incoming messages.r   Nr  z] r	  z	/messagesr�  r  r  r  z] Poll error: r   r&   )r2  r.  rå   rj  r-  r   rÎ   rÏ   r4  r  r5  Ú_build_message_eventrß   r7  Ú_send_read_receiptÚmessage_typer�   ÚTEXTÚ_enqueue_text_eventÚhandle_messagero  rP   r9  )rì   r2  rŽ  rL  ÚmessagesÚmsg_dataÚeventrB  s           r   r8  zWhatsAppAdapter._poll_messages$  s¢  è è € àˆˆˆàŒmñ #	#ØÔ%ð Ø�Ø $× ?Ò ?Ñ AÔ AÐAÐAÐAÐAÐAÐAˆKØð ÝÐ4˜$œ)Ð4Ð4 {Ð4Ð4Ñ5Ô5Ð5Ø�ð'ØÔ-×1Ò1ØD¨Ô(9ÐDÐDÐDØ#×1Ò1¸Ð1Ñ;Ô;ð 2ñ ô ð Eð Eð Eð Eð Eð Eð Eð Eð Ø”{ cÒ)Ð)Ø)-¯ª©¬Ð#4Ð#4Ð#4Ð#4Ð#4Ð#4˜Ø(0ð 
Eð 
E˜HØ*.×*CÒ*CÀHÑ*MÔ*MÐ$MÐ$MÐ$MÐ$MÐ$MÐ$M˜EØ$ð Eõ !(Ô 3°D×4KÒ4KÈHÑ4UÔ4UÑ VÔ VÐ VØ#(Ô#5½Ô9IÒ#IÐ#IØ$(×$<Ò$<¸UÑ$CÔ$CÐ$CÐ$Cà*.×*=Ò*=¸eÑ*DÔ*DÐ$DÐ$DÐ$DÐ$DÐ$DÐ$DÐ$Døð!Eð Eð Eñ Eô Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eð Eøøøð Eð Eð Eð Eøøõ" Ô)ð ð ð Ø��Ýð 'ð 'ð 'Ø$(×$CÒ$CÑ$EÔ$EÐEÐEÐEÐEÐEÐE�Øð ÝÐ8˜dœiÐ8Ð8¨;Ð8Ð8Ñ9Ô9Ð9Ø�E�E�E�E�EÝÐ6˜$œ)Ð6Ð6°1Ð6Ð6Ñ7Ô7Ð7Ý”m AÑ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøð'øøøõ ”- Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ðG Œmñ #	#ð #	#ð #	#ð #	#ð #	#sI   Á?E* ÂB5EÅE* Å
E"Å"E* Å%E"Å&E* Å*G?Å<	G?Æ6G:Ç4G:Ç:G?rM  c              ƒ   ó0  K  — | j         r| j        sdS |                     d¦  «        }t          |t          ¦  «        sdS 	 ddl}| j                             d| j        › d�d|i|                     d¬¦  «        ¬	¦  «        4 ƒd{V —†	 }|j	        d
k    r&t                               d| j        |j	        ¦  «         ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t          $ r,}t                               d| j        |¦  «         Y d}~dS d}~ww xY w)z>Mark a policy-accepted inbound message as read via the bridge.NÚreadReceiptKeyr   r	  z/readrð   r   r  r‚  r  z.[%s] WhatsApp read receipt failed with HTTP %sz%[%s] WhatsApp read receipt failed: %s)rÜ   rå   rÎ   rÚ   Údictr2  rŒ  rÏ   r4  r  rl   rn   r   rP   )rì   rM  rð   r2  rL  Úexcs         r   rã  z"WhatsAppAdapter._send_read_receiptM  så  è è € àÔ'ð 	¨tÔ/Að 	ØˆFØ�hŠhÐ'Ñ(Ô(ˆÝ˜#�tÑ$Ô$ð 	ØˆFð	TØˆNˆNˆNàÔ)×.Ò.Ø< DÔ$5Ð<Ð<Ð<Ø˜S�\Ø×-Ò-°AÐ-Ñ6Ô6ð /ñ ô ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð Ø”; #Ò%Ð%Ý—N’NØHØœ	Øœñô ð ð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
øõ ð 	Tð 	Tð 	TÝ�NŠNÐBÀDÄIÈsÑSÔSÐSÐSÐSÐSÐSÐSÐSøøøøð	Tøøøs=   Á AC Â2CÂ9C Ã
CÃC ÃCÃC Ã
DÃ)!DÄDip  rê  c                 óÂ   — ddl m}  ||j        | j        j                             dd¦  «        | j        j                             dd¦  «        |j        j        ¬¦  «        S )z-Session-scoped key for text message batching.r   )Úbuild_session_keyÚgroup_sessions_per_userTÚthread_sessions_per_userF)rñ  rò  Úprofile)Úgateway.sessionrð  Úsourcer¯   rÍ   rÎ   ró  )rì   rê  rð  s      r   Ú_text_batch_keyzWhatsAppAdapter._text_batch_keyi  so   € à5Ð5Ð5Ð5Ð5Ð5Ø Ð ØŒLØ$(¤KÔ$5×$9Ò$9Ð:SÐUYÑ$ZÔ$ZØ%)¤[Ô%6×%:Ò%:Ð;UÐW\Ñ%]Ô%]Ø”LÔ(ð	
ñ 
ô 
ð 	
rb   c                 óŒ  — |                       |¦  «        }| j                             |¦  «        }t          |j        pd¦  «        }|€||_        || j        |<   nw|j        r$|j        r|j        › d|j        › �n|j        |_        ||_        |j        r>|j                             |j        ¦  «         |j                             |j        ¦  «         | j	                             |¦  «        }|r(| 
                    ¦   «         s|                     ¦   «          t          j        |                      |¦  «        ¦  «        | j	        |<   dS )zøBuffer a text event and reset the flush timer.

        When WhatsApp delivers rapid-fire messages (e.g. forwarded
        batches), this concatenates them and waits for a short quiet
        period before dispatching the combined message.
        r   Nrf   )rö  rê   rÎ   rG   r!   Ú_last_chunk_lenÚ
media_urlsÚextendÚmedia_typesrë   rm  rn  rß   r7  Ú_flush_text_batch)rì   rê  rð   ÚexistingÚ	chunk_lenÚ
prior_tasks         r   ræ  z#WhatsAppAdapter._enqueue_text_events  sL  € ð ×"Ò" 5Ñ)Ô)ˆØÔ-×1Ò1°#Ñ6Ô6ˆÝ˜œ
Ð( bÑ)Ô)ˆ	ØÐØ$-ˆEÔ!Ø.3ˆDÔ& sÑ+Ð+àŒzð bØDLÄMÐ a 8¤=Ð @Ð @°E´JÐ @Ð @Ð @ÐW\ÔWa�”Ø'0ˆHÔ$ØÔð ?ØÔ#×*Ò*¨5Ô+;Ñ<Ô<Ð<ØÔ$×+Ò+¨EÔ,=Ñ>Ô>Ð>àÔ3×7Ò7¸Ñ<Ô<ˆ
Øð 	 ˜jŸošoÑ/Ô/ð 	 Ø×ÒÑÔÐÝ.5Ô.AØ×"Ò" 3Ñ'Ô'ñ/
ô /
ˆÔ& sÑ+Ð+Ð+rb   c              ƒ   óÌ  K  — t          j        ¦   «         }	 | j                             |¦  «        }|rt	          |dd¦  «        nd}|| j        k    r| j        }n| j        }t          j        |¦  «        ƒ d{V —† | j         	                    |d¦  «        }|s<	 | j
                             |¦  «        |u r| j
         	                    |d¦  «         dS dS |                      |¦  «        ƒ d{V —† | j
                             |¦  «        |u r| j
         	                    |d¦  «         dS dS # | j
                             |¦  «        |u r| j
         	                    |d¦  «         w w xY w)z4Wait for quiet period then dispatch aggregated text.rø  r   N)rß   Úcurrent_taskrê   rÎ   ró   Ú_SPLIT_THRESHOLDré   rè   r9  Úpoprë   rç  )rì   rð   r  ÚpendingÚlast_lenÚdelayrê  s          r   rü  z!WhatsAppAdapter._flush_text_batch�  s£  è è € åÔ+Ñ-Ô-ˆð	>ØÔ0×4Ò4°SÑ9Ô9ˆGØAHÐO•w˜wÐ(9¸1Ñ=Ô=Ð=ÈaˆHØ˜4Ô0Ò0Ð0ØÔ<��àÔ6�Ý”- Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÔ.×2Ò2°3¸Ñ=Ô=ˆEØð Øð Ô-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFð ×%Ò% eÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,àÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=Ð=ð GÐFøˆtÔ-×1Ò1°#Ñ6Ô6¸,ÐFÐFØÔ.×2Ò2°3¸Ñ=Ô=Ð=Ð=ð Gøøøs   —B D) ÃD) Ä):E#c              ƒ   ó  K  — 	 |                       |¦  «        sdS t          j        }t          |                     dd¦  «        pd¦  «        }|dv rt          j        }nx|dk    rt          j        }ne|                     d¦  «        rPd|v rt          j        }n?d|v rt          j        }n.d	|v rt          j	        }nd
|v rt          j
        }nt          j        }|                     dd¦  «        }|rdnd}|                      |                     dd¦  «        |                     d¦  «        ||                     d¦  «        |                     d¦  «        ¬¦  «        }|                     dg ¦  «        }g }g }	|D �]M}
t          |                     d¦  «        pd¦  «                             ¦   «         }|t          j        k    rÖ|
                     d¦  «        rÁ	 t          |
d¬¦  «        ƒ d{V —†}|                     |¦  «         |	                     |pd¦  «         t#          d| j        › d|› �d¬¦  «         Œ¿# t&          $ rS}t#          d| j        › d|› �d¬¦  «         |                     |
¦  «         |	                     |pd¦  «         Y d}~�Œd}~ww xY w|t          j        k    r–t(          j                             |
¦  «        rwt/          |
¦  «        rJ|                     |
¦  «         |	                     |pd¦  «         t#          d| j        › d|
› �d¬¦  «         �Œ§t#          d| j        › d |
› �d¬¦  «         �ŒÅ|t          j	        t          j
        hv rû|
                     d¦  «        ræ	 t1          |
d!¬¦  «        ƒ d{V —†}|                     |¦  «         |	                     |p|t          j	        k    rd"nd#¦  «         t#          d| j        › d$|› �d¬¦  «         �Œh# t&          $ re}t#          d| j        › d%|› �d¬¦  «         |                     |
¦  «         |	                     |p|t          j	        k    rd"nd#¦  «         Y d}~�ŒÒd}~ww xY w|t          j	        t          j
        hv r¨t(          j                             |
¦  «        r‰t/          |
¦  «        r\|                     |
¦  «         |	                     |p|t          j	        k    rd"nd#¦  «         t#          d| j        › d&|
› �d¬¦  «         �Œ~t#          d| j        › d'|
› �d¬¦  «         �Œœ|t          j        k    rÑt(          j                             |
¦  «        r²t/          |
¦  «        r…|                     |
¦  «         t3          |
¦  «        j                             ¦   «         }|pt9          j        |d(¦  «        }|	                     |¦  «         t#          d| j        › d)|
› �d¬¦  «         �Œ_t#          d| j        › d*|
› �d¬¦  «         �Œ}|t          j        k    r–t(          j                             |
¦  «        rwt/          |
¦  «        rJ|                     |
¦  «         |	                     |pd+¦  «         t#          d| j        › d,|
› �d¬¦  «         �Œt#          d| j        › d-|
› �d¬¦  «         �Œ#|                     |
¦  «         |	                     d.¦  «         �ŒO|                     d/d¦  «        }|                     d¦  «        r|                      ||¦  «        }|t          j	        k    r;|r9t          |¦  «                             ¦   «                              ¦   «         d0k    rd}t          |                     d1¦  «        pd¦  «                             ¦   «         }|pd}d}d}d}|                     d2¦  «        rg|                     d3¦  «        }|�t          |¦  «        }|                      |                     d4¦  «        ¦  «        }|r|}|                      |¦  «        }d5}|t          j        k    �r[|�rX|D �]T}t3          |¦  «        j                             ¦   «         }|d6v �r&	 t3          |¦  «                              ¦   «         j!        }||k    r$t#          d| j        › d7|› d8|› d9|› d:�	d¬¦  «         Œt3          |¦  «         "                    d;d<¬=¦  «        }t3          |¦  «        j        }|}d>|v r1| #                    d>d?¦  «        }tI          |¦  «        d@k    r|d?         }dA|› dB|› �}|r|› dC|› �}n|}t#          d| j        › dD|› �d¬¦  «         �Œ # t&          $ r'}t#          d| j        › dE|› �d¬¦  «         Y d}~�ŒLd}~ww xY w�ŒVi } t          |                     dF¦  «        pd¦  «                             ¦   «         }!|                     dG¦  «        }"|!r|!| dH<   tK          |"tL          ¦  «        r|"r|"| dI<   |                     dJ¦  «        r*d| dK<   |                     tN          ¦  «        stN          › |› �}tQ          |||||                     dL¦  «        ||	| ||||¬M¦  «        S # t&          $ r%}t#          d| j        › dN|› �¦  «         Y d}~dS d}~ww xY w)OzKBuild a MessageEvent from bridge message data, downloading images to cache.Nr¡  r   >   ÚlocationÚlive_locationÚstickerÚhasMediarÂ  rÍ  ÚpttrÑ  rÝ  Fr2   rÛ  r~  ÚchatNameÚsenderIdÚ
senderName)rs  Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_nameÚ	mediaUrlsÚmime)zhttp://zhttps://ú.jpg)Úextz
image/jpegr  z] Cached user image: T)Úflushz] Failed to cache image: z] Using bridge-cached image: z0] Rejected bridge image path outside cache dir: ú.oggz	audio/oggz
audio/mpegz] Cached user audio: z] Failed to cache audio: z] Using bridge-cached audio: z0] Rejected bridge audio path outside cache dir: zapplication/octet-streamz ] Using bridge-cached document: z3] Rejected bridge document path outside cache dir: z	video/mp4z] Using bridge-cached video: z0] Rejected bridge video path outside cache dir: r  Úbodyz[ptt received]Ú
quotedTextÚhasQuotedMessageÚquotedMessageIdÚquotedParticipanti � >   ú.jsú.mdú.pyú.tsú.cssú.csvú.logú.txtú.xmlú.ymlú.htmlú.jsonú.yamlz] Skipping text injection for z (z	 bytes > r  r   r   )r"   r#   Ú_r
  r=   z[Content of z]:
z

z] Injected text content from: z ] Failed to read document text: Ú
nativeTypeÚnativeMetadataÚwhatsapp_native_typeÚwhatsapp_nativeÚ	fromOwnerÚwhatsapp_from_ownerrƒ  )r!   rä  rõ  Úraw_messager|  rù  rû  rv  Úreply_to_message_idÚreply_to_textÚreply_to_author_idÚreply_to_is_own_messagez] Error building event: ))Ú_should_process_messager�   rå  r^   rÎ   ÚLOCATIONÚSTICKERÚPHOTOÚVIDEOÚVOICEÚAUDIOÚDOCUMENTÚbuild_sourcer*   Ú
startswithr“   r,   r-  r   rP   r   r¢   Úisabsr¡   r”   r   ÚsuffixrÓ   r’   Ú_clean_bot_mention_textÚ_normalize_whatsapp_idÚ_message_is_reply_to_botÚstatÚst_sizerh   rF   rG   rÚ   rí  Ú_OWNER_REPLY_PREFIXr�   )#rì   rM  Úmsg_typer›  Úis_groupr  rõ  Úraw_urlsÚcached_urlsrû  r–   Úbridge_mimeÚcached_pathrB  r  r  r  Úquoted_textr5  r4  r6  r7  Úraw_reply_idÚquoted_participantÚMAX_TEXT_INJECT_BYTESÚdoc_pathÚ	file_sizert  ÚfnameÚdisplay_namerQ   Ú	injectionrv  Únative_typeÚnative_metadatas#                                      r   râ  z$WhatsAppAdapter._build_message_event¢  sH  è è € ðF	Ø×/Ò/°Ñ5Ô5ð Ø�tõ #Ô'ˆHÝ˜TŸXšX k°2Ñ6Ô6Ð<¸"Ñ=Ô=ˆJØÐ:Ð:Ð:Ý&Ô/��Ø˜yÒ(Ð(Ý&Ô.��Ø—’˜*Ñ%Ô%ð 
4Ø˜jÐ(Ð(Ý*Ô0�H�HØ 
Ð*Ð*Ý*Ô0�H�HØ˜jÐ(Ð(Ý*Ô0�H�HØ 
Ð*Ð*Ý*Ô0�H�Hå*Ô3�Hð —x’x 	¨5Ñ1Ô1ˆHØ#+Ð5˜˜°ˆIð ×&Ò&ØŸš ¨2Ñ.Ô.ØŸ(š( :Ñ.Ô.Ø#ØŸš Ñ,Ô,ØŸ(š( <Ñ0Ô0ð 'ñ ô ˆFð —x’x ¨RÑ0Ô0ˆHØˆKØˆKØð 92ñ 92�Ý! $§(¢(¨6Ñ"2Ô"2Ð"8°bÑ9Ô9×?Ò?ÑAÔA�Ø�{Ô0Ò0Ð0°S·^²^ÐD[Ñ5\Ô5\Ð0ðHÝ,@ÀÈ&Ð,QÑ,QÔ,QÐ&QÐ&QÐ&QÐ&QÐ&QÐ&Q˜Ø#×*Ò*¨;Ñ7Ô7Ð7Ø#×*Ò*¨;Ð+F¸,ÑGÔGÐGÝÐO $¤)ÐOÐOÀ+ÐOÐOÐW[Ð\Ñ\Ô\Ð\Ð\øÝ$ð Hð Hð HÝÐI $¤)ÐIÐIÀaÐIÐIÐQUÐVÑVÔVÐVØ#×*Ò*¨3Ñ/Ô/Ð/Ø#×*Ò*¨;Ð+F¸,ÑGÔGÐGÐGÐGÐGÐGÑGøøøøðHøøøð ¥Ô!2Ò2Ð2µr´w·}²}ÀSÑ7IÔ7IÐ2å.¨sÑ3Ô3ð pØ#×*Ò*¨3Ñ/Ô/Ð/Ø#×*Ò*¨;Ð+F¸,ÑGÔGÐGÝÐO $¤)ÐOÐOÈ#ÐOÐOÐW[Ð\Ñ\Ô\Ð\Ñ\åÐb $¤)ÐbÐbÐ]`ÐbÐbÐjnÐoÑoÔoÐoÑoØ¥+Ô"3µ[Ô5FÐ!GÐGÐGÈCÏNÊNÐ[rÑLsÔLsÐGð|Ý,@ÀÈ&Ð,QÑ,QÔ,QÐ&QÐ&QÐ&QÐ&QÐ&QÐ&Q˜Ø#×*Ò*¨;Ñ7Ô7Ð7Ø#×*Ò*¨;Ð+zÈ(ÕVaÔVgÒJgÐJg¸;¸;ÐmyÑ{Ô{Ð{ÝÐO $¤)ÐOÐOÀ+ÐOÐOÐW[Ð\Ñ\Ô\Ð\Ñ\øÝ$ð |ð |ð |ÝÐI $¤)ÐIÐIÀaÐIÐIÐQUÐVÑVÔVÐVØ#×*Ò*¨3Ñ/Ô/Ð/Ø#×*Ò*¨;Ð+zÈ(ÕVaÔVgÒJgÐJg¸;¸;ÐmyÑ{Ô{Ð{Ð{Ð{Ð{Ð{Ñ{øøøøð|øøøð ¥+Ô"3µ[Ô5FÐ!GÐGÐGÍBÌGÏMÊMÐZ]ÑL^ÔL^ÐGå.¨sÑ3Ô3ð pØ#×*Ò*¨3Ñ/Ô/Ð/Ø#×*Ò*¨;Ð+zÈ(ÕVaÔVgÒJgÐJg¸;¸;ÐmyÑ{Ô{Ð{ÝÐO $¤)ÐOÐOÈ#ÐOÐOÐW[Ð\Ñ\Ô\Ð\Ñ\åÐb $¤)ÐbÐbÐ]`ÐbÐbÐjnÐoÑoÔoÐoÑoØ¥Ô!5Ò5Ð5½"¼'¿-º-ÈÑ:LÔ:LÐ5å.¨sÑ3Ô3ð sØ#×*Ò*¨3Ñ/Ô/Ð/Ý" 3™iœiÔ.×4Ò4Ñ6Ô6˜Ø*ÐkÕ.FÔ.JÈ3ÐPjÑ.kÔ.k˜Ø#×*Ò*¨4Ñ0Ô0Ð0ÝÐR $¤)ÐRÐRÈSÐRÐRÐZ^Ð_Ñ_Ô_Ð_Ñ_åÐe $¤)ÐeÐeÐ`cÐeÐeÐmqÐrÑrÔrÐrÑrØ¥Ô!2Ò2Ð2µr´w·}²}ÀSÑ7IÔ7IÐ2Ý.¨sÑ3Ô3ð pØ#×*Ò*¨3Ñ/Ô/Ð/Ø#×*Ò*¨;Ð+E¸+ÑFÔFÐFÝÐO $¤)ÐOÐOÈ#ÐOÐOÐW[Ð\Ñ\Ô\Ð\Ñ\åÐb $¤)ÐbÐbÐ]`ÐbÐbÐjnÐoÑoÔoÐoÑoà×&Ò& sÑ+Ô+Ð+Ø×&Ò& yÑ1Ô1Ð1Ñ1ð
 —8’8˜F BÑ'Ô'ˆDØ�xŠx˜	Ñ"Ô"ð @Ø×3Ò3°D¸$Ñ?Ô?�à�KÔ-Ò-Ð-Øð .å˜‘I”I—O’OÑ%Ô%×+Ò+Ñ-Ô-Ð1AÒAÐAð
 �õ ˜dŸhšh |Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔCˆKØ'Ð/¨4ˆMØ"&ÐØ!%ÐØ&+Ð#Ø�xŠxÐ*Ñ+Ô+ð NØ#ŸxšxÐ(9Ñ:Ô:�ØÐ+Ý*-¨lÑ*;Ô*;Ð'Ø%)×%@Ò%@ÀÇÂÐJ]ÑA^ÔA^Ñ%_Ô%_Ð"Ø%ð <Ø);Ð&Ø*.×*GÒ*GÈÑ*MÔ*MÐ'Ø$.Ð!Ø�;Ô/Ò/Ñ/°KÑ/Ø +ð bñ b�HÝ˜x™.œ.Ô/×5Ò5Ñ7Ô7�CØð  Fð  Fñ  FðbÝ(,¨X©¬×(;Ò(;Ñ(=Ô(=Ô(E˜IØ(Ð+@Ò@Ð@Ý %ð  'L¨$¬)ð  'Lð  'LÐS[ð  'Lð  'LÐ_hð  'Lð  'Lð  tIð  'Lð  'Lð  'Lð  TXð  !Yñ  !Yô  !Yð  !YØ (Ý&*¨8¡n¤n×&>Ò&>ÈÐXaÐ&>Ñ&bÔ&b˜GÝ$(¨¡N¤NÔ$7˜Eà+0˜LØ" e˜|˜|Ø(-¯ª°C¸Ñ(;Ô(; Ý#& u¡:¤:°¢? ?Ø38¸´8 LØ(R°|Ð(RÐ(RÈÐ(RÐ(R˜IØ#ð 1Ø*3Ð'?Ð'?¸Ð'?Ð'?  à'0 Ý!Ð"Y d¤iÐ"YÐ"YÈxÐ"YÐ"YÐaeÐfÑfÔfÐfÑføÝ(ð bð bð bÝ!Ð"T d¤iÐ"TÐ"TÐQRÐ"TÐ"TÐ\`ÐaÑaÔaÐaÐaÐaÐaÐaÑaøøøøðbøøøñ) Fð. (*ˆHÝ˜dŸhšh |Ñ4Ô4Ð:¸Ñ;Ô;×AÒAÑCÔCˆKØ"ŸhšhÐ'7Ñ8Ô8ˆOØð ?Ø3>�Ð/Ñ0Ý˜/­4Ñ0Ô0ð >°_ð >Ø.=�Ð*Ñ+ð �xŠx˜Ñ$Ô$ð :Ø26�Ð.Ñ/Ø—’Õ':Ñ;Ô;ð :Ý1Ð9°4Ð9Ð9�DåØØ%ØØ ØŸ8š8 KÑ0Ô0Ø&Ø'Ø!Ø$7Ø+Ø#5Ø(?ðñ ô ð øõ ð 	ð 	ð 	ÝÐ<�d”iÐ<Ð<¸Ð<Ð<Ñ=Ô=Ð=Ø�4�4�4�4�4øøøøð	øøøs°   „i ›F7i ÇAH3È2i È3
JÈ=AJÊi ÊJÊCi Í)A1OÏi Ï
QÏ&AQÑ i ÑQÑPi áAeâ!i â"Beåi å
e4åe/å)i å/e4å4C!i é
jé j ê j©r   N)NN©N)NNN),Ú__name__Ú
__module__Ú__qualname__Ú__doc__rÊ   Úsplits_long_messagesr‹   rÈ   r^   rô   rç   rÛ   r_  r0  r   rj  rr  r   r   r‘   r–  r™  r¦  r­  r-   r®  r¹  r¿  rÃ  rÉ  rÎ  rÒ  rÖ  rØ  rà  r8  rã  r  r�   rö  ræ  rü  râ  Ú__classcell__)rï   s   @r   r®   r®   }  s   ø€ € € € € ðð ð: ÐØÐðJE˜~ð JEð JEð JEð JEð JEð JEðX sð °Uð ¸uð ð ð ð ð& 5:ð y)ð y)ð y)¨Tð y)¸dð y)ð y)ð y)ð y)ðv	'ð 'ð 'ð 'ð3°(¸3´-ð 3ð 3ð 3ð 3ð@1-ð 1-ð 1-ð 1-ðn #'Ø-1ðC;ð C;àðC;ð ðC;ð ˜3”-ð	C;ð
 ˜4  S œ>Ô*ðC;ð 
ðC;ð C;ð C;ð C;ðV ð;ð ;ð ;àð;ð ð;ð ð	;ð ð;ð 
ð;ð ;ð ;ð ;ðL "&Ø#'ð/;ð /;àð/;ð ð/;ð ð	/;ð
 ˜#”ð/;ð ˜C”=ð/;ð 
ð/;ð /;ð /;ð /;ðn !"ð+;ð +;ð +;àð+;ð ð+;ð �c”ð	+;ð ð+;ð 
ð+;ð +;ð +;ð +;ðh .2ð'
ð '
àð'
ð ð'
ð ˜$”ð	'
ð
 ð'
ð ð'
ð ˜4  S œ>Ô*ð'
ð 
ð'
ð '
ð '
ð '
ð '
ð '
ð^ #Ø!%Ø"&Ø-1ð,;ð ,;ð ,;àð,;ð ð,;ð ð	,;ð �sŒmð,;ð ˜#”ð,;ð ˜3”-ð,;ð ˜4  S œ>Ô*ð,;ð 
ð,;ð ,;ð ,;ð ,;ðd "&Ø"&Ø-1ð]ð ]àð]ð ð]ð ˜#”ð	]ð
 ˜3”-ð]ð ˜4  S œ>Ô*ð]ð 
ð]ð ]ð ]ð ]ð ]ð ]ð2 "&Ø"&ð	Wð 	Wàð	Wð ð	Wð ˜#”ð		Wð
 ˜3”-ð	Wð 
ð	Wð 	Wð 	Wð 	Wð "&Ø"&ð	Wð 	Wàð	Wð ð	Wð ˜#”ð		Wð
 ˜3”-ð	Wð 
ð	Wð 	Wð 	Wð 	Wð "&Ø"&ð	Wð 	Wàð	Wð ð	Wð ˜#”ð		Wð
 ˜3”-ð	Wð 
ð	Wð 	Wð 	Wð 	Wð "&Ø#'Ø"&ð
ð 
àð
ð ð
ð ˜#”ð	
ð
 ˜C”=ð
ð ˜3”-ð
ð 
ð
ð 
ð 
ð 
ðð ¨ð Àð ð ð ð ð,/¨3ð /°4¸¸S¸´>ð /ð /ð /ð /ð4'#ð '#ð '#ð '#ðRT¨T°#°s°(¬^ð TÀð Tð Tð Tð Tð4 Ðð
 \ð 
°cð 
ð 
ð 
ð 
ð
¨ð 
¸$ð 
ð 
ð 
ð 
ð8>¨3ð >°4ð >ð >ð >ð >ð&H¨t°C¸°H¬~ð HÀ(È<ÔBXð Hð Hð Hð Hð Hð Hð Hð Hrb   r®   >   ú.gifú.pngú.jpegú.webpr  >   ú.3gpú.aviú.mkvú.movú.mp4ú.webm>   ú.m4aú.mp3ú.wavú.flacú.opusr  rš  Úis_voiceÚforce_documentc                 óÂ   — |rdS t           j                             | ¦  «        d                              ¦   «         }|s	|t          v rdS |t
          v rdS |t          v rdS dS )ay  Map a local media file to the bridge /send-media ``mediaType``.

    Returns one of ``image`` | ``video`` | ``audio`` | ``document`` so the
    Baileys bridge renders the right native WhatsApp message kind. Voice notes
    and audio files route to ``audio``; ``force_document`` (the [[as_document]]
    directive) forces every file to ``document`` regardless of extension.
    rÔ  r&   rÑ  rÂ  rÍ  )r   r¢   ÚsplitextrÓ   Ú_WA_AUDIO_EXTSÚ_WA_IMAGE_EXTSÚ_WA_VIDEO_EXTS)rš  rr  rs  r  s       r   Ú_bridge_media_typery  �  ss   € ð ð ØˆzÝ
Œ'×
Ò
˜9Ñ
%Ô
% aÔ
(×
.Ò
.Ñ
0Ô
0€CØð �3�.Ð(Ð(ØˆwØ
�nÐÐØˆwØ
�nÐÐØˆwØˆ:rb   )Ú	thread_idÚmedia_filesrs  rœ  c          	   ƒ   ó  K  — t          | di ¦  «        pi }	 ddl}n# t          $ r ddicY S w xY w	 |                     dd¦  «        }	t	          |¦  «        }
|pg }|pd}|rt          |¦  «        d	k    r|nd}d}|                     ¦   «         4 ƒd{V —†}|                     ¦   «         rç|så|                     d
|	› d�|
|dœ| 	                    d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j
        dk    rM|                     ¦   «         ƒ d{V —†}dd|j
        › d|› �icddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}|                     d¦  «        }ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |D �]1\  }}t          j                             |¦  «        sà|rÃ	 |                     d
|	› d�|
|dœ| 	                    d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j
        dk    r-|                     ¦   «         ƒ d{V —†                     d¦  «        }	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   n*# t           $ r t"                               d¦  «         Y nw xY wdd|› �ic cddd¦  «        ƒd{V —† S t'          |||¦  «        }|
||dœ}|dk    r"t          j                             |¦  «        |d<   |r||d<   |                     d
|	› d�|| 	                    d¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j
        dk    rO|                     ¦   «         ƒ d{V —†}dd|j
        › d|› �icddd¦  «        ƒd{V —† c cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}|                     d¦  «        p|}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   �Œ3	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   dd|
|dœS # t           $ r}dd |› �icY d}~S d}~ww xY w)!aÿ  Out-of-process WhatsApp delivery via the local bridge HTTP API.

    Implements the standalone_sender_fn contract so deliver=whatsapp cron jobs
    succeed when cron runs separately from the gateway. Replaces the legacy
    _send_whatsapp helper.

    When ``caption`` is provided (single-file ``MEDIA:<path> caption`` send),
    the text rides on the media bubble's native caption via the bridge
    ``/send-media`` ``caption`` field instead of being posted as a separate
    ``/send`` message beforehand.
    rÍ   r   Nr>  z/aiohttp not installed. Run: pip install aiohttpr²   r³   r   r&   zhttp://localhost:r€  r}  r�  r  r‚  r  zWhatsApp bridge error (z): rƒ  z7WhatsApp caption-fallback send failed for missing mediazWhatsApp media file not found: rŸ  rÔ  r¢  rœ  r£  r¤  zWhatsApp media error (TÚwhatsapp)rz  Úplatformrs  r|  zWhatsApp send failed: )ró   r2  ÚImportErrorrÎ   r�   rG   r3  r*   rŒ  r4  r  r!   r5  r   r¢   rg   rP   rl   rn   ry  rÕ  )Úpconfigrs  ri  rz  r{  rs  rœ  rÍ   r2  r²   Únormalized_chat_idÚmediar!   Úmedia_captionr’  rK  rL  r  rM  Ú
media_pathrr  r›  r•  rB  s                           r   Ú_standalone_sendr…  •  s	  è è € õ* �G˜W bÑ)Ô)Ð/¨R€EðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøðJ7Ø—i’i ¨tÑ4Ô4ˆÝ,¨WÑ5Ô5ÐØÐ!˜rˆØˆ}˜"ˆð %,ÐJµ°E±
´
¸a²°˜˜ÀdˆØˆØ×(Ò(Ñ*Ô*ð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	O¨gð �zŠz‰|Œ|ð 
< Mð 
<Ø"Ÿ<š<Ø:¨Ð:Ð:Ð:Ø$6À4ÐHÐHØ#×1Ò1¸Ð1Ñ;Ô;ð (ñ ô ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð Ø”{ cÒ)Ð)Ø%)§Y¢Y¡[¤[Ð0Ð0Ð0Ð0Ð0Ð0˜Ø 'Ð)YÀ4Ä;Ð)YÐ)YÐSWÐ)YÐ)YÐZð	<ð 	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð	8	Oð 8	Oð 8	Oð 8	Oñ 8	Oô 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð "&§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DØ&*§h¢h¨{Ñ&;Ô&;�Oð	<ð 	<ð 	<ñ 	<ô 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<øøøð 	<ð 	<ð 	<ð 	<ð ).ð %Oñ %OÑ$�
˜HÝ”w—~’~ jÑ1Ô1ð Uð
 %ð 
fð	fØ'.§|¢|Ø F°KÐ FÐ FÐ FØ0BÈ}Ð%]Ð%]Ø(/×(=Ò(=ÀBÐ(=Ñ(GÔ(Gð (4ñ (ô (ð [ð [ð [ð [ð [ð [ð [ð [ð "&Ø#'¤;°#Ò#5Ð#5Ø=A¿YºY¹[¼[Ð7HÐ7HÐ7HÐ7HÐ7HÐ7H×6MÒ6MÈkÑ6ZÔ6Z OÐ$Zð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [øøõ  )ð fð fð fÝ"ŸNšNÐ+dÑeÔeÐeÐeÐeðføøøà#Ð%SÀzÐ%SÐ%SÐTÐTÐTðI8	Oð 8	Oð 8	Oð 8	Oñ 8	Oô 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	OõJ 0°
¸HÀnÑUÔU�
à0Ø *Ø!+ð+ð +�ð
  Ò+Ð+Ý*,¬'×*:Ò*:¸:Ñ*FÔ*F�G˜JÑ'Ø ð 7Ø)6�G˜IÑ&Ø"Ÿ<š<Ø@¨Ð@Ð@Ð@Ø Ø#×1Ò1¸Ð1Ñ<Ô<ð (ñ ô ð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð Ø”{ cÒ)Ð)Ø%)§Y¢Y¡[¤[Ð0Ð0Ð0Ð0Ð0Ð0˜Ø 'Ð)XÀ$Ä+Ð)XÐ)XÐRVÐ)XÐ)XÐYð	Oð 	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð_8	Oð 8	Oð 8	Oð 8	Oñ 8	Oô 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oðn "&§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DØ&*§h¢h¨{Ñ&;Ô&;Ð&N¸�Oð	Oð 	Oð 	Oñ 	Oô 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oð 	Oøøøð 	Oð 	Oð 	Oð 	Oùð9%Oð'8	Oð 8	Oð 8	Oñ 8	Oô 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oð 8	Oøøøð 8	Oð 8	Oð 8	Oð 8	Oðv Ø"Ø)Ø)ð	
ð 
ð 	
øõ ð 7ð 7ð 7ØÐ5°!Ð5Ð5Ð6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøs  — œ-¬-±A"O/ ÂAOÃ$4E>ÄOÄ*O/ Ä=/E>Å,OÅ>
F	ÆOÆF	Æ,OÆ99IÇ39H?È-IÈ?
I	É	IÉI	ÉIÉOÉ$I8É5OÉ7I8É8OÊO/ ÊA<OÌ4N1ÍOÍO/ Í.1N1ÎOÎ1
N;Î;OÎ>N;Î?OÏO/ Ï
O!Ï!O/ Ï$O!Ï%	O/ Ï/
P
Ï9PÏ?P
ÐP
c                  ód  — ddl m} m}m} ddlm}m}m}m}m	}  |d¦  «          |d¦  «          |d¦  «          | d¦  «        }|r/| 
                    ¦   «         dv r |d	¦  «          |d
d¦  «        sdS  |dd¦  «        r |dd¦  «          |d¦  «         n |dd¦  «          |d¦  «         dS  |d¦  «        }	|	r+ |d|	                     dd¦  «        ¦  «          |d¦  «          |d¦  «                             ¦   «         }
|
r |d|
¦  «         dS  |d¦  «        r |d¦  «         dS dS )zóGuide the user through WhatsApp setup.

    Replaces the central _setup_whatsapp in hermes_cli/gateway.py and the
    static _PLATFORMS["whatsapp"] dict. CLI helpers are lazy-imported so the
    plugin's module-load surface stays minimal.
    r   )Úget_env_valueÚremove_env_valueÚsave_env_value)ÚpromptÚprompt_yes_noÚprint_headerÚ
print_infoÚprint_successÚWhatsAppz;WhatsApp uses a local Node.js bridge (WhatsApp Web client).zBStart the bridge separately; the gateway connects to it over HTTP.ÚWHATSAPP_ENABLED>   rÁ   rÃ   rÄ   zWhatsApp: already enabledzReconfigure WhatsApp?FNzEnable WhatsApp?TrÄ   zWhatsApp enabledr  zWhatsApp left disabledz@Allowed user IDs (comma-separated, leave empty for no allowlist)r»   Ú r   zWhatsApp allowlist configuredz4Home chat ID for cron delivery (leave empty to skip)ÚWHATSAPP_HOME_CHANNELzHome channel cleared.)Úhermes_cli.configr‡  rˆ  r‰  Úhermes_cli.cli_outputrŠ  r‹  rŒ  r�  rŽ  rÓ   r   r*   )r‡  rˆ  r‰  rŠ  r‹  rŒ  r�  rŽ  rý  Úallowed_usersÚhome_channels              r   Úinteractive_setupr—  ü  s  € ð RÐQÐQÐQÐQÐQÐQÐQÐQÐQðð ð ð ð ð ð ð ð ð ð ð ð ð ð €L�ÑÔÐØ€JÐLÑMÔMÐMØ€JÐSÑTÔTÐTØˆ}Ð/Ñ0Ô0€HØð �H—N’NÑ$Ô$Ð(<Ð<Ð<Øˆ
Ð.Ñ/Ô/Ð/Øˆ}Ð4°eÑ<Ô<ð 	ØˆFà€}Ð'¨Ñ.Ô.ð ØˆÐ)¨6Ñ2Ô2Ð2ØˆÐ(Ñ)Ô)Ð)Ð)àˆÐ)¨7Ñ3Ô3Ð3Øˆ
Ð+Ñ,Ô,Ð,Øˆà�FØJñô €Mð ð 7ØˆÐ/°×1FÒ1FÀsÈBÑ1OÔ1OÑPÔPÐPØˆÐ5Ñ6Ô6Ð6à�6ÐPÑQÔQ×WÒWÑYÔY€LØð 0ØˆÐ.°Ñ=Ô=Ð=Ð=Ð=àÐÐ3Ñ4Ô4ð 	0ØˆJÐ.Ñ/Ô/Ð/Ð/Ð/ð	0ð 	0rb   Úyaml_cfgÚwhatsapp_cfgc                 ó8  — ddl }d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   d|v r<t          j        d¦  «        s(|                     |d         ¦  «        t          j        d<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd	 
                    d
„ |D ¦   «         ¦  «        }t          |¦  «        t          j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd	 
                    d„ |D ¦   «         ¦  «        }t          |¦  «        t          j        d<   d|v rHt          j        d¦  «        s4t          |d         ¦  «                             ¦   «         t          j        d<   |                     d¦  «        }|�dt          j        d¦  «        sPt          |t          ¦  «        rd	 
                    d„ |D ¦   «         ¦  «        }t          |¦  «        t          j        d<   dS )u/  Translate config.yaml whatsapp: keys into WHATSAPP_* env vars.

    Implements the apply_yaml_config_fn contract (#24849). Mirrors the legacy
    whatsapp_cfg block from gateway/config.py::load_gateway_config(). Env vars
    take precedence over YAML. Returns None â€” everything flows through env.
    r   NÚrequire_mentionr  Úmention_patternsr  Úfree_response_chatsr   Ú,c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r\  ©r^   ©rµ  Úvs     r   ú	<genexpr>z%_apply_yaml_config.<locals>.<genexpr>;  ó(   è è € Ð/Ð/ a�3˜q™6œ6Ð/Ð/Ð/Ð/Ð/Ð/rb   r¶   r·   r¹   r»   c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r\  r   r¡  s     r   r£  z%_apply_yaml_config.<locals>.<genexpr>B  s(   è è € Ð-Ð- Q�#˜a™&œ&Ð-Ð-Ð-Ð-Ð-Ð-rb   r¼   r½   r¾   r  c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r\  r   r¡  s     r   r£  z%_apply_yaml_config.<locals>.<genexpr>I  r¤  rb   )r5  r   r   r^   rÓ   ÚenvironÚdumpsrÎ   rÚ   r­  Újoin)r˜  r™  Ú_jsonÚfrcÚafÚgafs         r   Ú_apply_yaml_configr®  ,  sY  € ð ÐÐÐØ˜LÐ(Ð(µ´Ð;UÑ1VÔ1VÐ(Ý14°\ÐBSÔ5TÑ1UÔ1U×1[Ò1[Ñ1]Ô1]�Œ
Ð-Ñ.Ø˜\Ð)Ð)µ"´)Ð<WÑ2XÔ2XÐ)Ø27·+²+¸lÐK]Ô>^Ñ2_Ô2_�Œ
Ð.Ñ/Ø
×
Ò
Ð0Ñ
1Ô
1€CØ
€�rœyÐ)GÑHÔH€Ý�c�4Ñ Ô ð 	0Ø—(’(Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/ˆCÝ58¸±X´X�Œ
Ð1Ñ2Ø�lÐ"Ð"­2¬9Ð5IÑ+JÔ+JÐ"Ý+.¨|¸KÔ/HÑ+IÔ+I×+OÒ+OÑ+QÔ+Q�Œ
Ð'Ñ(Ø	×	Ò	˜,Ñ	'Ô	'€BØ	€~�bœiÐ(@ÑAÔA€~Ý�b�$ÑÔð 	.Ø—’Ð-Ð-¨"Ð-Ñ-Ô-Ñ-Ô-ˆBÝ/2°2©w¬w�Œ
Ð+Ñ,Ø˜Ð%Ð%­b¬iÐ8OÑ.PÔ.PÐ%Ý.1°,¸~Ô2NÑ.OÔ.O×.UÒ.UÑ.WÔ.W�Œ
Ð*Ñ+Ø
×
Ò
Ð-Ñ
.Ô
.€CØ
€�rœyÐ)GÑHÔH€Ý�c�4Ñ Ô ð 	0Ø—(’(Ð/Ð/¨3Ð/Ñ/Ô/Ñ/Ô/ˆCÝ58¸±X´X�Œ
Ð1Ñ2Øˆ4rb   c                 óà   — t          | di ¦  «        pi }| �t          | dd¦  «        r|rdS ddlm} |                     d¦  «        pd                     ¦   «                              ¦   «         }|d	v S )
uV  WhatsApp is considered connected when the user has explicitly enabled it
    via ``WHATSAPP_ENABLED`` (or the YAML-bridged equivalent on the config).

    Auth itself is handled by the external Node.js bridge â€” we can't verify the
    bridge token here â€” so the opt-in flag is the connection signal. The legacy
    built-in path keyed off ``WHATSAPP_ENABLED`` in both the connected-platforms
    check and the setup-status display; returning an unconditional True here
    would make WhatsApp always show as "configured" in ``hermes setup`` even
    when the user never enabled it. #41112.
    rÍ   NÚenabledFTr   r�  r   >   rÁ   rÃ   rÄ   )ró   Úhermes_cli.gatewayÚgatewayr‡  r*   rÓ   )r¯   rÍ   Úgateway_modr   s       r   Ú_is_connectedr´  N  sŽ   € õ �F˜G RÑ(Ô(Ð.¨B€EØÐ�g f¨i¸Ñ?Ô?ÐÀEÐð ˆtð -Ð,Ð,Ð,Ð,Ð,Ø×$Ò$Ð%7Ñ8Ô8Ð>¸B×
EÒ
EÑ
GÔ
G×
MÒ
MÑ
OÔ
O€CØÐ&Ð&Ð&rb   c                 ó    — t          | ¦  «        S )zFFactory wrapper that constructs WhatsAppAdapter from a PlatformConfig.)r®   )r¯   s    r   Ú_build_adapterr¶  f  s   € å˜6Ñ"Ô"Ð"rb   c                 óŽ   — |                       ddt          t          t          dgdt          t
          dddt          dd	d
¬¦  «         dS )u:   Plugin entry point â€” called by the Hermes plugin system.r}  r�  r�  uF   WhatsApp requires a Node.js bridge â€” see the WhatsApp messaging docsr»   ÚWHATSAPP_ALLOW_ALL_USERSr’  i   u   ðŸ’¬T)r   ÚlabelÚadapter_factoryÚcheck_fnÚis_connectedÚrequired_envÚinstall_hintÚsetup_fnÚapply_yaml_config_fnÚallowed_users_envÚallow_all_envÚcron_deliver_env_varÚstandalone_sender_fnÚmax_message_lengthÚemojiÚallow_update_commandN)Úregister_platformr¶  r¬   r´  r—  r®  r…  )Úctxs    r   ÚregisterrÊ  k  s\   € à×ÒØØÝ&Ý,Ý"Ø(Ð)Ø]Ý"Ý/Ø2Ø0Ø4Ý-ØØØ!ð! ñ ô ð ð ð rb   )r   r[  )Kr`  rß   Úloggingr   r~  r0   rK   r'   ÚsystemrD   Úpathlibr   Útypingr   r   r   rE   r   Úhermes_constantsr	   r
   r   r^   r   Ú	getLoggerr]  rl   rI  r-   r­  r7   rT   rÛ   ra   rr   rw   r‰   Úsysr¢   ÚinsertÚ__file__rœ   r  Úgateway.configrŠ   r‹   rË   rŒ   Úgateway.whatsapp_identityr�   r�   rŽ   r�   r�   r‘   r’   r“   r”   Úutilsr•   r¡   r©   r¬   r®   rw  rx  rv  ry  r…  r—  rí  r®  r´  r¶  rÊ  r´  rb   r   ú<module>r×     s­  ððð ð" €€€Ø €€€Ø 	€	€	€	Ø €€€Ø 	€	€	€	Ø €€€Ø Ð Ð Ð àˆhŒoÑÔ 9Ò,€Ø Ð Ð Ð Ð Ð Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à EÐ EÐ EÐ EÐ EÐ Eðð ð ð ð ð ð ð ð ð ð/ð /�ð /˜cð /¨3ð /ð /ð /ð /ð* 
ˆÔ	˜8Ñ	$Ô	$€ð 'Ð ð# ð #¨ð #ð #ð #ð #ðL#˜Sð # Tð #ð #ð #ð #ðLB˜Sð B°ð BÈð Bð Bð Bð Bð>.°ð .¸ð .ð .ð .ð .ðb¨ð °3ð ¸4ð ð ð ð ð  6;ð ,ð ,ð ,¨dð ,¸tð ,ð ,ð ,ð ,ð\ €
€
€
Ø „‡‚��3�3�t�t˜H‘~”~×-Ò-Ñ/Ô/Ô7¸Ô:Ñ;Ô;Ñ <Ô <Ð <à 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø CÐ CÐ CÐ CÐ CÐ CØ 5Ð 5Ð 5Ð 5Ð 5Ð 5ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð Ð Ð Ð Ð ð& ð &¨ð &ð &ð &ð &ðR˜Tð  cð ð ð ð ð  Tð ð ð ð ð.mð mð mð mð mÐ+Ð-@ñ mô mð mð~' <Ð;Ð;€ØBÐBÐB€ØCÐCÐC€ð #ð °ð Àtð ÐPSð ð ð ð ð2 ØØØðd7ð d7ð d7ð d7ð d7ðN-0ð -0ð -0ð -0ð` ð °Tð ¸dÀT¹kð ð ð ð ðD'˜Tð 'ð 'ð 'ð 'ð0#ð #ð #ð
ð ð ð ð ð rb   