§
    ¦¨îi_ ã                   ó”  — U 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mZmZ ddl	Z	ddl
Z
ddlmZ  ej        e¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        Z ej        d¦  «        ZeZ eh d	£¦  «        Z ej        d
¦  «        Zh d£Zh d£Zh d£ZddhZ ej        dej        ¦  «        Z ej        dej        ¦  «        Zde fd„Z!de de"fd„Z#de$de%de&dz  fd„Z'ddœde%fd„Z(dddd d!d"gd#d$œd d%d&œd d'd&œd(œg d)œd*œZ)d+„ Z*d,„ Z+d-„ Z,d.e d/e fd0„Z-d1„ Z.d2„ Z/d.e d3e d4e dz  fd5„Z0dSd6„Z1dTd8„Z2de de fd9„Z3i Z4ee e5f         e6d:<   d3e d;e5ddfd<„Z7d3e dee5         fd=„Z8dSd>„Z9d?„ Z:d@„ Z;dUdA„Z<dB„ Z=dC„ Z>dD„ Z?dE„ Z@dSdF„ZAdG„ ZBdH„ ZCdI„ ZDdUdJ„ZEdK„ ZFdSdL„ZGdM„ ZHdN„ ZIddOlJmKZKmLZL  eKjM        ddPe)e*eHdQ¬R¦  «         dS )Va$  Send Message Tool -- cross-channel messaging via platform APIs.

Sends a message to a user or channel on any connected messaging platform
(Telegram, Discord, Slack). Supports listing available targets and resolving
human-friendly channel names to IDs. Works in both CLI and gateway contexts.
é    N)ÚDictÚOptional)Úredact_sensitive_textz^\s*(-?\d+)(?::(\d+))?\s*$zD^\s*((?:oc|ou|on|chat|open)_[-A-Za-z0-9]+)(?::([-A-Za-z0-9_]+))?\s*$z^\s*([CGD][A-Z0-9]{8,})\s*$zS^\s*((?:wxid|gh|v\d+|wm|wb)_[A-Za-z0-9_-]+|[A-Za-z0-9._-]+@chatroom|filehelper)\s*$>   ÚsmsÚsignalÚwhatsappz^\s*\+(\d{7,15})\s*$>   ú.gifú.jpgú.pngú.jpegú.webp>   ú.3gpú.aviú.mkvú.movú.mp4>   ú.m4aú.mp3ú.wavú.oggú.opusr   r   zP([?&](?:access_token|api[_-]?key|auth[_-]?token|token|signature|sig)=)([^&#\s]+)zJ\b(access_token|api[_-]?key|auth[_-]?token|signature|sig)\s*=\s*([^\s,;]+)Úreturnc                 ó”   — t          | ¦  «        }t                               d„ |¦  «        }t                               d„ |¦  «        }|S )zCRedact secrets from error text before surfacing it to users/models.c                 ó2   — |                       d¦  «        › d�S )Né   z***©Úgroup©Úms    ú9/home/div/.hermes/hermes-agent/tools/send_message_tool.pyú<lambda>z&_sanitize_error_text.<locals>.<lambda>9   s   € °Q·W²W¸Q±Z´ZÐ2DÐ2DÐ2D€ ó    c                 ó2   — |                       d¦  «        › d�S )Nr   z=***r   r   s    r    r!   z&_sanitize_error_text.<locals>.<lambda>:   s   € ¸!¿'º'À!¹*¼*Ð7JÐ7JÐ7J€ r"   )r   Ú_URL_SECRET_QUERY_REÚsubÚ_GENERIC_SECRET_ASSIGN_RE)ÚtextÚredacteds     r    Ú_sanitize_error_textr)   6   sF   € å$ TÑ*Ô*€HÝ#×'Ò'Ð(DÐ(DÀhÑOÔO€HÝ(×,Ò,Ð-JÐ-JÈHÑUÔU€HØ€Or"   Úmessagec                 ó$   — dt          | ¦  «        iS )z9Build a standardized error payload with redacted content.Úerror)r)   )r*   s    r    Ú_errorr-   >   s   € àÕ)¨'Ñ2Ô2Ð3Ð3r"   ÚexcÚattemptc                 óR  — t          | dd ¦  «        }|�6	 t          t          |¦  «        d¦  «        S # t          t          f$ r Y dS w xY wt          | ¦  «                             ¦   «         }d|v sd|v rd S d|v sd|v sd|v sd	|v sd
|v sd|v sd|v sd|v rt          d|z  ¦  «        S d S )NÚretry_afterg        g      ð?z	timed outÚtimeoutzbad gatewayÚ502ztoo many requestsÚ429zservice unavailableÚ503zgateway timeoutÚ504é   )ÚgetattrÚmaxÚfloatÚ	TypeErrorÚ
ValueErrorÚstrÚlower)r.   r/   r1   r'   s       r    Ú_telegram_retry_delayr?   C   sõ   € Ý˜#˜}¨dÑ3Ô3€KØÐð	Ý•u˜[Ñ)Ô)¨3Ñ/Ô/Ð/øÝ�:Ð&ð 	ð 	ð 	Ø�3�3ð	øøøõ ˆs‰8Œ8�>Š>ÑÔ€DØ�dÐÐ˜i¨4Ð/Ð/Øˆtà˜ÐÐØ�Dˆ=ˆ=Ø $Ð&Ð&Ø�Dˆ=ˆ=Ø  DÐ(Ð(Ø�Dˆ=ˆ=Ø Ð$Ð$Ø�Dˆ=ˆ=å�Q˜'‘\Ñ"Ô"Ð"Øˆ4s   •2 ²AÁAé   )ÚattemptsrA   c             ‹   óN  K  — t          |¦  «        D ]’}	  | j        di |¤Žƒ d {V —†c S # t          $ rn}t          ||¦  «        }|�	||dz
  k    r‚ t                               d|dz   ||t          |¦  «        ¦  «         t          j        |¦  «        ƒ d {V —† Y d }~Œ‹d }~ww xY wd S )Nr   zFTransient Telegram send failure (attempt %d/%d), retrying in %.1fs: %s© )	ÚrangeÚsend_messageÚ	Exceptionr?   ÚloggerÚwarningr)   ÚasyncioÚsleep)ÚbotrA   Úkwargsr/   r.   Údelays         r    Ú!_send_telegram_message_with_retryrN   \   s  è è € Ý˜‘?”?ð 'ð 'ˆð	'Ø)˜Ô)Ð3Ð3¨FÐ3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3øÝð 	'ð 	'ð 	'Ý)¨#¨wÑ7Ô7ˆEØˆ} ¨8°a©<Ò 7Ð 7ØÝ�NŠNØXØ˜!‘ØØÝ$ SÑ)Ô)ñô ð õ ”- Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøð	'øøøð'ð 's   •*ª
B"´A$BÂB"rE   a‹  Send a message to a connected messaging platform, or list available targets.

IMPORTANT: When the user asks to send to a specific channel or person (not just a bare platform name), call send_message(action='list') FIRST to see available targets, then send to the correct one.
If the user just says a platform name like 'send to telegram', send directly to the home channel without listing first.ÚobjectÚstringÚsendÚlistzAction to perform. 'send' (default) sends a message. 'list' returns all available channels/contacts across connected platforms.)ÚtypeÚenumÚdescriptiona~  Delivery target. Format: 'platform' (uses home channel), 'platform:#channel-name', 'platform:chat_id', or 'platform:chat_id:thread_id' for Telegram topics and Discord threads. Examples: 'telegram', 'telegram:-1001234567890:17585', 'discord:999888777:555444333', 'discord:#bot-home', 'slack:#engineering', 'signal:+155****4567', 'matrix:!roomid:server.org', 'matrix:@user:server.org')rS   rU   zThe message text to send)ÚactionÚtargetr*   )rS   Ú
propertiesÚrequired)ÚnamerU   Ú
parametersc                 ót   — |                       dd¦  «        }|dk    rt          ¦   «         S t          | ¦  «        S )z-Handle cross-channel send_message tool calls.rV   rQ   rR   )ÚgetÚ_handle_listÚ_handle_send)ÚargsÚkwrV   s      r    Úsend_message_toolrb   Ž   s8   € à�XŠX�h Ñ'Ô'€Fà�ÒÐÝ‰~Œ~Ðå˜ÑÔÐr"   c                  óÂ   — 	 ddl m}  t          j        d | ¦   «         i¦  «        S # t          $ r.}t          j        t          d|› �¦  «        ¦  «        cY d}~S d}~ww xY w)z5Return formatted list of available messaging targets.r   )Úformat_directory_for_displayÚtargetsz"Failed to load channel directory: N)Úgateway.channel_directoryrd   ÚjsonÚdumpsrF   r-   )rd   Úes     r    r^   r^   ˜   sŒ   € ðLØJÐJÐJÐJÐJÐJÝŒz˜9Ð&BÐ&BÑ&DÔ&DÐEÑFÔFÐFøÝð Lð Lð LÝŒz�&Ð!IÀaÐ!IÐ!IÑJÔJÑKÔKÐKÐKÐKÐKÐKÐKøøøøðLøøøs   ‚#& ¦
A°#AÁAÁAc           
      óÄ  — |                       dd¦  «        }|                       dd¦  «        }|r|st          d¦  «        S |                     dd¦  «        }|d                              ¦   «                              ¦   «         }t          |¦  «        dk    r|d                              ¦   «         nd}d}d}|rt          ||¦  «        \  }}}nd	}|rw|su	 dd
lm}	  |	||¦  «        }
|
rt          ||
¦  «        \  }}}nt          j
        dd|› d|› d�i¦  «        S n-# t          $ r  t          j
        dd|› d|› d�i¦  «        cY S w xY wddlm}  |¦   «         rt          d¦  «        S 	 ddlm}m}  |¦   «         }n;# t          $ r.}t          j
        t#          d|› �¦  «        ¦  «        cY d}~S d}~ww xY wi d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d|j        “d |j        “d!|j        “d"|j         “d#|j!        “d$|j"        “}|                      |¦  «        }|s<d% #                    | $                    ¦   «         ¦  «        }t          d&|› d'|› �¦  «        S |j%                              |¦  «        }|r|j&        sá|d"k    rÈtO          j(        d(d¦  «                             ¦   «         }tO          j(        d)d¦  «                             ¦   «         }|re|rcdd*lm)}  |d+||tO          j(        d,d¦  «                             ¦   «         tO          j(        d-d¦  «                             ¦   «         d.œ¬/¦  «        }n&t          d0|› d1�¦  «        S t          d0|› d1�¦  «        S dd2l*m+} | ,                    |¦  «        \  }}|                     ¦   «         pt[          |¦  «        }d	}|s˜| .                    |¦  «        }|sC|d"k    r=tO          j(        d3d¦  «                             ¦   «         }|rdd4lm/}  |||d5¬6¦  «        }|r
|j0        }d+}n2t          j
        dd7|› d8|› d9| 1                    ¦   «         › d:�i¦  «        S te          |||¦  «        } | rt          j
        | ¦  «        S 	 dd;l3m4}!  |!tk          ||||||¬<¦  «        ¦  «        }"|r6tm          |"tn          ¦  «        r!|"                      d=¦  «        rd>|› d?|› d@�|"dA<   tm          |"tn          ¦  «        rV|"                      d=¦  «        rA|r?	 ddBl8m9}# ddCl:m;}$  |$dDdE¦  «        }% |#||||%|¬F¦  «        rd+|"dG<   n# t          $ r Y nw xY wtm          |"tn          ¦  «        rd|"v rty          |"d         ¦  «        |"d<   t          j
        |"¦  «        S # t          $ r.}t          j
        t#          dH|› �¦  «        ¦  «        cY d}~S d}~ww xY w)Iz$Send a message to a platform target.rW   Ú r*   z;Both 'target' and 'message' are required when action='send'ú:r   r   NF)Úresolve_channel_namer,   zCould not resolve 'z' on z;. Use send_message(action='list') to see available targets.z). Try using a numeric channel ID instead.)Úis_interruptedÚInterrupted)Úload_gateway_configÚPlatformzFailed to load gateway config: ÚtelegramÚdiscordÚslackr   r   ÚbluebubblesÚqqbotÚmatrixÚ
