§
    øžyjk  ã                  óê  — d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	  ej
        e¦  «        Zd„ Zddd	d
dœZdZdcd„Z	 	 	 ddded„Zdfdgd„Z	 	 	 dhdid"„Z eh d#£¦  «        Z	 	 djdkd(„Zdd)lmZmZ d*„ Zd+„ Zd,„ Zd-„ Zd.„ Zd/„ Zd0Z  ej!        d1e d1d2d3dd4d5d6œidgd7œd8œeed9d:¬;¦  «          ej!        d<e d<d=d3d4d5d6œd4g d>¢d?d@œd4dAd6œdBdCd6œdDœddgd7œd8œeed9dE¬;¦  «          ej!        dFe dFdGd3d4dHd6œd4dId6œd4dJd6œd4dKd6œdLdMd3d4dNd6œdBdOd6œdPœdQgd7œdRœdSœg d7œd8œeed9dT¬;¦  «          ej!        dUe dUdVd3d4dWd6œdXdYd6œdZœg d7œd8œeed9d[¬;¦  «          ej!        d\e d\d]d3d4d^d6œd4d_d6œd4d`d6œdaœg d7œd8œeed9db¬;¦  «         dS )luÈ  
yuanbao_tools.py - å…ƒå®�å¹³å�°å·¥å…·é›†

æ��ä¾›ä»¥ä¸‹å·¥å…·å‡½æ•°ï¼Œä¾› hermes-agent çš„ "hermes-yuanbao" toolset ä½¿ç”¨ï¼š
  - get_group_info        : æŸ¥è¯¢ç¾¤åŸºæœ¬ä¿¡æ�¯ï¼ˆç¾¤å��ã€�ç¾¤ä¸»ã€�æˆ�å‘˜æ•°ï¼‰
  - query_group_members   : æŸ¥è¯¢ç¾¤æˆ�å‘˜ï¼ˆæŒ‰å��æ�œç´¢ã€�åˆ—ä¸¾ botã€�åˆ—ä¸¾å…¨éƒ¨ï¼‰
  - search_sticker        : æŒ‰å…³é”®è¯�æ�œç´¢å†…ç½®è´´çº¸ï¼ˆè¿”å›žå€™é€‰åˆ—è¡¨ï¼Œå�« sticker_id/name/descriptionï¼‰
  - send_sticker          : å�‘å½“å‰�ä¼šè¯�æˆ–æŒ‡å®š chat_id å�‘é€�è´´çº¸ï¼ˆTIMFaceElemï¼‰
  - send_dm               : å�‘é€�ç§�è�Šæ¶ˆæ�¯ï¼ˆæŒ‰æ˜µç§°æŸ¥æ‰¾ç”¨æˆ·å¹¶å�‘é€�ï¼‰

å¯¹é½� chatbot-web/yuanbao-openclaw-plugin çš„ sticker-search/sticker-send è¡Œä¸ºï¼š
LLM åº”å…ˆç”¨ search_sticker æ‰¾åˆ°å�ˆé€‚çš„ sticker_idï¼ˆæˆ–ç›´æŽ¥ä¼ ä¸­æ–‡ nameï¼‰ï¼Œå†�ç”¨ send_sticker
å�‘é€�ã€‚ä¸�è¦�åœ¨æ–‡æœ¬ä¸­å¤¹æ�‚è£¸çš„ Unicode emoji å½“ä½œè´´çº¸ã€‚

The active adapter singleton lives in ``gateway.platforms.yuanbao`` and is
accessed via ``get_active_adapter()``.
é    )ÚannotationsN)ÚPath)ÚListÚOptionalÚTuplec                 óF   — 	 ddl m}   | ¦   «         S # t          $ r Y dS w xY w)zOLazy import to avoid ImportError when gateway.platforms.yuanbao is unavailable.r   ©Úget_active_adapterN)Úgateway.platforms.yuanbaor
   ÚImportErrorr	   s    ú9/home/ragecks/.hermes/hermes-agent/tools/yuanbao_tools.pyÚ_get_active_adapterr      sJ   € ðØ@Ð@Ð@Ð@Ð@Ð@Ø!Ð!Ñ#Ô#Ð#øÝð ð ð Øˆtˆtðøøøs   ‚ ’
 Ÿ ÚunknownÚuserÚ
