+
    kHàj'’  ã                   ó–  a € R9 tS0 t R t^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	t	^ RI
t
^ RIHtHtHt ^ RIHt ^ RIHtHtHtHt ^ RIHt ^ RIHtHtHtHtH t  ^ RI!H"t"H#t# ^ RI$H%t% ^ R	I&H't'H(t(H)t) ^ R
I*H+t+ ^ RI,H-t-H.t. ]P^                  ! ]04      t1Rt2Rt3Rt4Rt5Rt6Rt70 R:mt80 R;mt90 R<mt:R=t;Rt<R].Pz                  3R].P|                  33t?R R lt@]A! 4       tB] ^ k R R ltCR R ltDR R ltER R ltFR R  ltGR>R! R" lltHR# R$ ltI ! R% R&]'4      tJR' R( ltKR) R* ltLR+ R, ltMR- R. ltNR/RR0RR1R2/R3 R4 lltOR?tPR5 R6 ltQR7 R8 ltRR# )@uî  SimpleX Chat adapter: persistent WebSocket to a simplex-chat daemon (``simplex-chat -p 5225``,
or ``docker run -p 5225:5225 simplexchat/simplex-chat-cli -p 5225``); JSON commands out, events in.

Env: SIMPLEX_WS_URL (required; default ws://127.0.0.1:5225) Â· SIMPLEX_ALLOWED_USERS (numeric
contactIds â€” stable across renames, see ``/contacts``) Â· SIMPLEX_ALLOW_ALL_USERS Â·
SIMPLEX_AUTO_ACCEPT ('false' disables contact-request auto-accept; default true) Â·
SIMPLEX_GROUP_ALLOWED (group IDs or '*'; omit to ignore groups) Â· SIMPLEX_HOME_CHANNEL[_NAME] Â·
HERMES_SIMPLEX_TEXT_BATCH_DELAY (quiet seconds, default 0.8, merging rapid-fire inbound text).
``websockets`` is imported lazily so the plugin stays discoverable when the package is missing.
N)ÚdatetimeÚtimezoneÚUTC)ÚPath)ÚAnyÚDictÚListÚOptional)Úunquote)Údecode_json_list_literalÚget_scoped_secretÚplatform_gate_envÚseed_extra_from_envÚ
send_error)ÚPlatformÚPlatformConfig)Úhermes_home_key)ÚBasePlatformAdapterÚ
SendResultÚcache_image_from_url)Úcancel_task)ÚMessageEventÚMessageTypei@  g       @g      N@ç      >@g     Àr@zhermes-zdata:image/jpg;base64,úaudio/úimage/c                óF   € V ^8„  d   QhR\         R\        \         ,          /# )é   ÚvalueÚreturn©ÚstrÚlist)Úformats   "ÚF/home/ubuntu/.hermes/hermes-agent/plugins/platforms/simplex/adapter.pyÚ__annotate__r%   5   s   € ÷ >ñ >œSð >¤T¬#¥Yñ >ó    c                 ó˜   € V P                  R 4       Uu. uF*  qP                  4       '       g   K  VP                  4       NK,  	  up# u upi )Ú,)ÚsplitÚstrip)r   Úvs   & r$   Ú_parse_comma_listr,   5   s3   € Ø$Ÿ{™{¨3Ô/Ó=Ñ/˜!·7±7·9ŒIˆA�G‰GŽIÑ/Ñ=Ð=ùÒ=s
   ”A°Ac                ó   € V ^8„  d   QhRR/# ©r   r   N© )r#   s   "r$   r%   r%   >   s   € ÷ Tñ T dñ Tr&   c                 óú  € \        \        R4      4      p \        V \        4      '       d*   V  Uu. uF  p\	        V4      P                  4       NK  	  upM
\        V 4      pV Uu. uF/  q3'       g   K  VR8w  g   K  VP                  4       '       d   K-  VNK1  	  ppV'       g   R# \        4       \        V4      3pV\        9   d   R# \        P                  V4       \        P                  RV4       R# u upi u upi )a  Warn once per process per profile/allowlist value about SIMPLEX_ALLOWED_USERS entries authz ignores.

Reads and decodes the value exactly as authz does (``platform_gate_env`` + JSON list literal), so the
warning names only entries that really fail the contactId check.ÚSIMPLEX_ALLOWED_USERSÚ*Nz‹SimpleX: SIMPLEX_ALLOWED_USERS entries %s are not numeric contactIds and are ignored (display names are not trusted; see /contacts for IDs))Ú_decode_json_list_literalÚ_platform_gate_envÚ
isinstancer"   r!   r*   r,   Úisdigitr   Ú	frozensetÚ_NAME_ALLOWLIST_WARNEDÚaddÚloggerÚwarning)ÚrawÚeÚentriesÚuÚnamesÚkeys         r$   Ú_warn_name_allowlist_entriesrB   >   sÂ   € ô
 $Ô$6Ð7NÓ$OÓ
P€CÜ/9¸#¼t×/DÒ/D¡sÓ+¡s !Œs�1‹v�|‰|Ž~¡sÒ+ÔJ[Ð\_ÓJ`€GÙÓF™�1£1ŒQ¨¨c©ŒQ¸!¿)¹)¿+�QˆQ™€EÐFßÙÜÓœi¨Ó.Ð
/€CØ
Ô$Ô$ÙÜ×Ñ˜sÔ#Ü
‡N�Nð LØMRöTùò ,ùÚFs   ¯"C3Á#	C8Á1C8Á:C8ÂC8c                ó0   € V ^8„  d   QhR\         R\         /# )r   Ú
contact_idr   ©r!   )r#   s   "r$   r%   r%   P   s   € ÷ 7ñ 7œ3ð 7¤3ñ 7r&   c                 ó„   € V '       g   R # \        V 4      p\        V4      ^8:  d   V# VR,          R,           VRR ,           # )z<none>:Nr   Nz**Néþÿÿÿ)r!   Úlen)rD   Úss   & r$   Ú
_redact_idrJ   P   s9   € ßÙÜˆJ‹€AÜ�A“˜!”ˆ1Ð6  2¥¨¥°°"°#°Õ!6Ð6r&   c                ó0   € V ^8„  d   QhR\         R\        /# ©r   Úextr   ©r!   Úbool)r#   s   "r$   r%   r%   W   ó   € ÷ &ñ &”sð &œtñ &r&   c                 ó0   € V P                  4       \        9   # ©N)ÚlowerÚ_IMAGE_EXTS©rM   s   &r$   Ú_is_image_extrV   W   ó   € Ø�9‰9‹;œ+Ñ%Ð%r&   c                ó0   € V ^8„  d   QhR\         R\        /# rL   rN   )r#   s   "r$   r%   r%   [   rP   r&   c                 ó0   € V P                  4       \        9   # rR   )rS   Ú_AUDIO_EXTSrU   s   &r$   Ú_is_audio_extr[   [   rW   r&   c                ó0   € V ^8„  d   QhR\         R\         /# rL   rE   )r#   s   "r$   r%   r%   _   s   € ÷ &ñ &”sð &œsñ &r&   c                 óš   € \        V 4      '       d   R V P                  R4       2# \        V 4      '       d   RV P                  R4       2# R# )r   Ú.r   zapplication/octet-stream)rV   Úlstripr[   rU   s   &r$   Ú_mime_for_extr`   _   sG   € Ü�S×ÒØ˜Ÿ
™
 3›Ð(Ð)Ð)Ü�S×ÒØ˜Ÿ
™
 3›Ð(Ð)Ð)Ù%r&   c                óH   € V ^8„  d   QhR\         R\        R\        R\        /# )r   ÚobjÚprofile_keyÚdefaultr   ©Údictr!   )r#   s   "r$   r%   r%   g   s.   € ÷ kñ k”tð k¬#ð k¼ð kÄSñ kr&   c                óŽ   € V P                  RR4      ;'       g-    V P                  V/ 4      ;'       g    / P                  RV4      # )zJ``localDisplayName`` falling back to the nested profile's ``displayName``.ÚlocalDisplayNameÚ ÚdisplayName)Úget)rb   rc   rd   s   &&&r$   Ú_display_namerl   g   s>   € à�7‰7Ð% rÓ*×jÐj¨s¯w©w°{ÀBÓ/G×/MÐ/MÈ2×.RÑ.RÐS`ÐbiÓ.jÐjr&   c                ó<   € V ^8„  d   QhR\         R\        R\         /# )r   Úchat_idÚitemsr   r    )r#   s   "r$   r%   r%   l   s!   € ÷ 7ñ 7”sð 7¤4ð 7¬Cñ 7r&   c                óŠ   € V P                  R4      '       d   RV R,           2MRV  2pRV R\        P                  ! V4       2# )uÁ   Structured ``/_send <target> json â€¦`` addressing *chat_id* by ID. The bare ``@name`` / ``#[id]``
syntax is a display-name lookup that silently drops unresolved names; json.dumps escapes text.úgroup:Ú#ºé   NNÚ@z/_send z json )Ú
startswithÚjsonÚdumps)rn   ro   Útargets   && r$   Ú	_send_cmdrz   l   sI   € ð #*×"4Ñ"4°X×">Ò">ˆq�˜•�ÑÀaÈÀyÀM€FØ�V�H˜F¤4§:¢:¨eÓ#4Ð"5Ð6Ð6r&   c            
       óŒ  a a€ ] tR t^st oRt]tRtV3R lV 3R lltRR/V3R lR lltV3R	 lR
 lt	V3R lR lt
V3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltV3R lR ltR]R]R]R]R]/tV3R  lR! ltV3R" lR# ltV3R$ lR% ltV3R& lR' ltV3R( lR) ltREV3R* lR+ lltV3R, lR- ltV3R. lR/ ltRFV3R0 lR1 lltV3R2 lR3 lt]V3R4 lR5 l4       tRGV3R6 lR7 lltRFV3R8 lR9 llt RFV3R: lR; llt!RFV3R< lR= llt"RHV3R> lR? llt#RGV3R@ lRA llt$V3RB lRC lt%RDt&Vt'V ;t(# )IÚSimplexAdapterzASimpleX Chat adapter using the simplex-chat daemon WebSocket API.Tc                ó    <€ V ^8„  d   QhRS[ /# )r   Úconfig)r   )r#   Ú__classdict__s   "€r$   r%   ÚSimplexAdapter.__annotate__y   s   ø€ ÷ _ñ _™~ñ _r&   c                ót  <€ \         SV `  V\        R 4      R7       \        VR/ 4      ;'       g    / pVP	                  RR4      P                  R4      V n        \        R4      pVe(   VP                  4       P                  4       R9  V n
        M \        VP	                  R	R