mattermostÚhomeassistantÚdingtalkÚfeishuÚwecomÚwecom_callbackÚweixinÚemailr   z, zUnknown platform: z. Available: ÚWEIXIN_TOKENÚWEIXIN_ACCOUNT_ID©ÚPlatformConfigTÚWEIXIN_BASE_URLÚWEIXIN_CDN_BASE_URL)Ú
account_idÚbase_urlÚcdn_base_url)ÚenabledÚtokenÚextraz
Platform 'zZ' is not configured. Set up credentials in ~/.hermes/config.yaml or environment variables.)ÚBasePlatformAdapterÚWEIXIN_HOME_CHANNEL)ÚHomeChannelzWeixin Home)ÚplatformÚchat_idrZ   zNo home channel set for zQ to determine where to send the message. Either specify a channel directly with 'z=:CHANNEL_NAME', or set a home channel via: hermes config set z_HOME_CHANNEL <channel_id>)Ú
_run_async)Ú	thread_idÚmedia_filesÚsuccesszSent to z home channel (chat_id: ú)Únote)Úmirror_to_session©Úget_session_envÚHERMES_SESSION_PLATFORMÚcli)Úsource_labelr’   ÚmirroredzSend failed: )=r]   Ú
tool_errorÚsplitÚstripr>   ÚlenÚ_parse_target_refrf   rm   rg   rh   rF   Útools.interruptrn   Úgateway.configrp   rq   r-   ÚTELEGRAMÚDISCORDÚSLACKÚWHATSAPPÚSIGNALÚBLUEBUBBLESÚQQBOTÚMATRIXÚ
MATTERMOSTÚHOMEASSISTANTÚDINGTALKÚFEISHUÚWECOMÚWECOM_CALLBACKÚWEIXINÚEMAILÚSMSÚjoinÚkeysÚ	platformsr‰   ÚosÚgetenvrƒ   Úgateway.platforms.baserŒ   Úextract_mediaÚ_describe_media_for_mirrorÚget_home_channelrŽ   r�   ÚupperÚ_maybe_skip_cron_duplicate_sendÚmodel_toolsr‘   Ú_send_to_platformÚ
isinstanceÚdictÚgateway.mirrorr—   Úgateway.session_contextr™   r)   )&r`   rW   r*   ÚpartsÚplatform_nameÚ
target_refr�   r’   Úis_explicitrm   ÚresolvedÚ_rn   rp   rq   Úconfigri   Úplatform_mapr�   ÚavailÚpconfigÚwx_tokenÚ
wx_accountrƒ   rŒ   r“   Úcleaned_messageÚmirror_textÚused_home_channelÚhomeÚwx_homerŽ   Úduplicate_skipr‘   Úresultr—   r™   rœ   s&                                         r    r_   r_   ¡   sƒ  € à�XŠX�h Ñ#Ô#€FØ�hŠh�y "Ñ%Ô%€GØð Y˜ð YÝÐWÑXÔXÐXà�LŠL˜˜aÑ Ô €EØ˜!”H—N’NÑ$Ô$×*Ò*Ñ,Ô,€MÝ%(¨¡Z¤Z°!¢^ ^��q”—’Ñ!Ô!Ð!¸€JØ€GØ€Iàð Ý*;¸MÈ:Ñ*VÔ*VÑ'ˆ�˜K˜Kàˆð ð ˜+ð ð	ØFÐFÐFÐFÐFÐFØ+Ð+¨M¸:ÑFÔFˆHØð Ý(9¸-ÈÑ(RÔ(RÑ%�˜ A Aå”zØð Q°:ð Qð QÀMð Qð Qð Qð#ñ ô ð ð %&øõ ð 	ð 	ð 	Ý”:Øð ;¨zð ;ð ;Àð ;ð ;ð ;ðñ ô ð ð ð ð	øøøð /Ð.Ð.Ð.Ð.Ð.Ø€~ÑÔð )Ý˜-Ñ(Ô(Ð(ðIØ@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø$Ð$Ñ&Ô&ˆˆøÝð Ið Ið IÝŒz�&Ð!FÀ1Ð!FÐ!FÑGÔGÑHÔHÐHÐHÐHÐHÐHÐHøøøøðIøøøðØ�HÔ%ðà�8Ô#ðð 	�”ðð 	�HÔ%ð	ð
 	�(”/ðð 	�xÔ+ðð 	�”ðð 	�(”/ðð 	�hÔ)ðð 	˜Ô/ðð 	�HÔ%ðð 	�(”/ðð 	�”ðð 	˜(Ô1ðð 	�(”/ðð  	�”ð!ð" 	ˆxŒ|ð#€Lð& ×Ò Ñ.Ô.€HØð TØ—	’	˜,×+Ò+Ñ-Ô-Ñ.Ô.ˆÝÐR¨}ÐRÐRÈ5ÐRÐRÑSÔSÐSàÔ×"Ò" 8Ñ,Ô,€GØð V˜'œ/ð Vð ˜HÒ$Ð$Ý”y °Ñ4Ô4×:Ò:Ñ<Ô<ˆHÝœÐ#6¸Ñ;Ô;×AÒAÑCÔCˆJØð Z˜Jð ZØ9Ð9Ð9Ð9Ð9Ð9Ø(˜.Ø Ø"à&0Ý$&¤IÐ.?ÀÑ$DÔ$D×$JÒ$JÑ$LÔ$LÝ(*¬	Ð2GÈÑ(LÔ(L×(RÒ(RÑ(TÔ(Tðð ðñ ô ��õ "ð  #Y¨}ð  #Yð  #Yð  #Yñ  Zô  Zð  Zåð  U¨=ð  Uð  Uð  Uñ  Vô  Vð  Và:Ð:Ð:Ð:Ð:Ð:à#6×#DÒ#DÀWÑ#MÔ#MÑ €K�Ø!×'Ò'Ñ)Ô)ÐTÕ-GÈÑ-TÔ-T€KàÐØð Ø×&Ò& xÑ0Ô0ˆØð 	[˜¨Ò1Ð1Ý”iÐ 5°rÑ:Ô:×@Ò@ÑBÔBˆGØð [Ø6Ð6Ð6Ð6Ð6Ð6Ø"�{¨H¸gÈMÐZÑZÔZ�Øð 	Ø”lˆGØ $ÐÐå”:Øð r°Mð rð rØ;Hðrð rà@M×@SÒ@SÑ@UÔ@Uðrð rð rðñ ô ð õ 5°]ÀGÈYÑWÔW€NØð *ÝŒz˜.Ñ)Ô)Ð)ð7Ø*Ð*Ð*Ð*Ð*Ð*Ø�ÝØØØØØ#Ø'ðñ ô ñ	
ô 	
ˆð ð 	Z¥¨FµDÑ!9Ô!9ð 	Z¸f¿jºjÈÑ>SÔ>Sð 	ZØY¨ÐYÐYÈwÐYÐYÐYˆF�6‰Nõ �f�dÑ#Ô#ð 	¨¯
ª
°9Ñ(=Ô(=ð 	À+ð 	ðØ<Ð<Ð<Ð<Ð<Ð<ØCÐCÐCÐCÐCÐCØ.˜Ð/HÈ%ÑPÔP�Ø$Ð$ ]°G¸[ÐWcÐoxÐyÑyÔyð .Ø)-�F˜:Ñ&øøÝð ð ð Ø�ðøøøõ �f�dÑ#Ô#ð 	D¨°6Ð(9Ð(9Ý2°6¸'´?ÑCÔCˆF�7‰OÝŒz˜&Ñ!Ô!Ð!øÝð 7ð 7ð 7ÝŒz�&Ð!4°Ð!4Ð!4Ñ5Ô5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøsu   ÃAD Ä'EÅEÅ'E: Å:
F2Æ#F-Æ'F2Æ-F2ÒBV' Ô$-U ÕV' Õ
UÕV' ÕUÕAV' Ö'
WÖ1#W×W×WrÈ   rÉ   c                 óö  — | dk    rGt                                |¦  «        }|r+|                     d¦  «        |                     d¦  «        dfS | dk    rGt                               |¦  «        }|r+|                     d¦  «        |                     d¦  «        dfS | dk    rGt                               |¦  «        }|r+|                     d¦  «        |                     d¦  «        dfS | dk    r4t
                               |¦  «        }|r|                     d¦  «        ddfS | d	k    r4t                               |¦  «        }|r|                     d¦  «        ddfS | t          v r3t                               |¦  «        }|r| 	                    ¦   «         ddfS | 
                    d
¦  «                             ¦   «         r|ddfS | dk    r/|                     d¦  «        s|                     d¦  «        r|ddfS dS )zFParse a tool target into chat_id/thread_id and whether it is explicit.rr   r   r7   Tr{   rs   rt   Nr~   Ú-rw   ú!ú@©NNF)Ú_TELEGRAM_TOPIC_TARGET_REÚ	fullmatchr   Ú_FEISHU_TARGET_REÚ_NUMERIC_TOPIC_REÚ_SLACK_TARGET_REÚ_WEIXIN_TARGET_REÚ_PHONE_PLATFORMSÚ_E164_TARGET_REr    ÚlstripÚisdigitÚ
startswith)rÈ   rÉ   Úmatchs      r    r¢   r¢   :  s  € à˜
Ò"Ð"Ý)×3Ò3°JÑ?Ô?ˆØð 	8Ø—;’;˜q‘>”> 5§;¢;¨q¡>¤>°4Ð7Ð7Ø˜Ò Ð Ý!×+Ò+¨JÑ7Ô7ˆØð 	8Ø—;’;˜q‘>”> 5§;¢;¨q¡>¤>°4Ð7Ð7Ø˜	Ò!Ð!Ý!×+Ò+¨JÑ7Ô7ˆØð 	8Ø—;’;˜q‘>”> 5§;¢;¨q¡>¤>°4Ð7Ð7Ø˜ÒÐÝ ×*Ò*¨:Ñ6Ô6ˆØð 	.Ø—;’;˜q‘>”> 4¨Ð-Ð-Ø˜Ò Ð Ý!×+Ò+¨JÑ7Ô7ˆØð 	.Ø—;’;˜q‘>”> 4¨Ð-Ð-ØÕ(Ð(Ð(Ý×)Ò)¨*Ñ5Ô5ˆØð 	2ð ×#Ò#Ñ%Ô% t¨TÐ1Ð1Ø×Ò˜ÑÔ×%Ò%Ñ'Ô'ð &Ø˜4 Ð%Ð%à˜Ò Ð  j×&;Ò&;¸CÑ&@Ô&@Ð ÀJ×DYÒDYÐZ]ÑD^ÔD^Ð Ø˜4 Ð%Ð%ØÐr"   c                 ó:  — | sdS t          | ¦  «        dk    rr| d         \  }}t          j                             |¦  «        d                              ¦   «         }|r|t
          v rdS |t          v rdS |t          v rdS |t          v rdS dS d	t          | ¦  «        › d
�S )zJReturn a human-readable mirror summary when a message only contains media.rk   r   r   z[Sent voice message]z[Sent image attachment]z[Sent video attachment]z[Sent audio attachment]z[Sent document attachment]z[Sent z media attachments])	r¡   r¹   ÚpathÚsplitextr>   Ú_VOICE_EXTSÚ_IMAGE_EXTSÚ_VIDEO_EXTSÚ_AUDIO_EXTS)r“   Ú
media_pathÚis_voiceÚexts       r    r½   r½   ^  sÀ   € àð ØˆrÝ
ˆ;ÑÔ˜1ÒÐØ*¨1œ~Ñˆ
�HÝŒg×Ò˜zÑ*Ô*¨1Ô-×3Ò3Ñ5Ô5ˆØð 	*˜�{Ð*Ð*Ø)Ð)Ø•+ÐÐØ,Ð,Ø•+ÐÐØ,Ð,Ø•+ÐÐØ,Ð,Ø+Ð+Ø9•C˜Ñ$Ô$Ð9Ð9Ð9Ð9r"   c                  ó  — ddl m}   | dd¦  «                             ¦   «                              ¦   «         } | dd¦  «                             ¦   «         }|r|sdS  | dd¦  «                             ¦   «         pd}|||dœS )	zMReturn the cron scheduler's auto-delivery target for the current run, if any.r   r˜   Ú!HERMES_CRON_AUTO_DELIVER_PLATFORMrk   Ú HERMES_CRON_AUTO_DELIVER_CHAT_IDNÚ"HERMES_CRON_AUTO_DELIVER_THREAD_ID)r�   r�   r’   )rÆ   r™   r    r>   )r™   r�   r�   r’   s       r    Ú_get_cron_auto_delivery_targetrù   q  s¬   € à7Ð7Ð7Ð7Ð7Ð7ØˆÐBÀBÑGÔG×MÒMÑOÔO×UÒUÑWÔW€HØˆoÐ@À"ÑEÔE×KÒKÑMÔM€GØð ˜7ð ØˆtØ�Ð DÀbÑIÔI×OÒOÑQÔQÐYÐUY€IàØØðð ð r"   r�   r’   c                 óþ   — t          ¦   «         }|sdS |d         | k    o>t          |d         ¦  «        t          |¦  «        k    o|                     d¦  «        |k    }|sdS | › d|› �}|�|d|› �z  }ddd|d|› d	�d
œS )zRSkip redundant cron send_message calls when the scheduler will auto-deliver there.Nr�   r�   r’   rl   TÚ#cron_auto_delivery_duplicate_targetzSkipped send_message to zÓ. This cron job will already auto-deliver its final response to that same target. Put the intended user-facing content in your final response instead, or use a different target if you want an additional message.)r”   ÚskippedÚreasonrW   r–   )rù   r=   r]   )rÈ   r�   r’   Úauto_targetÚsame_targetÚtarget_labels         r    rÀ   rÀ   €  sÖ   € å0Ñ2Ô2€KØð Øˆtð 	�JÔ =Ò0ð 	6Ý�˜IÔ&Ñ'Ô'­3¨w©<¬<Ò7ð	6à�OŠO˜KÑ(Ô(¨IÒ5ð ð
 ð Øˆtà#Ð/Ð/ gÐ/Ð/€LØÐØ˜˜I˜˜Ñ'ˆð ØØ7Øðh |ð hð hð hð
ð 
ð 
r"   c           	   ƒ   óˆ  K  — ddl m} ddlm}m} ddlm}	 ddlm}
 	 ddl	m
} d}n# t          $ r d}Y nw xY w	 dd	lm} d}n# t          $ r d}Y nw xY w|pg }| |j        k    rZ|rX	 |
                     |
¦  «        }|                     |¦  «        }n,# t"          $ r t$                               d
d¬¦  «         Y nw xY w|j        |r|j        nd|j        |	j        |j        |
j        i}|r|j        ||j        <   |                     | ¦  «        }|r(| |j        k    r|nd}|                     |||¬¦  «        }n|g}| |j        k    r»d}t5          t7          |di ¦  «        o|j                             d¦  «        ¦  «        }t;          |¦  «        D ]o\  }}|t=          |¦  «        dz
  k    }t?          |j         |||r|ng ||¬¦  «        ƒ d{V —†}tC          |tD          ¦  «        r|                     d¦  «        r|c S |}Œp|S | |j#        k    rtI          ||||¬¦  «        ƒ d{V —†S | |j        k    r‚d}t;          |¦  «        D ]n\  }}|t=          |¦  «        dz
  k    }tK          |j         |||r|ng |¬¦  «        ƒ d{V —†}tC          |tD          ¦  «        r|                     d¦  «        r|c S |}Œo|S | |j&        k    r|r}d}t;          |¦  «        D ]i\  }}|t=          |¦  «        dz
  k    }tO          ||||r|ng |¬¦  «        ƒ d{V —†}tC          |tD          ¦  «        r|                     d¦  «        r|c S |}Œj|S | |j(        k    rƒ|r�d}t;          |¦  «        D ]m\  }}|t=          |¦  «        dz
  k    }tS          |j        |||r|ng ¬¦  «        ƒ d{V —†}tC          |tD          ¦  «        r|                     d¦  «        r|c S |}Œn|S |r!| *                    ¦   «         sdd| j+        › d�iS d}|rd| j+        › d�}d}|D �]W}| |j        k    rtY          |j         ||¦  «        ƒ d{V —†}�nû| |j-        k    rt]          |j        ||¦  «        ƒ d{V —†}�nÒ| |j(        k    rtS          |j        ||¦  «        ƒ d{V —†}�n©| |j/        k    rta          |j        ||¦  «        ƒ d{V —†}�n€| |j1        k    rte          |j3        ||¦  «        ƒ d{V —†}�nW| |j4        k    r$tk          |j         |j        ||¦  «        ƒ d{V —†}�n(| |j&        k    r#tm          |j         |j        ||¦  «        ƒ d{V —†}nú| |j7        k    r#tq          |j         |j        ||¦  «        ƒ d{V —†}nÌ| |j9        k    rtu          |j        ||¦  «        ƒ d{V —†}n¤| |j        k    rtw          ||||¬¦  «        ƒ d{V —†}n| |j<        k    rt{          |j        ||¦  «        ƒ d{V —†}nW| |j>        k    rt          |j        ||¦  «        ƒ d{V —†}n/| |j@        k    rtƒ          |||¦  «        ƒ d{V —†}ndd| j+        › �i}tC          |tD          ¦  «        r|                     d¦  «        r|c S |}�ŒY|rgtC          |tD          ¦  «        rR|                     d¦  «        r=t…          |                     dg ¦  «        ¦  «        }| C                    |¦  «         ||d<   |S )a  Route a message to the appropriate platform sender.

    Long messages are automatically chunked to fit within platform limits
    using the same smart-splitting algorithm as the gateway adapters
    (preserves code-block boundaries, adds part indicators).
    r   )rq   )rŒ   Ú	utf16_len)ÚDiscordAdapter)ÚSlackAdapter©ÚTelegramAdapterTF)ÚFeishuAdapterz<Failed to apply Slack mrkdwn formatting in _send_to_platform©Úexc_infoi   N)Úlen_fnr‹   Údisable_link_previewsr   )r“   r’   r  r,   )r“   )r“   r’   zrsend_message MEDIA delivery is currently only supported for telegram, discord, matrix, weixin, and signal; target z had only media attachmentsz#MEDIA attachments were omitted for zr; native send_message media delivery is currently only supported for telegram, discord, matrix, weixin, and signal)r’   z'Direct sending not yet implemented for r”   Úwarnings)Dr¤   rq   r»   rŒ   r  Úgateway.platforms.discordr  Úgateway.platforms.slackr  Úgateway.platforms.telegramr  ÚImportErrorÚgateway.platforms.feishur  r§   Ú__new__Úformat_messagerF   rG   Údebugr¥   ÚMAX_MESSAGE_LENGTHr¦   r°   r]   Útruncate_messageÚboolr8   r‹   Ú	enumerater¡   Ú_send_telegramrŠ   rÃ   rÄ   r³   Ú_send_weixinÚ_send_discordr¬   Ú_send_matrix_via_adapterr©   Ú_send_signalr    ÚvalueÚ_send_slackr¨   Ú_send_whatsappr´   Ú_send_emailrµ   Ú	_send_smsÚapi_keyr­   Ú_send_mattermostÚ_send_matrixr®   Ú_send_homeassistantr¯   Ú_send_dingtalkÚ_send_feishur±   Ú_send_wecomrª   Ú_send_bluebubblesr«   Ú_send_qqbotrR   Úappend)r�   rÐ   r�   r*   r’   r“   rq   rŒ   r  r  r  r  Ú_telegram_availabler  Ú_feishu_availableÚslack_adapterÚ_MAX_LENGTHSÚmax_lenÚ_len_fnÚchunksÚlast_resultr  ÚiÚchunkÚis_lastrÙ   rH   r  s                               r    rÂ   rÂ   Ÿ  s¨	  è è € ð (Ð'Ð'Ð'Ð'Ð'ØEÐEÐEÐEÐEÐEÐEÐEØ8Ð8Ð8Ð8Ð8Ð8Ø4Ð4Ð4Ð4Ð4Ð4ð$Ø>Ð>Ð>Ð>Ð>Ð>Ø"ÐÐøÝð $ð $ð $Ø#ÐÐÐð$øøøð"Ø:Ð:Ð:Ð:Ð:Ð:Ø ÐÐøÝð "ð "ð "Ø!ÐÐÐð"øøøð Ð# €Kà�8”>Ò!Ð! gÐ!ð	hØ(×0Ò0°Ñ>Ô>ˆMØ#×2Ò2°7Ñ;Ô;ˆGˆGøÝð 	hð 	hð 	hÝ�LŠLÐWÐbfˆLÑgÔgÐgÐgÐgð	høøøð
 	ÔÐATÐ^˜?Ô=Ð=ÐZ^ØÔ˜.Ô;ØŒ˜Ô7ð€Lð
 ð IØ(5Ô(Hˆ�X”_Ñ%ð
 ×Ò˜xÑ(Ô(€GØð Ø'¨8Ô+<Ò<Ð<�)�)À$ˆØ$×5Ò5°g¸wÈwÐ5ÑWÔWˆˆà�ˆð �8Ô$Ò$Ð$ØˆÝ $¥W¨W°g¸rÑ%BÔ%BÐ%qÀwÄ}×GXÒGXÐYpÑGqÔGqÑ rÔ rÐÝ! &Ñ)Ô)ð 	!ð 	!‰HˆAˆuØ�C ™KœK¨!™OÒ+ˆGÝ)Ø”ØØØ+2Ð:˜K˜K¸Ø#Ø&;ðñ ô ð ð ð ð ð ð ˆFõ ˜&¥$Ñ'Ô'ð ¨F¯JªJ°wÑ,?Ô,?ð Ø���Ø ˆKˆKØÐð �8”?Ò"Ð"Ý! '¨7°GÈÐUÑUÔUÐUÐUÐUÐUÐUÐUÐUð �8Ô#Ò#Ð#ØˆÝ! &Ñ)Ô)ð 	!ð 	!‰HˆAˆuØ�C ™KœK¨!™OÒ+ˆGÝ(Ø”ØØØ+2Ð:˜K˜K¸Ø#ðñ ô ð ð ð ð ð ð ˆFõ ˜&¥$Ñ'Ô'ð ¨F¯JªJ°wÑ,?Ô,?ð Ø���Ø ˆKˆKØÐð �8”?Ò"Ð" {Ð"ØˆÝ! &Ñ)Ô)ð 	!ð 	!‰HˆAˆuØ�C ™KœK¨!™OÒ+ˆGÝ3ØØØØ+2Ð:˜K˜K¸Ø#ðñ ô ð ð ð ð ð ð ˆFõ ˜&¥$Ñ'Ô'ð ¨F¯JªJ°wÑ,?Ô,?ð Ø���Ø ˆKˆKØÐð �8”?Ò"Ð" {Ð"ØˆÝ! &Ñ)Ô)ð 
	!ð 
	!‰HˆAˆuØ�C ™KœK¨!™OÒ+ˆGÝ'Ø”ØØØ+2Ð:˜K˜K¸ð	ñ ô ð ð ð ð ð ð ˆFõ ˜&¥$Ñ'Ô'ð ¨F¯JªJ°wÑ,?Ô,?ð Ø���Ø ˆKˆKØÐð ð 
˜7Ÿ=š=™?œ?ð 
àðFØ"œ.ðFð Fð Fð
ð 	
ð €GØð 
ð°(´.ð ð ð ð 	ð
 €KØð  ñ  ˆØ�x”~Ò%Ð%Ý& w¤}°g¸uÑEÔEÐEÐEÐEÐEÐEÐEˆF‰FØ˜Ô*Ò*Ð*Ý)¨'¬-¸À%ÑHÔHÐHÐHÐHÐHÐHÐHˆF‰FØ˜œÒ(Ð(Ý'¨¬°wÀÑFÔFÐFÐFÐFÐFÐFÐFˆF‰FØ˜œÒ'Ð'Ý& w¤}°g¸uÑEÔEÐEÐEÐEÐEÐEÐEˆF‰FØ˜œÒ%Ð%Ý$ W¤_°g¸uÑEÔEÐEÐEÐEÐEÐEÐEˆF‰FØ˜Ô,Ò,Ð,Ý+¨G¬M¸7¼=È'ÐSXÑYÔYÐYÐYÐYÐYÐYÐYˆF‰FØ˜œÒ(Ð(Ý'¨¬°w´}ÀgÈuÑUÔUÐUÐUÐUÐUÐUÐUˆFˆFØ˜Ô/Ò/Ð/Ý.¨w¬}¸g¼mÈWÐV[Ñ\Ô\Ð\Ð\Ð\Ð\Ð\Ð\ˆFˆFØ˜Ô*Ò*Ð*Ý)¨'¬-¸À%ÑHÔHÐHÐHÐHÐHÐHÐHˆFˆFØ˜œÒ(Ð(Ý'¨°¸%È9ÐUÑUÔUÐUÐUÐUÐUÐUÐUˆFˆFØ˜œÒ'Ð'Ý& w¤}°g¸uÑEÔEÐEÐEÐEÐEÐEÐEˆFˆFØ˜Ô-Ò-Ð-Ý,¨W¬]¸GÀUÑKÔKÐKÐKÐKÐKÐKÐKˆFˆFØ˜œÒ'Ð'Ý& w°¸Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?ˆFˆFàÐYÈÌÐYÐYÐZˆFå�f�dÑ#Ô#ð 	¨¯
ª
°7Ñ(;Ô(;ð 	ØˆMˆMˆMØˆ‰àð +•:˜k­4Ñ0Ô0ð +°[·_²_ÀYÑ5OÔ5Oð +Ý˜Ÿš¨
°BÑ7Ô7Ñ8Ô8ˆØ�Š˜Ñ Ô Ð Ø"*ˆ�JÑØÐs/   ž' §6µ6ºA ÁAÁAÁ'*B Â&B;Â:B;Fc              ƒ   óú  K  — 	 ddl m} ddlm} t	          t          j        d|¦  «        ¦  «        }|r
|}	|j        }
nK	 ddlm	} | 
                    |¦  «        }|                     |¦  «        }	n# t          $ r |}	Y nw xY w|j        }
 || ¬¦  «        }t          |¦  «        }|pg }i }|�t          |¦  «        |d<   |rd	|d
<   d}g }|	                     ¦   «         �r	 t!          |f||	|
dœ|¤Žƒ d{V —†}në# t          $ rÞ}dt#          |¦  «                             ¦   «         v sFdt#          |¦  «                             ¦   «         v s#dt#          |¦  «                             ¦   «         v rjt&                               d|
t+          |¦  «        ¦  «         |s%	 ddlm}  ||	¦  «        }n# t          $ r |}Y nw xY w|}t!          |f||ddœ|¤Žƒ d{V —†}n‚ Y d}~nd}~ww xY w|D �]®\  }}t.          j                             |¦  «        s5d|› �}t&                               |¦  «         |                     |¦  «         ŒZt.          j                             |¦  «        d                              ¦   «         }	 t9          |d¦  «        5 }|t:          v r |j        d#||dœ|¤Žƒ d{V —†}nx|t>          v r |j         d#||dœ|¤Žƒ d{V —†}nX|tB          v r|r |j"        d#||dœ|¤Žƒ d{V —†}n6|tF          v r |j$        d#||dœ|¤Žƒ d{V —†}n |j%        d#||dœ|¤Žƒ d{V —†}ddd¦  «         n# 1 swxY w Y   �ŒT# t          $ rO}t+          d|› d|› �¦  «        }t&           &                    |¦  «         |                     |¦  «         Y d}~�Œ¨d}~ww xY w|€d}|r||dœS d|iS d	d|t#          |j'        ¦  «        dœ}|r||d <   |S # tP          $ r dd!icY S t          $ r}tS          d"|› �¦  «        cY d}~S d}~ww xY w)$uD  Send via Telegram Bot API (one-shot, no polling needed).

    Applies markdownâ†’MarkdownV2 formatting (same as the gateway adapter)
    so that bold, links, and headers render correctly.  If the message
    already contains HTML tags, it is sent with ``parse_mode='HTML'``
    instead, bypassing MarkdownV2 conversion.
    r   )ÚBot)Ú	ParseModez<[a-zA-Z/][^>]*>r  )rŠ   NÚmessage_thread_idTÚdisable_web_page_preview)r�   r'   Ú
parse_modeÚparseÚmarkdownÚhtmlzFParse mode %s failed in _send_telegram, falling back to plain text: %s)Ú_strip_mdv2ú Media file not found, skipping: r   Úrb)r�   Úphoto)r�   Úvideo)r�   Úvoice)r�   Úaudio)r�   ÚdocumentúFailed to send media ú: úANo deliverable text or media remained after processing MEDIA tags©r,   r  r,   rr   ©r”   r�   r�   Ú
message_idr  zGpython-telegram-bot not installed. Run: pip install python-telegram-botzTelegram send failed: rC   )*rr   r9  Útelegram.constantsr:  r  ÚreÚsearchÚHTMLr  r  r  r  rF   ÚMARKDOWN_V2Úintr    rN   r=   r>   rG   rH   r)   rA  r¹   rì   Úexistsr,  rí   Úopenrï   Ú
send_photorð   Ú
send_videorî   Ú
send_voicerñ   Ú
send_audioÚsend_documentr,   rN  r  r-   )rŠ   r�   r*   r“   r’   r  r9  r:  Ú	_has_htmlÚ	formattedÚsend_parse_moder  Ú_adapterrK   Úint_chat_idÚthread_kwargsÚlast_msgr  Úmd_errorrA  Úplainrò   ró   rH   rô   Úfri   r,   rÙ   s                                r    r  r  W  s×  è è € ðv4Ø Ð Ð Ð Ð Ð Ø0Ð0Ð0Ð0Ð0Ð0õ �œÐ#6¸Ñ@Ô@ÑAÔAˆ	àð 	4ØˆIØ'œnˆOˆOð$ØFÐFÐFÐFÐFÐFØ*×2Ò2°?ÑCÔC�Ø$×3Ò3°GÑ<Ô<�	�	øÝð $ð $ð $à#�	�	�	ð$øøøð (Ô3ˆOàˆc˜ÐÑÔˆÝ˜'‘l”lˆØ!Ð' RˆØˆØÐ Ý14°Y±´ˆMÐ-Ñ.Ø ð 	=Ø8<ˆMÐ4Ñ5àˆØˆà�?Š?ÑÔñ 	ðÝ!BØð"à'¨iØ.ð"ð "ð 3@ð"ð "ð ð ð ð ð ð ��øõ
 ð ð ð à�c (™mœm×1Ò1Ñ3Ô3Ð3Ð3°zÅSÈÁ]Ä]×EXÒEXÑEZÔEZÐ7ZÐ7ZÐ^dÕhkÐltÑhuÔhu×h{Òh{Ñh}Ôh}Ð^}Ð^}Ý—N’NØ`Ø'Ý,¨XÑ6Ô6ñô ð ð
 %ð (ð,ØNÐNÐNÐNÐNÐNØ$/ K°	Ñ$:Ô$:˜E˜EøÝ(ð ,ð ,ð ,Ø$+˜E˜E˜Eð,øøøð !(˜Ý%FØð&à +°%Ø#'ð&ð &ð ,9ð&ð &ð  ð  ð  ð  ð  ð  �H�Hð ð �H�H�H�Høøøøð!øøøð0 %0ð !	)ñ !	)Ñ ˆJ˜Ý”7—>’> *Ñ-Ô-ð ØI¸ZÐIÐI�Ý—’˜wÑ'Ô'Ð'Ø—’ Ñ(Ô(Ð(Øå”'×"Ò" :Ñ.Ô.¨qÔ1×7Ò7Ñ9Ô9ˆCð)Ý˜* dÑ+Ô+ð ¨qØ�kÐ)Ð)Ø)7¨¬ð *Ø$/°qð*ð *Ø<Ið*ð *ð $ð $ð $ð $ð $ð $˜˜ð ¥Ð+Ð+Ø)7¨¬ð *Ø$/°qð*ð *Ø<Ið*ð *ð $ð $ð $ð $ð $ð $˜˜ð ¥Ð+Ð+°Ð+Ø)7¨¬ð *Ø$/°qð*ð *Ø<Ið*ð *ð $ð $ð $ð $ð $ð $˜˜ð ¥Ð+Ð+Ø)7¨¬ð *Ø$/°qð*ð *Ø<Ið*ð *ð $ð $ð $ð $ð $ð $˜˜ð *;¨Ô):ð *Ø$/¸!ð*ð *Ø?Lð*ð *ð $ð $ð $ð $ð $ð $˜ð%ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ùøõ* ð )ð )ð )Ý.Ð/XÀzÐ/XÐ/XÐUVÐ/XÐ/XÑYÔY�Ý—’˜WÑ%Ô%Ð%Ø—’ Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ñ(øøøøð)øøøð
 ÐØWˆEØð >Ø!&°HÐ=Ð=Ð=Ø˜UÐ#Ð#ð Ø"ØÝ˜hÔ1Ñ2Ô2ð	
ð 
ˆð ð 	*Ø!)ˆF�:ÑØˆøÝð dð dð dØÐbÐcÐcÐcÐcÝð 4ð 4ð 4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøsó   „:O ¿0A0 Á/O Á0A?Á<O Á>A?Á?AO ÃC7 Ã6O Ã7
GÄBGÆF(Æ'GÆ(F7Æ4GÆ6F7Æ7GÇO ÇGÇBO É6L8ÊBL+ÌL8Ì+L/	Ì/L8Ì2L/	Ì3L8Ì6O Ì8
NÍANÎO ÎNÎO ÎO Î#!O ÏO:Ï	O:ÏO5Ï/O:Ï5O:c                 óì   — |                       ¦   «                              dd¦  «        d                               ¦   «         }|                     d¦  «                              ¦   «         }|sd}|dd…         S )zMDerive a thread name from the first line of the message, capped at 100 chars.Ú
r   r   ú#zNew PostNéd   )r    rŸ   rç   )r*   Ú
first_lines     r    Ú_derive_forum_thread_namerk  Ø  sk   € à—’‘”×&Ò& t¨QÑ/Ô/°Ô2×8Ò8Ñ:Ô:€Jà×"Ò" 3Ñ'Ô'×-Ò-Ñ/Ô/€JØð  Øˆ
Ø�d�s�dÔÐr"   Ú!_DISCORD_CHANNEL_TYPE_PROBE_CACHEÚis_forumc                 óN   — t          |¦  «        t          t          | ¦  «        <   d S ©N)r  rl  r=   )r�   rm  s     r    Ú_remember_channel_is_forumrp  è  s   € Ý6:¸8±n´nÕ%¥c¨'¡l¤lÑ3Ð3Ð3r"   c                 óP   — t                                t          | ¦  «        ¦  «        S ro  )rl  r]   r=   )r�   s    r    Ú_probe_is_forum_cachedrr  ì  s   € Ý,×0Ò0µ°W±´Ñ>Ô>Ð>r"   c              ƒ   ó.  K  — 	 ddl }n# t          $ r ddicY S w xY w	 ddlm}m}  |d¬¦  «        } ||¦  «        \  }	}
dd	| › �i}i |¥d
di¥}|pg }d}g }|rd|› d�}�n.d}	 ddlm}  |d|¦  «        }n# t          $ r Y nw xY w|dk    rd}�n&|�d}�n t          |¦  «        }|�|}�nd}	 d|› �} |j	        d<d| 
                    d¬¦  «        i|	¤Ž4 ƒd{V —†} |j        |fd|i|