yuanbao_aiÚbot)r   é   é   é   z\To @mention a user, you MUST use the format: space + @ + nickname + space (e.g. " @Alice ").Ú
group_codeÚstrÚreturnÚdictc           	   ƒ  óÂ  K  — | sdddœS t          ¦   «         }|€dddœS 	 |                     | ¦  «        ƒ d{V —†}|€dddœS d| |                     dd	¦  «        |                     d
d¦  «        |                     dd	¦  «        |                     dd	¦  «        dœddœS # t          $ r6}t                               d¦  «         dt          |¦  «        dœcY d}~S d}~ww xY w)u9   æŸ¥è¯¢ç¾¤åŸºæœ¬ä¿¡æ�¯ï¼ˆç¾¤å��ã€�ç¾¤ä¸»ã€�æˆ�å‘˜æ•°ï¼‰ã€‚Fúgroup_code is required©ÚsuccessÚerrorNú Yuanbao adapter is not connectedzquery_group_info returned NoneTÚ
group_nameÚ Úmember_countr   Úowner_idÚowner_nickname©Úuser_idÚnicknameu+   The group is called "æ´¾ (Pai)" in the app.)r   r   r    r"   ÚownerÚnotez$[yuanbao_tools] get_group_info error)r   Úquery_group_infoÚgetÚ	ExceptionÚloggerÚ	exceptionr   )r   ÚadapterÚgiÚexcs       r   Úget_group_infor2   5   s>  è è € àð EØ Ð+CÐDÐDÐDå!Ñ#Ô#€GØ€Ø Ð+MÐNÐNÐNð5Ø×+Ò+¨JÑ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7ˆØˆ:Ø$Ð/OÐPÐPÐPàØ$ØŸ&š& ¨rÑ2Ô2ØŸFšF >°1Ñ5Ô5àŸ6š6 *¨bÑ1Ô1ØŸFšFÐ#3°RÑ8Ô8ðð ð Bð

ð 

ð 
	
øõ ð 5ð 5ð 5Ý×ÒÐ?Ñ@Ô@Ð@Ø ­3¨s©8¬8Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøs$    !B ÁAB Â
CÂ(+CÃCÃCÚlist_allr!   FÚactionÚnameÚmentionÚboolc              ƒ  ó  ‡K  — | sdddœS t          ¦   «         }|€dddœS 	 |                     | ¦  «        ƒ d{V —†}|€dddœS d„ |                     dg ¦  «        D ¦   «         }|sdd	dœS |r	d
t          ini }|dk    r,d„ |D ¦   «         }|sdddœS ddt	          |¦  «        › d�|dœ|¥S |dk    ry|r^|                     ¦   «                              ¦   «         Šˆfd„|D ¦   «         }	|	rddt	          |	¦  «        › d|› d�|	dœ|¥S dd|› d�|dœ|¥S ddt	          |¦  «        › d�|dœ|¥S ddt	          |¦  «        › d�|dœ|¥S # t          $ r6}
t           	                    d¦  «         dt          |
¦  «        dœcY d}
~
S d}
~
ww xY w)uÚ   
    ç»Ÿä¸€çš„ç¾¤æˆ�å‘˜æŸ¥è¯¢å·¥å…·ï¼ˆå¯¹é½� TS query_session_membersï¼‰ã€‚

    action:
      - find      : æŒ‰æ˜µç§°æ¨¡ç³Šæ�œç´¢
      - list_bots : åˆ—å‡º bot å’Œå…ƒå®� AI
      - list_all  : åˆ—å‡ºå…¨éƒ¨æˆ�å‘˜
    Fr   r   Nr   ú#get_group_member_list returned Nonec                ó  — g | ]…}|                      d d¦  «        |                      d|                      dd¦  «        ¦  «        t                                |                      d|                      dd¦  «        ¦  «        d¦  «        dœ‘Œ†S )	r&   r!   r'   Ú	nick_nameÚ	user_typeÚroler   r   )r&   r'   r=   )r+   Ú_USER_TYPE_LABEL©Ú.0Úms     r   ú