4      4      V n
        \        RR4      ;'       g    VP	                  RR4      p\        \        V4      4      V n        RV n        RV n        RV n        RV n        RV n        \        4       V n        ^ÈV n        / V n        / V n        ^ V n        \3        \4        P6                  ! RR4      4      V n        V P8                  V n        \<        P?                  RV P                  V P                  V P                  '       d	   R4       R# R4       R# )Úsimplex)r~   ÚplatformÚextraÚws_urlúws://127.0.0.1:5225Ú/ÚSIMPLEX_AUTO_ACCEPTNri   Úauto_acceptTÚSIMPLEX_GROUP_ALLOWEDÚgroup_allowedFg        ÚHERMES_SIMPLEX_TEXT_BATCH_DELAYz0.8z<SimpleX adapter initialized: url=%s auto_accept=%s groups=%sÚenabledÚdisabled>   ri   Ú0ÚnoÚfalse) ÚsuperÚ__init__r   Úgetattrrk   Úrstripr…   Ú_get_scoped_secretr*   rS   r‰   rO   Úsetr,   Úgroup_allow_fromÚ_wsÚ_ws_taskÚ_health_taskÚ_runningÚ_last_ws_activityÚ_pending_corr_idsÚ_max_pending_corrÚ_pending_file_transfersÚ_pending_responsesÚ_corr_counterÚfloatÚosÚgetenvÚ_text_batch_delay_secondsÚ_text_batch_split_delay_secondsr:   Úinfo)Úselfr~   Úkwargsr„   Úenv_autoÚgroup_allowed_strÚ	__class__s   &&,   €r$   r“   ÚSimplexAdapter.__init__y   sz  ø€ Ü‰Ñ ´¸)Ó1DÐÔEÜ˜ ¨Ó,×2Ð2°ˆØ—i‘i Ð*?Ó@×GÑGÈÓLˆŒä%Ð&;Ó<ˆØÒØ'Ÿ~™~Ó/×5Ñ5Ó7Ð?WÑWˆDÕä# E§I¡I¨m¸TÓ$BÓCˆDÔä.Ð/FÈÓK×mÐmÈuÏyÉyÐYhÐjlÓOmÐô !$Ô$5Ð6GÓ$HÓ IˆÔØˆŒØ04ˆŒØ48ˆÔØˆŒØ!$ˆÔÜ&)£eˆÔØ!$ˆÔØ8:ˆÔ$Ø=?ˆÔØˆÔä).¬r¯yªyÐ9ZÐ\aÓ/bÓ)cˆÔ&Ø/3×/MÑ/MˆÔ,Ü�‰ØJØ�K‰K˜×)Ñ)¸×8M×8MÐ8M¨9ö	_àS]ö	_r&   Úis_reconnectFc                ó&   <€ V ^8„  d   QhRS[ RS[ /# )r   r¯   r   ©rO   )r#   r   s   "€r$   r%   r€   š   s   ø€ ÷ ñ ©Tð ¹dñ r&   c             ƒ  óh  "  €  ^ RI pT P                  '       g   \        P                  R4       R# \        4         TP                  T P                  ^
R7      ;_uu_4       GRj  x€L
   RRR4      GRj  x€L
  RT n        \        P                  ! 4       T n
        \        P                  ! T P                  4       4      T n        \        P                  ! T P                  4       4      T n        T P#                  4        \        P%                  RT P                  4       T P'                  R4       R#   \         d    \        P                  R4        R# i ; i Lò Lã  + GRj  x€L 
 '       g   i     Lú; i  \         d-   p\        P                  RT P                  T4        Rp?R# Rp?ii ; i5i)	é    NzHSimpleX: 'websockets' package not installed. Run: pip install websocketsFz#SimpleX: SIMPLEX_WS_URL is required)Úopen_timeoutz&SimpleX: cannot reach daemon at %s: %sTzSimpleX: connected to %s)Ú
