+
    lHàjóS  ã            "      ó¦  € R t ^ RIHt ^ RIt^ RIt^ RIHt ^ RIHt ^ RI	H
t
 ^ RIHtHt ]P                  ! ]4      t^ R^R^R	^R
/tRt]! 0 Rfm4      t ! R R]4      tR R ltR tR tR R ltRgR R lltR R ltR R lt]! R4      R R l4       t]! R4      R R l4       t]! R 4      R! R" l4       t ]! R#4      R$ R% l4       t!]! R&4      R' R( l4       t"R) t#R*R+R,R-R.R/R0R1R2R/R3R,R4//R5R2.//]R63R*R7R,R8R.R/R0R1R2R/R3R,R4/R9R/R3R:. RhOR,R;/R*R/R3R,R</R=R/R>R,R?//R5R2R9.//]R@3R*RAR,RBR.R/R0R1R2R/R3R,RC/R*R/R3R,RD/RER/R3R,RF/RGR/R3R,RH/RIR/RJR,RKRLR/R0R1RMR/R3R,RN/ROR/R>R,RP//R5RM.///R5. //]"RQ3R*RRR,RSR.R/R0R1RTR/R3R,RU/RVR/RWR,RX//R5. //] RY3R*RZR,R[R.R/R0R1R\R/R3R,R]/R^R/R3R,R_/R`R/R3R,Ra//R5. //]!Rb33t$]$ F'  w  t%t&t']PP                  ! ]%R*,          Rc]%]&]#Rd]'Re7       K)  	  R# )iu¼  yuanbao_tools.py - å…ƒå®�å¹³å�°å·¥å…·é›† (the "hermes-yuanbao" toolset).

get_group_info / query_group_members / search_sticker / send_sticker / send_dm. Sticker
flow mirrors chatbot-web's sticker-search/sticker-send: the LLM should search_sticker for
a sticker_id (or pass the Chinese name), then send_sticker â€” never bare Unicode emoji.
The active adapter singleton lives in ``plugins.platforms.yuanbao.adapter.YuanbaoAdapter.get_active``.
)ÚannotationsN)Úsuppress)ÚPath)ÚTuple)ÚregistryÚtool_resultÚunknownÚuserÚ
yuanbao_aiÚbotz\To @mention a user, you MUST use the format: space + @ + nickname + space (e.g. " @Alice ").c                  ó2   a € ] tR t^ tRtR V 3R lltRtV ;t# )Ú_YbErrorzLTool-level failure; ``payload`` is the error envelope returned to the model.c               ó   € V ^8„  d   QhRR/# )é   ÚmsgÚstr© )Úformats   "Ú8/home/ubuntu/.hermes/hermes-agent/tools/yuanbao_tools.pyÚ__annotate__Ú_YbError.__annotate__#   s   € ÷ Añ A˜Cñ Aó    c                	ó@   <€ \         SV `  V4       R RRV/VCV n        R# )ÚsuccessFÚerrorN)ÚsuperÚ__init__Úpayload)Úselfr   ÚextraÚ	__class__s   &&,€r   r   Ú_YbError.__init__#   s%   ø€ Ü‰Ñ˜ÔØ! 5¨'°3Ð@¸%Ð@ˆŽr   )r   )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classcell__)r    s   @r   r   r       s   ø† ÙV÷Aö Ar   r   c               ó   € V ^8„  d   QhRR/# )r   Úlabelr   r   )r   s   "r   r   r   (   s   € ÷ ñ �Cñ r   c                ó   a € V 3R lpV# )ue   Handler decorator: ``fn(args)`` â†’ tool_result; ``_YbError`` â†’ its envelope; else logged envelope.c                óJ   <a € \         P                  ! S 4      V V3R  l4       pV# )c              ›  ó>  <"  €  \        S! V 4      G R j  x€L
 4      #  L  \         d    p\        TP                  4      u R p?# R p?i\         dH   p\        P                  RS4       \        \        \        T4      4      P                  4      u R p?# R p?ii ; i5i)Nz[yuanbao_tools] %s error)r   r   r   Ú	ExceptionÚloggerÚ	exceptionr   )ÚargsÚkwÚexcÚfnr*   s   &, €€r   ÚhandlerÚ'_yb_tool.<locals>.deco.<locals>.handler+   sp   øé € ð?Ü"©¨D«§>Ó2Ð2¡>øÜô 0Ü" 3§;¡;Ó/Õ/ûÜô ?Ü× Ñ Ð!;¸UÔCÜ"¤8¬C°«HÓ#5×#=Ñ#=Ó>Õ>ûð?üsY   ƒB…  •–  �Bž   B«A¿BÁ BÁBÁBÁ<BÂBÂBÂBÂB)Ú	functoolsÚwraps)r4   r5   r*   s   f €r   ÚdecoÚ_yb_tool.<locals>.deco*   s%   ù€ Ü	�Š˜Ó	õ	?ó 