<listcomp>z'query_group_members.<locals>.<listcomp>l   s•   € ð 	
ð 	
ð 	
ð ð Ÿ5š5 ¨BÑ/Ô/ØŸEšE *¨a¯eªe°KÀÑ.DÔ.DÑEÔEÝ(×,Ò,Ø—E’E˜+ q§u¢u¨V°QÑ'7Ô'7Ñ8Ô8¸)ñô ðð ð	
ð 	
ð 	
ó    ÚmemberszNo members found in this group.Úmention_hintÚ	list_botsc                ó&   — g | ]}|d          dv ¯|‘ŒS )r=   >   r   r   © r?   s     r   rB   z'query_group_members.<locals>.<listcomp>}   s'   € ÐQÐQÐQ˜!¨a°¬iÐ;PÐ.PÐ.P�AÐ.PÐ.PÐ.PrC   zNo bots found in this group.TzFound z bot(s).)r   ÚmsgrD   Úfindc                óL   •— g | ] }‰|d                                ¦   «         v ¯|‘Œ!S )r'   )Úlower©r@   rA   Úfilts     €r   rB   z'query_group_members.<locals>.<listcomp>Š   s3   ø€ ÐSÐSÐS °T¸Q¸z¼]×=PÒ=PÑ=RÔ=RÐ5RÐ5R˜1Ð5RÐ5RÐ5RrC   z member(s) matching "z".zNo match for "z". All members listed below.z member(s).z)[yuanbao_tools] query_group_members error)r   Úget_group_member_listr+   ÚMENTION_HINTÚlenÚstriprL   r,   r-   r.   r   )r   r4   r5   r6   r/   ÚrawÚall_membersÚhintÚbotsÚmatchedr1   rN   s              @r   Úquery_group_membersrX   R   sÄ  øè è € ð ð EØ Ð+CÐDÐDÐDå!Ñ#Ô#€GØ€Ø Ð+MÐNÐNÐNðB5Ø×1Ò1°*Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=ˆØˆ;Ø$Ð/TÐUÐUÐUð	
ð 	
ð —W’W˜Y¨Ñ+Ô+ð	
ñ 	
ô 	
ˆð ð 	RØ$Ð/PÐQÐQÐQà18Ð@�¥Ð-Ð-¸bˆà�[Ò Ð ØQÐQ˜{ÐQÑQÔQˆDØð SØ#(Ð3QÐRÐRÐRàØ3¥ D¡	¤	Ð3Ð3Ð3Øðð ð ð	ð ð �VÒÐØð Ø—z’z‘|”|×)Ò)Ñ+Ô+�ØSÐSÐSÐS kÐSÑSÔS�Øð à#'ØS­¨G©¬ÐSÐSÈ4ÐSÐSÐSØ#*ðð ð ð	ð ð  %ØN¨DÐNÐNÐNØ*ðð ð ð	ð ð  Ø=¥ KÑ 0Ô 0Ð=Ð=Ð=Ø&ðð ð ð	ð ð Ø9�C Ñ,Ô,Ð9Ð9Ð9Ø"ð
ð 
ð ð	
ð 	
øõ ð 5ð 5ð 5Ý×ÒÐDÑEÔEÐEØ ­3¨s©8¬8Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøsH   ¡!E Á&E Á*%E ÂE Â)AE ÄE ÄE Ä(E Å
FÅ+E<Å6FÅ<Fé
   ÚqueryÚlimitÚintc           	   ƒ  óŽ  K  — ddl m} 	 t          dt          d|rt	          |¦  «        nd¦  «        ¦  «        }n# t
          t          f$ r d}Y nw xY w	  || pd|¬¦  «        }nC# t          $ r6}t           	                    d¦  «         d	t          |¦  «        d
œcY d}~S d}~ww xY wd| pdt          |¦  «        d„ |D ¦   «         dœS )uæ   
    åœ¨å†…ç½®è´´çº¸è¡¨ä¸­æŒ‰å…³é”®è¯�æ¨¡ç³Šæ�œç´¢ï¼Œè¿”å›ž Top-N å€™é€‰ã€‚

    è¿”å›žæ¯�æ�¡å€™é€‰çš„ sticker_id / name / description / package_idï¼Œ
    ä¾› LLM é€‰æ‹©å�Žä¼ ç»™ send_stickerã€‚ç©º query æ—¶è¿”å›žå‰� N æ�¡ã€‚
    r   )Úsearch_stickersr   é2   rY   r!   )r[   z$[yuanbao_tools] search_sticker errorFr   NTc           	     ó¼   — g | ]Y}|                      d d¦  «        |                      dd¦  «        |                      dd¦  «        |                      dd¦  «        dœ‘ŒZS )Ú