websocketsÚImportErrorr:   Úerrorr…   rB   ÚconnectÚ	Exceptionrœ   Útimer�   ÚasyncioÚcreate_taskÚ_ws_listenerrš   Ú_health_monitorr›   Ú_mark_connectedr¨   Ú_wire_plugin_handlers)r©   r¯   Ú	_wsclientr=   s   &$  r$   r¸   ÚSimplexAdapter.connectš   s2  é € ð	Û*ð �{�{ˆ{Ü�L‰LÐ>Ô?ÙÜ$Ô&ð	Ø ×(Ñ(¨¯©À2Ð(×F×FÕFØ÷ G×Fð
 ˆŒÜ!%§¢£ˆÔÜ×+Ò+¨D×,=Ñ,=Ó,?Ó@ˆŒÜ#×/Ò/°×0DÑ0DÓ0FÓGˆÔØ×ÑÔÜ�‰Ð.°·±Ô<Ø×"Ñ" 4Ô(Ùøô) ô 	Ü�L‰LÐcÔdÚð	ú÷ G×F×FÔFûäô 	Ü�L‰LÐAÀ4Ç;Á;ÐPQÔRÝûð	üs°   ‚F2„D1 ˆF2š!F2¼)E8 Á%EÁ&E8 Á)EÁ+E8 Á6EÁ7E8 Á;B6F2Ä1 EÅF2ÅEÅF2ÅE8 ÅE8 ÅE5	Å"E%Å#
E5	Å.E5	Å0E8 Å4F2Å5E8 Å8F/Æ!F*Æ$F2Æ*F/Æ/F2c                ó   <€ V ^8„  d   QhRR/# r.   r/   )r#   r   s   "€r$   r%   r€   ³   s   ø€ ÷ -ñ - $ñ -r&   c              ƒ  óf  "  € R V n         \        V P                  4      G Rj  x€L
  \        V P                  4      G Rj  x€L
  V P                  '       dU   \
        P                  ! \        4      ;_uu_ 4        V P                  P                  4       G Rj  x€L
  RRR4       RV n        V P                  P                  4       V P                  P                  4       3 F=  p\        V4       F+  pVP                  4       '       d   K  VP                  4        K-  	  K?  	  V P                  P                  4        V P                   P                  4        V P                  P                  4        V P#                  4        \$        P'                  R4       R#  ELr ELX EL  + '       g   i     EL; i5i)FNzSimpleX: disconnected)rœ   r   rš   r›   r™   Ú
contextlibÚsuppressr¹   ÚcloseÚ_pending_text_batch_tasksÚvaluesr¡   r"   ÚdoneÚcancelÚclearÚ_pending_text_batchesÚ_mark_disconnectedr:   r¨   )r©   ÚpendingÚitems   &  r$   Ú
disconnectÚSimplexAdapter.disconnect³   s%  é € ØˆŒÜ˜$Ÿ-™-Ó(×(Ð(Ü˜$×+Ñ+Ó,×,Ð,Ø�8�8ˆ8Ü×$Ò$¤Y×/Õ/Ø—h‘h—n‘nÓ&×&Ð&÷ 0àˆDŒHØ×6Ñ6×=Ñ=Ó?À×AXÑAX×A_ÑA_ÓAaÓbˆGÜ˜Wž�Ø—y‘y—{”{Ø—K‘K–Mó &ñ cð 	×&Ñ&×,Ñ,Ô.Ø×"Ñ"×(Ñ(Ô*Ø×Ñ×%Ñ%Ô'Ø×ÑÔ!Ü�‰Ð+Ö,ò 	)Ú,ò '÷ 0×/Ð/üsX   ‚ F1¢F£F1¿FÁ F1Á"F1Á8FÂFÂFÂA'F1ÄBF1ÆF1ÆFÆF.	Æ(	F1c                ó   <€ V ^8„  d   QhRR/# r.   r/   )r#   r   s   "€r$   r%   r€   Å   s   ø€ ÷ "?ñ "? Dñ "?r&   c              ƒ  óž  "  € ^ RI p^ RIHp \        pV P                  '       Ed‚    \
        P                  RV P                  4       VP                  V P                  ^^^
R7      ;_uu_4       GRj  x€L
 pW@n	        \        p\        P                  ! 4       V n        \
        P                  R4       V  Rj  x€L
  pV P                  '       g    MJ\        P                  ! 4       V n         V P                  \        P                  ! V4      4      G Rj  x€L
  Kh  RRR4      GRj  x€L
  RT n	        T P                  '       g   EK5  \&        P,                  ! Y3R
,          \.        P.                  ! 4       ,          ,           4      G Rj  x€L
  \1        T^,          \2        4      pEK”  R#  EL7 Ló L˜  \        P                    d    \
        P                  RT4        EK+  \"         d    \
        P%                  R4        EKN  i ; iEDMLí Lá  + GRj  x€L 
 '       g   i     Lø; i  \&        P(                   d     RT n	        R# T d4   pT P                  '       d   \
        P+                  RYc4        Rp?ELNRp?i\"         d4   pT P                  '       d   \
        P+                  R	Yc4        Rp?ELŠRp?ii ; i  RT n	        i ; i ELB5i)r³   N)ÚConnectionClosedzSimpleX WS: connecting to %s)Úping_intervalÚping_timeoutÚclose_timeoutzSimpleX WS: connectedz SimpleX WS: invalid JSON: %.100sz SimpleX WS: error handling eventz9SimpleX WS: connection closed: %s (reconnecting in %.0fs)z8SimpleX WS: unexpected error: %s (reconnecting in %.0fs)gš™™™™™É?)rµ   Úwebsockets.exceptionsrÕ   ÚWS_RETRY_DELAY_INITIALrœ   r:   Údebugr…   r¸   r™   rº   r�   r¨   Ú_handle_eventrw   ÚloadsÚJSONDecodeErrorr¹   Ú	exceptionr»   ÚCancelledErrorr;   ÚsleepÚrandomÚminÚWS_RETRY_DELAY_MAX)r©   rÁ   rÕ   ÚbackoffÚwsr<   r=   s   &      r$   r½   ÚSimplexAdapter._ws_listenerÅ   s  é € Û&Ý:Ü(ˆØ�m�m‰mð Ü—‘Ð;¸T¿[¹[ÔIØ$×,Ñ,¨T¯[©[ÈÐY[ÐkmÐ,×n×nÔnÐrtØ!”HÜ4�GÜ-1¯YªY«[�DÔ*Ü—K‘KÐ 7Ô8Ù%'÷ 	Qð 	Q˜cØ#Ÿ}Ÿ}˜}Ù!Ü15·²³˜Ô.ðQØ"&×"4Ñ"4´T·Z²ZÀ³_Ó"E×EÒE÷ o×nð0  �”Ø�}�}‹}Ü—m’m G¸­m¼f¿mºm»oÕ.MÕ$MÓN×NÐNÜ˜g¨�kÔ+=Ó>“ñ= ò oñ
	Qñ
 FøÜ#×3Ñ3ô RÜ"ŸL™LÐ)KÈS×QÐQÜ(ô QÜ"×,Ñ,Ð-O×PÐPðQúò &(÷ o×n×nÒnûô ×)Ñ)ô Øð  �–ð $ô lØ—=—=�=Ü—N‘NÐ#^Ð`aÔkÿùÜô kØ—=—=�=Ü—N‘NÐ#]Ð_`Ôjÿùðkûð  �•úâNùs>  ‚#K§AH' Á2F)Á3H' Á6>HÂ4HÂ8F,
Â9HÂ<0HÃ-(F0ÄF.
ÄF0ÄHÄH' Ä'H	Ä(H' Ä,KÅA KÆK
Æ	 KÆ)H' Æ,HÆ.F0Æ0+H	ÇHÇH	Ç(H	Ç>HÈH	ÈHÈ	H' ÈH$	ÈHÈ
H$	ÈH$	ÈH' È#J> È$H' È'J;È<J> È=	KÉJ;ÉJ;É(I:É4J> É:J;ÊJ;Ê(J6Ê0J> Ê6J;Ê;J> Ê>	KËKc                ó   <€ V ^8„  d   QhRR/# r.   r/   )r#   r   s   "€r$   r%   r€   é   s   ø€ ÷ 	Pñ 	P tñ 	Pr&   c              ƒ  ó8  "  € V P                   '       d‚   \        P                  ! \        4      G Rj  x€L
  V P                   '       g   R# \        P                  ! 4       V P
                  ,
          pV\        8”  g   K{  \        P                  RV4       K“  R#  Le5i)z�Log (never reconnect on) WebSocket idleness: simplex-chat legitimately stays
application-silent for long periods and the client already sends protocol pings.Nz&SimpleX: WS application-idle for %.0fs)	rœ   r»   rá   ÚHEALTH_CHECK_INTERVALrº   r�   ÚHEALTH_CHECK_STALE_THRESHOLDr:   rÛ   )r©   Úelapseds   & r$   r¾   ÚSimplexAdapter._health_monitoré   se   é € ð �m�mˆmÜ—-’-Ô 5Ó6×6Ð6Ø—=—=�=ÙÜ—i’i“k D×$:Ñ$:Õ:ˆGØÔ5Ö5Ü—‘ÐEÀwÖOñ Ù6ùs    ‚B•B²B³BÁ	0BÁ>Bc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úeventr   N©rf   )r#   r   s   "€r$   r%   r€   ô   s   ø€ ÷ Iñ I©ð I°$ñ Ir&   c              ƒ  ó   "  € \        VP                  R 4      \        4      '       d   VP                  R 4      MTpVP                  R4      pV'       dU   W0P                  9   dE   V P                  P	                  V4      pVP                  4       '       g   VP                  V4       R# V'       dO   \        V\        4      '       d9   VP                  \        4      '       d   V P                  P                  V4       R# VP                  R4      ;'       g    VP                  RR4      pV P                  P                  V4      pVe   V! W4      G Rj  x€L
  R# V'       d   \        P                  RV4       R# R#  L(5i)ÚrespÚcorrIdNÚtyperi   ú!SimpleX: unhandled event type: %s)r5   rk   rf   r¡   ÚpoprÊ   Ú
set_resultr!   rv   Ú_CORR_PREFIXrž   ÚdiscardÚ_EVENT_HANDLERSr:   rÛ   )r©   rï   rò   Úcorr_idÚfutÚ	resp_typeÚhandlers   &&     r$   rÜ   ÚSimplexAdapter._handle_eventô   s  é € ô %/¨u¯y©y¸Ó/@Ä$×$GÒ$Gˆu�y‰y˜Ô ÈUˆØ—)‘)˜HÓ%ˆß�w×"9Ñ"9Ô9Ø×)Ñ)×-Ñ-¨gÓ6ˆCØ—8‘8—:’:Ø—‘˜tÔ$Ùß”z '¬3×/Ò/°G×4FÑ4FÄ|×4TÒ4TØ×"Ñ"×*Ñ*¨7Ô3ÙØ—H‘H˜VÓ$×=Ð=¨¯	©	°&¸"Ó(=ˆ	Ø×&Ñ&×*Ñ*¨9Ó5ˆØÒÙ˜$Ó%×%Ò%ßÜ�L‰LÐ<¸iÖHñ ñ &ùs7   ‚AE>ÁA E>ÂE>Â00E>Ã!4E>Ä=E>ÅE<ÅE>Å"E>c                ó$   <€ V ^8„  d   QhRS[ RR/# ©r   rò   r   Nrð   )r#   r   s   "€r$   r%   r€     s   ø€ ÷ Bñ B©dð B°tñ Br&   c              ƒ  óP  "  € V P                   '       g   \        P                  R R4       R# VP                  R/ 4      ;'       g    / P                  R4      pVeG   \        P	                  R\        \        V4      4      4       V P                  RV 24      G Rj  x€L
  R# R#  L5i)rõ   ÚcontactRequestNÚcontactRequestIdz*SimpleX: auto-accepting contact request %sz/accept )r‰   r:   rÛ   rk   r¨   rJ   r!   Ú_send_command)r©   rò   Úcontact_req_ids   && r$   Ú_on_contact_requestÚ"SimplexAdapter._on_contact_request  sŽ   é € Ø××ÐÜ�L‰LÐ<Ð>NÔOÙØŸ(™(Ð#3°RÓ8×>Ð>¸B×CÑCÐDVÓWˆØÒ%Ü�K‰KÐDÄjÔQTÐUcÓQdÓFeÔfØ×$Ñ$ x°Ð/?Ð%@ÓA×AÒAñ &áAùs   ‚AB&ÁAB&ÂB$Â	B&c                ó$   <€ V ^8„  d   QhRS[ RR/# r  rð   )r#   r   s   "€r$   r%   r€     s   ø€ ÷ Eñ E±4ð E¸Dñ Er&   c              ƒ  ó  "  € VP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  R4      MR;pe5   \        P	                  RV4       V P                  RV 24      G Rj  x€L
  R# R#  L5i)z^XFTP files fire this before newChatItems; start the download now, the chat item arrives later.ÚrcvFileTransferÚfileIdNu>   SimpleX: rcvFileDescrReady for fileId=%s â€” sending /freceiveú
/freceive )rk   r5   rf   r:   rÛ   Ú_send_fire_and_forget)r©   rò   Úrcv_fileÚfile_ids   &&  r$   Ú_on_rcv_file_descr_readyÚ'SimplexAdapter._on_rcv_file_descr_ready  su   é € à—8‘8Ð-¨rÓ2×8Ð8°bˆÜ1;¸HÄd×1KÒ1K�x—|‘| HÔ-ÐQUÐUˆGÒbÜ�L‰LÐYÐ[bÔcØ×,Ñ,¨z¸'¸Ð-CÓD×DÒDñ cáDùs   ‚A7BÁ9BÁ:	Bc                ó$   <€ V ^8„  d   QhRS[ RR/# r  rð   )r#   r   s   "€r$   r%   r€     s   ø€ ÷ [ñ [©Tð [°dñ [r&   c              ƒ  óÂ   "  € VP                  R . 4      ;'       g    . p\        V\        4      '       d   TMV. F  pV P                  VR4      G Rj  x€L
  K  	  R#  L
5i)Ú	chatItemsú#SimpleX: error processing chat itemN)rk   r5   r"   Ú_safe_handle_chat_item)r©   rò   Ú
chat_itemsrÐ   s   &&  r$   Ú_on_new_chat_itemsÚ!SimplexAdapter._on_new_chat_items  sU   é € Ø—X‘X˜k¨2Ó.×4Ð4°"ˆ
Ü",¨Z¼×">Ò">‘JÀZÀLÒPˆDØ×-Ñ-¨dÐ4YÓZ×ZÒZó QÙZùs   ‚AAÁAÁAc                ó$   <€ V ^8„  d   QhRS[ RR/# r  rð   )r#   r   s   "€r$   r%   r€     s   ø€ ÷ Wñ W©Dð W°Tñ Wr&   c              ƒ  óF   "  € V P                  VR 4      G Rj  x€L
  R#  L5i)r  N)r  )r©   rò   s   &&r$   Ú_on_new_chat_itemÚ SimplexAdapter._on_new_chat_item  s   é € Ø×)Ñ)¨$Ð0UÓV×VÔVùs   ‚!˜™!c                ó$   <€ V ^8„  d   QhRS[ RR/# r  rð   )r#   r   s   "€r$   r%   r€      s   ø€ ÷ jñ j±ð j¸ñ jr&   c              ƒ  óª  "  € VP                  R/ 4      ;'       g    / P                  R/ 4      ;'       g    / pVP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRpVe   W@P                  9  d   R# V P                  P	                  V4      pVP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRpV'       dT   VP                  R/ 4      ;'       g    / pRV/VP                  R/ 4      R&   W…R&   V P                  VR4      G Rj  x€L
  R# R#  L5i)z?Deliver a chat item deferred until its file transfer completed.ÚchatItemÚfiler  NÚ
fileSourceÚfilePathz/SimpleX: error processing deferred file message)rk   r5   rf   r    rö   Ú
setdefaultr  )	r©   rò   Úchat_item_dataÚ	file_infor  rÏ   Úfile_sourceÚ	file_pathÚpending_item_datas	   &&       r$   Ú_on_rcv_file_completeÚ$SimplexAdapter._on_rcv_file_complete   s+  é € àŸ(™( :¨rÓ2×8Ð8°b×=Ñ=¸jÈ"ÓM×SÐSÐQSˆØ"×&Ñ& v¨rÓ2×8Ð8°bˆ	Ü-7¸	Ä4×-HÒ-H�)—-‘- Ô)ÈdˆØŠ?˜g×-IÑ-IÔIÙØ×.Ñ.×2Ñ2°7Ó;ˆØ—m‘m L°"Ó5×;Ð;¸ˆÜ3=¸kÌ4×3PÒ3P�K—O‘O JÔ/ÐVZˆ	ßØ '§¡¨J¸Ó ;× AÐ A¸rÐØFPÐR[ÐE\Ð×(Ñ(¨°Ó4°\ÑBØ"3�JÑØ×-Ñ-¨gÐ7hÓi×iÒiñ	 ñ jùs/   ‚3E¶EÁA5EÃ3EÃ<EÄ3EÅEÅ		Er  ÚrcvFileDescrReadyÚnewChatItemsÚnewChatItemÚrcvFileCompletec                ó*   <€ V ^8„  d   QhRS[ RS[RR/# )r   rÐ   Úerr_msgr   Nre   )r#   r   s   "€r$   r%   r€   5  s"   ø€ ÷ &ñ &±ð &Áð &Èñ &r&   c              ƒ  ó”   "  €  V P                  V4      G R j  x€L
  R #  L  \         d    \        P                  T4        R # i ; i5irR   )Ú_handle_chat_itemr¹   r:   rß   )r©   rÐ   r2  s   &&&r$   r  Ú%SimplexAdapter._safe_handle_chat_item5  s:   é € ð	&Ø×(Ñ(¨Ó.×.Ô.øÜô 	&Ü×Ñ˜W×%ð	&üs1   ‚A„! ˜™! �AŸ! ¡ AÁAÁAÁAc                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Ú	chat_itemr   Nrð   )r#   r   s   "€r$   r%   r€   ;  s   ø€ ÷ T1ñ T1±ð T1¸$ñ T1r&   c           
   ƒ  óŽ  a!"  € VP                  R / 4      ;'       g    / pVP                  R/ 4      ;'       g    / pVP                  RR4      pVP                  R/ 4      ;'       g    / pVP                  R/ 4      ;'       g    / pVP                  R/ 4      ;'       g    / pVP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  RR4      MRp	V	R-9   d   R# \        V\        4      '       d   VP                  RR4      MRp
V
R	8w  d   R# \        V\        4      '       d   VP                  RR4      MRpV\        9   d   VP                  R
R4      MRpV'       g
   VR.9  d   R# VR8H  pVR8X  dJ   VP                  R/ 4      ;'       g    / p\	        VP                  RR4      4      ;pp\        VR4      ;ppEMV'       dú   VP                  R/ 4      ;'       g    / p\	        VP                  RR4      4      pRV 2pVP                  R/ 4      ;'       g    / p\	        VP                  RR4      4      p\        VR4      p\        VRV4      pV P                  '       g   \        P                  R4       R# RV P                  9  d3   VV P                  9  d"   \        P                  R\        V4      4       R# M\        P                  RV4       R# V'       g   \        P                  R4       R# . p. o!VP                  R4      pV'       Edw   \        V\        4      '       Ed`   VP                  R/ 4      ;'       g    / p\        V\        4      '       d   VP                  R4      MRpVP                  R4      pV'       d$   \        V4      P                  P                  4       MRpV'       gC   VP                  R R4      '       d+   \        VR ,          4      P                  P                  4       pV'       gX   \        V4      '       dG   VeC   \        P                  R!V4       WP                  V&   V P!                  R"V 24      G Rj  x€L
  R# V'       d,   VP#                  V4       S!P#                  \%        V4      4       T P'                  TTV'       d   RMR#TT;'       g    TR$7      p\(        P*                  pS!'       d)   \-        V!3R% l\.         4       \(        P0                  4      pVP                  R&4      ;'       g    VP                  R'R4      p V'       d   \2        P4                  ! V4      M\2        P6                  ! \8        R(7      p\?        TT;'       g    RVVS!VVR)7      p \        P                  R*\        V4      VR+,          T;'       g    RR,,          4       V\(        P*                  8X  d   V'       d   V PA                  V 4       R# V PC                  V 4      G Rj  x€L
  R#  EL©  \:        \<        3 d    \2        P6                  ! \8        R(7      p LÑi ; i L;5i)/ÚchatInfor!  rô   ri   ÚmetaÚcontentÚ
msgContentÚchatDirNÚrcvMsgContentÚtextr"  ÚgroupÚdirectÚcontactÚ	contactIdÚprofileÚ	groupInfoÚgroupIdrq   ÚgroupMemberÚmemberIdÚmemberProfileÚgroupProfilez:SimpleX: ignoring group message (no SIMPLEX_GROUP_ALLOWED)r2   z"SimpleX: group %s not in allowlistz SimpleX: unhandled chat type: %sz(SimpleX: ignoring message with no senderr#  r$  r  ÚfileNamez;SimpleX: voice file %d not yet received, accepting transferr  Údm)rn   Ú	chat_nameÚ	chat_typeÚuser_idÚ	user_namec              3   ó´   <a"  € T FL  w  op\         ;QJ d    V3R  lS 4       F  '       g   K   RM	  RM! V3R  lS 4       4      '       g   KH  Vx € KN  	  R# 5i)c              3   óD   <"  € T F  qP                  S4      x € K  	  R # 5irR   ©rv   )Ú.0ÚmtÚprefixs   & €r$   Ú	<genexpr>Ú=SimplexAdapter._handle_chat_item.<locals>.<genexpr>.<genexpr>�  s   øé € ÐMzÑnyÐhjÏmÉmÐ\b×NcÐNcÓnyùs   ƒ TFN)Úany)rT  ÚtrV  Úmedia_typess   & @€r$   rW  Ú3SimplexAdapter._handle_chat_item.<locals>.<genexpr>�  s8   ùé € Ð{Ñ0F¡9 6¨1Ï#Ë#ÔMzÑnyÓMzÏ#Ï#Ê#ÔMzÑnyÓMz×JzŸQšQÓ0Fùs   „A—A®AÁ
AÚitemTsÚ	createdAt)Útz)Úsourcer?  Úmessage_typeÚ
media_urlsr[  Ú	timestampÚraw_messagez"SimpleX: message from %s in %s: %s:Né   NºNé2   N)Ú	directSndÚgroupSnd)Úimager"  Úvoice)"rk   r5   rf   Ú_TEXT_BEARING_TYPESr!   rl   r˜   r:   rÛ   rJ   r   ÚsuffixrS   r[   r¨   r    r  Úappendr`   Úbuild_sourcer   ÚTEXTÚnextÚ_MEDIA_KIND_PRECEDENCEÚDOCUMENTr   ÚfromisoformatÚnowr   Ú
ValueErrorÚAttributeErrorr   Ú_enqueue_text_eventÚhandle_message)"r©   r7  Ú	chat_infor&  rN  r:  r;  Úmsg_contentÚitem_directionÚdirection_typeÚcontent_typeÚmsg_type_strr?  Úis_grouprB  Ú	sender_idrn   Úsender_namerM  Ú
group_infoÚgroup_idÚmemberrb  r'  r(  r)  r  rM   r`  Úmsg_typeÚts_strrc  Ú	msg_eventr[  s"   &&                               @r$   r4  Ú SimplexAdapter._handle_chat_item;  s  øé € Ø—M‘M *¨bÓ1×7Ð7°Rˆ	Ø"Ÿ™ z°2Ó6×<Ð<¸"ˆØ—M‘M &¨"Ó-ˆ	Ø×!Ñ! &¨"Ó-×3Ð3°ˆØ ×$Ñ$ Y°Ó3×9Ð9°rˆØ—k‘k ,°Ó3×9Ð9°rˆØ'×+Ñ+¨I°rÓ:×@Ð@¸bˆÜ;EÀnÔVZ×;[Ò;[˜×+Ñ+¨F°BÔ7ÐacˆØÐ6Ô6ÙÜ2<¸WÄd×2KÒ2K�w—{‘{ 6¨2Ô.ÐQSˆØ˜?Ô*ÙÜ6@ÀÌd×6SÒ6S�{—‘ v¨rÔ2ÐY[ˆØ.:Ô>QÔ.Qˆ{�‰˜v rÔ*ÐWYˆß˜Ð,FÔFÙØ Ñ'ˆØ˜Ô Ø—m‘m I¨rÓ2×8Ð8°bˆGÜ"% g§k¡k°+¸rÓ&BÓ"CÐCˆI˜Ü&3°G¸YÓ&GÐGˆKš)ßØ"Ÿ™ {°BÓ7×=Ð=¸2ˆJÜ˜:Ÿ>™>¨)°RÓ8Ó9ˆHØ˜x˜jÐ)ˆGØ#×'Ñ'¨°rÓ:×@Ð@¸bˆFÜ˜FŸJ™J z°2Ó6Ó7ˆIÜ'¨°Ó@ˆKÜ% j°.À'ÓJˆIØ×(×(Ð(Ü—‘ÐYÔZÙØ˜$×/Ñ/Ô/°HÀD×DYÑDYÔ4YÜ—‘ÐAÄ:ÈhÓCWÔXÙøä�L‰LÐ;¸YÔGÙßÜ�L‰LÐCÔDÙà "ˆ
Ø!#ˆØ"×&Ñ& vÓ.ˆ	ßˆ9œ I¬t×4Ó4Ø#Ÿ-™-¨°bÓ9×?Ð?¸RˆKÜ7AÀ+Ìt×7TÒ7T˜Ÿ™¨
Ô3ÐZ^ˆIØ—m‘m HÓ-ˆGß4=”$�y“/×(Ñ(×.Ñ.Ô0À2ˆCß˜9Ÿ=™=¨°R×8Ò8Ü˜9 ZÕ0Ó1×8Ñ8×>Ñ>Ó@�÷ ¤¨s×!3Ò!3¸Ò8KÜ—‘ÐYÐ[bÔcØ8A×,Ñ,¨WÑ5Ø×0Ñ0°:¸g¸YÐ1GÓH×HÐHÙßØ×!Ñ! )Ô,Ø×"Ñ"¤=°Ó#5Ô6Ø×"Ñ"Ø yÇx¹GÐUYØ¨×)AÐ)A¸	ð #ó Cˆô ×#Ñ#ˆßÜÔ{Õ0FÓ{Ü'×0Ñ0ó2ˆHà—‘˜(Ó#×@Ð@ t§x¡x°¸RÓ'@ˆð	-ß:@œ×.Ò.¨vÔ6ÄhÇlÂlÔVYÔFZˆIô !Ø §
 
¨¸ÈjØ#¨yÀiôQˆ	ô 	�‰Ð9¼:ÀiÓ;PÐRYÐZ]ÕR^Ðae×akÐakÐikÐmpÕ`qÔrØ”{×'Ñ'Ô'¯DØ×$Ñ$ YÖ/à×%Ñ% iÓ0×0Ò0ò3 Iøô  œNÐ+ô 	-Ü Ÿš¬Ô,ŠIð	-úñ 1ùsà   ƒ5Y¹-YÁ'YÂYÂYÂ;B9YÅ5-YÆ#7YÇYÇ4;YÈ0CYË44YÌ)/YÍAYÎ,YÏYÏ#1YÐAYÑ%XÑ&YÑ4?YÒ4YÓYÓ!?YÔ!YÔ5X Ô=1X Õ.YÕ=7YÖ5*Y× 'YØYØYØ,Y Ø=YØ?Y Ù Yc                ó&   <€ V ^8„  d   QhRS[ RS[/# )r   rï   r   )r   r!   )r#   r   s   "€r$   r%   r€   “  s   ø€ ÷ Gñ G¡\ð G±cñ Gr&   c                ót   € VP                   P                  P                   R VP                   P                   2# )Ú:)r`  rƒ   r   rn   )r©   rï   s   &&r$   Ú_text_batch_keyÚSimplexAdapter._text_batch_key“  s/   € Ø—,‘,×'Ñ'×-Ñ-Ð.¨a°·±×0DÑ0DÐ/EÐFÐFr&   c                ó    <€ V ^8„  d   QhRS[ /# ©r   r   rE   )r#   r   s   "€r$   r%   r€   –  s   ø€ ÷ ñ ™sñ r&   c                ó‚  € V ;P                   ^,          un         \         V P                    R\        \        P                  ! 4       R,          4       2pV P                  P                  V4       \        \        V P                  4      V P                  ,
          4       F  pV P                  P                  4        K  	  V# )z†Mint a correlation ID and remember it for echo-filtering; the set is bounded by
``_max_pending_corr`` (overflow evicted in one sweep).Ú-éè  )
r¢   rø   Úintrº   rž   r9   ÚrangerH   rŸ   rö   )r©   rû   Ú_s   &  r$   Ú_make_corr_idÚSimplexAdapter._make_corr_id–  s’   € ð 	×Ò˜aÕÕÜ!�N 4×#5Ñ#5Ð"6°a¼¼D¿IºI»KÈ$Õ<NÓ8OÐ7PÐQˆØ×Ñ×"Ñ" 7Ô+Ü”s˜4×1Ñ1Ó2°T×5KÑ5KÕKÖLˆAØ×"Ñ"×&Ñ&Ö(ñ Màˆr&   c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   Úpayloadr   Nrð   )r#   r   s   "€r$   r%   r€      s   ø€ ÷ <ñ <¡dð <¨tñ <r&   c              ƒ  ó2  "  € V P                   '       g   \        P                  R4       R#  V P                   P                  \        P
                  ! V4      4      G Rj  x€L
  R#  L  \         d"   p\        P                  RT4        Rp?R# Rp?ii ; i5i)zHFire-and-forget JSON write; drops cleanly when the WS is missing/closed.z(SimpleX: WS send dropped (not connected)NzSimpleX: WS send error: %s)r™   r:   rÛ   Úsendrw   rx   r¹   r;   )r©   rš  r=   s   && r$   Ú_send_wsÚSimplexAdapter._send_ws   sc   é € à�x�xˆxÜ�L‰LÐCÔDÙð	<Ø—(‘(—-‘-¤§
¢
¨7Ó 3Ó4×4Ô4øÜô 	<Ü�N‰NÐ7¸×;Ò;ûð	<üs@   ‚*B­2A( ÁA&Á A( Á$BÁ&A( Á(BÁ3BÂ	BÂBÂBc                ó<   <€ V ^8„  d   QhRS[ RS[RS[S[,          /# )r   ÚcommandÚtimeoutr   )r!   r£   r	   rf   )r#   r   s   "€r$   r%   r€   ª  s'   ø€ ÷ ñ ©3ð ¹ð É(ÑSWÍ.ñ r&   c              ƒ  ó†  "  € V P                   pV'       g   \        P                  R 4       R# V P                  4       p\        P
                  ! 4       P                  4       pWPP                  V&    VP                  \        P                  ! RVRV/4      4      G Rj  x€L
  \        P                  ! WRR7      G Rj  x€L
 #  L# L  \         d!    \        P                  RTR,          4        M5\         d)   p\        P                  RTR,          T4        Rp?MRp?ii ; iT P                  P                  TR4       R# 5i)z1SimpleX: command sent but WebSocket not connectedNró   Úcmd©r¡  zSimpleX: command timed out: %srf  u"   SimpleX: command failed: %s â€” %s)r™   r:   r;   r—  r»   Úget_event_loopÚcreate_futurer¡   rœ  rw   rx   Úwait_forÚTimeoutErrorr¹   rö   )r©   r   r¡  ræ   rû   rü   r=   s   &&&    r$   r  ÚSimplexAdapter._send_commandª  sú   é € Ø�X‰XˆßÜ�N‰NÐNÔOÙà×$Ñ$Ó&ˆÜ%×4Ò4Ó6×DÑDÓFˆØ+.×Ñ Ñ(ð	RØ—'‘'œ$Ÿ*š* h°¸ÀÐ%HÓIÓJ×JÐJÜ ×)Ò)¨#Ô?×?Ð?ñ KÙ?øÜô 	KÜ�N‰NÐ;¸WÀS½\ÖJÜô 	RÜ�N‰NÐ?ÀÈÅÈq×QÑQûð	Rúà×Ñ×#Ñ# G¨TÔ2Ùùsf   ‚A-EÁ0,C ÂC ÂC Â;CÂ<C Â?EÃ C ÃC Ã(D Ã,EÃ.D Ã7D Ã8DÄEÄD Ä !Ec                ó$   <€ V ^8„  d   QhRS[ RR/# )r   r   r   NrE   )r#   r   s   "€r$   r%   r€   ½  s   ø€ ÷ Nñ N±3ð N¸4ñ Nr&   c              ƒ  óh   "  € V P                  RV P                  4       RV/4      G Rj  x€L
  R#  L5i)zNSend a command the daemon never replies to with a corrId (e.g. ``/freceive``).ró   r£  N)r�  r—  )r©   r   s   &&r$   r  Ú$SimplexAdapter._send_fire_and_forget½  s)   é € à�m‰m˜X t×'9Ñ'9Ó';¸UÀGÐLÓM×MÔMùs   ‚'2©0ª2c                ó2   <€ V ^8„  d   QhRS[ RS[RS[ RS[/# )r   rn   ro   r·   r   )r!   r"   r   )r#   r   s   "€r$   r%   r€   Á  s/   ø€ ÷ jñ j©ð j±Tð jÁ#ð jÉ*ñ jr&   c              ƒ  óŒ   "  € V P                  \        W4      4      G Rj  x€L
 pVe   \        RR7      # \        RVR7      #  L!5i)z9Send a structured ``/_send`` payload and await the reply.NT©ÚsuccessF©r°  r·   )r  rz   r   )r©   rn   ro   r·   Úresults   &&&& r$   Ú_send_itemsÚSimplexAdapter._send_itemsÁ  sA   é € à×)Ñ)¬)°GÓ*CÓD×DˆØ+1Ò+=Œz $Ô'ÐiÄ:ÐV[ÐchÔCiÐiñ Eùs   ‚A A¡"Ac                ón   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[S[ S[3,          ,          RS[/# )r   rn   r;  Úreply_toÚmetadatar   )r!   r	   rf   r   r   )r#   r   s   "€r$   r%   r€   Æ  sK   ø€ ÷ (ñ (Ùð(Ù%(ð(Ù4<¹SµMð(ÙT\Ñ]aÑbeÑgjÐbjÕ]kÕTlð(á	ñ(r&   c              ƒ  ób  "  € \         P                  ! RV4      pV'       d'   \         P                  ! RRV4      P                  4       pV'       d?   \	        VRRRRV//.4      pV P                  RV P                  4       RV/4      G R	j  x€L
  V F‰  p\        P                  P                  V4      ^,          P                  4       \        9   d   V P                  W4      G R	j  x€L
 pMV P                  W4      G R	j  x€L
 pVP                  '       d   K‡  Vu # 	  \        R
R7      #  LŸ LF L.5i)a  Send text; ``MEDIA:<path>`` tags (TTS / audio tools) are stripped and sent as native voice
notes or documents. The text send is fire-and-forget: the daemon doesn't always return a corrId
reply for chat commands, and waiting would serialise all outbound traffic behind a 30s timeout.zMEDIA:(\S+)z	MEDIA:\S+ri   r<  rô   r?  ró   r£  NTr¯  )ÚreÚfindallÚsubr*   rz   r�  r—  r¤   ÚpathÚsplitextrS   Ú_VOICE_TAG_EXTSÚ
send_voiceÚsend_documentr°  r   )	r©   rn   r;  r¶  r·  Úmedia_pathsÚcmd_strr¼  Úmedia_results	   &&&&&    r$   rœ  ÚSimplexAdapter.sendÆ  sû   é € ô —j’j °Ó9ˆßÜ—f’f˜\¨2¨wÓ7×=Ñ=Ó?ˆGßÜ ¨<¸&À&È&ÐRYÐ9ZÐ*[Ð)\Ó]ˆGØ—-‘- ¨4×+=Ñ+=Ó+?ÀÈÐ PÓQ×QÐQÛˆDÜ�w‰w×Ñ Ó% aÕ(×.Ñ.Ó0´OÔCØ%)§_¡_°WÓ%C×C‘à%)×%7Ñ%7¸Ó%F×F�Ø×'×'Ò'Ø#Ò#ñ  ô  $Ô'Ð'ñ Rñ  DáFùsC   ‚AD/Á9D/Â	D)Â
AD/Ã$D+Ã%D/Ã>D-Ã?D/ÄD/Ä+D/Ä-D/c                óV   <€ V ^8„  d   QhRS[ S[S[S[S[3,          ,          ,          /# r�  )r	   r"   rf   r!   r   )r#   r   s   "€r$   r%   r€   Û  s&   ø€ ÷ ñ ¡X©d±4¹¹S¸µ>Õ.BÕ%Cñ r&   c           
   ƒ  óŠ  "  € V P                   '       g   R# V P                  RRR7      G Rj  x€L
 pVf   R# . pVP                  R4      ;'       g    .  Fƒ  p\        V\        4      '       g   K  VP                  R4      p\        VR4      pVf   V'       g   KF  TP                  R\        T;'       g    T4      R	\        T;'       g    T4      R
R/4       K…  	  V P                  RRR7      G Rj  x€L
 pVe   VP                  R4      ;'       g    . M.  F   p\        V\        4      '       d   V'       d
   V^ ,          p\        V\        4      '       d   VP                  R4      f   KU  VR,          p\        VR4      ;'       g    \        V4      pVP                  RRV 2R	\        V4      R
R/4       K¢  	  V#  EL‘ LÎ5i)aP  Enumerate contacts and allowed groups for the channel directory.

Returns ``None`` (not ``[]``) when the WebSocket is down or the daemon is unresponsive so
the directory falls back to session-history discovery instead of wiping known targets.
Entry ``id`` values match the send targets: display name for DMs, ``group:<id>`` for groups.
Nz	/contactsg      $@r¤  ÚcontactsrC  rD  ÚidÚnamerô   rL  z/groupsÚgroupsrF  rJ  rq   r@  )	r™   r  rk   r5   rf   rl   rn  r!   r"   )r©   rò   ÚchannelsrB  rD   rÉ  r@  r„  s   &       r$   Úlist_channelsÚSimplexAdapter.list_channelsÛ  s’  é € ð �x�xˆxÙØ×'Ñ'¨¸TÐ'ÓB×BˆØŠ<ÙØ)+ˆØ—x‘x 
Ó+×1Ð1¨rÒ1ˆGÜ˜g¤t×,Ò,ÙØ Ÿ™ [Ó1ˆJÜ  ¨)Ó4ˆDØÒ!¯$Ùà�O‰O˜T¤3 t×'9Ð'9¨zÓ#:¸FÄCÈ×HZÐHZÐPZÓD[Ð]cÐeiÐjÖkñ 2ð ×'Ñ'¨	¸4Ð'Ó@×@ˆØ37Ò3C�d—h‘h˜xÓ(×.Ð.¨BøÈÒKˆEÜ˜%¤×&Ò&¯5Ø˜a��Ü˜e¤T×*Ò*¨e¯i©i¸	Ó.BÒ.JÙØ˜YÕ'ˆHÜ  ¨Ó7×HÐH¼3¸x»=ˆDØ�O‰O˜T V¨H¨:Ð#6¸ÄÀDÃ	È6ÐSZÐ[Ö\ñ Lð ˆò- Cñ AùsM   ‚+G­F>®#GÁAGÂGÂ5GÃ
(GÃ2GÃ3GÄ%GÄ9AGÆ	6GÇGc                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[ 3,          /# )r   r)  r   )r!   Útuple)r#   r   s   "€r$   r%   r€   ý  s#   ø€ ÷ +#ñ +#¡#ð +#©%±±S°­/ñ +#r&   c           
     ó  € ^ RI p^ RIp\        V 4      pVP                  P	                  4       R9  pV'       d   \        VP                  R4      4      MT pRp ^ RIHp ^ RI	pVP                  V 4      p	V'       d   V	P                  VR4       V	P                  4       p
V
P                  R4       V
P                  R9  du   V
P                  R9   dS   V
P                  R4      pVP!                  RVP"                  R4      pVP%                  W»P'                  R	4      R
7       Tp
MV
P                  R4      p
VP)                  4       pV
P                  VR^FR7       \*        \,        P.                  ! VP1                  4       4      P3                  4       ,           pWV3#   \4         Ed]     T'       d#   TP7                  RY.RR^TP8                  R7       TP;                  RRR7      ;_uu_ 4       pTP<                  pRRR4       M  + '       g   i     M; iTP7                  RT RRRRX.RR^TP8                  R7       \        TR4      ;_uu_ 4       p\*        \,        P.                  ! TP?                  4       4      P3                  4       ,           pRRR4       M  + '       g   i     M; i\@        PB                  ! T4        YV3#   \D        TPF                  3 d$   p\H        PK                  RT4        Rp? YV3# Rp?ii ; ii ; i)a  Ensure *file_path* is PNG/JPEG and return ``(png_path, thumb_data_uri)``. SimpleX clients
can't show WebP etc. inline, so convert to PNG when needed and build a 128px JPEG thumbnail for
the ``image`` field. Uses Pillow when available, else ImageMagick ``convert``.Nú.pngú.jpgri   )ÚImageÚPNGÚRGBÚRGBAÚA)ÚmaskÚJPEG)ÚqualityÚconvertT)ÚcheckÚcapture_outputr¡  ÚstdinF)rm  Údeletez-resizeÚ128x128z-qualityÚ70Úrbz)SimpleX: image conversion unavailable: %s)rÑ  rÒ  ú.jpeg)é€   rä  )rÕ  ÚL)rÖ  ÚLAÚP)éÿ   rè  rè  )&Ú
subprocessÚtempfiler   rm  rS   r!   Úwith_suffixÚPILrÓ  ÚioÚopenÚsaveÚcopyÚ	thumbnailÚmoderÛ  ÚnewÚsizeÚpasteÚ
getchannelÚBytesIOÚ_THUMB_URI_PREFIXÚbase64Ú	b64encodeÚgetvalueÚdecoder¶   ÚrunÚDEVNULLÚNamedTemporaryFilerÉ  Úreadr¤   ÚremoveÚFileNotFoundErrorÚSubprocessErrorr:   r;   )r)  ré  rê  ÚpÚ	needs_pngÚpng_pathÚ	thumb_urirÓ  rí  ÚimgÚthumbÚlayerÚ
backgroundÚbufÚtmpÚtmp_pathÚfÚexcs   &                 r$   Ú_prepare_imageÚSimplexAdapter._prepare_imageü  s~  € ó
 	ÛÜ�‹OˆØ—H‘H—N‘NÓ$Ð,EÑEˆ	ß1:”3�q—}‘} VÓ,Ô-À	ˆØˆ	ð 	QÝ!ÛØ—*‘*˜YÓ'ˆCßØ—‘˜ 5Ô)Ø—H‘H“JˆEØ�O‰O˜JÔ'Ø�z‰z Ô-Ø—:‘:Ð!4Ô4Ø!ŸM™M¨&Ó1�EØ!&§¡¨5°%·*±*¸oÓ!N�JØ×$Ñ$ U×1AÑ1AÀ#Ó1FÐ$ÔGØ&‘Eà!ŸM™M¨%Ó0�EØ—*‘*“,ˆCØ�J‰J�s˜F¨BˆJÔ/Ü)¬F×,<Ò,<¸S¿\¹\»^Ó,L×,SÑ,SÓ,UÕUˆIð Ð"Ð"øô õ 	QðQßØ—N‘N I¨yÐ#CØ)-¸dÈBÐV`×VhÑVhð #ô jà×0Ñ0¸ÀuÐ0×MÔMÐQTØ"Ÿx™x�H÷ N×M×MÐMúà—‘ 	¨9°iÀÈJÐX\Ð^fÐgØ%)¸$ÈÐR\×RdÑRdð ô fä˜( D×)Ô)¨QÜ 1´F×4DÒ4DÀQÇVÁVÃXÓ4N×4UÑ4UÓ4WÕ W�I÷ *×)×)Ð)úä—	’	˜(Õ#ð Ð"Ð"øô & z×'AÑ'AÐBô QÜ—‘ÐJÈC×PÑPØÐ"Ð"ûðQúð	Qúsn   Á"F Á;DF ÆK?Æ$KÆ,=KÇ)G?Ç6	KÇ?HÈ
AKÉ>JÊ	KÊJ$ÊKËK;ËK6Ë.K?Ë6K;Ë;K?c                óB   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[/# )r   rn   Ú	image_urlÚcaptionr   ©r!   r	   r   )r#   r   s   "€r$   r%   r€   *  s4   ø€ ÷ Oñ O©ð O¹ð OÁhÉsÅmð OÑisñ Or&   c           
   ‹  ó„  "  € VP                  R4      '       d   \        VR,          4      pM \        V4      G Rj  x€L
 pV'       d    \        V4      P                  4       '       g   \        RRR7      #  V P                  V4      w  rxR
TRRRRTRT;'       g    R//p
T P                  Y.R4      G Rj  x€L
 #  L}  \         d7   p\        P                  RT4       \        R\        T4      R7      u Rp?# Rp?ii ; i  \         d1   p	\        P                  RT	4       \        RR	T	 2R7      u Rp	?	# Rp	?	ii ; i Lˆ5i)zASend an image. Supports ``file://`` URLs and ``http(s)://`` URLs.úfile://:é   NNNz%SimpleX: failed to download image: %sFr±  zImage file not foundz$SimpleX: failed to prepare image: %szFailed to prepare image: r$  r<  rô   rj  r?  ri   zFailed to send image)rv   r
   r   r¹   r:   r;   r   r!   r   Úexistsr  r³  )r©   rn   r  r  rª   r)  r=   r  r  r  rÐ   s   &&&&,      r$   Ú
send_imageÚSimplexAdapter.send_image*  s(  é € à×Ñ 	×*Ò*Ü 	¨"¥Ó.‰Ið?Ü"6°yÓ"A×A�	÷ ¤ Y£× 6Ñ 6× 8Ò 8Ü eÐ3IÔJÐJð	VØ"&×"5Ñ"5°iÓ"@ÑˆHð
 ˜H l°V¸WÀgÈyÐZ`Ðbi×boÐboÐmoÐ4pÐqˆØ×%Ñ% g¨vÐ7MÓN×NÐNñ BøÜô ?Ü—‘ÐFÈÔJÜ!¨%´s¸1³vÔ>Õ>ûð?ûô ô 	VÜ�N‰NÐAÀ3ÔGÜ eÐ5NÈsÈeÐ3TÔUÕUûð	Vúñ
 OùsŒ   ‚+E ®B< ¼B:½B< ÁE Á	,E Á6D  Â	E ÂE Â5D>Â6E Â:B< Â<C=Ã+C8Ã2C=Ã3E Ã8C=Ã=E Ä D;Ä%D6Ä0D;Ä1E Ä6D;Ä;E c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   rn   Ú
image_pathr  r¶  r   r  )r#   r   s   "€r$   r%   r€   ?  sB   ø€ ÷ añ a©Sð a¹cð aÉHÑUXÍMð aÙ(0±­ðaÙKUñar&   c              ‹  óP   "  € V P                   ! VR V 23RV/VB G Rj  x€L
 #  L5i)r  r  N)r  )r©   rn   r  r  r¶  rª   s   &&&&&,r$   Úsend_image_fileÚSimplexAdapter.send_image_file?  s.   é € à—_’_ W°¸
°|Ð.DÑ`ÈgÐ`ÐY_Ñ`×`Ð`Ñ`ùs   ‚&Ÿ$ &c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   rn   Ú
video_pathr  r¶  r   r  )r#   r   s   "€r$   r%   r€   C  sB   ø€ ÷ Nñ N©ð N¹ð NÁxÑPSÅ}ð NÙ#+©C¥=ðNÙFPñNr&   c              ‹  óD   "  € V P                  WVR7      G Rj  x€L
 #  L5i)zVideos go as file attachments.)r  N)rÀ  )r©   rn   r#  r  r¶  rª   s   &&&&&,r$   Ú
send_videoÚSimplexAdapter.send_videoC  s#   é € ð ×'Ñ'¨ÀWÐ'ÓM×MÐMÑMùs   ‚ ™š c          
      óX   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[/# )r   rn   r)  r  Úfilenamer   r  )r#   r   s   "€r$   r%   r€   H  sB   ø€ ÷ Rñ R©3ð R¹3ð RÉÑRUÍð RÙ&.©s¥mðRÙISñRr&   c              ‹  óÄ   "  € \        V4      P                  4       '       g   \        R RR7      # RTRRRRT;'       g    R//pV P                  W.R	4      G R
j  x€L
 #  L5i)FzFile not foundr±  r$  r<  rô   r"  r?  ri   zFailed to send documentN©r   r  r   r³  )r©   rn   r)  r  r(  rª   rÐ   s   &&&&&, r$   rÀ  ÚSimplexAdapter.send_documentH  s`   é € ä�I‹×%Ñ%×'Ò'Ü eÐ3CÔDÐDØ˜I |°f¸fÀfÈgÏmÈmÐY[Ð5\Ð]ˆØ×%Ñ% g¨vÐ7PÓQ×QÐQÑQùs   ‚;A ¾A ÁAÁA c                ó^   <€ V ^8„  d   QhRS[ RS[ RS[S[ ,          RS[S[ ,          RS[RS[/# )r   rn   Ú
audio_pathr  r¶  Údurationr   )r!   r	   r”  r   )r#   r   s   "€r$   r%   r€   O  sK   ø€ ÷ Wñ W©ð W¹ð WÁxÑPSÅ}ð WÙ#+©C¥=ðWÙCFðWÙYcñWr&   c              ‹  óÌ   "  € \        V4      P                  4       '       g   \        RRR7      # RRRRT;'       g    RR	V/R
RV//pV P                  W.R4      G Rj  x€L
 #  L5i)zTSend an audio file as an inline SimpleX voice note (``msgContent.type == "voice"``).FzVoice file not foundr±  r<  rô   rk  r?  ri   r.  r#  r$  zFailed to send voice messageNr*  )r©   rn   r-  r  r¶  r.  rª   rÐ   s   &&&&&&, r$   r¿  ÚSimplexAdapter.send_voiceO  so   é € ô �JÓ×&Ñ&×(Ò(Ü eÐ3IÔJÐJØ˜v w°¸¿¸À2ÀzÐS[Ð\Ø˜z¨:Ð6ð8ˆà×%Ñ% g¨vÐ7UÓV×VÐVÑVùs   ‚9A$¼!A$ÁA"ÁA$c                ó$   <€ V ^8„  d   QhRS[ RR/# )r   rn   r   NrE   )r#   r   s   "€r$   r%   r€   X  s   ø€ ÷ =ñ =©ð =Àñ =r&   c              ƒ  ó   "  € R# 5i)u.   SimpleX has no typing-indicator API â€” no-op.Nr/   )r©   rn   r·  s   &&&r$   Úsend_typingÚSimplexAdapter.send_typingX  s   é ‚ ùs   ‚c                ó<   <€ V ^8„  d   QhRS[ RS[S[ S[3,          /# )r   rn   r   )r!   rf   r   )r#   r   s   "€r$   r%   r€   [  s'   ø€ ÷ yñ y©3ð y±4¹¹S¸µ>ñ yr&   c              ƒ  ót   "  € VP                  R 4      pRTRV'       d   RMRRV'       d   VR,          /# T/# 5i)rq   rn   rô   r@  rL  rÉ  rs   rS  )r©   rn   r€  s   && r$   Úget_chat_infoÚSimplexAdapter.get_chat_info[  s?   é € Ø×%Ñ% hÓ/ˆØ˜7 F·x©GÀTÈ6×bjÐSZÐ[]ÕS^ÐxÐxÐpwÐxÐxùs   ‚(8«8)r¢   r›   r�   rŸ   rž   r    r¡   rœ   r¦   r§   r™   rš   r‰   r˜   r…   )r   )NNrR   )NNr³   ))Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__ÚMAX_MESSAGE_LENGTHÚserial_receive_loopr“   r¸   rÑ   r½   r¾   rÜ   r  r  r  r  r+  rú   r  r4  r�  r—  r�  r  r  r³  rœ  rÌ  Ústaticmethodr  r  r   r%  rÀ  r¿  r3  r7  Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r­   r   s   @@r$   r|   r|   s   sœ  ù‡ € ÙKà+ÐØÐ÷_ó _ðB°E÷ ò ÷2-ð -÷$"?ð "?÷H	Pð 	P÷Ið I÷(Bð B÷Eð E÷[ð [÷
Wð W÷jð jð" 	Ð-Ð/BÐD\ØÐ*¨MÐ;LÐN_Ðavð€O÷
&ð &÷T1ð T1÷pGð G÷ð ÷<ð <÷ò ÷&Nð N÷jð j÷
(ò (÷*ð ðB ÷+#ó ð+#÷ZOò O÷*aò a÷Nò N÷
Rò R÷Wò W÷=ò =÷y÷ yð yr&   r|   c                ó$   € V ^8„  d   QhR\         /# r�  r±   )r#   s   "r$   r%   r%   `  s   € ÷ ñ œDñ r&   c                 óZ   € \        R4      '       g   R#  ^ RIp R#   \         d     R# i ; i)z?Plugin gate: require SIMPLEX_WS_URL AND the websockets package.ÚSIMPLEX_WS_URLFNT)r–   rµ   r¶   )rµ   s    r$   Úcheck_requirementsrG  `  s.   € äÐ.×/Ò/ÙðÛÙøÜô Úðús   • ›*©*c                ó$   € V ^8„  d   QhR\         /# r�  r±   )r#   s   "r$   r%   r%   k  s   € ÷ Qñ Qœtñ Qr&   c                 óŒ   € \        V R / 4      ;'       g    / p\        \        R4      ;'       g    VP                  RR4      4      # )r„   rF  r…   ri   )r”   rO   r–   rk   )r~   r„   s   & r$   Úvalidate_configrJ  k  s=   € Ü�F˜G RÓ(×.Ð.¨B€EÜÔ"Ð#3Ó4×OÐO¸¿	¹	À(ÈBÓ8OÓPÐPr&   c                ó$   € V ^8„  d   QhR\         /# r�  r±   )r#   s   "r$   r%   r%   p  s   € ÷ #ñ #œDñ #r&   c                ó   € \        V 4      # )uA   Configured (env or config.yaml) â‡’ shown as connected in status.)rJ  )r~   s   &r$   Úis_connectedrM  p  s   € ä˜6Ó"Ð"r&   c                ó:   € V ^8„  d   QhR\         \        ,          /# r�  )r	   rf   )r#   s   "r$   r%   r%   u  s   € ÷ 
&ñ 
&œ¤$�ñ 
&r&   c                 ó|   € \        RR4      P                  4       p V '       g   R# \        RRR 3R
3RR7      pR	V /VC# )z“``env_enablement_fn``: seed ``PlatformConfig.extra`` from the profile's env BEFORE adapter
construction; ``None`` when ``SIMPLEX_WS_URL`` is unset.rF  ri   Nrˆ   r‰   c                 ó(   € V P                  4       R9  # )r�   >   r�   r�   r‘   )rS   )r+   s   &r$   Ú<lambda>Ú!_env_enablement.<locals>.<lambda>|  s   € ¸¿¹»ÐJ^Ò9^r&   ÚSIMPLEX_HOME_CHANNEL)Úhome_envr…   )rŠ   r‹   N)r–   r*   Ú_seed_extra_from_env)r…   Úseeds     r$   Ú_env_enablementrW  u  sT   € ô  Ð 0°"Ó5×;Ñ;Ó=€FßÙÜØ	 Ñ/^Ð_Ø8ð!ð 'ô(€Dð �fÐ% Ð%Ð%r&   Ú	thread_idÚmedia_filesÚforce_documentFc                óÄ   € V ^8„  d   QhR\         R\         R\        \         ,          R\        \        \         ,          ,          R\        R\        \         \
        3,          /# )r   rn   ÚmessagerX  rY  rZ  r   )r!   r	   r"   rO   rf   r   )r#   s   "r$   r%   r%   ƒ  sS   € ÷ 7ñ 7Üð7Ü$'ð7äœ�}ð7ä2:¼4Ä½9Õ2Eð7ä^bð7ô 
Œ#Œsˆ(…^ñ7r&   c             ƒ  ó  "  €  ^ RI p\        T R/ 4      ;'       g    / p\	        R4      ;'       g    TP                  RR4      pT'       g   \        R4      #  R\         R	\        \        P                  ! 4       R
,          4       2R\        TRRRRT//.4      /p	TP                  T^
^R7      ;_uu_4       GRj  x€L
 p
T
P                  \        P                  ! T	4      4      G Rj  x€L
  \        P                  ! R4      G Rj  x€L
  RRR4      GRj  x€L
  RRRRRT/#   \         d    \        R4      u # i ; i Lƒ LX L< L.  + GRj  x€L 
 '       g   i     LE; i  \          d   p\        RT 24      u Rp?# Rp?ii ; i5i)un  Ephemeral WebSocket send for ``tools/send_message_tool`` when the gateway runner is not in
this process (``hermes cron``). ``thread_id``/``force_document`` are signature parity only;
``media_files`` is accepted but only the text body is delivered â€” SimpleX file transfers need
the daemon's filesystem-backed flow, which an ephemeral connection cannot drive safely.Nz5websockets not installed. Run: pip install websocketsr„   rF  r…   r†   z3SimpleX standalone send: SIMPLEX_WS_URL is requiredró   zsnd-r“  r£  r<  rô   r?  )r´   rØ   g      à?r°  Trƒ   r‚   rn   zSimpleX send failed: )rµ   r¶   r   r”   r–   rk   rø   r”  rº   rz   r¸   rœ  rw   rx   r»   rá   r¹   )Úpconfigrn   r\  rX  rY  rZ  rÁ   r„   r…   rš  ræ   r=   s   &&&$$$      r$   Ú_standalone_sendr_  ƒ  sh  é € ðSÛ&ô �G˜W bÓ)×/Ð/¨R€EÜÐ 0Ó1×_Ð_°U·Y±Y¸xÐI^Ó5_€FßÜÐOÓPÐPð	7àœ˜ d¬3¬t¯yªy«{¸TÕ/AÓ+BÐ*CÐDØ”9˜W¨°v¸vÀvÈwÐ6WÐ'XÐ&YÓZð\ˆð ×$Ñ$ V¸"ÈAÐ$×N×NÔNÐRTØ—'‘'œ$Ÿ*š* WÓ-Ó.×.Ð.Ü—-’- Ó$×$Ð$÷ O×Nð ˜4 ¨Y¸	À7ÐKÐKøô ô SÜÐQÓRÒRðSúñ OÙ.Ù$÷ O×N×NÒNûô ô 7ÜÐ1°!°Ð5Ó6Õ6ûð7üsÚ   ‚F	„D# ˆF	œF	±F	ÁF	ÁA#E# Â;D?Â<E# Â?)EÃ(EÃ)EÄEÄEÄE# ÄEÄE# Ä"F	Ä#D<Ä9F	Ä;D<Ä<F	Ä?E# ÅEÅEÅE# ÅE 	ÅEÅ
E 	ÅE 	ÅE# Å#FÅ.FÅ;FÅ<F	ÆFÆF	c                ó   € V ^8„  d   QhRR/# r.   r/   )r#   s   "r$   r%   r%   §  s   € ÷ bñ b˜4ñ br&   c                 ó  € ^ RI Hp Hp ^ RIHpHpHp ^ RIHp V! R4       V! RRR4      '       d   R# R F  pV! V4       K  	  \         F5  w  rxV ! V4      '       d   R	MR
p	V! V V	 24      p
V
'       g   K-  V! Wz4       K7  	  V! R4       R# )ug   ``hermes setup gateway`` â†’ SimpleX wizard (writes ``~/.hermes/.env``); CLI helpers are lazy-imported.)Úget_env_valueÚsave_env_value)Úprint_headerÚ
print_infoÚprompt)Údeclines_reconfigureúSimpleX ChatÚSimpleXzReconfigure SimpleX?rF  Nz [keep current]ri   zODone. Make sure the simplex-chat daemon is running before starting the gateway.)zRequirements:z?  1. simplex-chat daemon running (e.g. `simplex-chat -p 5225`).zF  2. Python package `websockets` installed (`pip install websockets`).)
Úhermes_cli.configrb  rc  Úhermes_cli.cli_outputrd  re  rf  Úhermes_cli.setup_platformsrg  Ú_SETUP_PROMPTS)rb  rc  rd  re  rf  rg  ÚlineÚvarÚquestionrm  r   s              r$   Úinteractive_setuprq  §  s‹   € ç?ßFÑFÝ?Ù�Ô Ù˜IÐ'=Ð?O×PÒPÙó[ˆá�4Öñ[÷ (‰ˆÙ&3°C×&8Ò&8Ñ"¸bˆÙ˜(˜ F 8Ð,Ó-ˆß‰5Ù˜3Ö&ñ	 (ñ
 Ð`Öar&   c                ó   € V ^8„  d   QhRR/# r.   r/   )r#   s   "r$   r%   r%   º  s   € ÷ Gñ G�Tñ Gr&   c                 óŽ   € V P                  R RR RR\        \        \        R.R\        \
        R\        RR	\        R
RRRR7       R# )r‚   rh  c                 ó   € \        V 4      # rR   )r|   )Úcfgs   &r$   rQ  Úregister.<locals>.<lambda>¼  s
   € Ì.ÐY\ÔJ]r&   zATalk to Hermes over SimpleX Chat via a local simplex-chat daemon.zGhttps://hermes-agent.nousresearch.com/docs/user-guide/messaging/simplexrF  zJpip install websockets   # SimpleX adapter requires the websockets packagerS  r1   ÚSIMPLEX_ALLOW_ALL_USERSu   ðŸ”’TaÓ  You are chatting via SimpleX Chat, a private decentralised messenger. Contacts are identified by opaque internal IDs, not phone numbers or usernames. SimpleX supports standard markdown formatting. There is no typing indicator and no hard message length limit, but keep responses conversational. You can attach native images, voice notes, and arbitrary files; the adapter handles MEDIA:<path> tags by sending them as inline voice notes (audio extensions) or documents.)rÉ  ÚlabelÚadapter_factoryÚdashboard_descriptionÚdocs_urlÚcheck_fnrJ  rM  Úrequired_envÚinstall_hintÚsetup_fnÚenv_enablement_fnÚcron_deliver_env_varÚstandalone_sender_fnÚallowed_users_envÚallow_all_envÚmax_message_lengthÚemojiÚpii_safeÚallow_update_commandÚplatform_hintN)Úregister_platformrG  rJ  rM  rq  rW  r_  r>  )Úctxs   &r$   ÚregisterrŒ  º  sX   € Ø×ÑØ˜nÑ>]ØaØZÜ#´_ÔS_Ø&Ð'ØbÜ"´oÐ\rÜ-ÐAXØ/ÔDVÐ^dØØ!ðEð ö Gr&   c                ó@   € V ^8„  d   Qh/ ^ \         9   d
   \        ;R&   # )r   r8   )Ú__conditional_annotations__r—   )r#   s   "r$   r%   r%      s    € ÷ 	ñ 	÷t $Ò #œÑ #òu	r&   >   ú.gifrÒ  rÑ  rã  ú.webp>   ú.aacú.m4aú.mp3ú.oggú.wavú.opus>   r’  r“  r”  r•  r–  )r?  r"  rj  rk  ÚlinkÚvideo)ri   ))rF  z2Daemon WebSocket URL (default ws://127.0.0.1:5225))r1   z0Allowed contactIds (comma-separated; blank=skip))rŠ   zIAllowed group IDs (comma-separated, or '*' for any; blank=disable groups))rˆ   zAAuto-accept incoming contact requests? (true/false, default true))rS  z(Home channel contact/group ID (or empty))TrŽ  r=  r»   rù  rÅ   rw   Úloggingr¤   râ   r¹  rº   r   r   r   Úpathlibr   Útypingr   r   r   r	   Úurllib.parser
   Úgateway.platforms._sharedr   r3   r   r–   r   r4   r   rU  r   Úgateway.configr   r   Úhermes_constantsr   Úgateway.platforms.baser   r   r   Úgateway.platforms.helpersr   Úgateway.platforms.eventr   r   Ú	getLoggerr9  r:   r>  rÚ   rä   rê   rë   rø   rT   rZ   r¾  rl  rø  ÚVOICEÚPHOTOrr  r,   r—   r8   rB   rJ   rV   r[   r`   rl   rz   r|   rG  rJ  rM  rW  r_  rm  rq  rŒ  r%   )rŽ  s   @r$   Ú<module>r¦     sV  øðö	ó Û Û Û Û Û 	Û Û 	Û ß ,Ñ ,Ý ß ,Ó ,å  ÷õ ÷ 4Ý ,ß XÑ XÝ 1ß =à	×	Ò	˜8Ó	$€àÐ ØÐ ØÐ ØÐ Ø$Ð Ø€Ú8€Ú?€Ú;€ØIÐ Ø,Ð Ø# [×%6Ñ%6Ð7¸(ÀK×DUÑDUÐ9VÐWÐ õ>ñ "›eÐ Ó #õTõ$7õ&õ&õ&÷kõ
7ôjyÐ(ô jyõZõQõ
#õ

&ð7à#ð7àHLð7àej÷7ð8J€õb÷&Gr&   