ð	?ð ˆr   r   )r*   r9   s   f r   Ú_yb_toolr;   (   s   ø€ õ
ð €Kr   c                 óš   € \        \        4      ;_uu_ 4        ^ RIHp  V P	                  4       uuRRR4       #   + '       g   i     R# ; i)zOLazy import to avoid ImportError when plugins.platforms.yuanbao is unavailable.©ÚYuanbaoAdapterN)r   ÚImportErrorÚ!plugins.platforms.yuanbao.adapterr>   Ú
get_activer=   s    r   Ú_get_active_adapterrB   8   s0   € ä	”+×	Õ	ÝDØ×(Ñ(Ó*÷ 
×	×	Ñ	ñ ús	   ˜9¹A
	c                 ó8   € \        4       ;p f   \        R4      hV # )Nz Yuanbao adapter is not connected)rB   r   )Úadapters    r   Ú_adapterrE   @   s!   € Ü&Ó(Ð(ˆÒ1ÜÐ9Ó:Ð:Ø€Nr   c               ó    € V ^8„  d   QhRRRR/# )r   Únamer   Úreturnr   )r   s   "r   r   r   F   s   € ÷ ñ �sð ˜sñ r   c                óŒ   € \        \        4      ;_uu_ 4        ^ RIHp V! V R4      uuRRR4       #   + '       g   i     R# ; i)é    )Úget_session_envÚ N)r   r.   Úgateway.session_contextrK   )rG   rK   s   & r   Ú_session_envrN   F   s.   € Ü	”)×	Õ	Ý;Ù˜t RÓ(÷ 
×	×	Ñ	ñ ús	   ˜2²A	c               ó$   € V ^8„  d   QhRRRRRR/# )r   ÚmÚdictÚdefaultr   rH   r   )r   s   "r   r   r   M   s!   € ÷ :ñ :ˆTð :˜Cð :¨ñ :r   c                óF   € V P                  R V P                  RV4      4      # )ÚnicknameÚ	nick_name)Úget)rP   rR   s   &&r   Ú_nickrW   M   s   € Ø�5‰5�˜QŸU™U ;°Ó8Ó9Ð9r   c               ó    € V ^8„  d   QhRRRR/# )r   Ú
group_coder   rH   Úlistr   )r   s   "r   r   r   Q   s   € ÷ "ñ "¨ð "°ñ "r   c              ƒ  ó‚   "  € V P                  V4      G R j  x€L
 pVf   \        R4      hVP                  R. 4      #  L%5i)Nz#get_group_member_list returned NoneÚmembers)Úget_group_member_listr   rV   )rD   rY   Úraws   && r   Ú_membersr_   Q   s?   é € Ø×-Ñ-¨jÓ9×
9€CØ
‚{ÜÐ<Ó=Ð=Ø�7‰7�9˜bÓ!Ð!ñ :ùs   ‚?—=˜&?c               ó$   € V ^8„  d   QhRRRRRR/# )r   rY   r   rG   rH   ztuple[str, str]r   )r   s   "r   r   r   X   s!   € ÷ 0ñ 0°Sð 0Àð 0Èñ 0r   c              ƒ  óš  "  € V'       g   \        R4      hV'       g   \        R4      hVP                  4       P                  4       p\        W4      G Rj  x€L
  Uu. uFM  pY4P	                  R4      ;'       g    VP	                  R4      ;'       g    RP                  4       9   g   KK  VNKO  	  ppV'       g   \        RV RV R	24      h\        V4      ^8”  d?   \        R
V R2V Uu. uF"  pRVP	                  RR4      R\        V4      /NK$  	  upR7      hV^ ,          pVP	                  RR4      \        WB4      3#  Léu upi u upi 5i)z–Resolve ``name`` to (user_id, nickname) via the group member list; >1 partial match raises
with ``candidates`` for disambiguation instead of guessing.z3group_code is required when user_id is not providedz-name is required when user_id is not providedNrT   rU   rL   zNo member matching "z" found in group Ú.zMultiple members match "z". Please specify which one.Úuser_id)Ú
candidates)r   ÚstripÚlowerr_   rV   ÚlenrW   )rD   rY   rG   ÚfiltrP   Úmatcheds   &&&   r   Ú_resolve_dm_recipientrj   X   s?  é € ÷ ÜÐLÓMÐMßÜÐFÓGÐGØ�:‰:‹<×ÑÓ€DÜ (¨Ó =×=Ð=ó SÑ=�QØŸ5™5 Ó,×HÐH°·±°kÓ0B×HÐHÀb×OÑOÓQÑQ÷ ˆqÑ=€Gð SçÜÐ-¨d¨VÐ3DÀZÀLÐPQÐRÓSÐSÜ
ˆ7ƒ|�aÔÜØ& t fÐ,HÐIÙY`ÓaÑY`ÐTU˜ A§E¡E¨)°RÓ$8¸*ÄeÈAÃhÓOÑY`Ñaô
ð 	
ð 	��
€AØ�5‰5�˜BÓ¤ q£Ð/Ð/ñ >ùò Sùò bùsF   ‚Ež7EÁD?ÁEÁEÁ9EÂEÂ)EÂ/:EÃ)(E
Ä/EÅ
EÚget_group_infoc               ó   € V ^8„  d   QhRR/# ©r   rH   rQ   r   )r   s   "r   r   r   n   s   € ÷ ñ  $ñ r   c              ƒ  ó\  "  € V P                  RR4      pV'       g   \        R4      h\        4       P                  V4      G Rj  x€L
 pVf   \        R4      hRRRVRVP                  RR4      R	VP                  R	^ 4      R
RVP                  RR4      RVP                  RR4      /RR/#  Le5i)u9   æŸ¥è¯¢ç¾¤åŸºæœ¬ä¿¡æ�¯ï¼ˆç¾¤å��ã€�ç¾¤ä¸»ã€�æˆ�å‘˜æ•°ï¼‰ã€‚rY   rL   úgroup_code is requiredNzquery_group_info returned Noner   TÚ
group_nameÚmember_countÚownerrc   Úowner_idrT   Úowner_nicknameÚnoteu+   The group is called "æ´¾ (Pai)" in the app.)rV   r   rE   Úquery_group_info)r1   rY   Úgis   &  r   rk   rk   m   s°   é € ð —‘˜,¨Ó+€JßÜÐ/Ó0Ð0Ü‹z×*Ñ*¨:Ó6×	6€BØ	‚zÜÐ7Ó8Ð8à�4˜ z°<ÀÇÁÈÐVXÓAYØ˜Ÿ™˜~¨qÓ1Ø�)˜RŸV™V J°Ó3°ZÀÇÁÐHXÐZ\ÓA]Ð^ØÐ=ð	ð ñ 
7ùs   ‚AB,ÁB*ÁA&B,Úquery_group_membersc               ó   € V ^8„  d   QhRR/# rm   r   )r   s   "r   r   r      s   € ÷ !Oñ !O tñ !Or   c              ƒ  ó  a
"  € V P                  RR4      V P                  RR4      r!V P                  RR4      pV'       g   \        R4      h\        \        4       V4      G Rj  x€L
  Uu. uFX  pRVP                  RR4      R	\	        V4      R
\
        P                  VP                  RVP                  R
^ 4      4      R4      /NKZ  	  ppV'       g   \        R4      hV P                  RR4      '       d	   R\        /M/ o
R V
3R llpVR8X  dK   V Uu. uF  qDR
,          R9   g   K  VNK  	  ppV'       g   \        R4      hV! RR\        V4       R2V4      # VR8X  d…   V'       d}   VP                  4       P                  4       pV Uu. uF"  qHVR	,          P                  4       9   g   K   VNK$  	  p	pV	'       d   V! RR\        V	4       RV R2V	4      # V! RRV R2V4      # V! RR\        V4       R2V4      #  EL˜u upi u upi u upi 5i)u£   ç»Ÿä¸€çš„ç¾¤æˆ�å‘˜æŸ¥è¯¢ï¼ˆå¯¹é½� TS query_session_membersï¼‰ã€‚
action: find (æŒ‰æ˜µç§°æ¨¡ç³Šæ�œç´¢; æ—  name æ—¶ç­‰å�Œ list_all) / list_bots / list_all (é»˜è®¤).rY   rL   rG   ÚactionÚlist_allro   Nrc   rT   ÚroleÚ	user_typer   zNo members found in this group.ÚmentionFÚmention_hintc               ó(   € V ^8„  d   QhRRRRRRRR/# )	r   ÚokÚboolr   r   r\   rZ   rH   rQ   r   )r   s   "r   r   Ú)query_group_members.<locals>.__annotate__�   s.   € ÷ Gñ G�Tð G ð G¨dð G°tñ Gr   c                ó   <€ R V RVRV/SC# )r   r   r\   r   )r‚   r   r\   Úhints   &&&€r   Ú_listingÚ%query_group_members.<locals>._listing�   s   ø€ Ø˜2˜u c¨9°gÐFÀÐFÐFr   Ú	list_botszNo bots found in this group.TzFound z bot(s).Úfindz member(s) matching "z".zNo match for "z". All members listed below.z member(s).>   r   r
   )
rV   r   r_   rE   rW   Ú_USER_TYPE_LABELÚMENTION_HINTrg   re   rf   )r1   rY   rG   r{   rP   Úall_membersr‡   Úbotsrh   ri   r†   s   &         @r   rx   rx   ~   s  øé € ð —x‘x ¨bÓ1°4·8±8¸FÀBÓ3G�Ø�X‰X�h 
Ó+€FßÜÐ/Ó0Ð0ô  ¤£
¨JÓ7×7Ð7óñ 8ˆAð 
�A—E‘E˜) RÓ(¨*´e¸A³hØ	Ô!×%Ñ% a§e¡e¨K¸¿¹¸vÀqÓ9IÓ&JÈIÓVó	Xá7ð ð ÷
 ÜÐ8Ó9Ð9à-1¯X©X°iÀ×-GÒ-GˆNœLÑ)ÈR€D÷Gð Gð �ÔÙ&ÓM™;�a¨F­)Ð7LÑ*L—�™;ˆÐMßÜÐ9Ó:Ð:Ù˜ ¤s¨4£y k°Ð:¸DÓAÐAà�ÔŸDØ�z‰z‹|×!Ñ!Ó#ˆÙ)ÓK™k˜°Q°zµ]×5HÑ5HÓ5JÑ-J—1�1™kˆÐKßÙ˜D F¬3¨w«<¨.Ð8MÈdÈVÐSUÐ"VÐX_Ó`Ð`Ù˜ °¨vÐ5QÐRÐT_Ó`Ð`á�D˜F¤3 {Ó#3Ð"4°KÐ@À+ÓNÐNò/ 8ùòùò Nùò LùsV   ƒA HÁ#G;Á$HÁ*AG>Ã,HÃ5HÄHÄ'HÄ-:HÅ("HÆ
HÆ,HÆ2A
HÇ>HÚsearch_stickerc               ó   € V ^8„  d   QhRR/# rm   r   )r   s   "r   r   r   ¤   s   € ÷ ñ  $ñ r   c              ƒ  ó¾  "  € ^ RI Hp V P                  RR4      V P                  R^
4      r2 \        ^\	        ^2V'       d   \        V4      M^
4      4      pT! T;'       g    RVR7      pRRRT;'       g    RR\        V4      R	V UUu. uF%  pR
 Uu/ uF  qwVP                  VR4      bK  	  upNK'  	  upp/#   \        \        3 d    ^
p Lxi ; iu upi u uppi 5i)ue   åœ¨å†…ç½®è´´çº¸è¡¨ä¸­æŒ‰å…³é”®è¯�æ¨¡ç³Šæ�œç´¢ï¼Œè¿”å›ž Top-N å€™é€‰ï¼ˆç©º query è¿”å›žå‰� N æ�¡ï¼‰ã€‚)Úsearch_stickersÚqueryrL   Úlimit)r”   r   TÚcountÚresults)Ú
sticker_idrG   ÚdescriptionÚ
package_id)	Ú)plugins.platforms.yuanbao.yuanbao_stickerr’   rV   ÚmaxÚminÚintÚ	TypeErrorÚ
ValueErrorrg   )r1   r’   r“   r”   Ú
safe_limitÚmatchesÚsÚks   &       r   r�   r�   £   sÞ   é € õ Jà—8‘8˜G RÓ(¨$¯(©(°7¸BÓ*?ˆ5ðÜ˜œC ·%¤C¨¤J¸RÓ@ÓAˆ
ñ ˜eŸk˜k r°Ô<€Gà�4˜ %§+ +¨2¨w¼¸G»ØÙ$ô&Ù$˜ñ /bÓbÑ.a¨˜Ÿ™˜a ›’_Ñ.aÔbÙ$ò&ðð øô ”zÐ"ô ØŠ
ðüò
 cùó &ùsX   ‚*C­)B9 Á
CÁ!CÁ6CÂ		CÂCÂ-CÂ4CÂ9CÃCÃCÃCÃCÃCÚsend_stickerc               ó   € V ^8„  d   QhRR/# rm   r   )r   s   "r   r   r   ¶   s   € ÷ ñ  ñ r   c              ƒ  ó$  "  € ^ RI HpHpHp V P	                  RR4      ;'       g    RP                  4       ;'       g    \        R4      pV'       g   \        R4      h\        4       pV P	                  RR4      ;'       g    RP                  4       pV'       g	   V! 4       pM0VP                  4       '       d	   V! V4      MR;'       g	    V! V4      pVf   \        RV: R	24      hTP                  YGP	                  R
R4      V P	                  RR4      ;'       g    RR7      G Rj  x€L
 p\        VRR4      '       g   \        \        VRR4      4      hRRRVRRVP	                  RR4      R
VP	                  R
R4      /R\        VRR4      RR/#  Lh5i)u  å�‘ chat_idï¼ˆç¼ºçœ�å�–å½“å‰�ä¼šè¯� HERMES_SESSION_CHAT_IDï¼‰å�‘é€�ä¸€å¼ å†…ç½®è´´çº¸ï¼ˆTIMFaceElemï¼‰ã€‚
``sticker``: å��ç§°ï¼ˆå¦‚ "å…­å…­å…­"ï¼‰æˆ– sticker_idï¼ˆå¦‚ "278"ï¼‰ï¼›ä¸ºç©ºæ—¶éš�æœºå�‘é€�ã€‚
``chat_id``: ``direct:{account_id}`` / ``group:{group_code}`` / è£¸ account_idã€‚)Úget_sticker_by_idÚget_sticker_by_nameÚget_random_stickerÚchat_idrL   ÚHERMES_SESSION_CHAT_IDz8chat_id is required (no active yuanbao session detected)ÚstickerNzSticker not found: z:. Use search_sticker first to discover available stickers.rG   Úreply_to)rª   Ústicker_namer­   r   Fr   zsend_sticker failedTr—   Ú
message_idru   z~Sticker delivered to the chat. If you have additional text to say, reply now; otherwise end your turn without generating text.)rš   r§   r¨   r©   rV   re   rN   r   rE   Úisdigitr¤   Úgetattr)	r1   r§   r¨   r©   ÚtargetrD   r^   Ústicker_objÚresults	   &        r   r¤   r¤   µ   s|  é € ÷
 uÑtà�h‰h�y "Ó%×+Ð+¨×2Ñ2Ó4×^Ð^¼ÐE]Ó8^€FßÜÐQÓRÐRÜ‹j€Gà�8‰8�I˜rÓ"×(Ð( b×
/Ñ
/Ó
1€CßÙ(Ó*‰à14·±·²Ñ(¨Ô-ÀD×eÐeÑM`ÐadÓMeˆØÒÜÐ,¨S©GÐ3mÐnÓoÐoà×'Ñ'°Ç_Á_ÐU[Ð]_ÓE`Ø15·±¸*ÀbÓ1I×1QÐ1QÈTð (ó S÷ S€Fä�6˜9 e×,Ò,Ü”w˜v wÐ0EÓFÓGÐGà�4˜ FØ�L +§/¡/°,ÀÓ"CÀVÈ[Ï_É_Ð]cÐegÓMhÐiØ”g˜f l°DÓ9Øð  Qð	ð ñ	Sùs<   ‚;F¾FÁ-FÂ FÂFÂ7FÃAFÄFÄ%FÄ&A)FÚsend_dmc               ó   € V ^8„  d   QhRR/# rm   r   )r   s   "r   r   r   Ö   s   € ÷ 7@ñ 7@˜4ñ 7@r   c           
   ƒ  ó�  "  € V P                  RR4      pV'       g<   \        R4      ;pP                  R4      '       d   VP                  R^4      ^,          p. pV P                  R4      ;'       g    .  Fº  p\	        V\
        4      '       d?   VP                  VP                  RR4      \        VP                  RR	4      4      34       KW  \	        V\        \        34      '       g   Ku  \        V4      ^8¼  g   K‡  VP                  \        V^ ,          4      \        V^,          4      34       K¼  	  ^ R
IHp VP                  V P                  RR4      4      w  rgTP                  T\        T;'       g    . 4      ,           4      pV'       g   V'       g   \!        R4      h\#        4       pV P                  RR4      p	V P                  RR4      ;'       g    RP%                  4       V	P%                  4       rºV
'       g   \'        W�V	4      G Rj  x€L
 w  r«V
'       g   \!        R4      hRV
 2pRp. pV'       di   VP%                  4       '       dS   VP)                  W§VR7      G Rj  x€L
 pVP*                  '       g&   TP                  VP,                  ;'       g    R4       V F”  w  rï\/        V4      P0                  P3                  4       \4        9   d   VP6                  MVP8                  pV! W.VR7      G Rj  x€L
 pVP*                  '       d   Ko  TP                  VP,                  ;'       g    R4       K–  	  Vf   \!        R4      hV'       d-   VP*                  '       g   \!        RP;                  V4      4      hRV R2pV'       d   VRRP;                  V4       R2,          pRRRV
RVRVP<                  RV/#  EL° EL\ LÊ5i) až  Send a DM to a group member, with optional media. group_code defaults to the session's
"group:<code>" chat_id. Without ``user_id`` the member list is searched by ``name`` (partial,
case-insensitive; >1 match returns candidates). media_files items are {"path", "is_voice"} dicts or
(path, is_voice) pairs; ``MEDIA:<path>`` tags in the text count too. Partial media failures are
reported in ``note``, not as failure.rY   rL   r«   zgroup:Ú:Úmedia_filesÚpathÚis_voiceF)ÚBasePlatformAdapterÚmessagez"message or media_files is requiredrG   rc   NzCould not resolve user_idzdirect:)rY   ztext send failedzmedia send failedz%No deliverable text or media remainedz; zDM sent to "z" successfully.z (partial failure: Ú)r   TrT   r¯   ru   )rV   rN   Ú
startswithÚsplitÚ
isinstancerQ   Úappendrƒ   rZ   Útuplerg   r   Úgateway.platforms.baser¼   Úextract_mediaÚfilter_media_delivery_pathsr   rE   re   rj   rµ   r   r   r   Úsuffixrf   Ú_IMAGE_EXTSÚsend_image_fileÚsend_documentÚjoinr¯   )r1   rY   rª   r¹   Úitemr¼   Úembedded_mediar½   rD   rG   Úresolved_user_idÚresolved_nicknameÚlast_resultÚerrorsÚ
media_pathÚ	_is_voiceÚsendru   s   &                 r   rµ   rµ   Õ   s%  é € ð —‘˜,¨Ó+€Jß¤lÐ3KÓ&LÐL˜7×XÑXÐYa×bÒbØ—]‘] 3¨Ó*¨1Õ-ˆ
à€KØ—‘˜Ó'×-Ð-¨2Ò-ˆÜ�dœD×!Ò!Ø×Ñ §¡¨°Ó 4´d¸4¿8¹8ÀJÐPUÓ;VÓ6WÐXÖYÜ˜œt¤U˜m×,Ô,´°T³¸a¶Ø×Ñ¤ D¨¥G£¬d°4¸µ7«mÐ<Ö=ñ	 .õ ;Ø1×?Ñ?ÀÇÁÈÐTVÓ@WÓXÑ€NØ%×AÑAÀ+ÔPTÐUc×UiÐUiÐgiÓPjÕBjÓk€KçŸ;ÜÐ;Ó<Ð<Ü‹j€Gà�8‰8�F˜BÓ€DØ+/¯8©8°I¸rÓ+B×+HÐ+HÀb×*OÑ*OÓ*QÐSW×S]ÑS]ÓS_Ð'ßÜ4IÈ'Ð_cÓ4d×.dÑ+ÐßÜÐ2Ó3Ð3àÐ(Ð)Ð*€GØ€KØ€Fß�7—=‘=—?’?Ø#ŸO™OÐ,<ÐR\˜OÓ]×]ˆØ×"×"Ð"Ø�M‰M˜+×+Ñ+×AÐAÐ/AÔBã!,Ñˆ
Ü*.¨zÓ*:×*AÑ*A×*GÑ*GÓ*IÌ[Ô*Xˆw×&Ò&Ð^e×^sÑ^sˆÙ  ÀÔL×LˆØ×"×"Ò"Ø�M‰M˜+×+Ñ+×BÐBÐ/BÖCñ	 "-ð ÒÜÐ>Ó?Ð?ß�k×)×)Ð)Ü�t—y‘y Ó(Ó)Ð)àÐ+Ð,¨OÐ<€DßØÐ% d§i¡i°Ó&7Ð%8¸Ð:Õ:ˆØ�t˜YÐ(8¸*ÐFWØ˜+×0Ñ0°&¸$ð@ð @ò5 /eò ^ñ MùsŸ   ‚A/OÁ2A3OÃ*OÃ<A9OÅ6OÆOÆ?OÇ7OÈN>ÈOÈOÈ9OÉOÉ%OÉ&OÉ<OÊAOË9OË:OÌOÌ0!OÍOÍ$'OÎ3OÏOÏOc                 óF   € \        R4      R8H  ;'       g    \        4       RJ# )uN   Toolset availability check â€” True when running in a yuanbao gateway session.ÚHERMES_SESSION_PLATFORMÚyuanbaoN)rN   rB   r   r   r   Ú_check_yuanbaorØ     s%   € äÐ1Ó2°iÑ?×dÐdÔCVÓCXÐ`dÐCdÐdr   rG   Úyb_query_group_infor˜   ul   Query basic info about a group (called 'æ´¾/Pai' in the app), including group name, owner, and member count.Ú
parametersÚtypeÚobjectÚ
propertiesrY   Ústringz)The unique group identifier (group_code).Úrequiredu   ðŸ‘¥Ú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.r{   Úenumu¤   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.z€User name to search (partial match, case-insensitive). Required for 'find'. Use the name the user mentioned in the conversation.r   Úbooleanz{Set to true when you need to @mention/at someone in your reply. The response will include the exact @mention format to use.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.r½   zEThe message text to send as a DM. Can be empty if only sending media.rc   z}Target user's account ID. If provided, skips the member lookup. Usually obtained from a previous yb_query_group_members call.r¹   Ú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.Úitemsrº   z.Absolute local file path of the media to send.r»   z5Whether this file is a voice message (default false).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.r“   uw   Search keyword (Chinese or English, e.g. '666', 'æ¯”å¿ƒ', 'cool', 'å�ƒç“œ'). Empty string returns the first N stickers.r”   Úintegerz8Max number of candidates to return (default 10, max 50).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.r¬   u�   Sticker name (e.g. 'å…­å…­å…­', 'æ¯”å¿ƒ', 'ok') or numeric sticker_id (e.g. '278'). Empty string sends a random built-in sticker.rª   zvTarget chat. Defaults to the current session. Format: 'direct:{account_id}', 'group:{group_code}', or bare account_id.r­   z5Optional ref_msg_id to quote-reply (group chat only).u   ðŸŽ¨zhermes-yuanbaoT)rG   ÚtoolsetÚschemar5   Úcheck_fnÚis_asyncÚemoji>   ú.bmpú.gifú.jpgú.pngú.jpegú.webp)rL   )rŠ   r‰   r|   ))r&   Ú
__future__r   r7   ÚloggingÚ
contextlibr   Úpathlibr   Útypingr   Útools.registryr   r   Ú	getLoggerr"   r/   r‹   rŒ   Ú	frozensetrÈ   r.   r   r;   rB   rE   rN   rW   r_   rj   rk   rx   r�   r¤   rµ   rØ   Ú_TOOLSÚ_schemaÚ_handlerÚ_emojiÚregisterr   r   r   Ú<module>r     sO  ðñõ #ã Û Ý Ý Ý ç 0à	×	Ò	˜8Ó	$€à�y ! V¨Q°¸aÀÐGÐ ð6ð ñ ÒJÓK€ôAˆyô Aõò òõ÷:õ"õ0ñ* 
Ð
Óôó ðñ  
Ð
Ó ô!Oó !ð!OñH 
Ð
Óôó ðñ" 
ˆ.Óôó ðñ> 
ˆ)Óô7@ó ð7@òteð Ð)ØðAð Ø˜ØØ Ø Ø%Ð'Rð#ðð ˜\˜Nð	ð	
ð" 	Øð'ð. Ð,ØðXð Ø˜ØØ Ø Ø%Ð'Rð#ð Ø ØÒ AØ%ð=ð	ð Ø Ø%ðhðð Ø 	Ø%ðZð ð+ð: ˜\¨8Ð4ð? ð*	
ðV 	Øð[.ðb �LØðJð Ø˜ØØ Ø Ø%ðEð#ð Ø Ø%ðEðð Ø Ø%Ð'nð ð Ø Ø%ð\ð ð "Ø Ø%ðLð  Ø" HØ(Ø &Ø$*¨HØ$1Ð3cð)"ð !+Ø$*¨IØ$1Ð3jð-"ð	+ð '¨¨ð"ð$ð71ðd ˜Bði5ð?	
ð@ 	ØðECðL Ð'Øðeð Ø˜ØØØ Ø%ðIðð Ø 	Ø%Ð'aððð ˜Bðð	
ð6 	Øð;ðB Ð%Øð	%ð Ø˜ØØØ Ø%ðZð ð Ø Ø%ðgð ð Ø Ø%Ð'^ð!ðð( ˜Bð-ð&	
ðN 	ØðS*ðQS
€ój "(Ñ€GˆX�vØ×ÒØ�V�_Ð&6¸wÐPXØ¨$°f÷ó "(r   