sticker_idr!   r5   ÚdescriptionÚ
package_id)ra   r5   rb   rc   ©r+   )r@   Úss     r   rB   z"search_sticker.<locals>.<listcomp>Ä   su   € ð 
ð 
ð 
ð ð  Ÿeše L°"Ñ5Ô5ØŸš˜f bÑ)Ô)Ø Ÿušu ]°BÑ7Ô7ØŸeše L°"Ñ5Ô5ð	ð ð
ð 
ð 
rC   )r   rZ   ÚcountÚresults)Ú!gateway.platforms.yuanbao_stickerr^   ÚmaxÚminr\   Ú	TypeErrorÚ
ValueErrorr,   r-   r.   r   rQ   )rZ   r[   r^   Ú
safe_limitÚmatchesr1   s         r   Úsearch_stickerro   ¬   s+  è è € ð BÐAÐAÐAÐAÐAðÝ˜�C °%Ð$?¥C¨¡J¤J J¸RÑ@Ô@ÑAÔAˆ
ˆ
øÝ•zÐ"ð ð ð Øˆ
ˆ
ˆ
ðøøøð5Ø!�/ % +¨2°ZÐ@Ñ@Ô@ˆˆøÝð 5ð 5ð 5Ý×ÒÐ?Ñ@Ô@Ð@Ø ­3¨s©8¬8Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøð
 Ø�˜"Ý�W‘”ð
ð 
ð ð
ñ 
ô 
ð	ð ð s-   Š/: ºAÁAÁA$ Á$
B$Á.+BÂB$ÂB$ÚstickerÚchat_idÚreply_toc              ƒ  ó  K  — ddl m} ddlm}m}m} |pd                     ¦   «         p |dd¦  «        }|sdddœS t          ¦   «         }|€dd
dœS | pd                     ¦   «         }	d	}
|	s |¦   «         }
n,|	                     ¦   «         r ||	¦  «        }
|
€ ||	¦  «        }
|
€	dd|	›d�dœS 	 | 	                    ||
 
                    dd¦  «        |pd	¬¦  «        ƒ d	{V —†}nC# t          $ r6}t                               d¦  «         dt          |¦  «        dœcY d	}~S d	}~ww xY wt          |dd¦  «        rBd||
 
                    dd¦  «        |
 
                    dd¦  «        dœt          |dd	¦  «        ddœS dt          |dd¦  «        dœS )u  
    å�‘ chat_idï¼ˆç¼ºçœ�å�–å½“å‰�ä¼šè¯�ï¼‰å�‘é€�ä¸€å¼ å†…ç½®è´´çº¸ï¼ˆTIMFaceElemï¼‰ã€‚

    Args:
        sticker:   è´´çº¸å��ç§°ï¼ˆå¦‚ "å…­å…­å…­"ï¼‰æˆ– sticker_idï¼ˆå¦‚ "278"ï¼‰ã€‚ä¸ºç©ºæ—¶éš�æœºå�‘é€�ä¸€å¼ ã€‚
        chat_id:   ç›®æ ‡ä¼šè¯�ï¼›ç¼ºçœ�æ—¶ä½¿ç”¨å½“å‰�ä¼šè¯�ä¸Šä¸‹æ–‡ï¼ˆHERMES_SESSION_CHAT_IDï¼‰ã€‚
                   æ ¼å¼�ï¼š``direct:{account_id}`` / ``group:{group_code}`` / æˆ–è£¸ account_idã€‚
        reply_to:  ç¾¤è�Šåœºæ™¯çš„å¼•ç”¨æ¶ˆæ�¯ IDï¼ˆå�¯é€‰ï¼‰ã€‚

    Returns: ``{"success": bool, ...}``
    r   ©Úget_session_env)Úget_sticker_by_idÚget_sticker_by_nameÚget_random_stickerr!   ÚHERMES_SESSION_CHAT_IDFz8chat_id is required (no active yuanbao session detected)r   Nr   zSticker not found: z:. Use search_sticker first to discover available stickers.r5   )rq   Ústicker_namerr   z"[yuanbao_tools] send_sticker errorr   Tra   )ra   r5   Ú