¤Ž4 ƒd{V —†}|j        dk    rC|                     ¦   «         ƒ d{V —†}|                     d¦  «        dk    }t          ||¦  «         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  t                               d|d¬¦  «         Y nw xY w|�rÏt#          |¦  «        }d|› d�}g }|D ]n\  }}t$          j                             |¦  «        s5d|› �}t                               |¦  «         |                     |¦  «         ŒY|                     |¦  «         Œo |j	        d<d| 
                    d¬¦  «        i|	¤Ž4 ƒd{V —†}|�rêd„ t/          |¦  «        D ¦   «         }||dœ} t          j        || d œ¦  «        }!|                     ¦   «         }"|"                     d!|!d¬"¦  «         	 t/          |¦  «        D ]x\  }#}t7          |d#¦  «        5 }$|"                     d$|#› d%�|$                     ¦   «         t$          j                             |¦  «        ¬&¦  «         ddd¦  «         n# 1 swxY w Y   Œy |j        |f||"d'œ|
¤Ž4 ƒd{V —†}%|%j        d(vrX|%                     ¦   «         ƒ d{V —†}&tA          d)|%j        › d*|&› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |%                     ¦   «         ƒ d{V —†}'ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   �n# t          $ r;}(tA          tC          d+|(› �¦  «        ¦  «        cY d}(~(cddd¦  «        ƒd{V —† S d}(~(ww xY w |j        |f||d,|id œd-œ|
¤Ž4 ƒd{V —†	 }%|%j        d(vrX|%                     ¦   «         ƒ d{V —†}&tA          d)|%j        › d*|&› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |%                     ¦   «         ƒ d{V —†}'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   |'                     d.¦  «        })|'                     d/¦  «        pi                      d.|)¦  «        }*dd||)|*d0œ}+|r||+d1<   |+S d|› d�} |j	        d<d| 
                    d2¬¦  «        i|	¤Ž4 ƒd{V —†}| "                    ¦   «         s|s¸ |j        |f|d,|id-œ|
¤Ž4 ƒd{V —†}%|%j        d(vrX|%                     ¦   «         ƒ d{V —†}&tA          d3|%j        › d*|&› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |%                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |D �]\  }}t$          j                             |¦  «        s5d|› �}t                               |¦  «         |                     |¦  «         ŒZ	 |                     ¦   «         }"t$          j                             |¦  «        },t7          |d#¦  «        5 }-|"                     d4|-|,¬&¦  «          |j        |f||"d'œ|
¤Ž4 ƒd{V —†}%|%j        d(vr…|%                     ¦   «         ƒ d{V —†}&tC          d5|› d6|%j        › d*|&› �¦  «        }t           #                    |¦  «         |                     |¦  «         	 ddd¦  «        ƒd{V —† ddd¦  «         �Œ]|%                     ¦   «         ƒ d{V —†}ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   ddd¦  «         n# 1 swxY w Y   �Œ³# t          $ rO}(tC          d5|› d7|(› �¦  «        }t           #                    |¦  «         |                     |¦  «         Y d}(~(�Œd}(~(ww xY w	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   |€d8}.|r|.|d9œS d|.iS dd||                     d.¦  «        d:œ}+|r||+d1<   |+S # t          $ r}(tA          d;|(› �¦  «        cY d}(~(S d}(~(ww xY w)=u@  Send a single message via Discord REST API (no websocket client needed).

    Chunking is handled by _send_to_platform() before this is called.

    When thread_id is provided, the message is sent directly to that thread
    via the /channels/{thread_id}/messages endpoint.

    Media files are uploaded one-by-one via multipart/form-data after the
    text message is sent (same pattern as Telegram).

    Forum channels (type 15) reject POST /messages â€” a thread post is created
    automatically via POST /channels/{id}/threads.  Media files are uploaded
    as multipart attachments on the starter message of the new thread.

    Channel type is resolved from the channel directory first, then a
    process-local probe cache, and only as a last resort with a live
    GET /channels/{id} probe (whose result is memoized).
    r   Nr,   ú/aiohttp not installed. Run: pip install aiohttp©Úresolve_proxy_urlÚproxy_kwargs_for_aiohttpÚDISCORD_PROXY)Úplatform_env_varÚAuthorizationzBot úContent-Typeúapplication/jsonz%https://discord.com/api/v10/channels/ú	/messages)Úlookup_channel_typers   ÚforumTFr2   é   ©ÚtotalÚheaderséÈ   rS   z#Failed to probe channel type for %sr  z/threadsrB  é<   c                 ór   — g | ]4\  }}t          |¦  «        t          j                             |¦  «        d œ‘Œ5S ))ÚidÚfilename)r=   r¹   rì   Úbasename)Ú.0Úidxrì   s      r    ú