message_idz~Sticker delivered to the chat. If you have additional text to say, reply now; otherwise end your turn without generating text.)r   rq   rp   r{   r)   r   zsend_sticker failed)Úgateway.session_contextru   rh   rv   rw   rx   rR   r   ÚisdigitÚsend_stickerr+   r,   r-   r.   r   Úgetattr)rp   rq   rr   ru   rv   rw   rx   Útargetr/   rS   Ústicker_objÚresultr1   s                r   r~   r~   Ð   s”  è è € ð  8Ð7Ð7Ð7Ð7Ð7ðð ð ð ð ð ð ð ð ð ð ˆm˜×"Ò"Ñ$Ô$ÐU¨¨Ð8PÐRTÑ(UÔ(U€FØð 
àØOð
ð 
ð 	
õ
 "Ñ#Ô#€GØ€Ø Ð+MÐNÐNÐNàˆ=�b×
Ò
Ñ
!Ô
!€CØ"&€KØð 3Ø(Ð(Ñ*Ô*ˆˆà�;Š;‰=Œ=ð 	1Ø+Ð+¨CÑ0Ô0ˆKØÐØ-Ð-¨cÑ2Ô2ˆKàÐàðQ¨3ð Qð Qð Qð
ð 
ð 	
ð5Ø×+Ò+ØØ$Ÿš¨°Ñ4Ô4ØÐ% ð ,ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
ˆˆøõ
 ð 5ð 5ð 5Ý×ÒÐ=Ñ>Ô>Ð>Ø ­3¨s©8¬8Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøõ ˆv�y %Ñ(Ô(ð 

àØà)Ÿošo¨l¸BÑ?Ô?Ø#Ÿš¨°Ñ3Ô3ðð õ " &¨,¸Ñ=Ô=ð Uð	
ð 	
ð 		
ð Ý˜ Ð*?Ñ@Ô@ðð ð s   Â.4C# Ã#
D#Ã-+DÄD#ÄD#>   ú.bmpú.gifú.jpgú.pngú.jpegú.webpÚmessager&   Úmedia_filesú Optional[List[Tuple[str, bool]]]c              ƒ  ó†  ‡K  — |s|sdddœS t          ¦   «         }|€dddœS |r|                     ¦   «         nd}|                     ¦   «         }|�sH| sdddœS |sdddœS 	 |                     | ¦  «        ƒ d{V —†}|€dd	dœS |                     d
g ¦  «        }	|                     ¦   «                              ¦   «         Šˆfd„|	D ¦   «         }
|
sdd|› d| › d�dœS t          |
¦  «        dk    rd„ |
D ¦   «         }dd|› d�|dœS |
d                              dd¦  «        }|
d                              d|
d                              d|¦  «        ¦  «        }nC# t          $ r6}t                               d¦  «         dt          |¦  «        dœcY d}~S d}~ww xY w|sdddœS d|› �}d}g }	 |rU|                     ¦   «         rA| 
                    ||| ¬¦  «        ƒ d{V —†}|j        s|                     |j        pd¦  «         |pg D ]”\  }}t          |¦  «        j                             ¦   «         }|t           v r|                     ||| ¬¦  «        ƒ d{V —†}n|                     ||| ¬¦  «        ƒ d{V —†}|j        s|                     |j        pd¦  «         Œ•|€dddœS |r!|�|j        sdd                     |¦  «        dœS d |||j        d!|› d"�d#œ}|r'|d$xx         d%d                     |¦  «        › d&�z  cc<   |S # t          $ r6}t                               d'¦  «         dt          |¦  «        dœcY d}~S d}~ww xY w)(a  
    Send a DM (private chat message) to a group member, with optional media.

    Workflow:
      1. If user_id is provided, send directly.
      2. Otherwise, search the group member list by name to resolve user_id.
      3. Send text via adapter.send_dm(), then iterate media_files by extension.

    Args:
        group_code: The group where the target user belongs.
        name: Target user's nickname (partial match, case-insensitive).
        message: The message text to send.
        user_id: (Optional) If already known, skip the member lookup.
        media_files: (Optional) List of (file_path, is_voice) tuples to send
                     after the text message.  Images are sent via
                     send_image_file; everything else via send_document.
    Fz"message or media_files is requiredr   Nr   r!   z3group_code is required when user_id is not providedz-name is required when user_id is not providedr9   rD   c                ó”   •— g | ]D}‰|                      d ¦  «        p|                      d¦  «        pd                     ¦   «         v ¯B|‘ŒES )r'   r;   r!   )r+   rL   rM   s     €r   rB   zsend_dm.<locals>.<listcomp>R  s\   ø€ ð ð ð ØØ˜AŸEšE *Ñ-Ô-ÐI°·²°{Ñ1CÔ1CÐIÀr×PÒPÑRÔRÐRÐRð ØRÐRÐRrC   zNo member matching "z" found in group ú.r   c           
     ó�   — g | ]C}|                      d d¦  «        |                      d|                      dd¦  «        ¦  «        dœ‘ŒDS )r&   r!   r'   r;   r%   rd   r?   s     r   rB   zsend_dm.<locals>.<listcomp>^  sa   € ð ð ð ð
 ð $%§5¢5¨°BÑ#7Ô#7Ø$%§E¢E¨*°a·e²e¸KÈÑ6LÔ6LÑ$MÔ$Mðð ðð ð rC   zMultiple members match "z". Please specify which one.)r   r   Ú
candidatesr   r&   r'   r;   z+[yuanbao_tools] send_dm member lookup errorzCould not resolve user_idzdirect:©r   ztext send failedzmedia send failedz%No deliverable text or media remainedz; TzDM sent to "z" successfully.)r   r&   r'   r{   r)   r)   z (partial failure: ú)z[yuanbao_tools] send_dm error)r   rR   rO   r+   rL   rQ   r,   r-   r.   r   Úsend_dmr   Úappendr   r   ÚsuffixÚ_IMAGE_EXTSÚsend_image_fileÚsend_documentÚjoinr{   )r   r5   r‰   r&   rŠ   r/   Úresolved_user_idÚresolved_nicknamerS   rD   rW   r�   r1   rq   Úlast_resultÚerrorsÚ
media_pathÚ	_is_voiceÚextr‚   rN   s                       @r   r“   r“   "  sÔ  øè è € ð0 ð Q˜;ð QØ Ð+OÐPÐPÐPå!Ñ#Ô#€GØ€Ø Ð+MÐNÐNÐNà*1Ð9�w—}’}‘”�°rÐØŸ
š
™œÐð ñ *9Øð 	fØ$Ð/dÐeÐeÐeØð 	`Ø$Ð/^Ð_Ð_Ð_ð$	9Ø×5Ò5°jÑAÔAÐAÐAÐAÐAÐAÐAˆCØˆ{Ø#(Ð3XÐYÐYÐYà—g’g˜i¨Ñ,Ô,ˆGØ—:’:‘<”<×%Ò%Ñ'Ô'ˆDðð ð ð Ø"ðñ ô ˆGð
 ð à$ØX°DÐXÐXÈ:ÐXÐXÐXðð ð õ �7‰|Œ|˜aÒÐðð ð
 %ðñ ô �
ð  %ØZ¸ÐZÐZÐZØ",ðð ð ð  ' qœzŸ~š~¨i¸Ñ<Ô<ÐØ '¨¤
§¢¨z¸7À1¼:¿>º>È+ÐW[Ñ;\Ô;\Ñ ]Ô ]ÐÐøÝð 	9ð 	9ð 	9Ý×ÒÐJÑKÔKÐKØ$­s°3©x¬xÐ8Ð8Ð8Ð8Ð8Ð8Ð8Ð8øøøøð	9øøøð ð HØ Ð+FÐGÐGÐGð +Ð(Ð*Ð*€GØ€KØ€Fð"5Øð 	G�w—}’}‘”ð 	GØ '§¢Ð0@À'ÐV` Ñ aÔ aÐaÐaÐaÐaÐaÐaˆKØÔ&ð GØ—’˜kÔ/ÐEÐ3EÑFÔFÐFð &1Ð%6°Bð 	Hð 	HÑ!ˆJ˜	Ý�zÑ"Ô"Ô)×/Ò/Ñ1Ô1ˆCØ•kÐ!Ð!Ø$+×$;Ò$;¸GÀZÐ\fÐ$;Ñ$gÔ$gÐgÐgÐgÐgÐgÐg��à$+×$9Ò$9¸'À:ÐZdÐ$9Ñ$eÔ$eÐeÐeÐeÐeÐeÐe�ØÔ&ð HØ—’˜kÔ/ÐFÐ3FÑGÔGÐGøàÐØ$Ð/VÐWÐWÐWàð 	B�{Ð*°+Ô2EÐ*Ø$¨t¯yªy¸Ñ/@Ô/@ÐAÐAÐAð Ø'Ø)Ø%Ô0ØEÐ#4ÐEÐEÐEð
ð 
ˆð ð 	IØ�6ˆNˆNŒNÐH°D·I²I¸fÑ4EÔ4EÐHÐHÐHÑHˆNˆN‰NØˆøÝð 5ð 5ð 5Ý×ÒÐ8Ñ9Ô9Ð9Ø ­3¨s©8¬8Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4øøøøð5øøøs]   Á !E ÂAE Ã(E ÄAE Å
FÅ +FÆFÆFÆ*C6L  Ê!"L  Ë;L  Ì 
M Ì
+L;Ì5M Ì;M )ÚregistryÚtool_resultc                 óv   — 	 ddl m}   | dd¦  «        dk    rdS n# t          $ r Y nw xY wt          ¦   «         duS )uN   Toolset availability check â€” True when running in a yuanbao gateway session.r   rt   ÚHERMES_SESSION_PLATFORMr!   ÚyuanbaoTN)r|   ru   r,   r   rt   s    r   Ú_check_yuanbaor¦   ¤  sm   € ðØ;Ð;Ð;Ð;Ð;Ð;Øˆ?Ð4°bÑ9Ô9¸YÒFÐFØ�4ð Gøåð ð ð ØˆðøøøåÑ Ô ¨Ð,Ð,s   ‚ ›
(§(c              ‹  ót   K  — t          t          |                      dd¦  «        ¬¦  «        ƒ d {V —†¦  «        S )Nr   r!   r‘   )r¢   r2   r+   ©ÚargsÚkws     r   Ú_handle_yb_query_group_infor«   ¯  sX   è è € Ý�^Ø—8’8˜L¨"Ñ-Ô-ðñ ô ð ð ð ð ð ð ñ ô ð rC   c              ‹  ó  K  — t          t          |                      dd¦  «        |                      dd¦  «        |                      dd¦  «        t          |                      dd¦  «        ¦  «        ¬¦  «        ƒ d {V —†¦  «        S )	Nr   r!   r4   r3   r5   r6   F©r   r4   r5   r6   )r¢   rX   r+   r7   r¨   s     r   Ú_handle_yb_query_group_membersr®   µ  s”   è è € ÝÕ0Ø—8’8˜L¨"Ñ-Ô-Ø�xŠx˜ *Ñ-Ô-Ø�XŠX�f˜bÑ!Ô!Ý�T—X’X˜i¨Ñ/Ô/Ñ0Ô0ð	ñ ô ð ð ð ð ð ð ñ ô ð rC   c              ‹  ó  K  — |                       dd¦  «        }|sU	 ddlm}  |dd¦  «        }|                     d¦  «        r|                     dd¦  «        d         }n# t
          $ r Y nw xY w|                       d	¦  «        pg }g }|D ]Ð}t          |t          ¦  «        rM|                     |                      d