<listcomp>z!_send_discord.<locals>.<listcomp>I  sJ   € ð ,ð ,ð ,á )  Tõ $' s¡8¤8½¼×9IÒ9IÈ$Ñ9OÔ9OÐPÐPð,ð ,ð ,r"   )ÚcontentÚattachments)rZ   r*   Úpayload_json)Úcontent_typerC  zfiles[Ú])rˆ  )rƒ  Údata©r„  éÉ   z%Discord forum thread creation error (ú): z$Discord forum thread upload failed: r�  ©rƒ  rg   r‡  r*   )r”   r�   r�   r’   rN  r  é   zDiscord API error (zfiles[0]rI  z: Discord API error (rJ  z6No deliverable text or media remained after processingrL  rM  zDiscord send failed: rC   )$Úaiohttpr  r»   rv  rw  rf   r~  rF   rr  ÚClientSessionÚClientTimeoutr]   Ústatusrg   rp  rG   r  rk  r¹   rì   rU  rH   r,  r  rh   ÚFormDataÚ	add_fieldrV  Úreadr‰  Úpostr'   r-   r)   r    r,   )/rŠ   r�   r*   r’   r“   r˜  rv  rw  Ú_proxyÚ_sess_kwÚ_req_kwÚauth_headersÚjson_headersÚ	last_datar  ÚurlÚ_channel_typer~  rm  ÚcachedÚinfo_urlÚ	info_sessÚ	info_respÚinfoÚthread_nameÚ
thread_urlÚvalid_mediarò   Ú	_is_voicerH   ÚsessionÚattachments_metaÚstarter_messager�  Úformr‹  ÚfhÚrespÚbodyr’  ri   Úthread_id_createdÚstarter_msg_idrÙ   rˆ  re  r,   s/                                                  r    r  r  ð  s‰  è è € ð&LØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøðk3ØVÐVÐVÐVÐVÐVÐVÐVØ"Ð"°OÐDÑDÔDˆØ4Ð4°VÑ<Ô<Ñˆ�'Ø'¨°¨¨Ð8ˆØK˜,ÐK¨Ð8JÐKÐKˆØ!Ð' RˆØˆ	Øˆð ð q	MØN¸)ÐNÐNÐNˆC‰Cð !ˆMðØIÐIÐIÐIÐIÐIØ 3Ð 3°I¸wÑ GÔ G��øÝð ð ð Ø�ðøøøð  Ò'Ð'Ø�‘ØÐ*Ø �‘å/°Ñ8Ô8�ØÐ%Ø%�H‘Hà$�Hð	dØ#TÈ7Ð#TÐ#T˜Ø#8 7Ô#8Ð#mÐ#mÀ×AVÒAVÐ]_ÐAVÑA`ÔA`Ð#mÐdlÐ#mÐ#mð Rð Rð Rð Rð Rð Rð RÐqzØ'4 y¤}°XÐ'_Ð'_À|Ð'_ÐW^Ð'_Ð'_ð Rð Rð Rð Rð Rð Rð RÐclØ#,Ô#3°sÒ#:Ð#:Ø1:·²Ñ1AÔ1AÐ+AÐ+AÐ+AÐ+AÐ+AÐ+A DØ/3¯xªx¸Ñ/?Ô/?À2Ò/E HÝ$>¸wÈÑ$QÔ$QÐ$Qð	Rð Rð Rñ Rô Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Røøøð Rð Rð Rð RðRð Rð Rñ Rô Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Rð Røøøð Rð Rð Rð Røøõ %ð dð dð dÝŸšÐ%JÈGÐ^b˜ÑcÔcÐcÐcÐcðdøøøð ñ LÝ7¸Ñ@Ô@�ØVÀWÐVÐVÐV�
ð !�Ø-8ð 3ð 3Ñ)�J 	Ýœ7Ÿ>š>¨*Ñ5Ô5ð !Ø"QÀZÐ"QÐ"Q˜ÝŸš wÑ/Ô/Ð/Ø Ÿš¨Ñ0Ô0Ð0Ø Ø×&Ò& zÑ2Ô2Ð2Ð2à0˜7Ô0ÐeÐe¸×9NÒ9NÐUWÐ9NÑ9XÔ9XÐeÐ\dÐeÐeð 05ð 05ð 05ð 05ð 05ð 05ð 05ÐipØ"ñ /5ð,ð ,å-6°{Ñ-CÔ-Cð,ñ ,ô ,Ð(ð 7>ÐN^Ð*_Ð*_˜Ý'+¤z¸;ÐSbÐ2cÐ2cÑ'dÔ'd˜à&×/Ò/Ñ1Ô1˜ØŸš ~°|ÐRd˜ÑeÔeÐeð
lÝ3<¸[Ñ3IÔ3Ið &ð &¡  ZÝ%)¨*°dÑ%;Ô%;ð !&¸rØ$(§N¢NØ(7°¨¨¨Ø(*¯ª©	¬	Ý13´×1AÒ1AÀ*Ñ1MÔ1Mð %3ñ %&ô %&ð %&ð!&ð !&ð !&ñ !&ô !&ð !&ð !&ð !&ð !&ð !&ð !&øøøð !&ð !&ð !&ð !&øð (4 w¤|°JÐ'kÈÐ[_Ð'kÐ'kÐcjÐ'kÐ'kð 9ð 9ð 9ð 9ð 9ð 9ð 9ÐosØ#'¤;°jÐ#@Ð#@Ø15·²±´Ð+<Ð+<Ð+<Ð+<Ð+<Ð+< DÝ+1Ð2pÐZ^ÔZeÐ2pÐ2pÐjnÐ2pÐ2pÑ+qÔ+qð9ð 9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð505ð 05ð 05ð 05ñ 05ô 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð< .2¯YªY©[¬[Ð'8Ð'8Ð'8Ð'8Ð'8Ð'8 ð	9ð 9ð 9ñ 9ô 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9ð 9øøøð 9ð 9ð 9ð 9ùøõ
  )ð lð lð lÝ#)Õ*>Ð?iÐfgÐ?iÐ?iÑ*jÔ*jÑ#kÔ#kÐkÐkÐkÐkÐkðA05ð 05ð 05ð 05ñ 05ô 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05øøøøð>løøøð
 $0 7¤<Ø&ð$à$0à(3Ø,5°wÐ+?ð"ð "ð$ð $ð &ð$ð $ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð "Ø#œ{°*Ð<Ð<Ø-1¯YªY©[¬[Ð'8Ð'8Ð'8Ð'8Ð'8Ð'8 Ý'-Ð.lÐVZÔVaÐ.lÐ.lÐfjÐ.lÐ.lÑ'mÔ'mð5ð 5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ðI05ð 05ð 05ð 05ñ 05ô 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð` *.¯ª©¬Ð#4Ð#4Ð#4Ð#4Ð#4Ð#4˜Dð5ð 5ð 5ñ 5ô 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5ð 5øøøð 5ð 5ð 5ð 5ðI05ð 05ð 05ñ 05ô 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05ð 05øøøð 05ð 05ð 05ð 05ðd %)§H¢H¨T¡N¤NÐ!Ø"&§(¢(¨9Ñ"5Ô"5Ð";¸×!@Ò!@ÀÐGXÑ!YÔ!Y�à#Ø )Ø&Ø!2Ø"0ðð �ð ð 2Ø)1�F˜:Ñ&Ø�àL¸'ÐLÐLÐLˆCà(�7Ô(Ð]Ð]°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ]ÐT\Ð]Ð]ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-Ðahà�}Š}‰Œð 2 kð 2Ø'˜7œ<¨Ðh°\ÈÐT[ÐH\ÐhÐhÐ`gÐhÐhð 2ð 2ð 2ð 2ð 2ð 2ð 2ÐlpØ”{¨*Ð4Ð4Ø%)§Y¢Y¡[¤[Ð0Ð0Ð0Ð0Ð0Ð0˜Ý%Ð&R¸D¼KÐ&RÐ&RÈDÐ&RÐ&RÑSÔSð2ð 2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 	-ð  	-ð  	-ð  	-ñ  	-ô  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð '+§i¢i¡k¤kÐ 1Ð 1Ð 1Ð 1Ð 1Ð 1�Ið	2ð 2ð 2ñ 2ô 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ð 2øøøð 2ð 2ð 2ð 2ð *5ð -ñ -Ñ%�
˜IÝ”w—~’~ jÑ1Ô1ð ØMÀÐMÐM�GÝ—N’N 7Ñ+Ô+Ð+Ø—O’O GÑ,Ô,Ð,Øð-Ø"×+Ò+Ñ-Ô-�DÝ!œw×/Ò/°
Ñ;Ô;�HÝ˜j¨$Ñ/Ô/ð 	:°1ØŸš z°1¸x˜ÑHÔHÐHØ#/ 7¤<°Ð#`¸\ÐPTÐ#`Ð#`ÐX_Ð#`Ð#`ð :ð :ð :ð :ð :ð :ð :ÐdhØ#œ{°*Ð<Ð<Ø-1¯YªY©[¬[Ð'8Ð'8Ð'8Ð'8Ð'8Ð'8 Ý*>ð  @OÐWað  @Oð  @OÐx|ô  yDð  @Oð  @Oð  IMð  @Oð  @Oñ  +Pô  +P Ý &§¢¨WÑ 5Ô 5Ð 5Ø (§¢°Ñ 8Ô 8Ð 8Ø (ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :ð :ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ñ 	:ð /3¯iªi©k¬kÐ(9Ð(9Ð(9Ð(9Ð(9Ð(9˜Ið:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð	:ð 	:ð 	:ñ 	:ô 	:ð 	:ð 	:ð 	:ð 	:ð 	:ð 	:øøøð 	:ð 	:ð 	:ð 	:ùøõ !ð -ð -ð -Ý2Ð3\È:Ð3\Ð3\ÐYZÐ3\Ð3\Ñ]Ô]�GÝ—L’L Ñ)Ô)Ð)Ø—O’O GÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ñ,øøøøð-øøøð'-ð 	-ð  	-ð  	-ñ  	-ô  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-ð  	-øøøð  	-ð  	-ð  	-ð  	-ðD ÐØLˆEØð >Ø!&°HÐ=Ð=Ð=Ø˜UÐ#Ð#à!¨yÀWÐ\e×\iÒ\iÐjnÑ\oÔ\oÐpÐpˆØð 	*Ø!)ˆF�:ÑØˆøÝð 3ð 3ð 3ÝÐ1¨aÐ1Ð1Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2øøøøð3øøøs£  „	 ‰™žAc. Á$A7 Á6c. Á7
BÂc. ÂBÂ*c. Â/.F
 ÃE8Ã4AEÅE8Å
E	ÅE8Å"E	Å#E8Å&F
 Å8
FÆF
 ÆFÆF
 Æ	c. Æ
'F4Æ1c. Æ3F4Æ4B7c. É+A%T'Ë$PË5AMÍPÍMÍPÍMÍPÍ0=O>Î-PÎ?c. ÏO>Ï,PÏ>
P	ÐPÐP	ÐPÐT'Ð
QÐQÐ9QÐ:T'Ð>c. ÑQÑT'Ñ6=TÒ3T'Óc. ÓTÓ2T'Ô
T	ÔT'ÔT	ÔT'Ôc. Ô'
T1Ô1c. Ô4T1Ô5Ac. Ö	/c. Ö80b+×(=Y6Ø%b+Ø7c. Ù
Y6Ù$b+Ù6
Z 	Ú b+ÚZ 	ÚAb+Û$A`<Ü'0`/ÝA1`	ß`/ß`<ß$b+ß&`	à `/à
`à`/à`à `/à#`<à/`3à3`<à6`3à7`<à:b+à<
báAbâ
b+âbâb+âc. â+
b5â5c. â8b5â9c. ãc. ã"c. ã.
dã8dä	dädc           	   ƒ   óP  K  — 	 ddl }n# t          $ r ddicY S w xY w	 ddlm}m}  |¦   «         } ||¦  «        \  }}d}	d| › �dd	œ}
 |j        dd
|                     d¬¦  «        i|¤Ž4 ƒd{V —†}||ddœ} |j        |	f|
|dœ|¤Ž4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}| 	                    d¦  «        r>dd|| 	                    d¦  «        dœcddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S t          d| 	                    dd¦  «        › �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t          $ r}t          d|› �¦  «        cY d}~S d}~ww xY w)zSend via Slack Web API.r   Nr,   rt  ru  z&https://slack.com/api/chat.postMessageúBearer r|  ©rz  r{  r2   r—  r�  T)Úchannelr'   Úmrkdwnr–  Úokrt   ÚtsrM  zSlack API error: ÚunknownzSlack send failed: rC   )r˜  r  r»   rv  rw  r™  rš  rŸ  rg   r]   r-   rF   )rŠ   r�   r*   r˜  rv  rw  r   r¡  r¢  r¦  rƒ  r±  Úpayloadr¶  r’  ri   s                   r    r  r  µ  sk  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð1ØVÐVÐVÐVÐVÐVÐVÐVØ"Ð"Ñ$Ô$ˆØ4Ð4°VÑ<Ô<Ñˆ�'Ø6ˆØ$5¨eÐ$5Ð$5ÐGYÐZÐZˆØ(�7Ô(Ð]Ð]°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ]ÐT\Ð]Ð]ð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	RÐahØ")°7ÀdÐKÐKˆGØ#�w”| CÐR°¸wÐRÐRÈ'ÐRÐRð Rð Rð Rð Rð Rð Rð RÐVZØ!ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�Ø—8’8˜D‘>”>ð tØ'+¸ÈWÐdh×dlÒdlÐmqÑdrÔdrÐsÐsðRð Rð Rð Rñ Rô Rð Rð Rð Rð Rð Rð Rð Rð	Rð 	Rð 	Rð 	Rñ 	Rô 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rõ ÐP°$·(²(¸7ÀIÑ2NÔ2NÐPÐPÑQÔQð	Rð Rð Rð Rñ Rô Rð Rð Rð Rð Rð Rð Rð Rð	Rð 	Rð 	Rð 	Rñ 	Rô 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	RðRð Rð Rð Rð Rð Rð Rð Rð Rð Røøøð Rð Rð Rð Rð Rð	Rð 	Rð 	Rñ 	Rô 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Rð 	Røøøð 	Rð 	Rð 	Rð 	Rð 	Rð 	Røõ ð 1ð 1ð 1ÝÐ/¨AÐ/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøs‹   „	 ‰™žAE? Á1E,ÂA	EÃE,Ã*E? Ã=%EÄ"E,Ä4E? Å
E	ÅE,ÅE	ÅE,ÅE? Å,
E6Å6E? Å9E6Å:E? Å?
F%Æ	F ÆF%Æ F%c              ƒ   óL  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                      dd¦  «        }|                     ¦   «         4 ƒd{V —†}|                     d|› d�||d	œ|                     d
¬¦  «        ¬¦  «        4 ƒd{V —†	 }|j        dk    rX|                     ¦   «         ƒ d{V —†}dd||                     d¦  «        dœcddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}t          d|j        › d|› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t          $ r}	t          d|	› �¦  «        cY d}	~	S d}	~	ww xY w)z,Send via the local WhatsApp bridge HTTP API.r   Nr,   rt  Úbridge_porti¸  zhttp://localhost:z/send)ÚchatIdr*   r—  r�  )rg   r2   r„  Tr   Ú	messageIdrM  zWhatsApp bridge error (r•  zWhatsApp send failed: )r˜  r  r]   r™  rŸ  rš  r›  rg   r'   r-   rF   )
r‹   r�   r*   r˜  rÄ  r±  r¶  r’  r·  ri   s
             r    r   r   Ì  s?  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð4Ø—i’i ¨tÑ4Ô4ˆØ×(Ò(Ñ*Ô*ð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	P¨gØ—|’|Ø6 KÐ6Ð6Ð6Ø '°GÐ<Ð<Ø×-Ò-°BÐ-Ñ7Ô7ð $ñ ô ð Pð Pð Pð Pð Pð Pð Pð Pð Ø”; #Ò%Ð%Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�Dà#'Ø$.Ø#*Ø&*§h¢h¨{Ñ&;Ô&;ð	ð ðPð Pð Pð Pñ Pô Pð Pð Pð Pð Pð Pð Pð Pð	Pð 	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð "ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�ÝÐN¸¼ÐNÐNÈÐNÐNÑOÔOðPð Pð Pð Pñ Pô Pð Pð Pð Pð Pð Pð Pð Pð	Pð 	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	PðPð Pð Pð Pð Pð Pð Pð Pð Pð Pøøøð Pð Pð Pð Pð Pð	Pð 	Pð 	Pñ 	Pô 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøøøð 	Pð 	Pð 	Pð 	Pð 	Pð 	Pøõ  ð 4ð 4ð 4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøs‰   „	 ‰™ž0E= Á:E*Â	?EÃE*ÃE= Ã-3EÄ E*Ä2E= Å
E	ÅE*ÅE	ÅE*ÅE= Å*
E4Å4E= Å7E4Å8E= Å=
F#ÆFÆF#ÆF#c              ƒ   ó`  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                      dd¦  «                             d¦  «        }|                      dd	¦  «        }|sdd
iS ||dœ}|                     d¦  «        r|dd…         |d<   n|g|d<   |pg }g }	|D ]U\  }
}t
          j                             |
¦  «        r|	                     |
¦  «         Œ:t           
                    d|
¦  «         ŒV|	r|	|d<   dd|dt          t          j        ¦   «         dz  ¦  «        › �dœ}|                     d¬¦  «        4 ƒd{V —†}|                     |› d�|¬¦  «        ƒ d{V —†}|                     ¦   «          |                     ¦   «         }d|v r*t#          d|d         › �¦  «        cddd¦  «        ƒd{V —† S dd|dœ}t%          |	¦  «        t%          |¦  «        k     rdg|d <   |cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t&          $ r}t#          d!|› �¦  «        cY d}~S d}~ww xY w)"zÂSend via signal-cli JSON-RPC API.

    Supports both text-only and text-with-attachments (images/audio/documents).
    Attachments are sent as an 'attachments' array in the JSON-RPC params.
    r   Nr,   úhttpx not installedÚhttp_urlzhttp://127.0.0.1:8080ú/Úaccountrk   zSignal account not configured)rË  r*   zgroup:é   ÚgroupIdÚ	recipientz)Signal media file not found, skipping: %srŽ  z2.0rQ   Úsend_éè  )ÚjsonrpcÚmethodÚparamsr‡  ç      >@©r2   z/api/v1/rpc©rg   zSignal RPC error: Tr   ©r”   r�   r�   z1Some media files were skipped (not found on disk)r  zSignal send failed: )Úhttpxr  r]   Úrstripré   r¹   rì   rU  r,  rG   rH   rT  ÚtimeÚAsyncClientrŸ  Úraise_for_statusrg   r-   r¡   rF   )r‹   r�   r*   r“   rØ  rÉ  rË  rÓ  r¯  Úattachment_pathsrò   r°  rÂ  Úclientr¶  r’  rÙ   ri   s                     r    r  r  è  s˜  è è € ð0ØˆˆˆˆøÝð 0ð 0ð 0ØÐ.Ð/Ð/Ð/Ð/ð0øøøð,2Ø—9’9˜ZÐ)@ÑAÔA×HÒHÈÑMÔMˆØ—)’)˜I rÑ*Ô*ˆØð 	>ØÐ<Ð=Ð=à$°Ð9Ð9ˆØ×Ò˜hÑ'Ô'ð 	,Ø '¨¨¨¤ˆF�9ÑÐà#* )ˆF�;Ñð "Ð' RˆØÐØ%0ð 	Xð 	XÑ!ˆJ˜	ÝŒw�~Š~˜jÑ)Ô)ð XØ ×'Ò'¨
Ñ3Ô3Ð3Ð3å—’ÐJÈJÑWÔWÐWÐWàð 	5Ø$4ˆF�=Ñ!ð ØØØ3�#�dœi™kœk¨DÑ0Ñ1Ô1Ð3Ð3ð	
ð 
ˆð ×$Ò$¨TÐ$Ñ2Ô2ð 	ð 	ð 	ð 	ð 	ð 	ð 	°fØŸš¨Ð%=Ð%=Ð%=ÀG˜ÑLÔLÐLÐLÐLÐLÐLÐLˆDØ×!Ò!Ñ#Ô#Ð#Ø—9’9‘;”;ˆDØ˜$ˆˆÝÐB°4¸´=ÐBÐBÑCÔCð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð "&°8ÈÐPÐPˆFÝÐ#Ñ$Ô$¥s¨;Ñ'7Ô'7Ò7Ð7Ø&ZÐ%[��zÑ"Øð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øõ ð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøsb   „	 ‰™žAH Á#CH Ä=A$G4Æ!H Æ4-G4Ç!H Ç4
G>Ç>H ÈG>ÈH È
H-ÈH(È"H-È(H-c              ƒ   ó"  K  — ddl }ddlm} |                      d¦  «        pt	          j        dd¦  «        }t	          j        dd¦  «        }|                      d¦  «        pt	          j        d	d¦  «        }	 t          t	          j        d
d¦  «        ¦  «        }n# t          t          f$ r d}Y nw xY wt          |||g¦  «        sddiS 	  ||dd¦  «        }	||	d<   ||	d<   d|	d<   | 
                    ||¦  «        }
|
                     t          j        ¦   «         ¬¦  «         |
                     ||¦  «         |
                     |	¦  «         |
                     ¦   «          dd|dœS # t"          $ r}t%          d|› �¦  «        cY d}~S d}~ww xY w)z:Send via SMTP (one-shot, no persistent connection needed).r   N)ÚMIMETextÚaddressÚEMAIL_ADDRESSrk   ÚEMAIL_PASSWORDÚ	smtp_hostÚEMAIL_SMTP_HOSTÚEMAIL_SMTP_PORTÚ587iK  r,   zNEmail not configured (EMAIL_ADDRESS, EMAIL_PASSWORD, EMAIL_SMTP_HOST required)rd  zutf-8ÚFromÚTozHermes AgentÚSubject)ÚcontextTr   r×  zEmail send failed: )ÚsmtplibÚemail.mime.textrà  r]   r¹   rº   rT  r<   r;   ÚallÚSMTPÚstarttlsÚsslÚcreate_default_contextÚloginrE   ÚquitrF   r-   )r‹   r�   r*   rì  rà  rá  Úpasswordrä  Ú	smtp_portÚmsgÚserverri   s               r    r!  r!  !  sÕ  è è € à€N€N€NØ(Ð(Ð(Ð(Ð(Ð(à�iŠi˜	Ñ"Ô"ÐD¥b¤i°ÀÑ&DÔ&D€GÝŒyÐ)¨2Ñ.Ô.€HØ—	’	˜+Ñ&Ô&ÐJ­"¬)Ð4EÀrÑ*JÔ*J€IðÝ�œ	Ð"3°UÑ;Ô;Ñ<Ô<ˆ	ˆ	øÝ�	Ð"ð ð ð Øˆ	ˆ	ˆ	ðøøøõ �˜ 9Ð-Ñ.Ô.ð kØÐiÐjÐjð1Øˆh�w ¨Ñ1Ô1ˆØˆˆF‰ØˆˆD‰	Ø'ˆˆI‰à—’˜i¨Ñ3Ô3ˆØ�Š¥Ô :Ñ <Ô <ˆÑ=Ô=Ð=Ø�Š�W˜hÑ'Ô'Ð'Ø×Ò˜CÑ Ô Ð Ø�Š‰ŒˆØ¨WÀÐIÐIÐIøÝð 1ð 1ð 1ÝÐ/¨AÐ/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøs1   Á7"B ÂB0Â/B0Ã
BE( Å(
FÅ2F	ÆFÆ	Fc              ƒ   ó6  K  — 	 ddl }n# t          $ r ddicY S w xY wddl}t          j        dd¦  «        }t          j        dd¦  «        }|r| r|sddiS t          j        d	d
|t
          j        ¬¦  «        }t          j        dd
|t
          j        ¬¦  «        }t          j        dd
|t
          j        ¬¦  «        }t          j        dd
|t
          j        ¬¦  «        }t          j        dd|¦  «        }t          j        dd
|¦  «        }t          j        dd|t
          j        ¬¦  «        }t          j        dd
|¦  «        }t          j        dd|¦  «        }| 	                    ¦   «         }	 ddl
m}m}  |¦   «         }	 ||	¦  «        \  }
}|› d| › �}|                     |                     d¦  «        ¦  «                             d¦  «        }d|› d�}dd|› �i} |j        d,d|                     d¬¦  «        i|
¤Ž4 ƒd{V —†}|                     ¦   «         }|                     d|¦  «         |                     d |¦  «         |                     d!|¦  «          |j        |f||d"œ|¤Ž4 ƒd{V —†}|                     ¦   «         ƒ d{V —†}|j        d#k    ra|                     d$t1          |¦  «        ¦  «        }t3          d%|j        › d&|› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |                     d'd¦  «        }d(d)||d*œcddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   	 ddd¦  «        ƒd{V —† dS # 1 ƒd{V —†swxY w Y   dS # t4          $ r}t3          d+|› �¦  «        cY d}~S d}~ww xY w)-z½Send a single SMS via Twilio REST API.

    Uses HTTP Basic auth (Account SID : Auth Token) and form-encoded POST.
    Chunking is handled by _send_to_platform() before this is called.
    r   Nr,   rt  ÚTWILIO_ACCOUNT_SIDrk   ÚTWILIO_PHONE_NUMBERzXSMS not configured (TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_PHONE_NUMBER required)z\*\*(.+?)\*\*z\1)Úflagsz	\*(.+?)\*z	__(.+?)__z_(.+?)_z```[a-z]*\n?z`(.+?)`z
^#{1,6}\s+z\[([^\]]+)\]\([^\)]+\)z\n{3,}z

ru  rl   Úasciiz+https://api.twilio.com/2010-04-01/Accounts/z/Messages.jsonrz  zBasic r2   r—  r�  rè  ré  ÚBody)r’  rƒ  i�  r*   zTwilio API error (r•  ÚsidTr   rM  zSMS send failed: rC   )r˜  r  Úbase64r¹   rº   rP  r%   ÚDOTALLÚ	MULTILINEr    r»   rv  rw  Ú	b64encodeÚencodeÚdecoder™  rš  rœ  r�  rŸ  rg   r›  r]   r=   r-   rF   )Ú
auth_tokenr�   r*   r˜  r   Úaccount_sidÚfrom_numberrv  rw  r   r¡  r¢  ÚcredsÚencodedr¦  rƒ  r±  Ú	form_datar¶  r·  Ú	error_msgÚmsg_sidri   s                          r    r"  r"  A  s=  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð €M€M€Må”)Ð0°"Ñ5Ô5€KÝ”)Ð1°2Ñ6Ô6€KØð u˜jð u°ð uØÐsÐtÐtõ ŒfÐ% u¨g½R¼YÐGÑGÔG€GÝŒf�\ 5¨'½¼ÐCÑCÔC€GÝŒf�\ 5¨'½¼ÐCÑCÔC€GÝŒf�Z ¨µr´yÐAÑAÔA€GÝŒf�_ b¨'Ñ2Ô2€GÝŒf�Z ¨Ñ0Ô0€GÝŒf�] B¨µr´|ÐDÑDÔD€GÝŒfÐ.°°wÑ?Ô?€GÝŒf�Y ¨Ñ0Ô0€GØ�mŠm‰oŒo€Gð/ØVÐVÐVÐVÐVÐVÐVÐVØ"Ð"Ñ$Ô$ˆØ4Ð4°VÑ<Ô<Ñˆ�'ØÐ-Ð- Ð-Ð-ˆØ×"Ò" 5§<¢<°Ñ#8Ô#8Ñ9Ô9×@Ò@ÀÑIÔIˆØW¸KÐWÐWÐWˆØ"Ð$6¨WÐ$6Ð$6Ð7ˆà(�7Ô(Ð]Ð]°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ]ÐT\Ð]Ð]ð 	gð 	gð 	gð 	gð 	gð 	gð 	gÐahØ×(Ò(Ñ*Ô*ˆIØ×Ò ¨Ñ4Ô4Ð4Ø×Ò  gÑ.Ô.Ð.Ø×Ò ¨Ñ0Ô0Ð0à#�w”| CÐT¨iÀÐTÐTÈGÐTÐTð gð gð gð gð gð gð gÐX\Ø!ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�Ø”; #Ò%Ð%Ø $§¢¨µC¸±I´IÑ >Ô >�IÝ!Ð"R°t´{Ð"RÐ"RÀyÐ"RÐ"RÑSÔSð	gð gð gð gñ gô gð gð gð gð gð gð gð gð	gð 	gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð Ÿ(š( 5¨"Ñ-Ô-�Ø#'°UÀwÐ^eÐfÐfðgð gð gð gñ gô gð gð gð gð gð gð gð gð	gð 	gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gðgð gð gð gð gð gð gð gð gð gøøøð gð gð gð gð gð	gð 	gð 	gñ 	gô 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gð 	gøøøð 	gð 	gð 	gð 	gð 	gð 	gøõ ð /ð /ð /ÝÐ-¨!Ð-Ð-Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.øøøøð/øøøs�   „	 ‰™Å,BM2 ÈA.MÉ2A"L:ËMË&M2 Ë9L:ÌMÌ'M2 Ì:
M	ÍMÍM	ÍMÍM2 Í
M)Í)M2 Í,M)Í-M2 Í2
NÍ<NÎNÎNc              ƒ   ó¼  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                     d¦  «        pt          j        dd¦  «                             d¦  «        }| pt          j        d	d¦  «        } |r| sdd
iS |› d�}d| › �ddœ}|                     |                     d¬¦  «        ¬¦  «        4 ƒd{V —†}|                     ||||dœ¬¦  «        4 ƒd{V —†}	|	j	        dvrX|	 
                    ¦   «         ƒ d{V —†}
t          d|	j	        › d|
› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |	                     ¦   «         ƒ d{V —†}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   dd||                     d¦  «        dœS # t          $ r}t          d|› �¦  «        cY d}~S d}~ww xY w)zSend via Mattermost REST API.r   Nr,   rt  r¦  ÚMATTERMOST_URLrk   rÊ  ÚMATTERMOST_TOKENzEMattermost not configured (MATTERMOST_URL, MATTERMOST_TOKEN required)z/api/v4/postsr»  r|  r¼  r—  r�  rÕ  )Ú
channel_idr*   r–  r“  zMattermost API error (r•  Trx   r‡  rM  zMattermost send failed: )r˜  r  r]   r¹   rº   rÙ  r™  rš  rŸ  r›  r'   r-   rg   rF   )rŠ   r‹   r�   r*   r˜  r‡   r¦  rƒ  r±  r¶  r·  r’  ri   s                r    r$  r$  y  sÕ  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð6Ø—I’I˜eÑ$Ô$ÐG­¬	Ð2BÀBÑ(GÔ(G×OÒOÐPSÑTÔTˆØÐ:�œÐ#5°rÑ:Ô:ˆØð 	f˜uð 	fØÐdÐeÐeØÐ(Ð(Ð(ˆØ$5¨eÐ$5Ð$5ÐGYÐZÐZˆØ×(Ò(°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ(ÑQÔQð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ÐU\Ø—|’| C°ÈgÐbiÐ?jÐ?j�|ÑkÔkð )ð )ð )ð )ð )ð )ð )ÐosØ”; jÐ0Ð0Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ!Ð"Q¸4¼;Ð"QÐ"QÈ4Ð"QÐ"QÑRÔRð)ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð	)ð 	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð
 "ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�ð	)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð  ¨\ÀgÐ]a×]eÒ]eÐfjÑ]kÔ]kÐlÐlÐløÝð 6ð 6ð 6ÝÐ4°Ð4Ð4Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5øøøøð6øøøsŠ   „	 ‰™žAF5 Á:=F5 Â7"F
Ã=E'ÄF
Ä(F5 Ä;E'ÅF
Å'
E1	Å1F
Å4E1	Å5F
Å8F5 Æ

FÆF5 ÆFÆF5 Æ5
GÆ?GÇGÇGc              ƒ   ó(  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                     d¦  «        pt          j        dd¦  «                             d¦  «        }| pt          j        d	d¦  «        } |r| sdd
iS dt          t          j        ¦   «         dz  ¦  «        › dt          j        d¦  «         	                    ¦   «         › �}ddl
m}  ||d¬¦  «        }|› d|› d|› �}	d| › �ddœ}
d|dœ}	 ddl}|                     |ddg¬¦  «        }t          j        dd|¦  «        }d|d<   ||d<   n# t          $ r Y nw xY w|                     |                     d ¬!¦  «        ¬"¦  «        4 ƒd{V —†}|                     |	|
|¬#¦  «        4 ƒd{V —†}|j        d$vrX|                     ¦   «         ƒ d{V —†}t)          d%|j        › d&|› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S |                     ¦   «         ƒ d{V —†}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   d'd(||                     d)¦  «        d*œS # t,          $ r}t)          d+|› �¦  «        cY d}~S d}~ww xY w),z·Send via Matrix Client-Server API.

    Converts markdown to HTML for rich rendering in Matrix clients.
    Falls back to plain text if the ``markdown`` library is not installed.
    r   Nr,   rt  Ú
homeserverÚMATRIX_HOMESERVERrk   rÊ  ÚMATRIX_ACCESS_TOKENzGMatrix not configured (MATRIX_HOMESERVER, MATRIX_ACCESS_TOKEN required)Úhermes_rÐ  rÌ   é   )Úquote)Úsafez/_matrix/client/v3/rooms/z/send/m.room.message/r»  r|  r¼  zm.text)Úmsgtyper·  Úfenced_codeÚtables)Ú
extensionsz<h[1-6]>(.*?)</h[1-6]>z<strong>\1</strong>zorg.matrix.custom.htmlÚformatÚformatted_bodyr—  r�  rÕ  r–  r“  zMatrix API error (r•  Trw   Úevent_idrM  úMatrix send failed: )r˜  r  r]   r¹   rº   rÙ  rT  rÚ  ÚurandomÚhexÚurllib.parser  r?  rP  r%   r™  rš  Úputr›  r'   r-   rg   rF   )rŠ   r‹   r�   r*   r˜  r  Útxn_idr  Úencoded_roomr¦  rƒ  rÂ  Ú_mdr@  r±  r¶  r·  r’  ri   s                      r    r%  r%  ‘  sÅ  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð2Ø—i’i Ñ-Ô-ÐSµ´Ð;NÐPRÑ1SÔ1S×[Ò[Ð\_Ñ`Ô`ˆ
ØÐ=�œÐ#8¸"Ñ=Ô=ˆØð 	h ð 	hØÐfÐgÐgØJ�3�tœy™{œ{¨TÑ1Ñ2Ô2ÐJÐJµR´ZÀ±]´]×5FÒ5FÑ5HÔ5HÐJÐJˆØ&Ð&Ð&Ð&Ð&Ð&Ø�u˜W¨2Ð.Ñ.Ô.ˆØÐaÐa°lÐaÐaÐY_ÐaÐaˆØ$5¨eÐ$5Ð$5ÐGYÐZÐZˆð '°Ð8Ð8ˆð	Ø"Ð"Ð"Ð"Ø—<’< °]ÀHÐ4M�<ÑNÔNˆDå”6Ð3Ð5KÈTÑRÔRˆDØ 8ˆG�HÑØ(,ˆGÐ$Ñ%Ð%øÝð 	ð 	ð 	ØˆDð	øøøð ×(Ò(°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ(ÑQÔQð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ÐU\Ø—{’{ 3°¸g�{ÑFÔFð )ð )ð )ð )ð )ð )ð )È$Ø”; jÐ0Ð0Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ!Ð"M°t´{Ð"MÐ"MÀtÐ"MÐ"MÑNÔNð)ð )ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð	)ð 	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð
 "ŸYšY™[œ[Ð(Ð(Ð(Ð(Ð(Ð(�ð	)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)ð  ¨XÀ'ÐY]×YaÒYaÐblÑYmÔYmÐnÐnÐnøÝð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøs¯   „	 ‰™žAI+ Á:A7I+ Ã2=D0 Ä/I+ Ä0
D=Ä:I+ Ä<D=Ä=3I+ Å0I Æ=HÇI ÇI+ Ç1HÈI È
H'	È'I È*H'	È+I È.I+ É 
I
É
I+ ÉI
ÉI+ É+
JÉ5JÊJÊJc              ƒ   ó@  K  — 	 ddl m} n# t          $ r ddicY S w xY w|pg }	  || ¦  «        }|                     ¦   «         ƒ d{V —†}|s:t	          d¦  «        	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY w|rd|ind}d}	|                     ¦   «         rg|                     |||¬¦  «        ƒ d{V —†}	|	j	        sBt	          d	|	j
        › �¦  «        	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY w|D �]¦\  }
}t          j                             |
¦  «        s?t	          d
|
› �¦  «        c 	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY wt          j                             |
¦  «        d                              ¦   «         }|t           v r|                     ||
|¬¦  «        ƒ d{V —†}	n˜|t$          v r|                     ||
|¬¦  «        ƒ d{V —†}	np|t(          v r!|r|                     ||
|¬¦  «        ƒ d{V —†}	nF|t,          v r|                     ||
|¬¦  «        ƒ d{V —†}	n|                     ||
|¬¦  «        ƒ d{V —†}	|	j	        sDt	          d|	j
        › �¦  «        c 	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY w�Œ¨|	€/ddi	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY wdd||	j        dœ	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY w# t          $ rG}t	          d	|› �¦  «        cY d}~	 |                     ¦   «         ƒ d{V —† S # t          $ r Y S w xY wd}~ww xY w# 	 |                     ¦   «         ƒ d{V —† w # t          $ r Y w w xY wxY w)zISend via the Matrix adapter so native Matrix media uploads are preserved.r   )ÚMatrixAdapterr,   zIMatrix dependencies not installed. Run: pip install 'mautrix[encryption]'NzMatrix connect failedr’   ©Úmetadatar!  úMedia file not found: r   zMatrix media send failed: rK  Trw   rM  )Úgateway.platforms.matrixr*  r  Úconnectr-   Ú
disconnectrF   r    rQ   r”   r,   r¹   rì   rU  rí   r>   rï   Úsend_image_filerð   rX  rî   rY  rñ   r[  rN  )rÐ   r�   r*   r“   r’   r*  ÚadapterÚ	connectedr,  r4  rò   ró   rô   ri   s                 r    r  r  ½  s±  è è € ðfØ:Ð:Ð:Ð:Ð:Ð:Ð:øÝð fð fð fØÐdÐeÐeÐeÐeðføøøð Ð# €Kð0Ø�- Ñ(Ô(ˆØ!Ÿ/š/Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+ˆ	Øð 	3ÝÐ1Ñ2Ô2ðR	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøðS 09ÐB�K Ð+Ð+¸dˆØˆà�=Š=‰?Œ?ð 	JØ '§¢¨W°gÈ Ñ QÔ QÐQÐQÐQÐQÐQÐQˆKØÔ&ð JÝÐH°[Ô5FÐHÐHÑIÔIðB	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøðC %0ð 	Pñ 	PÑ ˆJ˜Ý”7—>’> *Ñ-Ô-ð EÝÐC°zÐCÐCÑDÔDÐDÐDð:	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøõ; ”'×"Ò" :Ñ.Ô.¨qÔ1×7Ò7Ñ9Ô9ˆCØ•kÐ!Ð!Ø$+×$;Ò$;¸GÀZÐZbÐ$;Ñ$cÔ$cÐcÐcÐcÐcÐcÐc��Ø�Ð#Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��Ø�Ð#Ð#¨Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��Ø�Ð#Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��à$+×$9Ò$9¸'À:ÐX`Ð$9Ñ$aÔ$aÐaÐaÐaÐaÐaÐa�àÔ&ð PÝÐN¸;Ô;LÐNÐNÑOÔOÐOÐOð	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøñ#Pð ÐØÐ`Ðað	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøð Ø ØØ%Ô0ð	
ð 
ð	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøøõ ð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1ð	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøøøøøð2øøøøð	Ø×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øÝð 	ð 	ð 	ØˆDð	øøøøøøsý   „ ‹›¤5L ÁA5Á5
BÂBÂAL ÃC:Ã:
DÄDÄ
:L ÅE Å 
E-Å,E-Å0DL ÊJ"Ê"
J/Ê.J/Ê2L Ê:KË
K"Ë!K"Ë%L Ë1LÌ
LÌLÌ
M-Ì&M(Ì7M-Ì8M0 Ì=MÍ
M%Í$M%Í(M-Í-M0 Í0NÍ2NÎNÎ
NÎNÎNÎNc              ƒ   ób  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                     d¦  «        pt          j        dd¦  «                             d¦  «        }| pt          j        d	d¦  «        } |r| sdd
iS |› d�}d| › �ddœ}|                     |                     d¬¦  «        ¬¦  «        4 ƒd{V —†}|                     ||||dœ¬¦  «        4 ƒd{V —†}	|	j	        dvrX|	 
                    ¦   «         ƒ d{V —†}