d¦  «        t          |                      dd¦  «        ¦  «        f¦  «         Œdt          |t          t          f¦  «        rPt          |¦  «        dk    r=|                     t          |d         ¦  «        t          |d         ¦  «        f¦  «         ŒÑ|                       dd¦  «        }ddlm}	 |	                     |¦  «        \  }
}|
r|                     |
¦  «         |	                     |¦  «        }t'          t)          ||                       dd¦  «        ||                       dd¦  «        |pd ¬¦  «        ƒ d {V —†¦  «        S )Nr   r!   r   rt   ry   zgroup:ú:r   rŠ   ÚpathÚis_voiceFr   r‰   )ÚBasePlatformAdapterr5   r&   ©r   r5   r‰   r&   rŠ   )r+   r|   ru   Ú
startswithÚsplitr,   Ú
isinstancer   r”   r7   ÚlistÚtuplerQ   r   Úgateway.platforms.baser³   Úextract_mediaÚextendÚfilter_media_delivery_pathsr¢   r“   )r©   rª   r   ru   rq   Ú	raw_mediarŠ   Úitemr‰   r³   Úembedded_medias              r   Ú_handle_yb_send_dmrÁ   ¾  sH  è è € à—’˜,¨Ñ+Ô+€JØð ð	Ø?Ð?Ð?Ð?Ð?Ð?Ø%�oÐ&>ÀÑCÔCˆGà×!Ò! (Ñ+Ô+ð 6Ø$Ÿ]š]¨3°Ñ2Ô2°1Ô5�
øøÝð 	ð 	ð 	ØˆDð	øøøð —’˜Ñ'Ô'Ð-¨2€IØ€KØð >ð >ˆÝ�d�DÑ!Ô!ð 	>Ø×Ò §¢¨°Ñ 4Ô 4µd¸4¿8º8ÀJÐPUÑ;VÔ;VÑ6WÔ6WÐXÑYÔYÐYÐYÝ˜�t¥U˜mÑ,Ô,ð 	>µ°T±´¸a²°Ø×Ò¥ D¨¤G¡¤­d°4¸´7©m¬mÐ<Ñ=Ô=Ð=øð �hŠh�y "Ñ%Ô%€GØ:Ð:Ð:Ð:Ð:Ð:Ø1×?Ò?ÀÑHÔHÑ€N�GØð +Ø×Ò˜>Ñ*Ô*Ð*Ø%×AÒAÀ+ÑNÔN€Kå�WØ¨4¯8ª8°F¸BÑ+?Ô+?ØØ—’˜ BÑ'Ô'ØÐ' 4ð	ñ ô ð ð ð ð ð ð ñ ô ð s   œAA  Á 
A-Á,A-c           	   ‹  óž   K  — t          t          |                      dd¦  «        |                      dd¦  «        ¬¦  «        ƒ d {V —†¦  «        S )NrZ   r!   r[   rY   ©rZ   r[   )r¢   ro   r+   r¨   s     r   Ú_handle_yb_search_stickerrÄ   å  si   è è € Ý�^Ø�hŠh�w Ñ#Ô#Ø�hŠh�w Ñ#Ô#ðñ ô ð ð ð ð ð ð ñ ô ð rC   c           
   ‹  óÈ   K  — t          t          |                      dd¦  «        |                      dd¦  «        |                      dd¦  «        ¬¦  «        ƒ d {V —†¦  «        S )Nrp   r!   rq   rr   ©rp   rq   rr   )r¢   r~   r+   r¨   s     r   Ú_handle_yb_send_stickerrÇ   ì  sz   è è € Ý�\Ø—’˜ BÑ'Ô'Ø—’˜ BÑ'Ô'Ø—’˜* bÑ)Ô)ðñ ô ð ð ð ð ð ð ñ ô ð rC   zhermes-yuanbaoÚyb_query_group_infoul   Query basic info about a group (called 'æ´¾/Pai' in the app), including group name, owner, and member count.ÚobjectÚstringz)The unique group identifier (group_code).)Útyperb   )rË   Ú