t          d|	j	        › d|
› �¦  «        cddd¦  «        ƒd{V —† cddd¦  «        ƒd{V —† S 	 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   dd|dœS # t          $ r}t          d|› �¦  «        cY d}~S d}~ww xY w)z'Send via Home Assistant notify service.r   Nr,   rt  r¦  ÚHASS_URLrk   rÊ  Ú
HASS_TOKENz=Home Assistant not configured (HASS_URL, HASS_TOKEN required)z/api/services/notify/notifyr»  r|  r¼  r—  r�  rÕ  )r*   rW   r–  r“  zHome Assistant API error (r•  Try   r×  zHome Assistant send failed: )r˜  r  r]   r¹   rº   rÙ  r™  rš  rŸ  r›  r'   r-   rF   )rŠ   r‹   r�   r*   r˜  Úhass_urlr¦  rƒ  r±  r¶  r·  ri   s               r    r&  r&  ù  s  è è € ðLØˆˆˆˆøÝð Lð Lð LØÐJÐKÐKÐKÐKðLøøøð:Ø—I’I˜eÑ$Ô$ÐA­¬	°*¸bÑ(AÔ(A×IÒIÈ#ÑNÔNˆØÐ4�œ <°Ñ4Ô4ˆØð 	^˜uð 	^ØÐ\Ð]Ð]ØÐ6Ð6Ð6ˆØ$5¨eÐ$5Ð$5ÐGYÐZÐZˆØ×(Ò(°×1FÒ1FÈRÐ1FÑ1PÔ1PÐ(ÑQÔQð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	WÐU\Ø—|’| C°È7Ð^eÐ?fÐ?f�|ÑgÔgð Wð Wð Wð Wð Wð Wð WÐkoØ”; jÐ0Ð0Ø!%§¢¡¤Ð,Ð,Ð,Ð,Ð,Ð,�DÝ!Ð"U¸t¼{Ð"UÐ"UÈtÐ"UÐ"UÑVÔVðWð Wð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wð Wð	Wð 	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wà0ðWð Wð Wñ Wô Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wð Wøøøð Wð Wð Wð Wð	Wð 	Wð 	Wñ 	Wô 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wð 	Wøøøð 	Wð 	Wð 	Wð 	Wð
  ¨_ÈÐQÐQÐQøÝð :ð :ð :ÝÐ8°QÐ8Ð8Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9øøøøð:øøøs„   „	 ‰™žAF Á:=F Â7"E1Ã=EÄE1Ä(F Ä<E1Å
E	ÅE1ÅE	ÅE1ÅF Å1
E;Å;F Å>E;Å?F Æ
F.ÆF)Æ#F.Æ)F.c              ƒ   ó´  K  — 	 ddl }n# t          $ r ddicY S w xY w	 |                      d¦  «        pt          j        dd¦  «        }|sddiS |                     d	¬
¦  «        4 ƒd{V —†}|                     |dd|idœ¬¦  «        ƒ d{V —†}|                     ¦   «          |                     ¦   «         }|                     dd¦  «        dk    r8t          d|                     dd¦  «        › �¦  «        cddd¦  «        ƒd{V —† S 	 ddd¦  «        ƒd{V —† n# 1 ƒd{V —†swxY w Y   dd|dœS # t          $ r}t          d|› �¦  «        cY d}~S d}~ww xY w)aq  Send via DingTalk robot webhook.

    Note: The gateway's DingTalk adapter uses per-session webhook URLs from
    incoming messages (dingtalk-stream SDK).  For cross-platform send_message
    delivery we use a static robot webhook URL instead, which must be
    configured via ``DINGTALK_WEBHOOK_URL`` env var or ``webhook_url`` in the
    platform's extra config.
    r   Nr,   rÈ  Úwebhook_urlÚDINGTALK_WEBHOOK_URLrk   zkDingTalk not configured. Set DINGTALK_WEBHOOK_URL env var or webhook_url in dingtalk platform extra config.rÔ  rÕ  r'   r�  )r  r'   rÖ  ÚerrcodezDingTalk API error: ÚerrmsgrÁ  Trz   r×  zDingTalk send failed: )rØ  r  r]   r¹   rº   rÛ  rŸ  rÜ  rg   r-   rF   )	r‹   r�   r*   rØ  r9  rÞ  r¶  r’  ri   s	            r    r'  r'    sÄ  è è € ð0ØˆˆˆˆøÝð 0ð 0ð 0ØÐ.Ð/Ð/Ð/Ð/ð0øøøð4Ø—i’i Ñ.Ô.ÐWµ"´)Ð<RÐTVÑ2WÔ2WˆØð 	LØð  Kð  Lð  LØ×$Ò$¨TÐ$Ñ2Ô2ð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	V°fØŸšØØ!'°)¸WÐ1EÐFÐFð %ñ ô ð ð ð ð ð ð ˆDð ×!Ò!Ñ#Ô#Ð#Ø—9’9‘;”;ˆDØ�xŠx˜	 1Ñ%Ô%¨Ò*Ð*ÝÐT°T·X²X¸hÈ	Ñ5RÔ5RÐTÐTÑUÔUð	Vð 	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð +ð	Vð 	Vð 	Vñ 	Vô 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vð 	Vøøøð 	Vð 	Vð 	Vð 	Vð  ¨ZÀGÐLÐLÐLøÝð 4ð 4ð 4ÝÐ2¨qÐ2Ð2Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3øøøøð4øøøsZ   „	 ‰™ž/D1 ÁD1 Á*B
DÃ4D1 ÄD1 Ä
D$Ä$D1 Ä'D$Ä(D1 Ä1
EÄ;EÅEÅEc              ƒ   óŠ  K  — 	 ddl m}m}  |¦   «         sddiS n# t          $ r ddicY S w xY w	 ddlm}  || ¬¦  «        } ||¦  «        }|                     ¦   «         ƒ d{V —†}|st          d	|j        pd
› �¦  «        S 	 | 	                    ||¦  «        ƒ d{V —†}	|	j
        s1t          d|	j        › �¦  «        |                     ¦   «         ƒ d{V —† S dd||	j        dœ|                     ¦   «         ƒ d{V —† S # |                     ¦   «         ƒ d{V —† w xY w# t          $ r}
t          d|
› �¦  «        cY d}
~
S d}
~
ww xY w)z;Send via WeCom using the adapter's WebSocket send pipeline.r   )ÚWeComAdapterÚcheck_wecom_requirementsr,   z?WeCom requirements not met. Need aiohttp + WECOM_BOT_ID/SECRET.zWeCom adapter not available.r‚   ©r‹   NzWeCom: failed to connect - zunknown errorzWeCom send failed: Tr|   rM  )Úgateway.platforms.wecomr>  r?  r  r¤   rƒ   r/  r-   Úfatal_error_messagerQ   r”   r,   r0  rN  rF   )r‹   r�   r*   r>  r?  rƒ   rÐ   r2  r3  rÙ   ri   s              r    r)  r)  /  s  è è € ð9ØRÐRÐRÐRÐRÐRÐRÐRØ'Ð'Ñ)Ô)ð 	`ØÐ^Ð_Ð_ð	`øåð 9ð 9ð 9ØÐ7Ð8Ð8Ð8Ð8ð9øøøð1Ø1Ð1Ð1Ð1Ð1Ð1Ø �. uÐ-Ñ-Ô-ˆØ�,˜wÑ'Ô'ˆØ!Ÿ/š/Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+ˆ	Øð 	jÝÐh¸Ô8SÐ8fÐWfÐhÐhÑiÔiÐið	'Ø"Ÿ<š<¨°Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9ˆFØ”>ð DÝÐB°F´LÐBÐBÑCÔCð ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð  $°ÀWÐ\bÔ\mÐnÐnà×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ø�'×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøÝð 1ð 1ð 1ÝÐ/¨AÐ/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøsN   „ ›,«,°AD Â9C= Â<D ÃC= Ã"D Ã=DÄD Ä
EÄ&D=Ä7EÄ=Ec              ƒ   óò   K  — 	 ddl m}m}  |¦   «         sddiS n# t          $ r ddicY S w xY w	  || j        | j        |||¬¦  «        ƒ d{V —†S # t          $ r}t          d|› �¦  «        cY d}~S d}~ww xY w)	z6Send via Weixin iLink using the native adapter helper.r   )Úcheck_weixin_requirementsÚsend_weixin_directr,   z9Weixin requirements not met. Need aiohttp + cryptography.zWeixin adapter not available.)r‹   rŠ   r�   r*   r“   NzWeixin send failed: )Úgateway.platforms.weixinrD  rE  r  r‹   rŠ   rF   r-   )rÐ   r�   r*   r“   rD  rE  ri   s          r    r  r  J  s  è è € ð:ØZÐZÐZÐZÐZÐZÐZÐZØ(Ð(Ñ*Ô*ð 	ZØÐXÐYÐYð	Zøåð :ð :ð :ØÐ8Ð9Ð9Ð9Ð9ð:øøøð	2Ø'Ð'Ø”-Ø”-ØØØ#ð
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ð 	
øõ ð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøs)   „ ›,«,°A Á
A6ÁA1Á+A6Á1A6c              ƒ   óv  K  — 	 ddl m}m}  |¦   «         sddiS n# t          $ r ddicY S w xY w	 ddlm}  || ¬¦  «        } ||¦  «        }|                     ¦   «         ƒ d{V —†}|st          d	¦  «        S 	 |                     ||¦  «        ƒ d{V —†}	|	j	        s1t          d
|	j
        › �¦  «        |                     ¦   «         ƒ d{V —† S dd||	j        dœ|                     ¦   «         ƒ d{V —† S # |                     ¦   «         ƒ d{V —† w xY w# t          $ r}
t          d
|
› �¦  «        cY d}
~
S d}
~
ww xY w)zBSend via BlueBubbles iMessage server using the adapter's REST API.r   )ÚBlueBubblesAdapterÚcheck_bluebubbles_requirementsr,   z8BlueBubbles requirements not met (need aiohttp + httpx).z"BlueBubbles adapter not available.r‚   r@  Nz(BlueBubbles: failed to connect to serverzBlueBubbles send failed: Tru   rM  )Úgateway.platforms.bluebubblesrH  rI  r  r¤   rƒ   r/  r-   rQ   r”   r,   r0  rN  rF   )r‹   r�   r*   rH  rI  rƒ   rÐ   r2  r3  rÙ   ri   s              r    r*  r*  _  s  è è € ð?ØdÐdÐdÐdÐdÐdÐdÐdØ-Ð-Ñ/Ô/ð 	YØÐWÐXÐXð	Yøåð ?ð ?ð ?ØÐ=Ð>Ð>Ð>Ð>ð?øøøð7Ø1Ð1Ð1Ð1Ð1Ð1Ø �. uÐ-Ñ-Ô-ˆØ$Ð$ WÑ-Ô-ˆØ!Ÿ/š/Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+ˆ	Øð 	FÝÐDÑEÔEÐEð	'Ø"Ÿ<š<¨°Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9ˆFØ”>ð JÝÐH¸&¼,ÐHÐHÑIÔIð ×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ð  $°È7ÐbhÔbsÐtÐtà×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ø�'×$Ò$Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øøøøÝð 7ð 7ð 7ÝÐ5°!Ð5Ð5Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6øøøøð7øøøsN   „ ›,«,°AD Á99C3 Â2D ÃC3 ÃD Ã3DÄD Ä
D8ÄD3Ä-D8Ä3D8c              ƒ   óº  K  — 	 ddl m}m} |sddiS ddl m}m} n# t
          $ r ddicY S w xY w|pg }	  || ¦  «        }	t          |	dd¦  «        }