propertiesÚrequired)r5   rb   Ú
parametersTu   ðŸ‘¥)r5   ÚtoolsetÚschemaÚhandlerÚcheck_fnÚis_asyncÚemojiÚyb_query_group_membersu:  Query members of a group (called 'æ´¾/Pai' in the app). Use this tool when you need to @mention someone, find a user by name, list bots (including Yuanbao AI), or list all members. IMPORTANT: You MUST call this tool before @mentioning any user, because you need the exact nickname to construct the @mention format.)rJ   rF   r3   u¤   find â€” search a user by name (use when you need to @mention or look up someone); list_bots â€” list bots and Yuanbao AI assistants; list_all â€” list all members.)rË   Úenumrb   z€User name to search (partial match, case-insensitive). Required for 'find'. Use the name the user mentioned in the conversation.Úbooleanz{Set to true when you need to @mention/at someone in your reply. The response will include the exact @mention format to use.r­   u   ðŸ“‹Ú
yb_send_dmu`  Send a private/direct message (DM) to a user in a group, with optional media files. This tool automatically looks up the user by name in the group member list and sends the message. Use this when someone asks to privately message / ç§�ä¿¡ / DM a user. Supports text, images, and file attachments. You can also provide user_id directly if already known.uˆ   The group where the target user belongs. Extract from chat_id: 'group:328306697' â†’ '328306697'. Required when user_id is not provided.zdTarget user's display name (partial match, case-insensitive). Required when user_id is not provided.zEThe message text to send as a DM. Can be empty if only sending media.z}Target user's account ID. If provided, skips the member lookup. Usually obtained from a previous yb_query_group_members call.Úarrayz¤Optional list of media files to send along with the DM. Images (.jpg/.png/.gif/.webp/.bmp) are sent as image messages; other files are sent as document attachments.z.Absolute local file path of the media to send.z5Whether this file is a voice message (default false).)r±   r²   r±   )rË   rb   Úitemsr´   u   âœ‰ï¸�Úyb_search_stickerui  Search the built-in Yuanbao sticker (TIM face / è¡¨æƒ…åŒ…) catalogue by keyword. Returns the top matching candidates with sticker_id, name, and description. Use this BEFORE yb_send_sticker to discover the right sticker_id. Sticker = è´´çº¸ = TIM face â€” NOT a message reaction. Prefer sending a sticker over bare Unicode emoji when reacting/expressing emotion.uw   Search keyword (Chinese or English, e.g. '666', 'æ¯”å¿ƒ', 'cool', 'å�ƒç“œ'). Empty string returns the first N stickers.Úintegerz8Max number of candidates to return (default 10, max 50).rÃ   u   ðŸ”�Úyb_send_stickeruµ  Send a built-in sticker (TIMFaceElem / è´´çº¸è¡¨æƒ…) to the current Yuanbao chat. Call yb_search_sticker first if you don't know the sticker_id/name. Sticker = è´´çº¸ = TIM face â€” NOT a message reaction. CRITICAL: Whenever the user asks you to send a sticker / è´´çº¸ / è¡¨æƒ…åŒ…, you MUST use this tool. DO NOT draw a PNG via execute_code / Pillow / matplotlib and then call send_image_file â€” that produces a fake 'sticker' image instead of a real TIM face and is the WRONG path. If no suitable sticker_id is known, call yb_search_sticker first. When the recent thread shows users sending stickers, prefer matching that tone by replying with a sticker instead of (or in addition to) text.u�   Sticker name (e.g. 'å…­å…­å…­', 'æ¯”å¿ƒ', 'ok') or numeric sticker_id (e.g. '278'). Empty string sends a random built-in sticker.zvTarget chat. Defaults to the current session. Format: 'direct:{account_id}', 'group:{group_code}', or bare account_id.z5Optional ref_msg_id to quote-reply (group chat only).rÆ   u   ðŸŽ¨)r   r   r   r   )r3   r!   F)
r   r   r4   r   r5   r   r6   r7   r   r   )r!   rY   )rZ   r   r[   r\   r   r   )r!   r!   r!   )rp   r   rq   r   rr   r   r   r   )r!   N)r   r   r5   r   r‰   r   r&   r   rŠ   r‹   r   r   )"Ú__doc__Ú
__future__r   ÚloggingÚpathlibr   Útypingr   r   r   Ú	getLoggerÚ__name__r-   r   r>   rP   r2   rX   ro   r~   Ú	frozensetr–   r“   Útools.registryr¡   r¢   r¦   r«   r®   rÁ   rÄ   rÇ   Ú_TOOLSETÚregisterrH   rC   r   ú<module>ré      sX  ððð ð$ #Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (Ð (à	ˆÔ	˜8Ñ	$Ô	$€ðð ð ð ! V°ÀÐGÐGÐ ð6ð ð5ð 5ð 5ð 5ð> ØØð	W5ð W5ð W5ð W5ð W5ðt!ð !ð !ð !ð !ðJ ØØðKð Kð Kð Kð Kð^ ˆiÐJÐJÐJÑKÔK€ð Ø48ðx5ð x5ð x5ð x5ð x5ð~ 1Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0ð-ð -ð -ðð ð ðð ð ð$ð $ð $ðNð ð ðð ð ð €à €Ô Ø	Øà%ð=ð àØ$Ø#Nðð ðð &˜ð	
ð 	
ðð ð" (ØØØ
ð/ñ ô ð ð4 €Ô Ø	!Øà(ðTð ð %Ø#Nðð ð
 %Ø=Ð=Ð=ð9ð	ð ð %ðdðð ð &ðVðð ð+ð ð: & xÐ0ð? 
ð  
ð*ð *ðV +ØØØ
ðc2ñ 2ô 2ð 2ðh €Ô Ø	ØàðFð ð %ðAðð ð %ðAðð ð %Ø#jðð ð
 %ðXðð ð $ðHð
 !)ð )1Ø/_ð%ð %ð
 )2Ø/fð)ð )ð	'ð 	'ð &, Hðð ð ð  ð71ð 1ðd ði5
ð 5
ð?ð ?ð@ ØØØ
ðMGñ Gô Gð GðT €Ô Ø	Øà#ðað ð %ðEðð ð &Ø#]ðð ðð ð ð
ð 
ðð ð6 &ØØØ
ðC"ñ "ô "ð "ðJ €Ô Ø	Øà!ð	!ð ð %ðVðð ð %ðcðð ð %Ø#Zðð ðð ð( ð-
ð 
ð&ð &ðN $ØØØ
ð[.ñ .ô .ð .ð .ð .rC   