|
dk    r|n|}|	                     |¦  «        |	_        |rd	|ind
}d
}| 	                    ¦   «         r<|	 
                    |||¬¦  «        ƒ d
{V —†}|j        st          d|j        › �¦  «        S |D �]P\  }}t          j                             |¦  «        st          d|› �¦  «        c S t          j                             |¦  «        d                              ¦   «         }|t&          v r|	                     |||¬¦  «        ƒ d
{V —†}n˜|t*          v r|	                     |||¬¦  «        ƒ d
{V —†}np|t.          v r!|r|	                     |||¬¦  «        ƒ d
{V —†}nF|t2          v r|	                     |||¬¦  «        ƒ d
{V —†}n|	                     |||¬¦  «        ƒ d
{V —†}|j        st          d|j        › �¦  «        c S �ŒR|€ddiS dd||j        dœS # t8          $ r}t          d|› �¦  «        cY d
}~S d
}~ww xY w)z7Send via Feishu/Lark using the adapter's send pipeline.r   )r  ÚFEISHU_AVAILABLEr,   zJFeishu dependencies not installed. Run: pip install 'hermes-agent[feishu]')ÚFEISHU_DOMAINÚLARK_DOMAINÚ_domain_namer{   Úlarkr’   Nr+  zFeishu send failed: r-  r   zFeishu media send failed: rK  TrM  )r  r  rL  rM  rN  r  r8   Ú_build_lark_clientÚ_clientr    rQ   r”   r-   r,   r¹   rì   rU  rí   r>   rï   r1  rð   rX  rî   rY  rñ   r[  rN  rF   )rÐ   r�   r*   r“   r’   r  rL  rM  rN  r2  Údomain_nameÚdomainr,  r4  rò   ró   rô   ri   s                     r    r(  r(  z  sŽ  è è € ðgØLÐLÐLÐLÐLÐLÐLÐLØð 	kØÐiÐjÐjØGÐGÐGÐGÐGÐGÐGÐGÐGøÝð gð gð gØÐeÐfÐfÐfÐfðgøøøð Ð# €Kð*2Ø�- Ñ(Ô(ˆÝ˜g ~°xÑ@Ô@ˆØ"-°Ò"7Ð"7��¸[ˆØ!×4Ò4°VÑ<Ô<ˆŒØ/8ÐB�K Ð+Ð+¸dˆàˆØ�=Š=‰?Œ?ð 	JØ '§¢¨W°gÈ Ñ QÔ QÐQÐQÐQÐQÐQÐQˆKØÔ&ð JÝÐH°[Ô5FÐHÐHÑIÔIÐIà$/ð 	Pñ 	PÑ ˆJ˜Ý”7—>’> *Ñ-Ô-ð EÝÐC°zÐCÐCÑDÔDÐDÐDÐDå”'×"Ò" :Ñ.Ô.¨qÔ1×7Ò7Ñ9Ô9ˆCØ•kÐ!Ð!Ø$+×$;Ò$;¸GÀZÐZbÐ$;Ñ$cÔ$cÐcÐcÐcÐcÐcÐc��Ø�Ð#Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��Ø�Ð#Ð#¨Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��Ø�Ð#Ð#Ø$+×$6Ò$6°wÀ
ÐU]Ð$6Ñ$^Ô$^Ð^Ð^Ð^Ð^Ð^Ð^��à$+×$9Ò$9¸'À:ÐX`Ð$9Ñ$aÔ$aÐaÐaÐaÐaÐaÐa�àÔ&ð PÝÐN¸;Ô;LÐNÐNÑOÔOÐOÐOÐOñPð ÐØÐ`ÐaÐað Ø ØØ%Ô0ð	
ð 
ð 	
øõ ð 2ð 2ð 2ÝÐ0¨QÐ0Ð0Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1øøøøð2øøøsG   „ ’ ›,«,´BH4 Ã:H4 Ä	DH4 È H4 È(H4 È4
IÈ>IÉIÉIc                  ó~   — ddl m}   | dd¦  «        }|r|dk    rdS 	 ddlm}  |¦   «         S # t          $ r Y dS w xY w)	zOGate send_message on gateway running (always available on messaging platforms).r   r˜   rš   rk   ÚlocalT)Úis_gateway_runningF)rÆ   r™   Úgateway.statusrW  rF   )r™   r�   rW  s      r    Ú_check_send_messagerY  ³  s…   € à7Ð7Ð7Ð7Ð7Ð7ØˆÐ8¸"Ñ=Ô=€HØð �H Ò'Ð'ØˆtðØ5Ð5Ð5Ð5Ð5Ð5Ø!Ð!Ñ#Ô#Ð#øÝð ð ð Øˆuˆuðøøøs   ž. ®
<»<c              ƒ   óÌ  K  — 	 ddl }n# t          $ r t          d¦  «        cY S w xY w| j        pi }|                     d¦  «        pt          j        dd¦  «        }| j        p)|                     d¦  «        pt          j        dd¦  «        }|r|st          d	¦  «        S 	 |                     d
¬¦  «        4 ƒd{V —†}| 	                    dt          |¦  «        t          |¦  «        dœ¬¦  «        ƒ d{V —†}|j        dk    r)t          d|j        › �¦  «        cddd¦  «        ƒd{V —† S |                     ¦   «         }	|	                     d¦  «        }
|
s!t          d¦  «        cddd¦  «        ƒd{V —† S d|
› �ddœ}d|› d�}|dd…         ddœ}| 	                    |||¬¦  «        ƒ d{V —†}|j        dv r@|                     ¦   «         }dd||                     d¦  «        dœcddd¦  «        ƒd{V —† S t          d |j        › d!|j        › �¦  «        cddd¦  «        ƒd{V —† S # 1 ƒd{V —†swxY w Y   dS # t          $ r}t          d |› �¦  «        cY d}~S d}~ww xY w)"zñSend via QQBot using the REST API directly (no WebSocket needed).

    Uses the QQ Bot Open Platform REST endpoints to get an access token
    and post a message. Works for guild channels without requiring
    a running gateway adapter.
    r   Nz8QQBot direct send requires httpx. Run: pip install httpxÚapp_idÚ	QQ_APP_IDrk   Úclient_secretÚQQ_CLIENT_SECRETz3QQBot: QQ_APP_ID / QQ_CLIENT_SECRET not configured.r€  rÕ  z)https://bots.qq.com/app/getAppAccessToken)ÚappIdÚclientSecretrÖ  r„  zQQBot token request failed: Úaccess_tokenz"QQBot: no access_token in responsezQQBot r|  r¼  z#https://api.sgroup.qq.com/channels/r}  i   )r�  Úmsg_type)rg   rƒ  r“  Trv   r‡  rM  zQQBot send failed: Ú )rØ  r  r-   r‹   r]   r¹   rº   rŠ   rÛ  rŸ  r=   Ústatus_coderg   r'   rF   )rÐ   r�   r*   rØ  r‹   ÚappidÚsecretrÞ  Ú
token_respÚ
token_datara  rƒ  r¦  rÂ  r¶  r’  ri   s                    r    r+  r+  À  sƒ  è è € ðRØˆˆˆˆøÝð Rð Rð RÝÐPÑQÔQÐQÐQÐQðRøøøð ŒMÐ˜R€EØ�IŠI�hÑÔÐ=¥2¤9¨[¸"Ñ#=Ô#=€EØŒmð 3˜uŸyšy¨Ñ9Ô9ð 3Ý”Ð-¨rÑ2Ô2ð àð M˜ð MÝÐKÑLÔLÐLð1Ø×$Ò$¨RÐ$Ñ0Ô0ð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	T°Fà%Ÿ{š{Ø;Ý" 5™zœz½3¸v¹;¼;ÐGÐGð  +ñ  ô  ð ð ð ð ð ð ˆJð Ô%¨Ò,Ð,ÝÐU¸ZÔ=SÐUÐUÑVÔVð	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð $ŸšÑ*Ô*ˆJØ%Ÿ>š>¨.Ñ9Ô9ˆLØð EÝÐCÑDÔDð	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð "9¨,Ð!8Ð!8Ø 2ðð ˆGð K¸ÐJÐJÐJˆCØ")¨%¨4¨%¤.¸aÐ@Ð@ˆGàŸš S¨wÀ˜ÑHÔHÐHÐHÐHÐHÐHÐHˆDØÔ :Ð-Ð-Ø—y’y‘{”{�Ø#'°WÈØ&*§h¢h¨t¡n¤nð6ð 6ð1	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tõ6 ÐR°DÔ4DÐRÐRÀtÄyÐRÐRÑSÔSð7	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøõ8 ð 1ð 1ð 1ÝÐ/¨AÐ/Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0øøøøð1øøøst   „	 ‰%¤%Â H= Â<AH*ÄH= Ä+9H*Å$H= Å7A/H*Ç&H= Ç9H*ÈH= È*
H4È4H= È7H4È8H= È=
I#ÉIÉI#ÉI#)Úregistryrž   Ú	messagingu   ðŸ“¨)rZ   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚemoji)NNrÞ   ro  )NÚ__doc__rI   rg   Úloggingr¹   rP  Útypingr   r   rñ  rÚ  Úagent.redactr   Ú	getLoggerÚ__name__rG   Úcompilerß   rá   rã   rä   râ   Ú	frozensetrå   ræ   rï   rð   rñ   rî   Ú
IGNORECASEr$   r&   r=   r)   rÄ   r-   rF   rT  r:   r?   rN   ÚSEND_MESSAGE_SCHEMArb   r^   r_   r¢   r½   rù   rÀ   rÂ   r  rk  rl  r  Ú__annotations__rp  rr  r  r  r   r  r!  r"  r$  r%  r  r&  r'  r)  r  r*  r(  rY  r+  Útools.registryri  rž   ÚregisterrC   r"   r    ú<module>r}     se  ððð ð ð €€€Ø €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø !Ð !Ð !Ð !Ð !Ð !Ð !Ð !Ø 
€
€
€
Ø €€€à .Ð .Ð .Ð .Ð .Ð .à	ˆÔ	˜8Ñ	$Ô	$€à&˜BœJÐ'DÑEÔEÐ Ø�B”JÐfÑgÔgÐ ð �2”:Ð<Ñ=Ô=Ð Ø�B”JÐuÑvÔvÐ à-Ð ð �9Ð:Ð:Ð:Ñ;Ô;Ð Ø�"”*Ð4Ñ5Ô5€Ø8Ð8Ð8€Ø6Ð6Ð6€Ø7Ð7Ð7€Ø�wÐ€Ø!�r”zØWØ„Mñô Ð ð '˜BœJØQØ„Mñô Ð ð #ð ð ð ð ð4�Cð 4˜Dð 4ð 4ð 4ð 4ð
˜yð °3ð ¸5À4¹<ð ð ð ð ð2 EFð 'ð 'ð '¸cð 'ð 'ð 'ð 'ð& ð	5ð ð !Ø Ð(ð  aðð ð !ð  `ðð ð
 !Ø9ðð ð
ð 
ð ð#ð ðð Ð ð@ð ð ðLð Lð LðV7ð V7ð V7ðr! Sð !°cð !ð !ð !ð !ðH:ð :ð :ð&ð ð ð°3ð Àð ÐQTÐW[ÑQ[ð ð ð ð ð>uð uð uð uðp~4ð ~4ð ~4ð ~4ðB sð ¨sð ð ð ð ð 68Ð ! 4¨¨T¨	¤?Ð 7Ð 7Ñ 7ðE¨ð E°tð EÀð Eð Eð Eð Eð? Cð ?¨H°T¬Nð ?ð ?ð ?ð ?ðB3ð B3ð B3ð B3ðJ1ð 1ð 1ð.4ð 4ð 4ð862ð 62ð 62ð 62ðr1ð 1ð 1ð@5/ð 5/ð 5/ðp6ð 6ð 6ð0)2ð )2ð )2ðX9ð 9ð 9ð 9ðx:ð :ð :ð.4ð 4ð 4ð>1ð 1ð 1ð62ð 2ð 2ð 2ð*7ð 7ð 7ð662ð 62ð 62ð 62ðr
ð 
ð 
ð11ð 11ð 11ðj 0Ð /Ð /Ð /Ð /Ð /Ð /Ð /à €Ô Ø	ØØØØ Ø
ðñ ô ð ð ð r"   